状态机
状态机(FSM),它其实是一种思想,即一种套路。
这种思想就是,根据输入来改变状态。
常常用在电路设计中(FPGA中也有用到),也会用在程序编写中。
状态机分为两种:
1,输出状态与输入没有关系:比如有好几个按键,无论按下哪一个开关,小灯都会亮,无论你关掉哪个开关,小灯都会灭。
2,输出状态与输入有关系:比如,按下一号开关红灯亮;按下二号开关路灯亮;按下三号开关黄灯亮。
状态机主要用于解决一些不是既定的程序。比如用于解决一些互动的程序。
既定的程序是死的,我们能够根据时间判断出程序下一步的变化,但是互动的程序,需要根据人的输入来决定下面的程序走向。
举一个状态机的例子:(电路如何搭建状态机,这里就不演试了,因为咱是编软件的。)
题目:开锁状态机
功能描述:用户连续输入正确的密码则会开锁,
如果密码输入过程错误则锁会退回到初始状态,重新计入密码。
即用户只需要连续输入出正确的密码才可以开锁,不可以输入错误,不能撤销和删除。
#include<stdio.h>
typedef enum
{
STATE1,
STATE2,
STATE3,
STATE4,
STATE5,
STATE6,
STATE7,
}STATE;
int main (void)
{
int num=0;
STATE current_state=STATE1;
//第一步:实现一个用户循环输入密码的循环。
while(1)
{
switch()
{
case STATE1:
if(num==1)
{
current_state=STATE2; //用户输入对了一步,STATE走一步。
}
else
{current_state=STATE1;}
case STATE2:
if(num==2)
{
current_state=STATE3; //用户输入对了一步,STATE走一步。
}
else
{current_state=STATE1;}
case STATE3:
if(num==3)
{
current_state=STATE3; //用户输入对了一步,STATE走一步。
}
else
{current_state=STATE1;}
case STATE4:
if(num==4)
{
current_state=STATE4; //用户输入对了一步,STATE走一步。
}
else
{current_state=STATE1;}
case STATE5:
if(num==5)
{
current_state=STATE5; //用户输入对了一步,STATE走一步。
}
else
{current_state=STATE1;}
case STATE6:
if(num==6)
{
current_state=STATE6; //用户输入对了一步,STATE走一步。
}
else
{current_state=STATE1;}
case STATE7:
if(num==7)
{
current_state=STATE7; //用户输入对了一步,STATE走一步。
}
else
{current_state=STATE1;}
default:
current_state=STATE1;
}
if (current_state==STATE7)
{
print("锁开了。\n");
break; //跳出while(1)
}
}
return 0;
}
感觉之前读过一篇文章,
文章中说,利用状态机可以写大循环式的程序框架。(这样可以实现一些多线程的编程??)