Язык Си в примерах/Простая реализация конечного автомата: различия между версиями
Содержимое удалено Содержимое добавлено
Karagota (обсуждение | вклад) Нет описания правки |
(нет различий)
|
Версия от 20:40, 28 марта 2006
Ниже приведена реализация конечного автомата, который прибавляет 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; } }