点击蓝字

关注我们

作为嵌入式工程师,写一个效率高效,思路清晰的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语言的三把斧”!

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

戳“阅读原文”我们一起进步

C语言的万能“三板斧”相关推荐

  1. 单片机c语言中void key(void),STC单片机C语言通用万能编程模板

    <STC单片机C语言通用万能编程模板>由会员分享,可在线阅读,更多相关<STC单片机C语言通用万能编程模板(23页珍藏版)>请在人人文库网上搜索. 1.8051 单片机 C 语 ...

  2. 单片机的字节寻址c语言,单片机C语言通用万能编程模板

    <单片机C语言通用万能编程模板>由会员分享,可在线阅读,更多相关<单片机C语言通用万能编程模板(30页珍藏版)>请在人人文库网上搜索. 1.8051单片机C语言编程模板 1.函 ...

  3. c语言万能编程模板_8051单片机C语言通用万能编程模板

    .........word 文档 ... 完美整理 ... 范文范例 ...... 专业资料 ... 仅供学习 . 参考 . 分享 < 8051 单片机 C 语言编程模板> 1. 函数头文 ...

  4. 通用编程c语言,STC单片机C语言通用万能编程.docx

    <8051单片机C语言编程模板> TOC \o "1-5" \h \z \o "Current Document" 毫秒级CPU延时函数 4 \o ...

  5. c语言作业 万能公式,按照下面的通项公式计算: sin(x)=x-x3/3!+x5/5!-x7/7!+… 直到最后一项的绝对值小于10-7为止。 用C程序编写正弦...

    满意答案 C代码: #include #include//fabs() int main() {  double x,s,a;//为了提高精度,我把它们定义成双精度的. int i; scanf(&q ...

  6. c语言万能编程模板_51、STC单片机C语言通用万能编程模板

    . . < 8051 单片机 C 语言编程模板> 1. 函数头文件 ............................................................ ...

  7. c语言实现万能求积分

    本文章原创,转载请注明出处~  原理:如下图,若要求a,b区间之间的面积,则对a,b区间进行分割,用分割后的矩形面积相加作为区域面积的近似,分割的越细,近似程度越高 由此,可设计原型如下: Doubl ...

  8. python编程 语言-Python现在还是最火的编程语言吗?

    相信对于每个人而言,知道编程和学习编程这件事,出发点是不同的.我在北京接触编程的时间是2013年,那个时候还在一个二线城市上大学,还没有这么多各种融资,各种互联网创业的氛围,大家想的更多的是一些线下的 ...

  9. 哪个专业学python语言_想学Python编程?你真的适合吗?

    原标题:想学Python编程?你真的适合吗? 有的人说我想学什么.我想干什么,很多时候都是头脑发热,单凭一腔热血,可是这样的路即便走上去你又能坚持多久呢?所以,每每有人问我学Python编程怎么样,我 ...

最新文章

  1. Redis学习笔记~Redis在windows环境下的安装
  2. 树莓派_FTP服务器的搭建
  3. python中查看显卡状态
  4. spyder的输出面板不小心关掉了怎么办?
  5. Java对象内存图三
  6. python序列符号_Python中的文本和字节序列
  7. mongotemplate模糊查_java 中 mongodb的各种操作 模糊查询 精确查询 等等
  8. 95-30-018-Channel-AbstractNioByteChannel
  9. 落魄前端,整理给自己的前端知识体系复习大纲(下篇)
  10. MXNet下载Fashion-MNIST错误处理
  11. 【2017CCPC哈尔滨赛区 HDU 6242】Geometry Problem【随机化】
  12. 2021年最值得推荐的5款在线文档制作工具,效率这块稳稳拿捏
  13. java运行环境JDK下载安装配置
  14. vue 高德地图使用热力图
  15. 使用VC++6.0创建.cpp文件工程
  16. 区块链baas平台告警方案
  17. 【论文翻译】基于分层关注和时间RNN的动态异构网络链路预测建模
  18. 洛谷 P5594 【XR-4】模拟赛
  19. Glamhive创始人Stephanie Sprangers与明星造型师Johnny Wujek和Nicole Chavez、明星发型师Andrew Fitzsimons和时尚影响者Claire Su
  20. Spark读取压缩文件

热门文章

  1. 方便好用的OA工作流程如何选择
  2. [课业] 18 | 软工 | 软件体系结构基础
  3. 怎么靠互联网兼职赚点钱呢?做网站?威客?
  4. Cityscapes数据集转换成COCO类型和VOC类型
  5. vertrigoserv mysql 密码_VertrigoServ-官方版-VertrigoServ(网络开发环境)2.37官方版-独木成林...
  6. 一个普通人不靠工资的收入有什么?
  7. MapGIS67编辑线右键结束时,想继续接着编辑线时怎么操作?
  8. Ubuntu Server关机的方法
  9. U盘无法格式化怎么办?!
  10. 实锤,无脑定投指数基金真的可以赚钱么?