作为嵌入式工程师,写一个效率高效,思路清晰的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 data = i;s->next = p->next;p->next = s;p = p->next;}通过该步骤后,head和p(present)都成了一个“猴子圈”的链表。在该链表的构建过程中需要注意一下几点:内存的开辟,此时遵守使用多少开辟多少的原则。 如果一下开辟过多,会引起内存泄露的问题,但是,这个小程序是不会遇到这种问题了。其次是熟悉循环链表的构建方法:链表的尾巴指向链表的头。这个时候有心的话还会联想到双向链表的情况。 c、 /* 找到第 k 个节点 */ p = head;for (i = 1; i 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 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语言的三把斧”!
SMT快速打样加工中如何解决焊接气孔的问题?
双张检测传感器应用和特点
具精准50uV失调电压的运算放大器 工作在76V输入电压范围
如何使用ESP8266和Android控制继电器
英特尔发布第五代至强可扩展处理器:性能和能效大幅提升,AI 加速
C语言的万能“三板斧”
华为首款5G商用芯片已定 5G手机有望2019年上市
5G手机防水滤网膜材料是如何实现IP68级防水的
区块链与云技术将如何构建新型游戏生态系统
PCB行业未来三大发展趋势,新三板市场相关PCB企业介绍
一款工厂工作室必备的专业级桌面3D打印机
两种控制无节点号区别的设备的方案
给内存加上AI?三星是这样做的
电子行业商户如何抓住百度爱采购红利期
光电计时器的原理和使用
苹果iPhone 12有望采用全新5nm EUV工艺制程的A14仿生芯片
佛山力士乐比例溢流阀的工作原理是怎样的
电桥的作用是什么
5W单声道音频功放NS4196引脚和电路应用介绍
喜报 | 国家级!英码科技成功入选国家级专精特新“小巨人”企业