如何编写高效清晰的嵌入式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("\n\nthe last num:[%d] \n\n", p->data);free(p);}

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

使用C语言的指针

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

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

我们知道,指针操作不但可以减少数据操作需要的内存,还可以提高程序的运行速度。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/577225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内存之-LeakCanary

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、使用四、原理分析4.1 自动初始化4.1.1 初始化…

人工智能_机器学习074_SVM支持向量机_软间隔与优化目标函数构建_C参数由来_惩罚误差点的惩罚度---人工智能工作笔记0114

然后我们接着上一节再来看一下这里我们说有个 min_faces_per_person = 0 这个可以看到如果我们写上0,就意味着要加载所有的人脸图片,就会花费的时间久对吧 我们可以试试,这里我们 min_faces_per_person = 0 改成0然后 我们等一会加载完了以后,我们用 display(X.shape,faces.sh…

Jenkins安装与设置(插件安装失败,版本问题解决)

早期的使用docker安装jenkins的方法会出现插件无法安装的问题&#xff0c;是由于docker拉取的jenkins版本太低了 jdk安装 Linux系统安装JDK1.8 详细流程 maven安装&#xff1a; centos7下安装Maven 使用docker进行安装jenkins&#xff1a; 先把镜像和容器卸干净 docker ps -a…

vue data变量不能以“_”开头,否则会产生很多怪异问题

1、 比如给子组件赋值&#xff0c;子组件无法得到这个值&#xff08;也不是一直无法得到&#xff0c;设置后this.$forceUpdate() 居然可以得到&#xff09;&#xff0c; 更无法watch到 <zizujian :config"_config1"> </zizujian>this._config1 { ...…

短视频矩阵系统的崛起和影响

近年来&#xff0c;短视频矩阵系统已经成为了社交媒体中的一股新势力。这个新兴的社交媒体形式以其独特的魅力和吸引力&#xff0c;迅速吸引了大量的用户。这个系统简单来说就是将海量短视频整合在一个平台上&#xff0c;使用户可以方便地观看和分享好玩有趣的短视频。 短视频…

50个免费的 AI 工具,提升工作效率(附网址)

上次我们已经介绍了20个精选的提高工作效率的免费AI工具&#xff0c;但如果你觉得这些AI工具还不过瘾的话&#xff0c;想进一步成为职场中最了解AI的人&#xff0c;本文将汇总介绍免费最新的50个AI工具。 DeepSwap DeepSwap 是一个基于 AI 的工具&#xff0c;适用于想要制作令人…

【内存泄漏】内存泄漏及常见的内存泄漏检测工具介绍

内存泄漏介绍 什么是内存泄漏 内存泄漏是指程序分配了一块内存&#xff08;通常是动态分配的堆内存&#xff09;&#xff0c;但在不再需要这块内存的情况下未将其释放。内存泄漏会导致程序浪费系统内存资源&#xff0c;持续的内存泄漏还导致系统内存的逐渐耗尽&#xff0c;最…

android内存管理机制概览

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、相关概念3.1 垃圾回收3.2 应用内存的分配与回…

插入排序详解(C语言)

前言 插入排序是一种简单直观的排序算法&#xff0c;在小规模数据排序或部分有序的情况下插入排序的表现十分良好&#xff0c;今天我将带大家学习插入排序的使用。let’s go ! ! ! 插入排序 插入排序的基本思想是将待排序的序列分为已排序和未排序两部分。初始时&#xff0c…

商务大厦安装电气火灾监控系统,从源头监控电气火灾

安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;介绍分析剩余电流式电气火灾监控系统的特点、组成、设计依据、监控原理和实施方案&#xff0c;并结合上海市某大厦工程设计实例探讨该系统在高层建筑中的设置要求和应用方式&#xff0c;供设计人员参考。 关键词&…

蓝桥杯嵌入式LED

1.LED原理图 2.CubeMX的LED的GPIO 3.创建LED.c和.h文件添加到bsp文件 添加bsp文件路径在c/c中 4.LED相关代码

Django之DRF框架三,序列化组件

一、序列化类的常用字段和字段参数 常用字段 字段名字段参数CharFieldmax_lengthNone, min_lengthNone, allow_blankFalse, trim_whitespaceTrueIntegerFieldmax_valueNone, min_valueNoneFloatFieldmax_valueNone, min_valueNoneBooleanFieldNullBooleanFieldFloatFieldmax_…

【隐私保护】使用Python从文本中删除个人信息:第一部分

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

【开源】基于JAVA语言的大学生相亲网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询会员4.2 查询相亲大会4.3 新增留言4.4 查询新闻4.5 新增新闻 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的大学生相亲网站&#xff0c;包含了会员管理模块、新闻管…

图灵日记之java奇妙历险记--输入输出方法数组

目录 输入输出输出到控制台从键盘输入使用 Scanner 读取字符串/整数/浮点数使用 Scanner 循环读取 猜数字方法方法定义方法调用的执行过程实参和形参的关系(重要)方法重载 数组数组的创建数组的初始化动态初始化静态初始化 数组的使用元素访问遍历数组 数组是引用类型null数组应…

龙芯杯个人赛串口——做一个 UART串口——RS-232

文章目录 Async transmitterAsync receiver1. RS-232 串行接口的工作原理DB-9 connectorAsynchronous communicationHow fast can we send data? 2.波特率时钟生成器Parameterized FPGA baud generator 3.RS-232 transmitter数据序列化完整代码&#xff1a; 4.RS-232 receiver…

CEC2013(python):六种算法(RFO、PSO、CSO、WOA、DBO、ABC)求解CEC2013

一、六种算法简介 1、红狐优化算法RFO 2、粒子群优化算法PSO 3、鸡群优化算法CSO 4、鲸鱼优化算法WOA 5、蜣螂优化算法DBO 6、人工蜂群算法 &#xff08;Artificial Bee Colony Algorithm, ABC&#xff09; 二、6种算法求解CEC2013 &#xff08;1&#xff09;CEC2013简…

一篇讲透:箭头函数、普通函数有什么区别

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热衷分享有趣实用的文章&#xff0c;希望大家多多支持&#xff0c;一起进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 什么是箭头函数 箭头函数和普通函数的区别 更简洁的语法 箭头函数…

Rancher小白学习之路

官网&#xff1a;http://docs.rancher.cn/docs/rancher1/rancher-service/load-balancer/_indexhttp://docs.rancher.cn/docs/rancher1/rancher-service/load-balancer/_indexRancher2.5集群搭建&K3S生产环境搭建手册 - 知乎 【rancher教程】十年运维大佬两小时带你搞定ran…

Order Delivery for WooCommerce电商商城订单一体化交付解决方案

Order Delivery for WooCommerce电商商城订单一体化交付解决方案 Order Delivery for WooCommerce电商商城订单一体化交付解决方案使客户可以在结账过程中轻松选择订单的交付日期和时间。 Order Delivery for WooCommerce电商商城订单一体化交付解决方案 让您的客户以流畅且…