C语言实现状态机

//状态机解决开锁问题
//正确密码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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coder_Alger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值