状态机的原理就不说了,先给出状态机的转换图,很简单实现的思路是这样的:1、用函数指针表示状态(状态函数)。2、状态函数接受一个参数(event),并根据event决定下一个状态。3、状态函数返回一个函数指针,此函数指针的类型也是状态函数指针。即状态函数返回一个指向下一个状态函数的指针。4、由于返回值是和原函数相同类型的函数指针,要
每个父类
状态
机
内部有若干个子
状态
机
(可自由添加更多子类
状态
机
)
二、直接上代码
/****************************************************************************
作者:小鱼儿飞丫飞
日期:2020-6-19
文件名:FSM层次
状态
机
头文件
*************************************************************
2、
状态
函数接受一个参数(event),并根据event决定下一个
状态
。
3、
状态
函数返回一个函数指针,此函数指针的类型也是
状态
函数指针。即
状态
函数返回一个指向下一个
状态
函数的指针。
4、由于返回值是和原函数相同类型的函数指针,要
确定的
有限
状态
自动
机
有限
自动
机
作为一种识别装置,能准确的识别正规集。一个确定的
有限
状态
自动
机
M是一个五元组:M={K,Σ,f,S,Z}M={K,Σ,f,S,Z}M=\left \{ K,\Sigma ,f,S,Z \right \}
K是一个有穷集,它的每一个元素成为一个
状态
。
ΣΣ\Sigma是一个有穷字母表,它的每个元素称为一个输入符号,所以也可以称ΣΣ\Sigma为输入符号表。
f是...
现态:是指当前所处的
状态
。
条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次
状态
的迁移。
动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的
状态
,也可以仍旧保持原
状态
。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新
状态
。
次态:条件满足后要迁往的新
状态
。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的...
{ 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 ;
有限
状态
机
是一种非常常见的计算
机
科学概念,可以用于许多不同的应用程序。在C
语言
中,可以使用结构体和函数指针来
实现
有限
状态
机
。具体
实现
方式可以参考以下代码:
typedef struct {
int state;
void (*action)();
} State;
void state1() {
printf("State 1\n");
void state2() {
printf("State 2\n");
void state3() {
printf("State 3\n");
void state4() {
printf("State 4\n");
void transition(State *states, int currentState) {
states[currentState].action();
currentState = states[currentState].state;
int main() {
State states[] = {
{1, state1},
{2, state2},
{3, state3},
{0, state4}
int currentState = 0;
while (currentState != 4) {
transition(states, currentState);
return 0;
这段代码定义了一个
有限
状态
机
,其中包含了四个
状态
和对应的动作函数。在主函数中,我们使用一个循环来不断执行
状态
转移,直到达到最终
状态
。
先移项:xxxx xxxx = 0000 0000-0000 1110。
可得出:xxxx xxxx = (借位 1) 1111 0010。
取八位:xxxx xxxx = 1111 0010。
因此,[-14]补码 = 1111 0010。
《《《 负数的补码,就是这么推出来的! 》》》
补码,和 “符号位原码反码取反加一”,
一丁点的关系,都没有!
----------------------
实际上,任意负数(-X)的补码,都是:0 - X。
你用二进制简单算一下,立刻就能得到结果。
(-128 的 8 位补码,也就是这样求出来的。)
同理,任意正数(+X)的补码,也都是:0 + X。
这还用算? 0 + X,不就是 X 吗?
即,正数的补码,就是 X 本身!
求补码,就是这么简单!
8位有符号数的补码表示范围
做而论道_CS:
整理:C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用
说不行其实也还行:
csdn代码片教程
jessezappy: