0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用C语言进行程序构架构建的“三板斧”

GReq_mcu168 来源:工程师曾玲 2018-12-30 17:06 次阅读

作为嵌入式工程师,写一个效率高效,思路清晰的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("\n\nthe last num:[%d] \n\n", p->data);

free(p);

}

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

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

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

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

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

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

总之,对于嵌入式工程师,不但能设计出好的硬件电路,如果也能写出好的软件程序就会让我们的生活更加美好。工程师们,耍起这“C语言的三把斧”!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4981

    文章

    18274

    浏览量

    288361
  • C语言
    +关注

    关注

    180

    文章

    7528

    浏览量

    128433

原文标题:来!耍起C语言的万能“三板斧”!

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式工程师,耍起C语言的万能“三板斧”!

    退出该圈,从下一只猴子开始继续从1报数,如此反复,最终剩下的猴子便是猴子的大王。那么,这“三板斧”该如何使用呢?第一板斧C语言的思维方式
    发表于 08-14 20:17

    三板斧搞定玻纤效应

    达到等长,可能仍然会因为玻纤效应而无法避免时延的偏差,哀莫大于“等长不等时”。玻纤效应不容忽视,怎么破?套用孙燕姿《神奇》的歌词:“板材换换换,走线转转转,结果好神奇”,总结起来有“三板斧”,一是板材
    发表于 12-17 16:25

    电路设计之交直流与电路分析三板斧

    电路设计之交直流与电路分析三板斧,直流电和交流电之争人类最早发现了交流电,但最开始推广的是直流电。1831年,法拉第发现了电磁感应现象之后不久,他又利用电磁感应发明了世界上第一台发电机──法拉第圆盘
    发表于 07-07 06:57

    如何直接使用RISC-V架构的汇编语言进行程序设计

    本文将介绍如何直接使用RISC-V架构的汇编语言进行程序设计。
    发表于 11-05 06:20

    如何直接使用RISC-V架构的汇编语言进行程序设计

    在本号之前发表的文章《编译过程简介》中介绍了C/C++语言如何被编译成为汇编语言,而本文将介绍如何直接使用RISC-V架构的汇编
    发表于 11-08 06:39

    ARM应用程序构架_时间片轮询模板

    ARM嵌入式应用程序架构设计实例精讲--ARM应用程序构架02时间片轮询模板
    发表于 07-08 11:08 12次下载

    ARM应用程序构架_顺序执行模板

    ARM嵌入式应用程序架构设计实例精讲--ARM应用程序构架01顺序执行模板
    发表于 07-08 11:08 6次下载

    如何写好一个效率高效思路清晰的C语言程序教你关键的三招

    为嵌入式工程师,写一个效率高效,思路清晰的C语言程序是我们的终极目标,那么,怎么才能写好这样的程序呢?首先,我们要用C语言的思维方式来进行程序
    的头像 发表于 12-31 18:31 5164次阅读

    你不知道嵌入式工程师,耍起C语言的万能“三板斧”!

    关键词:嵌入式C语言 作为嵌入式工程师,写一个效率高效,思路清晰的C语言程序是我们的终极目标,那么,怎么才能写好这样的程序呢?首先,我们要用C语言
    发表于 04-22 15:59 1013次阅读

    如何进行程序的扩展

    本文档的主要内容详细介绍的是程序的扩展性如何进行程序的扩展。
    发表于 04-26 18:26 0次下载
    如何<b class='flag-5'>进行程序</b>的扩展

    浅谈PCB设计中玻纤效应的三板斧

    所谓玻纤效应,是指构成PCB介质层的增强材料——玻璃纤维束网状结构之间的间隙引起介质层的相对介电常数局部变化的现象。玻纤效应的发现史反映了信号速率的不断提升。 PCB的介质层一般由玻纤布和树脂组成,玻纤布的玻璃纤维束空隙填充树脂,由于玻纤布和树脂的介电常数相差较大(玻纤布一般在6左右,树脂是2.5),在靠近玻纤的走线上信号感受到的介电常数较大,而在玻纤束之间窗口区域走线的信号感受到的介电常数较小,从而导致了玻纤效
    的头像 发表于 03-23 12:21 3164次阅读

    RISC-V嵌入式开发入门篇2:RISC-V汇编语言程序设计(下)

    本文将介绍如何直接使用RISC-V架构的汇编语言进行程序设计。
    发表于 11-02 18:50 40次下载
    RISC-V嵌入式开发入门篇2:RISC-V汇编<b class='flag-5'>语言</b><b class='flag-5'>程序</b>设计(下)

    RISC-V嵌入式开发入门篇2:RISC-V汇编语言程序设计(中)

    本文将介绍如何直接使用RISC-V架构的汇编语言进行程序设计。
    发表于 11-03 09:51 42次下载
    RISC-V嵌入式开发入门篇2:RISC-V汇编<b class='flag-5'>语言</b><b class='flag-5'>程序</b>设计(中)

    C语言的万能“三板斧

    进行程序构架构建;其次,要有良好的C语言算法基础,以此来实现程序的逻辑构架;最后,灵活运用C语言
    的头像 发表于 01-12 10:49 699次阅读
    C<b class='flag-5'>语言</b>的万能“<b class='flag-5'>三板斧</b>”

    怎么写出效率高、思路清晰的C语言程序

    要用C语言的思维方式来进行程序构架构建 要有良好的C语言算法基础,以此来实现程序的逻辑构架
    的头像 发表于 01-02 14:20 254次阅读