Язык Си в примерах/Простая реализация конечного автомата
- Компиляция программ
- Простейшая программа «Hello World»
- Учимся складывать
- Максимум
- Таблица умножения
- ASCII-коды символов
- Верхний регистр
- Скобочки
- Факториал
- Степень числа
- Треугольник Паскаля
- Корень уравнения
- Система счисления
- Сортировка
- Библиотека complex
- Сортировка на основе qsort
- RPN-калькулятор
- RPN-калькулятор на Bison
- Простая грамматика
- Задача «Расчёт сопротивления схемы»
- Простая реализация конечного автомата
- Использование аргументов командной строки
- Чтение и печать без использования stdio
- Декодирование звукозаписи в формате ADX
- Другие примеры
- XCC C
Ниже приведена реализация конечного автомата, который прибавляет 1 к числу, поданному на вход в виде двоичной записи начиная с младшего разряда.
#include <stdio.h>
int c;
int
main()
{
goto s1;
s2: c = getchar();
switch(c)
{
case EOF:
exit(0);
default :
putchar(c);
goto s2;
}
s1: c = getchar();
switch (c)
{
case EOF:
exit(0);
case '1':
putchar('0');
goto s1;
case '0':
putchar('1');
goto s2;
}
}
#include <stdio.h>
int char_to_id (int c) {
switch (c) {
case '0': return 0;
case '1': return 1;
case EOF: return 2;
default: return 2;
}
}
typedef struct table_item_s {
int state;
int out_char;
} table_item_t;
#define END_STATE 2
table_item_t
T[2][3] = {
{ {1, '1'}, {0, '0'} , {END_STATE, '\n'}},
{ {1, '0'}, {1, '1'} , {END_STATE, '\n'}}
};
int main() {
int c, c_id;
int state = 0;
while(!feof(stdin)) {
c = getchar();
c_id = char_to_id(c);
putchar(T[state][c_id].out_char);
state = T[state][c_id].state;
if(state == END_STATE)
return 0;
}
}