Язык Си в примерах/Простая реализация конечного автомата: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
(нет различий)

Версия от 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;
    }
}