有限状态机

有限状态机 在计算机中是一份能够运动的代码。函数

这份代码有 有限个状态,里面的变量只能有 有限个状态,好比:spa

// 定义枚举类型,共 9 种状态
typedef enum{
	S1,	
	S2,		
	S3,		
	S4,		
	S5,		
	S6,
	S7,
	S8,
	S9,
}STATE;

STATE cur_s = S1;
// 枚举类型的变量 cur_s 就只有 有限个状态(9个)。

另外有限状态机能从外部接受信号和信息输入,接受后会综合考虑当前本身的状态和用户输入的信息跳转到另外一个状态。.net

 

有限状态机分为 Moore 和 Mealy 型。code

Moore:输出只与当前状态有关(与输入无关)。blog

Mealy:输出结合了当前状态、输入信号,状态机接收到一个输入信号须要跳转为下一个状态,下一个状态具体是 哪一个状态 ,取决于 当前状态 和 输入值。input

经常使用的有限状态机考虑的:当前状态、外部输入、下一个状态,也就是 Mealy 型。博客

用 C 实现一个简单的有限状态机,最好的取材是地址。it

XX省 XX市 XX区 XX街道 XX号io

若是在 输入省前 先输入 市 ,状态机就归零,在输入街道前 输入号也是如此。class

简单起见,重在理解。

把上面的地址 换为 一串数字,要按照顺序输入 41739364 才能到达状态 S9,结束程序。

看一下代码吧,思想实现大概就是这样。

#include<stdio.h>
// 俩个宏定义,想少写点代码,为了可读性您能够补上。
#define S(n) { cur_s = S##n, print(cur_s); }    // 若是输入匹配,状态加一
#define Than else{ cur_s = S1; }                // 不然,状态回到 S1

typedef enum{
	S1,	
	S2,		
	S3,		
	S4,		
	S5,		
	S6,
	S7,
	S8,
	S9,
}STATE;

void print(STATE str)                            // 打印函数,提示也能够不用
{
 	if(  str == S1 )
	    puts("等级归零,从新输入");
	 else 
	    puts("等级+1");
}

int main(int argc, const char *argv[])
{
	puts("input num: ");
	STATE cur_s = S1;                        // 起始状态
	int n;
	while(1){	
		scanf("%d", &n);
		
		switch(cur_s)                    // 有限状态机的代码实现通常采用 switch 语句 
		{
			case S1:    if( n == 4 ) S(2) Than break;
			case S2:    if( n == 1 ) S(3) Than break;
			case S3:    if( n == 7 ) S(4) Than break;
			case S4:    if( n == 3 ) S(5) Than break;
			case S5:    if( n == 9 ) S(6) Than break;
			case S6:    if( n == 3 ) S(7) Than break;
			case S7:    if( n == 6 ) S(8) Than break;
			case S8:    if( n == 4 ) S(9) Than break;
			default:	S(0)
		}
		
		if( cur_s == S9 )
			puts("博客地址正确哦, https://blog.csdn.net/qq_41739364"), break;
		
	}

	return 0;
}

若是只使用 第一个宏 S(n) ,输入数字不对应时,还能够在原状态一直输入下一个状态;若是俩个宏一块儿使用,那么中途只要有一个数字匹配不上,状态机的状态初始化,须要又从头开始输入。