状态机

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

}

 

 

感觉之前读过一篇文章,

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

 

转载于:https://www.cnblogs.com/chulin/p/11192059.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值