状态机

状态机(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;

}

 

 

感觉之前读过一篇文章,

文章中说,利用状态机可以写大循环式的程序框架。(这样可以实现一些多线程的编程??)

 

posted @ 2019-07-15 22:38  GXTon  阅读(1106)  评论(0编辑  收藏  举报