【问题标题】:Finite State Machine In CC语言中的有限状态机
【发布时间】:2015-09-15 00:56:50
【问题描述】:

我正在尝试用 C 创建一个简单的有限状态机,但我对如何开始感到很困惑。我尝试在网上查找,但并没有真正为我解决这个问题。

我的目标是检查字符串是八进制、十六进制还是十进制。

要为八进制,字符串必须以 0 开头,后跟数字 0-7。 要为十六进制,字符串必须以 0x 或 OX 开头,后跟 (a-f, A-F, 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;
      }
  }

这个概念对我来说仍然很新,我很难理解它的实现。如果有人能解释一下,将不胜感激。

【问题讨论】:

标签: c switch-statement state-machine


【解决方案1】:

这是一个非常直接的问题,解决方案也很简单。

如图所示,我有 7 个状态,即从 0 到 6。0 是初始状态。 3,4,5 可能是最终状态,6 是死亡状态。

state 0:初始状态,从这个状态我们只能遇到以下字符:

0O1-9

如果有任何其他字符,则存在错误,无需进一步处理。

状态 1:如果状态 0 中的字符为 0,那么这是下一个状态并且

如果此状态的字符为 x,则字符串为十六进制 (state=4),无需进一步处理,因为任何字符都可以跟随。

如果此状态的字符为 0-7,则字符串为八进制(状态 = 5),我们处理到字符串的末尾以查看是否得到任何不同于 0-7 的字符,如果我们这样做了,则错误为无效的字符串,一旦我们得到它就不需要进一步处理。

状态 2:如果状态 0 中的 char 为 O,则这是下一个状态,如果下一个 char 为 X,则此状态下的字符串为十六进制 (state=4),无需进一步处理,如果不是,则存在错误。

状态 3:如果状态 0 的字符是 1-9,则字符串是十进制数(状态 = 3),我们处理到字符串的末尾,看看我们是否得到任何不同于 0 的字符-9,如果我们这样做了,那么错误是无效字符串,一旦我们得到它就不需要进一步处理。

状态4:十六进制数

状态 5:八进制数

状态6:错误表示无效字符串

这是 C 代码。我将字符串的长度设为 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");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    相关资源
    最近更新 更多