Язык Си в примерах/Простая реализация конечного автомата
Материал из Викиучебника
Язык Си в примерах
- Компиляция программ
- Простейшая программа «Hello World»
- Учимся складывать
- Максимум
- Таблица умножения
- ASCII коды символов
- Верхний регистр
- Скобочки
- Факториал
- Степень числа
- Треугольник Паскаля
- Корень уравнения
- Система счисления
- Сортировка
- Библиотека complex
- Сортировка на основе qsort
- RPN калькулятор
- RPN калькулятор на Bison
- Простая грамматика
- Задача «Расчёт сопротивления схемы»
- Простая реализация конечного автомата
- Использование аргументов командной строки
- Чтение и печать без использования stdio
Ниже приведена реализация конечного автомата, который прибавляет 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; } }

