C语言实现有限状态机FSM

本文介绍了有限状态机(FSM)的概念,强调了它在处理有限内存计算过程和语言类中的应用。通过百度百科的定义,文章指出状态机具有有限状态、条件触发的迁移和状态相关动作。在何时使用状态机方面,当需要根据条件进行大量判断以转换状态时,状态机是理想选择。接着,作者展示了如何用C语言通过查表法实现复杂状态机,以解决if-else或switch-case结构维护困难的问题,并给出了在VS2019环境下运行的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        好久没写博客了,先来段废话,状态机这个词是在我实习的那一年了解到的,当时有个项目要根据采集到的数据来显示不同的LED指示状态,领导和同事们当时就说可以用状态机来做,当时我也有疑惑,状态机是什么?只能怪上大学那会太怠惰了,只学了课本上的知识,没有去扩展课外的知识点,如果正在读大学,请先去了解好你们学的专业以后能找什么工作(百度以及求职网站都可以),了解后就可以针对性的去学一些知识,这样应该就不会就像我实习那会一样,除了老师教的什么都不会,什么都不懂。感慨一下,废话少说,进入正题。

一、什么是状态机

先抛个问题,什么是状态机(FSM)?

我们来看看百度百科对FSM是怎么解释的。


有限状态自动机(FSM "finite state machine" 或者FSA "finite state automaton" )是为研究有限内存的计算过程和某些语言类而抽象出的一种计算模型。有限状态自动机拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字串决定执行哪个状态的迁移。有限状态自动机可以表示为一个有向图。有限状态自动机是自动机理论的研究对象。


从上面这段定义可以看出:

1.状态的数量是有限的。

2.状态的迁移由条件触发。

#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 ; } } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值