有限状态机C语言实现

本文介绍了如何使用C语言设计和实现有限状态机(FSM),通过函数指针表示状态,根据接收到的事件(EVENT)来决定状态的转换。通过示例展示了状态机在处理不同事件时的状态变化。
摘要由CSDN通过智能技术生成

有限状态机(FSM)是设计和实现事件驱动程序内复杂行为组织原则的有力工具。

设计思路:

(1)用函数指针表示状态;

(2)函数指针函数接收事件(EVENT),根据(EVENT)决定下个状态;

(3)函数指针函数返回下个状态的函数指针。

利用强制类型转换,实现函数指针函数的原型。

#include <stdio.h>

typedef void (*state_ret)(int event);
typedef state_ret (*state)(int event);

// 申明状态函数
state_ret STATE1(int event);
state_ret STATE2(int event);
state_ret STATE3(int event);

// 事件列表
enum EVENT_NUM {
    EVENT1,
    EVENT2,
    EVENT3,
    EVENT4,
};

int main(void) {
	int i;
	int event;
	state curState = STATE1; 
	for (i = 0; i < 5; i++) {
		switch(i % 5) {
			case 0: event = EVENT1; break;
			case 1: event = EVENT2; break;
			case 2: event = EVENT3; break;
			case 3: event = EVENT4; break;
			case 4: event = EVENT2; break;
			default: break;
		}
		// 运行当前状态函数,返回下一状态函数指针
		curStat
#include int main() { int state_key = 1; //钥匙状态 为1时钥匙区有钥匙,为时钥匙区 无钥匙 int state_hold = 0; // 钥匙持有状态 为1时持有钥匙,为时 未持有钥匙 int state_door = 0; //门状态 0:关闭 1:打开 int state_lock = 1; //上锁状态 1:上锁 0:解锁 int order; // 用于存放用户输入指令 printf("this is a game.\n"); printf ("if you want to OPEN THE DOOR ,input 1\n"); printf ("if you want to CLOSE THE DOOR ,input 2\n"); printf ("if you want to LOCK THE DOOR ,input 3\n"); printf ("if you want to UNLOCK THE DOOR,input 4\n"); // printf ("if you want to LOCK THE DOOR ,input 5\n"); printf("please input the order\n"); while(1) { scanf("%d",&order); // if(order!=(1||2||3||4)) // { // printf("worng input ,please input again.\n"); // continue; // } switch(order) { case 1 : if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_door=1; break; case 2: if(state_door==0) { printf("the door has been closed before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_door=0; break; case 3: if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_lock=1; break ; case 4: if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==0) { printf("the door has not been lock\n"); break; } state_lock=0; break ; } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值