Конечный автомат в 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");
}