功能描述:用户连续输入正确的密码则会开锁,如果密码输入过程错误则锁会退回到初始状态,重新键入密码,即:用户只需要连续输入正确的密码即可开锁(输入错误不用撤销、也不用删除)
以上的分析和下面的代码来自《朱有鹏老师物联网大讲堂》的C语言高级篇,本人觉得采用状态机编程的这种思路比较新,值得回味,特保存以待后续参考学习。
#include <stdio.h>
// 给状态机定义状态集
typedef enum
{
STATE1,
STATE2,
STATE3,
STATE4,
STATE5,
STATE6,
STATE7,
}STATE;
int main(void)
{
int num = 0;
// current_state记录状态机的当前状态,初始为STATE1,用户每输入一个正确的
// 密码STATE就走一步,一直到STATE为STATE7后锁就开了;其中只要有一次用户
// 输入对不上就回到STATE1.
//假如密码是123456
STATE current_state = STATE1; // 状态机初始状态为STATE1
// 第一步:实现一个用户循环输入密码的循环
printf("请输入密码:\n");
while (1)
{
scanf("%d", &num);
printf("num = %d.\n", num);
// 在这里处理用户的本次输入
switch (current_state)
{
case STATE1:
if (num == 1)
{
current_state = STATE2; // 用户输入对了一步,STATE走一步
}
else
{
current_state = STATE1;
}
break;
case STATE2:
if (num == 2)
{
current_state = STATE3; // 用户输入对了一步,STATE走一步
}
else
{
current_state = STATE1;
}
break;
case STATE3:
if (num == 3)
{
current_state = STATE4; // 用户输入对了一步,STATE走一步
}
else
{
current_state = STATE1;
}
break;
case STATE4:
if (num == 4)
{
current_state = STATE5; // 用户输入对了一步,STATE走一步
}
else
{
current_state = STATE1;
}
break;
case STATE5:
if (num == 5)
{
current_state = STATE6; // 用户输入对了一步,STATE走一步
}
else
{
current_state = STATE1;
}
break;
case STATE6:
if (num == 6)
{
current_state = STATE7; // 用户输入对了一步,STATE走一步
}
else
{
current_state = STATE1;
}
break;
default:
current_state = STATE1;
}//switch语句
if (current_state == STATE7)
{
printf("锁开了.\n");
break;//跳出while循环
}
}//while(1)
return 0;
}