作为嵌入式工程师,怎么写出效率高、思路清晰的C语言程序呢?
要用C语言的思维方式来进行程序的构架构建
要有良好的C语言算法基础,以此来实现程序的逻辑构架
灵活运用C语言的指针操作
虽然看起来以上的说法很抽象,给人如坠雾里的感觉,其实就是用C语言进行遇到问题、分析问题和解决问题的过程。
嵌入式工程师在编写C语言程序的时候,要针对遇到的问题进行程序构架构建。
比如我们要处理“猴子选大王”的经典问题:一群猴子,手拉手排成一个圆,从任意一只猴子开始从1开始报数,当遇到要排除的数(预先设定)时该猴子退出该圈,从下一只猴子开始继续从1报数,如此反复,最终剩下的猴子便是猴子的大王。
用C语言的思维方式进行程序构架构建程序分为三大部分:
a、数据获取,为了程序的运行,上面的问题要获得猴子的总数,从那只猴子开始和剔除的个数;
b、数据运算,需要从一堆数据中剔除相应的数据,注意逻辑的正确;
c、提高程序的运行速率,少用循环多用指针。
用C语言进行逻辑实现a、数据获取,通过printf和scanf进行参数的获取。
/*读入问题条件*/printf("inputtotalnum:");scanf("%d",n);printf("fromwhichnumbegin:");scanf("%d",k);if(kn
k==0){printf("pleaseinputtherightbeginnum");return1;}printf("inputtheoutnum:");scanf("%d",m);if(mn
m==0){printf("pleaseinputtherightdelnum");return2;}
同时注意异常时的处理,比如上面两个if语句就是异常情况的判断,每种异常情况对应不同的返回值,这样便于程序过程的调试和数据的合法性。
b、/*定义链表节点类型*/
typedefstructnode{intdata;structnode*next;}linklist;
构建循环链表进行“猴子”的圆圈建设。
/*创建循环链表,头节点也存信息*/head=(linklist*)malloc(sizeof(linklist));p=head;p-data=1;p-next=p;/*初始化循环链表*/for(i=2;i=n;i++){s=(linklist*)malloc(sizeof(linklist));s-data=i;s-next=p-next;p-next=s;p=p-next;}
通过该步骤后,head和p(present)都成了一个“猴子圈”的链表。在该链表的构建过程中需要注意一下几点:内存的开辟,此时遵守使用多少开辟多少的原则。
如果一下开辟过多,会引起内存泄露的问题,但是,这个小程序是不会遇到这种问题了。其次是熟悉循环链表的构建方法:链表的尾巴指向链表的头。这个时候有心的话还会联想到双向链表的情况。
c、/*找到第k个节点*/
p=head;for(i=1;i=k;i++){p=p-next;}
找到从第几个位置开始计数。此时,p指向开始的“猴子”。因为采用了链表方法,这个过程只需要