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

Язык Си в примерах


  1. Компиляция программ
  2. Простейшая программа «Hello World»
  3. Учимся складывать
  4. Максимум
  5. Таблица умножения
  6. ASCII-коды символов
  7. Верхний регистр
  8. Скобочки
  9. Факториал
  10. Степень числа
  11. Треугольник Паскаля
  12. Корень уравнения
  13. Система счисления
  14. Сортировка
  15. Библиотека complex
  16. Сортировка на основе qsort
  17. RPN-калькулятор
  18. RPN-калькулятор на Bison
  19. Простая грамматика
  20. Задача «Расчёт сопротивления схемы»
  21. Простая реализация конечного автомата
  22. Использование аргументов командной строки
  23. Чтение и печать без использования stdio
  24. Декодирование звукозаписи в формате ADX
  25. Другие примеры
  26. 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;
     }
 }