状态机c语言编程
‘壹’ c语言程序设计例如一个信息管理系统(同时保存输入的信息),如何在完成子版块后返回到菜单
同鞋,你的描述让我有点懵逼,不过今天调bug比较郁闷,换换头脑尝试解答一下看的懂的部分……
关于return 和 exit 的区别:
exit是一个系统函数,功能是退出当前进程。return 是一个关键字,配合函数使用,代表返回,并不一定是退出。
你描述返回主菜单的意思,让人无法理解,但是菜单之间的切换方法很多,最常见的方法是使用状态机,具体可以网络搜索一下相关知识。
这里简单的给个伪代码:
enumMENU_ITEM
{
EXIT=0,
MAIN,
ITEM1,
ITEM2
};
MENU_ITEMmenu()
{
//一些逻辑
...
//跳转到1
returnITEM2;
}
MENU_ITEMmenu1()
{
//一些逻辑
...
//跳转到主菜单
returnMAIN;
}
MENU_ITEMmenu2()
{
//一些逻辑
...
//退出
returnEXIT;
}
voidmain()
{
MENU_ITEMchoose=EXIT;
scanf("%d",&choose);
while(choose)
{
caseMAIN:
//输出主菜单
choose=menu();
break;
caseITEM1:
//输出功能1
choose=menu1();
break;
caseITEM2:
//输出功能2
choose=menu2();
break;
}
}
‘贰’ 如何用c语言实现:a,b,c三个事件,依次进行,每到a时就执行事件1,再到b,再执行事件1,再c,再事件1.
典型的状态机结构,可以去网上找找有关的资料,大概的结构像这样
enum { state_A, state_B, state_C } state = state_A;
while(1)
{
switch ( state )
{
case state_A:
if ( event_A ) // 这里也可以用switch
{
action_1(); // 在某状态下发生某事件执行某个动作,并转入下个状态
state = state_B;
}
else if ( event_B )
{
}
else
{
}
break;
case state_B:
... ...
}
}
根据你的问题补充,可以这样划分状态
准备轮询1号机,等待1号机应答(已经轮询1号机,但1号机未应答),准备轮询2号机,等待2号机应答,准备轮询3号机,等待3号机应答,
或者分成3个状态加一个标志,
轮询1号机,轮询2号机,轮询3号机,加一个有无应答标志,
其实这两种分法没有本质区别。
程序框架大概的样子是这样
switch ( state )
case 准备轮询1号机:
发送轮询1号机的命令
state = 等待1号机的应答;
break;
case 等待1号机的应答;
判断1号机的应答状态,可能是正确、错误、超时,分别处理,并设置状态
正确:
state = 准备轮询2号机
错误:
state = 准备轮询1号机,重试
超时:
state = 准备轮询1号机,重试,具体做什么可以很灵活
‘叁’ C语言作业C/C++数学词法分析器。最好是用状态机做的,没有也没关系,我给出状态机的图,和分析器的线路图
我记得有个神奇的东西叫做bison&flex
嘛……只是这么一说你可以自己慢慢研究……
用来做作业好像不太道德啊=w=
‘肆’ 用单片机C语言怎么写用状态机实现按键控制LED灯闪烁这个程序
#include<STC12C52.H>
#defineucharunsignedchar
#defineuintunsignedint
sbitkey=P1^2;
sbitp1_6=P1^6;
voiddelay(uchardelay_time)
{
ucharn;
uintm;
for(n=0;n<delay_time;n++)
{
for(m=0;m<10000;m++);
}
}
voidkeyscan()
{
if(key==0)
{
delay(5);
if(key==0)
while(!key)
{
p1_6=0;
delay(20);
p1_6=1;
delay(20);
}
}
}
voidmain()
{
WDT_CONTR=0x3C;
while(1)
{
keyscan();
WDT_CONTR=0x3C;
}
}
这个功能可以用中断来实现,当然,现在我写的这个也可以实现。由于你用的晶振频率不知道,所以你自己修改一下延时时间,再把头文件改一下,就可以了,我试验了,可以实现改功能。
‘伍’ C语言状态机 swtich 按键切换问题。连键
如果想它停止继续判断,在要停止的语句后面加一个break就行了
‘陆’ 怎么用c语言写状态机呀请举例说明
c语言写状态机之前:
1、确定一共有多少种状态,这里的状态有开和关,细分还有say thankyou 和警告
2、确定状态之间的迁移条件
如果按照四种状态:开、关、说谢谢、警告,那么这四种状态之前的迁移条件很明显了
分两个函数:
1、检查是否需要迁移状态;
2、迁移状态.
遍历各种状态检查是否有状态需要发生迁移.一般用一个switch将各种状态列出,然后在各种状态里面用if检查是否需要迁移状态,如果需要迁移,做好标记.
再次遍历各种状态,检查哪些状态做了标记,迁移到新状态,并做相应的操作,比如进入关的时候,做关门动作。
典型的状态机结构:
enum { state_A, state_B, state_C } state = state_A;
while(1)
{
switch ( state )
{
case state_A:
if ( event_A ) // 这里也可以用switch
{
action_1(); // 在某状态下发生某事件执行某个动作,并转入下个状态
state = state_B;
}
else if ( event_B )
{
}
else
{
}
break;
case state_B:
... ...
}
}
‘柒’ 如何提高单片机,
单片机控制大部分是面向硬件的,关于这些物理硬件的控制,最重要的就是调节速度和精度,表现在单片机内部算法上,我认为就是时间和空间的合理运用,而这些对算法的要求是什么呢,或者说作为单片机开发者来说,应该怎么样考虑自己的单片机程序呢?
第一,程序结构
我知道你肯定不会想去仔细研究数据结构,那太抽象了。在这里我直接告诉你,基于“状态机”的程序结构更加适合单片机,确切的说是有限状态机。状态机编程技术将直接促使你解决程序的时间问题,并且程序结构可大可小,普通状态机和层次式状态机能让你对绝大多数项目手到擒来。当然状态机编程技术也是需要学习的,但这比你直接去学数据结构要轻松的多。
第二,使用适合的算法
我们编程时要明白一个道理,再多复杂的算法也不能证明你的程序是一个好程序,那什么才是呢?是简洁明了和可靠稳定。大道至简放在编程上不是一句空话,同样一个冒泡排序算法,有的人写出来死板的很,有的人却能独具效率,这是对算法的理解高度不同。我认为与其学习更为复杂的控制算法,不如加深自己对现有算法的理解。通样的PID算法程序,有的人能加上积分分离,有的人能用上环境自适应,这里面差别不可谓不大啊。
最后希望你能早日从自己的工作中形成自己独到的理解,精益求精。
‘捌’ C语言 我是初学者
函数,或者说子程序,追求的效果是高内聚、低耦合。简单点说,最好是一个子程序只完成一个功能。具体的细节,软件工程里面对这个问题有相关讨论。
初学者,可以试着这样做:
首先,把很长的主函数划分成几个子程序,分的生硬一点也没关系。
然后,试着给每个子程序起一个名字,尽量做到名符其实。
回过头来,用这几个子程序的名字去写主程序,看主程序是否看起来还算合理。如果看着哪里不舒服,就试着倒回去重新划分、重新起名。多来几次,逐渐调整,最后你会觉着主程序看起来舒服多了,因为你的逻辑结构变得清晰了。
注意,最终的主程序,我们把它称为程序的构架,它可能是一个超级循环,也可能是一个状态机,也可能是别的什么结构,比如,我们通常称Windows程序的构架是事件驱动的构架,按键、鼠标都是事件。当然,设计一个好的构架不是一个简单的事,事实上,这应该是系统分析人员应该考虑的,这需要经验,海量的经验,经过实践检验的经验。
初学者,只要记住一个大的原则,一个子程序只完成一个功能。
‘玖’ C语言 状态机代码 怎么写
刚好前段时间写了一个简单协议的状态机,代码就不写了,说一下大概吧
1、确定一共有多少种状态,这里的状态有开和关,细分还有say thankyou 和警告
2、确定状态之间的迁移条件
如果按照四种状态:开、关、说谢谢、警告,那么这四种状态之前的迁移条件很明显了
分两个函数:1、检查是否需要迁移状态;2、迁移状态。
遍历各种状态检查是否有状态需要发生迁移。一般用一个switch将各种状态列出,然后在各种状态里面用if检查是否需要迁移状态,如果需要迁移,做好标记。
再次遍历各种状态,检查哪些状态做了标记,迁移到新状态,并做相应的操作,比如进入关的时候,做关门动作
刚才忘记说了,还有一个运转状态机函数,main函数在被触发的情况下调用运转函数,触发条件有:投币,人进入。