Конечный автомат в C

Я пытаюсь создать простой конечный автомат в C, и я совершенно не понимаю, как начать. Я пытался смотреть онлайн, но ничего не прояснило для меня.

Моя цель - проверить, является ли строка восьмеричной, шестнадцатеричной или десятичной.

Чтобы быть восьмеричным, строка должна начинаться с 0, за которым следуют цифры 0-7. Чтобы быть шестнадцатеричным, строка должна начинаться с 0x или OX, а затем (af, AF, 0-9)

Моя попытка создания штатов будет такой:

typedef enum  {
   ERROR,
   OCTAL,
   HEX,
   DECIMAL
} stringStates;

Теперь я бы использовал оператор switch, чтобы пройти всю строку и переключаться между различными состояниями, пока я не определю, к какому состоянию он принадлежит.

 while (current_Position<=end_String-1)
 {
    switch( "input something here")
      {
        case 0:
             //process string
             break;
        case 1:
             //process string
             break;

         case 2:
             //process string
             break;
         case 3:
             //process string
             break;
         default:
             break;
      }
  }

Эта концепция все еще очень нова для меня, и мне трудно понять ее реализацию. Если кто-то может пролить немного света, это будет высоко ценится.

1 ответ

Решение

Это довольно прямой вопрос, и решение также очень простое.

У меня есть 7 состояний, а именно от 0 до 6, как показано на диаграмме.0 является начальным состоянием. 3,4,5 могут быть конечными состояниями, а 6 - мертвым состоянием.

состояние 0: начальное состояние, и из этого состояния мы можем встретить только следующие символы:

0 или О или 1-9

если есть какой-либо другой символ, то есть ошибка и нет необходимости обрабатывать дальше.

состояние 1: если символ из состояния 0 равен 0, то это следующее состояние и

если char из этого состояния равен x, то строка является шестнадцатеричной (state=4), и дальнейшая обработка не требуется, так как любой символ может следовать.

если char из этого состояния 0-7, то строка восьмеричная (состояние = 5), и мы обрабатываем до конца строки, чтобы увидеть, получим ли мы какой-либо символ, отличный от 0-7, если мы это сделаем, то ошибка будет в виде недопустимой строки и нет необходимости обрабатывать дальше, как только мы его получим.

состояние 2: если символ из состояния 0 равен O, то это следующее состояние, и из этого состояния, если следующий символ равен X, тогда строка является шестнадцатеричной (состояние = 4), и нет необходимости обрабатывать дальше, если это не так, то возникает ошибка.

состояние 3: если символ из состояния 0 равен 1-9, то строка является десятичным числом (состояние =3), и мы обрабатываем до конца строки, чтобы увидеть, получим ли мы какой-либо символ, отличный от 0-9, если мы это сделаем, то ошибка есть как недопустимая строка и нет необходимости обрабатывать дальше, как только мы ее получим.

состояние 4: шестнадцатеричное число

состояние 5: восьмеричное число

состояние 6: ошибка означает недопустимую строку

Вот код Си. Я взял длину строки равной 9, просто для простоты и ничего больше.

#include <stdio.h>
#include <stdlib.h>
int main()
{
  char *a="066676777";
  int state=0;int i=0;
  while(state!=6&&i<9)
  {
      switch(state)
      {
      case 0:
        if(a[i]=='0')
            state=1;
        else if(a[i]=='O')
            state=2;
        else if(a[i]>=49&&a[i]<=57)
            state=3;
        else {state=6;i=9;}
        break;
      case 1:
         if(a[i]=='x')
         {
              state=4;i=9;
         }
         else if(a[i]>=48&&a[i]<=55)
         {
             state=5;
             while(i<9)
                if(a[i]>=48&&a[i]<=55)
                 ++i;
                else {state=6;i=9;}
         }
         else {state=6;i=9;}
         break;
      case 2:
          if(a[i]=='X')
          {
              state=4;i=9;
          }
          else {state=6;i=9;}
         break;
      case 3:
          while(i<9)
            if(a[i]>=48&&a[i]<=57)
                ++i;
            else {state=6;i=9;}
            break;
      default:
        printf("please select correct initial state");
         break;
      }
      ++i;
    }
    if(state==3)
      printf("it is a decimal number");
    else if(state==4)
      printf("it is a hexadecimal number");
    else if(state==5)
      printf("it is a octal number");
    else printf("error encountered as invalid string");
}
Другие вопросы по тегам