当前位置:首页 > 技术学院 > 技术前线
[导读]作为嵌入式工程师,写一个效率高效,思路清晰的C语言程序是我们的终极目标,那么,怎么才能写好这样的程序呢?首先,我们要用C语言的思维方式来进行程序的构架构建;其次,要有良好的C语言算法基础,以此来实现程序的逻辑构架;最后,灵活运用C语言的指针操作。

作为嵌入式工程师,写一个效率高效,思路清晰的C语言程序是我们的终极目标,那么,怎么才能写好这样的程序呢?首先,我们要用C语言的思维方式来进行程序的构架构建;其次,要有良好的C语言算法基础,以此来实现程序的逻辑构架;最后,灵活运用C语言的指针操作。

C语言作为一种实践技术也是类似的。“最好的C语言程序”并不是说编码多么优美、算法多么简洁,而是它能够用有限的代码实现一个高效、实用的新功能。如果这个功能既有创新性,又被广泛采纳,那么就是最好的代码。

虽然看起来以上的说法很抽象,给人如坠雾里的感觉,其实就是用C语言进行遇到问题、分析问题和解决问题的过程。那么,下文将给你介绍如何耍这“三板斧”。

嵌入式工程师在编写C语言程序的时候,要针对遇到的问题进行程序构架构建。

比如我们要处理“猴子选大王”的经典问题:一群猴子,手拉手排成一个圆,从任意一只猴子开始从1开始报数,当遇到要排除的数(预先设定)时该猴子退出该圈,从下一只猴子开始继续从1报数,如此反复,最终剩下的猴子便是猴子的大王。那么,这“三板斧”该如何使用呢?

第一板斧,用C语言的思维方式进行程序构架构建

程序分为三大部分:

a、数据获取,为了程序的运行,上面的问题要获得猴子的总数,从那只猴子开始和剔除的个数;

b、数据运算,需要从一堆数据中剔除相应的数据,注意逻辑的正确;

c、提高程序的运行速率,少用循环多用指针。

第二板斧,用C语言进行逻辑实现

a、 数据获取,通过printf和scanf进行参数的获取。

/* 读入问题条件 */

printf("input total num:");

scanf("%d", &n);

printf("from which num begin:");

scanf("%d", &k);

if(k>n||k==0)

{printf("please input the right begin num");

return 1; }

printf("input the out num:");

scanf("%d", &m);

if(m>n||m==0)

{ printf("please input the right del num");

return 2; }

同时注意异常时的处理,比如上面两个if语句就是异常情况的判断,每种异常情况对应不同的返回值,这样便于程序过程的调试和数据的合法性。

b、 /* 定义链表节点类型 */

typedef struct node

{

int data;

struct node *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指向开始的“猴子”。因为采用了链表方法,这个过程只需要关注p指针的next指向即可。

a、 保存初始的“猴子”圆圈参数。

/* 保存节点总数 */

total = n;

printf("nthe out num:");

q = head;

为什么要保留这个呢?首先要控制猴子数目,所以保留了全部的数目。其次用q(qurry)来保留剔除猴子前面的链表,并连接剔除猴子后的链表。这样,完成了循环链表的元素删除。

b、 猴子查数。

猴子查数是整个程序的关键,需要完成以下任务:a、找到开始的“猴子”数;b、删除该“猴子”;c、将删除掉的循环链表首尾连接起来。

/* 只剩一个节点时停止循环 */

while (total != 1)

{

/* 报数过程,p指向要删除的节点 */

for (i = 1; i < m; i++)

{

p = p->next;

}

/* 打印要删除的节点序号 */

printf("[%d] ", p->data);

/* q 指向 p 节点的前驱 */

while (q->next != p)

{

q = q->next;

}

/* 删除 p 节点 */

q->next = p->next;

/* 保存被删除节点指针 */

s = p;

/* p 指向被删除节点的后继 */

p = p->next;

/* 释放被删除的节点 */

free(s);

/* 节点个数减一 */

total--;

}

/* 打印最后剩下的节点序号 */

printf("nnthe last num:[%d] nn", p->data);

free(p);

}

通过以上数据运算,可以完成相应链表元素的删除,这或许就是C语言程序的魅力所在。

第三把斧,使用C语言的指针

比如本程序的链表指针的定义,p,s,q。

linklist *head, *p, *s, *q;

我们知道,指针操作不但可以减少数据操作需要的内存,还可以提高程序的运行速度,这在另一方面达到了我们的“第三把斧”的目的。

指针的优势,或许在本程序中表现的不明显,在大量数据和对操作速度要求比较敏感的情况下会很明显,比如Linux内核中,就会有很好的体现。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭