//状态机解决开锁问题
//正确密码123456
//必须连续输入正确密码才能开锁
//输错一个退回到原始状态
#include <stdio.h>
enum STATES{
STATE0 = 0,
STATE1 = 1,
STATE2 = 2,
STATE3 = 3,
STATE4 = 4,
STATE5 = 5,
STATE6 = 6
};
int main()
{
int state_current = STATE0;
int num = 0;
printf("请输入开锁密码:\n");
while (1)
{
scanf("%d", &num);
printf("num=%d\n", num);
switch (state_current)
{
case STATE0:
if(1 == num)
{
state_current = STATE1;
}
else
{
state_current = STATE0;
}
break;
case STATE1:
if(2 == num)
{
state_current = STATE2;
}
else
{
state_current = STATE0;
}
break;
case STATE2:
if(3 == num)
{
state_current = STATE3;
}
else
{
state_current = STATE0;
}
break;
case STATE3:
if(4 == num)
{
state_current = STATE4;
}
else
{
state_current = STATE0;
}
break;
case STATE4:
if(5 == num)
{
state_current = STATE5;
}
else
{
state_current = STATE0;
}
break;
case STATE5:
if(6 == num)
{
state_current = STATE6;
}
else
{
state_current = STATE0;
}
break;
default:
state_current = STATE0;
break;
}
if(state_current == STATE6)
{
printf("锁开了\n");
break;
}
}
return 0;
}
//以下是一个简单的层次状态机的C语言示例,模拟一个简单的电梯控制系统:
#include <stdio.h>
// 定义状态类型
typedef enum { S_IDLE, S_MOVING, S_OPENING, S_CLOSING, S_WAITING} State;
// 定义事件类型
typedef enum { EV_CALL, EV_DOOR_OPEN, EV_DOOR_CLOSED, EV_TIMER_EXPIRED } Event;
// 状态机上下文
typedef struct {
State state; // 当前状态
int floor; // 当前楼层
} ElevatorContext;
// 状态机处理函数
void handleEvent(ElevatorContext *ctx, Event event) {
switch (ctx->state) {
case S_IDLE:
if (event == EV_CALL) {
ctx->state = S_MOVING;
printf("Elevator is moving to the requested floor.\n");
}
break;
case S_MOVING:
if (event == EV_TIMER_EXPIRED ) {
ctx->state = S_WAITING;
printf("Elevator is waiting for the next command.\n");
}
break;
case S_WAITING:
if (event == EV_CALL) {
ctx->state = S_CLOSING;
printf("Closing the door.\n");
}
break;
case S_CLOSING:
if (event == EV_DOOR_CLOSED) {
ctx->state = S_MOVING;
printf("Door is closed. Moving to the next floor.\n");
}
break;
case S_OPENING:
if (event == EV_DOOR_OPEN) {
ctx->state = S_IDLE;
printf("Door is open.\n");
}
break;
}
}
int main()
{
ElevatorContext elevator = {S_IDLE, 1}; // 初始状态为空闲,初始楼层为1
// 模拟电梯事件序列
handleEvent(&elevator, EV_CALL); // 接收到呼叫
handleEvent(&elevator, EV_TIMER_EXPIRED); // 定时器超时
handleEvent(&elevator, EV_DOOR_OPEN); // 门打开
handleEvent(&elevator, EV_CALL); // 再次接收到呼叫
handleEvent(&elevator, EV_DOOR_CLOSED); // 门关闭
return 0;
}
文章评论