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

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

3天内不再提示

C语言的万能“三板斧”

朱老师物联网大讲堂 2022-01-12 10:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


作为嵌入式程师,写一个效率高效,思路清晰的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语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144638
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言特性

    ,开发者们可以在这些社区中分享经验、交流技术、解决问题。在社区中,开发者们可以找到大量的开源项目、代码示例、技术文章等资源,为学习和使用 C 语言提供了有力的支持。当遇到技术难题时,在社区中提问往往得到其他开发者的热心帮助,快
    发表于 11-24 07:01

    PCB抄板打样提速‘三板斧’:从扫描到交付的全链路优化

    一站式PCBA加工厂家今天为大家讲讲电路板PCB抄板打样怎么提速?电路板PCB抄板打样提速秘籍。电路板抄板打样提速可通过以下方法实现:   电路板PCB抄板打样提速秘籍! 一、技术流程优化:缩短核心环节耗时 高精度扫描与智能图像转换 采用专业设备对电路板进行高分辨率扫描(精度达0.02mm),确保一次成像准确率,避免重复扫描。 通过智能软件将扫描图像快速转换为可编辑的PCB文件格式,速度较传统方式提升40%,减少人工绘制时间。 元器件识别与BOM清单
    的头像 发表于 11-05 09:06 317次阅读

    软件的力量:玩转电子万能试验机控制系统的高级技巧

    电子万能试验机的效能发挥,不仅依赖硬件设备的性能,更离不开控制系统软件的灵活运用。很多操作人员仅将软件视为“参数输入工具”,却忽略了其隐藏的强大功能。实际上,熟练掌握软件的高级技巧,能让测试流程更高
    的头像 发表于 10-24 09:31 106次阅读
    软件的力量:玩转电子<b class='flag-5'>万能</b>试验机控制系统的高级技巧

    HarmonyOSAI编程万能卡片生成(一)

    基于AI大模型理解开发者的卡片需求信息,通过对话式的交互智能生成HarmonyOS万能卡片工程。 使用约束 建议从以下维度描述卡片需求: 当前不支持在生成卡片预览图后继续描述需求进行增量修改。 万能
    发表于 09-08 17:09

    广州邮科相逆变电源:从直流220V到交流380V,工业用电的“万能转换器”

    在工业领域,电力问题就像一场“无声的战役”——设备突然停机、电压不稳导致故障、临时用电无处可接……这些问题不仅影响效率,还可能造成损失。而广州邮科推出的相逆变电源,正是为解决这些痛点而生。今天,我们就用“大白话”聊聊这款“电力转换神器”,看看它如何成为工业场景的“万能
    的头像 发表于 09-03 16:40 752次阅读
    广州邮科<b class='flag-5'>三</b>相逆变电源:从直流220V到交流380V,工业用电的“<b class='flag-5'>万能</b>转换器”

    米朗科技成功在“新三板”挂牌上市,股票代码:874771

    2025年5月9日正式在北交所“新三板”挂牌!股票代码:874771,股票简称:米朗科技。这一里程碑事件标志着米朗科技在资本市场的新起点,也预示着企业将迎来更加广阔的发展空间和机遇。米朗科技成立
    的头像 发表于 08-28 15:52 627次阅读
    米朗科技成功在“新<b class='flag-5'>三板</b>”挂牌上市,股票代码:874771

    BMS通信“卡壳”?CAN转EtherCAT让电池数据“跑起来”

    提升至±2%以内。 技术硬核:通信转换的“三板斧” 1. 数据“翻译”的门道 CAN的8字节数据帧如何适配EtherCAT的PDO?通过网关配置工具建立映射表,把电池温度、电压等信号按优先级“打包
    发表于 07-18 15:32

    DevEco CodeGenie 鸿蒙AI 辅助编程初次使用

    上下文自动补全。 万能卡片生成 :辅助创建 HarmonyOS 万能卡片,提升开发效率。 二、插件获取与安装指南 获取方式 访问华为开发者联盟​​下载中心
    的头像 发表于 06-26 08:48 530次阅读

    湖北位移传感器公司成功登陆“新三板

    5月9日,湖北米朗科技股份有限公司(简称:米朗科技,代码:874771)在全国中小企业股份转让系统(“新三板”)成功挂牌,这是枣阳市第一家在“新三板”挂牌的本土企业。由此,该市资本市场建设实现新突破
    的头像 发表于 06-07 16:41 360次阅读
    湖北位移传感器公司成功登陆“新<b class='flag-5'>三板</b>”

    深入理解C语言C语言循环控制

    C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C语言提供了多种循环控制语句,如break、continue和
    的头像 发表于 04-29 18:49 1740次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制

    突破工业接口壁垒!ARK(方舟微)DMZ42C10S让PLC\\\"万能适配\\\"成为现实!

    突破工业接口壁垒!ARK(方舟微)DMZ42C10S让PLC\"万能适配\"成为现实!
    发表于 03-27 15:20

    万能七彩充开关电源电器的制作

    手机万能七彩充电器的制作过程JC820型手机万能充电器套件制成后,适合充容量为250~3000mA锂离子、镍氢电池;充电时,七彩灯闪烁,指示灯的颜色依次变化,发出绚丽多彩的七彩光芒,饱和后熄灭
    发表于 03-26 14:17

    物联网 + 设备管理,让管理触手可及

    物联网技术快速发展,设备管理面临大挑战:分散、数据孤岛、安全隐患。中设智控采用分层架构和智能维护模式,提高设备管理效率和安全性。物联网设备管理“三板斧”包括分布式管理、智能维护和数据驱动预测性维护。
    的头像 发表于 02-28 10:08 1109次阅读
    物联网 + 设备管理,让管理触手可及

    PID控制算法的C语言实现:PID算法原理

    在工业应用中 PID 及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握 PID 算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵
    发表于 02-26 15:24

    效率大升!AI赋鸿蒙万能卡片开发

    万能卡片,作为鸿蒙生态应用和元服务的重要展示形式,凭借将关键信息和核心操作前置,实现服务直达、减少跳转层级的体验效果,备受用户和开发者青睐。但传统卡片的设计和编码流程相对繁琐,影响了万能卡片的搭建
    的头像 发表于 01-13 13:44 1392次阅读
    效率大升!AI赋<b class='flag-5'>能</b>鸿蒙<b class='flag-5'>万能</b>卡片开发