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

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску

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


  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

Ниже приведена реализация конечного автомата, который прибавляет 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;
     }
 }