嵌入式C语言开发
文章平均质量分 64
嵌入式C语言实战100例,按照由浅及深、循序渐进的原则,全面、系统地讲解了 C 语言各个方面的知识点和常用的程序设计基本技巧,以及编写程序过程中值得注意的地方,内容深入浅出,通俗易懂。
物联技术666
开发、辅导嵌入式软硬件。软件开发、电路设计、设备物联网云平台。[email protected]
展开
-
【嵌入式C编程】快速通关秘籍七: 文件操作章节
内容提要:文件的基本概念文件的操作函数文件的定位与随机读写文件的出错检测与总结原创 2023-12-24 21:47:34 · 31 阅读 · 0 评论 -
【嵌入式C编程】快速通关秘籍六: 数据链表章节
内容提要:动态内存的应用链表的基本概念单向链表的操作原创 2023-12-24 21:42:06 · 17 阅读 · 0 评论 -
【嵌入式C编程】快速通关秘籍五:结构体与位运算章节
内容提要:结构体变量的应用结构体数组的应用结构体指针的应用共用体、枚举的应用typedef的使用结构体的内存分配位运算原创 2023-12-24 20:24:28 · 56 阅读 · 0 评论 -
【嵌入式C编程】快速通关秘籍四: 字符与字符串处理函数章节
内容提要:熟练常见的字符处理函数熟练常见的字符串处理函数掌握常见字符、字符串处理函数的编写原创 2023-12-24 20:18:38 · 101 阅读 · 0 评论 -
【嵌入式C编程】快速通关秘籍三: 指针与应用章节
指针的相关概念主要讲解啥叫指针和指针变量 指针的定义与应用。如何去定义不同类型的指针(char,int ,float~~~)以及指针的应用(重点也是难点)数组与指针字符串与指针函数与指针指针相关运算总结原创 2023-12-24 20:12:14 · 144 阅读 · 0 评论 -
【嵌入式C编程】快速通关秘籍二: 数组与函数
数组的基本概念及应用函数的基本概念与应用变量的存储类别预编译命令原创 2023-12-22 22:17:32 · 94 阅读 · 0 评论 -
【嵌入式C编程】快速通关秘籍一: C基础章节
C语言概述数据类型、运算符与表达式C语言程序结构VC6.0使用练习原创 2023-12-22 22:07:40 · 37 阅读 · 0 评论 -
【嵌入式C语言开发】实战第100例 常用算法之-简单专家系统
printf("\n\t请选择操作:\n\n\t1、查询;\n\n\t3、退出程序.\n\n\t");printf("\n结果为%20s\n" , ntx->feature);/////////////////////////////////将信息写入子节点。///////////////////////////////将信息写入父节点。printf("\n请输入新特征描述的对象\n");printf("\n输入错误,请重新输入\n");printf("\n请输入对新对象的描述\n");原创 2023-12-22 20:53:42 · 58 阅读 · 0 评论 -
【嵌入式C语言开发】实战第099例 常用算法之-求解野人与传教士问题
printf("野 人%8d%8d\t->\t%8d\n",result -> sl,result -> ssr,result -> sr - result -> ssr);printf("传教士%8d%8d\t->\t%8d\n",result -> pl,result -> spr,result -> pr - result -> spr);printf("野 人%8d%8d\t原创 2023-12-22 20:52:02 · 30 阅读 · 0 评论 -
【嵌入式C语言开发】实战第098例 常用算法之-快速傅里叶变换
本实例将实现二维快速傅立叶变换,这是第一次通过读程序流程图来设计程序,同时也将借此实例学习用C语言实现矩阵的基本操作、复数的基本操作,复习前面所学过的动态内存分配、文件操作、结构指针的函数调用等内容。/////////讲解传递结构指针和结构本身的区别。{//检验输入数据是否为2的整数次幂,如果是返回用2进制表示时的位数。printf("\n快速复利叶逆变换后的结果:\n");printf("\n快速复利叶变换后的结果:\n");{//按行进行快速复利叶变换。{//求复数矩阵的共轭矩阵。原创 2023-12-22 20:50:20 · 98 阅读 · 0 评论 -
【嵌入式C语言开发】实战第097例 常用算法之-ISODATA算法
printf ("\n请输入一次迭代运算中可以合并的聚类中心的最多数目:");i++)//计算新的聚类中心。printf (" \n聚类包含的样本点的坐标为:\n ");//每一聚类中最少的样本数目,即如少于此数就不作为一个孤立的聚类。printf ("\n请输入一个聚类域中样本距离分布的标准差:");printf ("\n请输入每一聚类域中最少样本数:");printf("\n请输入两聚类中心之间的最小距离:");printf ("\n请输入预期的聚类中心数目:");(Y/N)\n");原创 2023-12-22 20:48:13 · 24 阅读 · 0 评论 -
【嵌入式C语言开发】实战第096例 常用算法之-K_均值算法
选择这个算法的原因是因为它有较为复杂的逻辑结构,包括了多次条件判断、循环、中断等程序控制操作,包含了插入排序算法,并需要运用动态内存分配以满足参数动态配置的需要。在本节中先介绍聚类分析的概念,实现一种较为简单的 K 均值算法,并复习、总结前面已经学过的内存的三种分配方法及文件操作等内容。index++)//计算新的聚类中心。printf (" \n聚类包含的样本点的坐标为:\n ");//聚类包含的样本个数。原创 2023-12-22 20:46:45 · 20 阅读 · 0 评论 -
【嵌入式C语言开发】实战第095例 常用算法之-人工神经网络
printf("第%10d轮误差:%20f,学习速率:%10f\n",i,E,a1[0][0]);printf("输入值为%20f对应的正常结果为%f\n",input,sin(input));printf("输入值为%20f对应的结果为%f\n",input,output);printf("本程序将用BP神经网络拟合函数:Y=sin(X)\n\n");printf("在此输入需要计算的值(0,1):\n");(Y/N)\n");原创 2023-12-22 20:44:56 · 111 阅读 · 0 评论 -
【嵌入式C语言开发】实战第094例 常用算法之-用C语言实现遗传算法
先简要介绍用遗传算法求解的主要步骤,使读者掌握算法的基本思想:然后将算法实例化,借助一个典型例子讲解如何用 C 语言实现遗传算法,以及应用遗传算法求解的全过程,使读者具备独立实现简单遗传算法的能力:最后对实例的求解结果进行分析,令读者更好地掌握这种常用的算法。i = i + 5)//对收敛过程进行显示。i++)//按表达式的值进行排序,)//随机找到一组未进行过交叉的染色体与a[i]交叉。int randbit(int i, int j)//产生在i与j之间的一个随机数。//记录最优的染色体。原创 2023-12-22 20:42:27 · 29 阅读 · 0 评论 -
【嵌入式C语言开发】实战第093例 常用算法之-正定矩阵求逆
本实例演示的是用来求实对称正定矩阵逆矩阵的C语言实现方法。设A为n x n对称正定矩阵,其关系式y=Ax确定了R^n上的一个映像,如果能求出逆关系x=By,则得到A的逆矩阵B=A^-1。这就是下面要介绍的实对称矩阵求逆的基本思路。该实例求逆过程通过函数GJ(int n,double**a)完成.printf("矩阵求逆失败\n");printf("内存分配失败\n");printf("该矩阵的逆为:\n");原创 2023-12-22 20:39:54 · 32 阅读 · 0 评论 -
【嵌入式C语言开发】实战第092例 常用算法之-高斯消去法
本实例将向大家介绍用高斯消去法求解线性方程组AX=b的C语言实现方法.printf("不可以用高斯消去法求解\n");printf("内存分配失败\n");printf("该方程组的解为:\n");原创 2023-12-22 20:36:23 · 21 阅读 · 0 评论 -
【嵌入式C语言开发】实战第091例 常用算法之-龙格-库塔法
前面向读者介绍了用于解常微分方程的欧拉法和改进欧拉法,它们对应的局部截断误差为一阶Taylor余项O(h^2)和二阶 Taylor 余项O(h^3)。/*存放n个未知函数在起始点t处的函数值,返回时,其初值在二维数组z的第零列中*//*二维数组,体积为n x k.返回k个积分点上的n个未知函数值*/b=malloc(n*sizeof(double));/*微分方程组中方程的个数,也是未知函数的个数*//*积分的步数(包括起始点这一步)*/原创 2023-12-22 20:32:38 · 49 阅读 · 0 评论 -
【嵌入式C语言开发】实战第090例 常用算法之-改进欧拉法
返回k个积分点(包括起始点)上的未知函数值*/存放n个未知函数yi在起始点t0处的函数值*//*整型变量,微分方程组中方程的个数,也是未知函数的个数*//*双精度实型变量,对微分方程进行积分的起始点t0*/y[0]=-1.0;/*初值y0(0)=-1.0*//*初值y1(0)=-1.0*//*初值y2(0)=-1.0*//*求出f(x)*//*步长为0.01*//*起始点t=0*/y[0]=-1.0;/*双精度实型变量。printf("变步长欧拉法结果:\n");/*将方程组的初值赋给数组z[i*k]*/原创 2023-12-21 13:07:00 · 140 阅读 · 0 评论 -
【嵌入式C语言开发】实战第089例 常用算法之-辛普生数值积分
本实例通过求解定积分,介绍求解积分一种常用的方法辛普生数值积分。辛普生数值积分有定步长和变步长两种方法,本实例分别通过两个函数SIMPI()和SIMP2()实现辛普生定步长和变步长积分。在微积分中,积分值是通过找原函数的解析式求得的,然而寻找原函数往往非常困难许多积分函数甚至找不到用初等函数表示的原函数。为此,研究积分的数值计算问题是非常必要的。原创 2023-12-21 13:04:24 · 59 阅读 · 0 评论 -
【嵌入式C语言开发】实战第088例 常用算法之-最小二乘法拟合
*实型变量,输出参数,拟合多项式与数据点偏差的绝对值最大值*//*实型变量,输出参数,拟合多项式与数据点偏差的绝对值之和*//*实型变量,输出参数,拟合多项式与数据点偏差的平方和*//*调用拟合函数*//*实型一维数组,输入参数,存放节点的xi值*//*实型一维数组,输入参数,存放节点的yi值*//*整型变量,输入参数,给定数据点的个数*//*整型变量,输入参数,拟合多项式的项数*//*释放存储空间*//*释放存储空间*//*z为各个x的平均值*//*计算x[i-1]点对应的y值作为拟合已知值*/原创 2023-12-21 13:01:23 · 124 阅读 · 0 评论 -
【嵌入式C语言开发】实战第087例 常用算法之-拉格朗日插值
在生产实践中常常遇到这样的问题:给出一批离散的样点,要求作出一条通过这些样点的光滑曲线,以便满足设计要求或进行加工。反应在数学上,即已知函数在一些点上的值,寻求它的分析表达式,以便求得它在某个给定点的近似值。这个过程就称为插值。插值的基本思想是,设法构造一个简单的函数y=p(x)作为实际函数f(x)的近似表达式,然后算出 p(x)的值,以此得到f(x)的近似值本实例演示的便是在已知六个样点值的情况下,用拉格朗日插值法计算出给定某x值处的近似函数值。printf("拉各朗日插值后得到的结果是:\n");原创 2023-12-21 12:56:11 · 49 阅读 · 0 评论 -
【嵌入式C语言开发】实战第086例 常用算法之-弦截法求解方程
前面讲到的二分法虽然可以用来计算 f(x)=0在[a,b]的所有实根且方法简单,函数 f(x)要求连续就可以,但是二分法收领速度较慢。而牛顿法虽然在单根附近收敛速度快,且具有二阶收敛速度,但牛顿法初值的选取要求比较苛刻,即要求初值选取充分靠近方程的根,否则不能收敛,而且它还有个明显的缺陷:需要计算函数 f(x)的导数,所以如果f(x)比较复杂,那么使用牛顿迭代法就很不方便。if(fabs(y)原创 2023-12-21 12:52:47 · 37 阅读 · 0 评论 -
【嵌入式C语言开发】实战第085例 常用算法之-牛顿迭代法求解方程
当实际问题所建立的模型为数学物理方程时,其数值算法采用迭代法是一种简易的好方法。迭代法的基本思想就是构造一串收敛到解的序列,即建立一种从已有近似解来计算新的近似解的迭代式,然后选取方程的某个初始近似值 x0代入选代式,反复这个过程使得到根逐渐通近于真实根,直到得到满足精度要求的结果。本例向大家演示用牛顿迭代法求解方程f(x)=x^3-x^2-1的一个实根的C语实现方法通过求解该方程的根,向大家介绍另一种求解一元非线性方程的方法:牛顿迭代法。printf("利用牛顿跌代法求的的根为:\n");原创 2023-12-21 12:21:35 · 33 阅读 · 0 评论 -
【嵌入式C语言开发】实战第084例 常用算法之-二分法求解防尘
if(fabs(y)原创 2023-12-21 12:18:52 · 18 阅读 · 0 评论 -
【嵌入式C语言开发】实战第083例 常用算法之-树的动态查找
首先程序通过construct()函数,利用已经存在的结构体数组数据建立一个二叉树,建立树的过程中,要保证每个节点的值都大于它的左子树上节点的值而小于它右子树上所有节点的值,该函数返回建立树的根指针:然后通过函数Search(root,name)查找,如果找到相应的数据,将其打印出来,如果没有找到,则用户可以选择是否将该数据插入到树中。printf("请输入该人年龄:\n");printf("请输入该人工作:\n");printf("请输入要查找的人的名字\n");printf("没有该人资料\n");原创 2023-12-21 12:16:49 · 20 阅读 · 0 评论 -
【嵌入式C语言开发】实战第082例 常用算法之-二分法查找
二分查找法要求被查找的数据是按照某种顺序排列的有序序列,因此在本例中,首先建立了一个结构体数组SDatas[NUM],并给其赋初值,然后按结构体数组中的一个成员变量name的大小对该结构体数组通过函数qs_struct()利用快速排序法进行排序使其成为有序序列最后通过函数 BinarySeach()利用二分查找法根据用户输入的查找的字符串,将其找到并利用函数 print_data ()把该结构体的详细信息打印出来。printf(" 姓名:%s\n",point->name);原创 2023-12-21 12:14:52 · 26 阅读 · 0 评论 -
【嵌入式C语言开发】实战第081例 常用算法之-顺序查找
本例演示的是一种最简单的查找方式:顺序查找本例首先利用creat()函数建立一个链表将数组Datas[NUM]存储的结构信息输入链表中,然后再调用函数SequelScach(head,name)将与用户输入的字符串name相匹配的信息调出,最后通过函数 print_data(point)将详细信息打印出来。printf(" 姓名:%s\n",point->name);printf(" 城市:%s\n",point->city);printf(" 性别:%s\n",point->sex);原创 2023-12-21 12:12:35 · 15 阅读 · 0 评论 -
【嵌入式C语言开发】实战第080例 常用算法之-磁盘文件排序
if(i原创 2023-12-21 12:09:50 · 23 阅读 · 0 评论 -
【嵌入式C语言开发】实战第078例 常用算法之-堆排序
本例将介绍一种较为抽象的排序方法:堆序在排序中将要用到前面讲过的树的概念本例首先将一些已经存在的整型数值用一个函数 adjust()调整成堆,然后利用堆排序的性质,将其顶端的极值取出,再将最后的节点放到顶端,进行堆排序,然后将顶端的极值取出,如此反复完成排序。如果排序的记录数不大,则堆排序的优越性并不明显,而且还需要一个供交换时暂存记录的辅助空间。printf("\n第%2d步操作结果===>",count++);printf("\n初始化成堆===> ");printf("\n排序后的数据为:");原创 2023-12-21 11:57:31 · 16 阅读 · 0 评论 -
【嵌入式C语言开发】实战第077例 常用算法之-冒泡排序法
从基本原理讲,冒泡排序法属于一种交换排序的类型,它从数组的一端开始,依次对相邻两元素进行比较,当发现它们不合顺序时就进行一次交换。这样各个元素就像是水箱甲面的气泡,每个气泡都在自身的平衡点。本例排序主要是通过一个函数bubble()实现的,在主函数中通过gets()数输入一定的字符串后调用该函数排序,然后再将其打印输出。printf("排序之后的字符串是:\n");printf("请输入字符串:\n");原创 2023-12-21 11:55:42 · 244 阅读 · 0 评论 -
【嵌入式C语言开发】实战第079例 常用算法之-归并排序
二路归并的含义是把两个有序的序列合并成为一个有序的序列,其排序的基木思想是将有n个记录的原始序列看作n个有序的子序列,每个子序列的长度为1,然后从第一个子序列开始,把相邻的子序列两两合并,得到[n/2]个长度为2或1的列(当子列个数为奇数时,最后一组合并得到的序列长度为 1),把这一过程称为一次归并排序。while(strat1+k原创 2023-12-21 11:52:41 · 19 阅读 · 0 评论 -
【嵌入式C语言开发】实战第075例 常用算法之-串的应用
虽然文本编辑软件的功能有强弱差别,但是其基本功能都包含了串的输入、删除和输出等本例中分别使用函数 EnterData(),DeleteLine()和 List()完成串的输入、删除和输出。printf("第%d行有数据,它们是:\n",Head[i].Num);printf("输入数据要插入的行号(0~100):\n");printf("请输入要插入的数据,以@作为结束符号\n");printf("输入要删除的行号(0~100):\n");/*改行字符的个数*/printf("请输入菜单选择号\n");原创 2023-12-20 11:25:04 · 24 阅读 · 0 评论 -
【嵌入式C语言开发】实战第074例 常用算法之-堆栈的应用
首先输入两个操作数,将它们分别压入堆栈,然后根据输入操作符,将压入堆栈的数据弹出,并对其进行相应的操作,最终将操作结果重新压入堆栈。本例重点讲述堆栈的压入、弹出操作,它是由两个函数 push()和pop()实现的,希望通过对这两个函数学习,掌握堆栈的实现和工作方式。printf("结果是a+b = %d\n",(a+b));printf("结果是a-b = %d\n",(a-b));printf("结果是a*b = %d\n",(a*b));printf("结果是a/b = %d\n",(a/b));原创 2023-12-20 11:23:04 · 94 阅读 · 0 评论 -
【嵌入式C语言开发】实战第073例 常用算法之-队列的应用
本例中队列的基本操作是由四个函数完成的,它们是置空队列函数 SetNull()、判断队列是否为空函数 Empty()、入排操作函数EnQueue()、出排操作函数 DelQueue(),在主函数中程序对其进行简单的调用,并显示调用效果,给读者一个更加直观的概念。printf("队列中还有%d个数据",(m-n));printf("输出从队列中提取的数据:\n");printf("要输入队列的字符个数:\n");printf("输入队列的整型数据:\n");printf("要提出队列的字符个数:");原创 2023-12-20 11:21:17 · 348 阅读 · 0 评论 -
【嵌入式C语言开发】实战第072例 常用算法之链表的基本操作
上例讲述了链表的建立方法,在本例中,将重点学习链表的插入和副除等基本操作。本例是在上例建立的一个链表的基础上,完成在指定位置上增添和删除一个链表节点的作,并在主函数中将被修改的链表输出。链表的添加和删除主要是通过两个函数完成的:inlink()和dellink()。if(p->value == a) //找到数据域为a的结点。/*遍历单链表,寻找数据域值为a的结点*//*在链表中搜索数据为a的结点*//*在链表中无数据值为a的结点*//*链表的第一个结点即为a结点*/原创 2023-12-20 11:19:45 · 20 阅读 · 0 评论 -
【嵌入式C语言开发】实战第071例 常用算法之链表的建立
该实例旨在通过建立一个简单的链表,让读者对链表这个 C语言中常用的数据结构有一个直观的概念,并通过对本例的模仿,掌握新建一个链表的基本思路和方法。本例讲述的是一个输入整数序列,并按整数的输入顺序建立一个整数链表。函数采用以下算法思想:从空链表开始,每输入一个整数,向系统申请一个表元存储空间,将输入整数存入新表元并将新表元接在链表末尾。当不能输入一个整数时,函数结束建立链表的过程,返回链表的头指针值。/*tail为倒数第二个表元指针,tail->始终指向最后一个表元*//*建立一个整数链表*/原创 2023-12-20 11:15:18 · 19 阅读 · 0 评论 -
【嵌入式C语言开发】实战第070例 可变数目变元
* 初始化argptr *//* 计算序列之和 */原创 2023-12-20 11:13:33 · 17 阅读 · 0 评论 -
【嵌入式C语言开发】实战第069例 伪随机数生成
标准函数库中定义了一些函数用来生成随机号码,它们就是本例中要讨论的函数 rand()和srand()。/* 返回系统的当前日历时间 */本例中的程序是用系统时间通过使用srand()函数随机的初始化rand()函数。/* 生成十个伪随机数序列 *//* 获得正确的日历时间 */原创 2023-12-20 11:12:06 · 30 阅读 · 0 评论 -
【嵌入式C语言开发】实战第068例 排序函数
qsort()函数是C标准库中提供的排序函数。由于这个函数的存在,在很多情况下,不再需要自编写排序函数进行排序,而可以直接调用qsort()函数完成工作这样能够很大地节省时间和精力。本程序是对一整数列表进行排序,并且显示出排序后的结果。因此,非常有必要介绍几个函数,使读者能够熟练使用它。原创 2023-12-20 11:09:33 · 21 阅读 · 0 评论 -
【嵌入式C语言开发】实战第067例 跳转函数
* 跳转到执行setjmp()的地方,但此时函数setjmp()返回值为3 */在C的标准库中函数setjmp()和longjmp()提供了一种在函数间跳转的手段若要使用它们,必须用到头文件 。 第一次调用时返回值为零 */本实例中的程序介绍了上述跳转函数的用法,程序本身的功能很简单,只是输出1、3、5。原创 2023-12-20 11:07:02 · 41 阅读 · 0 评论