如何使用c语言实现状态机算法
如何使用c语言实现状态机算法
1.C语言实现简单的状态机
1.1、题目:开锁状态机。
功能描述:用户连续输入正确的密码则会开锁,如果密码输入过程错误则锁会退
回到初始状态重新计入密码,即:用户只需要连续输入出正确的密码即可开锁(输
入错误不用撤销、也不用删除)。
1.2、题目分析
我们平时写程序都是顺序执行的,这种程序有个特点:程序的大体执行流程
是既定的,程序的执行是遵照一定的大的方向有迹可寻的。但是偶尔会碰到这样
的程序:外部不一定会按照既定流程来给程序输入信息,而程序还需要完全能够
接收并响应外部的这些输入信号,还要能做出符合逻辑的输出。
用状态机来实现密码锁相当于密码序列一旦输错,需要全部删除后重新输
入。即用户输错引起状态机将锁置为初始状态,用户下一次输入作为下一组密码
的起始部分。
假设密码序列为:N1N2N3N4N5N6,给出流程图:
分析流程图
#include
// 给状态机定义状态集
typedef enum
{
STATE0,
STATE1,
STATE2,
STATE3,
STATE4,
STATE5,
STATE6,
}STATE;
//利用枚举类型来表达状态机的所有可能状态。具体到本题目,即开锁已经
到哪一步或者该执行哪一步。
Int main(void)
{
int num 0;
// current_state记录状态机的当前状态,初始为STATE1,
//用户每输入一个正确的
// 密码STATE就走一步,直到STATE为STATE6后锁就开了;
//其中只要有一次用户
// 输入对不上就回到STATE1.
STATE current_state STATE0;// 状态机初始状态为STATE1
// 第一步:实现一个用户循环输入密码的循环
printf("请输入密码,密码正确开锁.\n");
while (1)
{
scanf("%d", &num);
printf("num %d.\n", num);// 提示信息,在这里处理用
//户的本次输入
switch (current_state)
{
case STATE0:
if (num 1)
{
current_state STATE1; // 用户输入对了一步,
//STATE走一步
}
else
{
current_state STATE0;
}
break;
case STATE1:
if (num 2)
{
current_state STATE2; // 用户输入对了一步,
//STATE走一步
}
else
{
current_state STATE0;
}
break;
case STATE2:
if (num 3)
{
current_state STATE3; // 用户输入对了一步,
//STATE走一步
}
else