完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
在嵌入式软件中,逻辑处理是最基本的操作,如何能使程序简洁清晰?如何能使程序高效运行?下面记录一点自己的心得。 1.基本的逻辑 逻辑的定义就必须是严谨准确的,一段好的逻辑程序应该能够消除歧义,不遗漏任何条件或者重复判断。if/else这种最简单的不用说了,如下程序考虑一个if/else if/else的示例。 if(A) { } else if(B) { } else if(C) { } ... else { } A、B、C的条件必须是无交叉的,确保判断的排他性。 正常情况的处理放在if或者else if中,常用情况的处理放在靠前的位置,else留到最后,可作为错误的处理等。组成else if的完整语句,else是必不可少的,往往在很多实际中有很多else if,强烈建议在最后加上else,即使逻辑已经处理完毕,在else中什么也不做,也应该留下一条空的语句。 对于复杂逻辑的简化处理,有德摩根定律、卡诺图等来辅助分析,就不细说了。 2.余数与倍数的应用 对于周期性的逻辑控制,余数和倍数就能很好的表示了。 考察一个题目,五个灯一排,按下键则顺次闪其中一个灯,利用取余则很好实现这个控制逻辑,逻辑控制如下: int key=0; void enter(){ key++; } void control(key){ key=key%5; if(key==1) {//turn on light 1 } if(key==2) {//turn on light 2 } if(key==3) {//turn on light 3 } if(key==4) {//turn on light 4 } else {//turn on light 5 } } 当然上面的实现方式有很多种,但是余数的使用体现了通过一次计算就可以对数进行分组的思想。在处理较大的数字分组时,余数就很有用了。考察题目:今天是周日,一年(365天)后是周几? 只需要365对7取余即可得出。取余结果0,1, 2,3,4,5,6 分别代表周日,周一,周二,周三,周四,周五,周六。365%7=1,因此结果是周一。 倍数的使用就比较简单了,考察一个二层的菜单操作,如何表征菜单状态呢?这里给一个简单的思路。 一级菜单使用0x100,0x200,0x400,0x800,0x100,···,二级菜单在其相应的一级菜单里面自加即可。这里可以有255个子项,需要增加的扩充位数就行,当然自加需要设定一个限定值。如此使用简单的&运算就可以确定菜单状态。 2.查表 当有大量的else if时,程序看起来不简洁,维护也比较麻烦。这里考虑一种表的实现方法。 考察题目一年中每个月份有多少天? 一种常见的解决可以是: int mouth ; int days; if(mouth=1) days=31; else if(mouth=2) days=28;//暂时不考虑闰月 else if(mouth=3) days=31; else if(mouth=4) days=30; else if(mouth=5) days=31; else if(mouth=6) days=30; else if(mouth=7) days=31; else if(mouth=8) days=31; else if(mouth=9) days=30; else if(mouth=10) days=31; else if(mouth=11) days=30; else if(mouth=12) days=31; else ; 实现这个功能,只需要创建一张表来解决。 int days; int mouth; int dayspermouth[]= {31,28,31,30,31,30,31,31,30,31,30,31}; days=dayspermouth[mouth-1]; 用这种方法,考虑闰年也会比较简单,只需要将这张表改为二维的即可。 当然在算法中表还可以有很多高级用法,这里暂时不讨论了。 |
|
|
|
只有小组成员才能发言,加入小组>>
702 浏览 0 评论
1111 浏览 1 评论
2476 浏览 5 评论
2811 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2654 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
658浏览 9评论
666浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
788浏览 6评论
633浏览 5评论
677浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 05:16 , Processed in 1.004326 second(s), Total 51, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号