- #include <stdio.h>
- #include <stdbool.h>
- // 定义电闸门状态
- typedef enum {
- DOOR_CLOSED,
- DOOR_OPEN
- } DoorState;
- // 电闸门事件
- typedef enum {
- CARD_SWIPED,
- PERSON_PASSED,
- NO_ACTION
- } DoorEvent;
- // 状态机处理函数原型
- void handleEvent(DoorState* state, DoorEvent event);
- // 主程序入口
- int main() {
- DoorState state = DOOR_CLOSED; // 初始状态设置为门关闭
- DoorEvent event;
- // 模仿事件触发
- // 情景1: 刷卡时门关闭
- event = CARD_SWIPED;
- handleEvent(&state, event);
- // 情景2: 关闭状态下未刷卡(触发警报)
- event = NO_ACTION;
- handleEvent(&state, event);
- // 情景3: 开门状态下人通过
- event = PERSON_PASSED;
- handleEvent(&state, event);
- // 情景4: 开门状态下再次刷卡
- event = CARD_SWIPED;
- handleEvent(&state, event);
- return 0;
- }
- void handleEvent(DoorState* state, DoorEvent event) {
- switch (*state) {
- case DOOR_CLOSED:
- if (event == CARD_SWIPED) {
- *state = DOOR_OPEN; // 改变状态为门打开
- printf("门现在打开。\n");
- }
- else if (event == NO_ACTION) {
- printf("警告!请刷卡!\n"); // 保持状态,只是给出警告
- }
- break;
- case DOOR_OPEN:
- if (event == PERSON_PASSED) {
- *state = DOOR_CLOSED; // 改变状态为门关闭
- printf("人已进入,门现在关闭。\n");
- }
- else if (event == CARD_SWIPED) {
- printf("门已经打开。\n"); // 保持门开状态
- }
- break;
- default:
- printf("未知状态.\n");
- break;
- }
- }