单片机常用的13个C语言算法,看过的据说都晋级高手了

网友投稿 2019-07-31 14:24

算 法

计算机解题的基本思想方法和步骤。是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。

01、计数、求和、求阶乘等简单算法

此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。

例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。

本题使用数组来处理,用数组a[100]存放产生的100个随机整数,数组x[10]来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中,……个位是0的个数存放在数组x[10]。

https://cdn.china-scratch.com/timg/190802/14244WY7-0.jpg

02、求两个整数的最大公约数、最小公倍数

求最大公约数的算法思想是

最小公倍数=两个整数之积/最大公约数

(1) 对于已知两数m、n,使得m>n;
(2) m除以n得余数r;
(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);
(4) m←n,n←r,再重复执行(2)。

03、判断素数

只能被1或本身整除的数称为素数。基本思想:把m作为被除数,将2-INT()作为除数,如果都除不尽,m就是素数,否则就不是。可用以下程序段实现。

https://cdn.china-scratch.com/timg/190802/14244R1I-1.jpg

04、验证哥德巴赫猜想

任意一个大于等于6的偶数都可以分解为两个素数之和。

基本思想:n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。如n1不是素数,就不必再检查n2是否素数。先从n1=3开始,检验n1和n2(n2=N-n1)是否素数。然后使n1+2 再检验n1、n2是否素数,… 直到n1=n/2为止。

利用上面的prime函数,验证哥德巴赫猜想的程序代码如下:

https://cdn.china-scratch.com/timg/190802/14244Wa6-2.jpg

05、排序问题

选择法排序(升序)

  • 对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;

  • 除第1个数外,其余n-1个数中选最小的数,与第2个数交换位置;

  • 依次类推,选择了n-1次后,这个数列已按升序排列。

程序代码如下:

https://cdn.china-scratch.com/timg/190802/1424493K5-3.jpg

冒泡法排序(升序)

基本思想:将相邻两个数比较,小的调到前头。

1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”。

2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数。

3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。

程序段如下:

https://cdn.china-scratch.com/timg/190802/1424495J0-4.jpg

合并法排序

将两个有序数组A、B合并成另一个有序的数组C,升序.

  • 先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组;

  • 取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完;

  • 将另一个数组剩余元素抄入C数组,合并排序完成。

程序段如下:

https://cdn.china-scratch.com/timg/190802/1424494338-5.jpg

06、查找问题

顺序查找法

一列数放在数组a[1]---a[n]中,待查找的数放在x 中,把x与a数组中的元素从头到尾一一进行比较查找。用变量p表示a数组元素下标,p初值为1,使x与a[p]比较,如果x不等于a[p],则使p=p+1,不断重复这个过程;一旦x等于a[p]则退出循环;另外,如果p大于数组长度,循环也应该停止。(这个过程可由下语句实现)

https://cdn.china-scratch.com/timg/190802/1424491458-6.jpg

07、二分法

在一个数组中,知道一个数值,想确定它在数组中的位置下标,如数组:

A[5] = {1,2,6,7,9}; 

我知道其中的值为6,那么他的下标位置就是3。

https://cdn.china-scratch.com/timg/190802/1424495061-7.jpg

08、限幅滤波法

对于随机干扰 , 限幅滤波是一种有效的方法。

比较相邻n和n-1时刻的两个采样值y(n)和y(n–1),根据经验确定两次采样允许的最大偏差。如果两次采样值的差值超过最大偏差范围,认为发生可随机干扰 ,并认为后一次采样值y(n)为非法值,应予删除。删除y(n)后 ,可用y(n–1)代替y(n);若未超过所允许的最大偏差范围 ,则认为本次采样值有效。

下面是限幅滤波程序:

https://cdn.china-scratch.com/timg/190802/142450K95-8.jpg

A值可根据实际情况调整,value为有效值,new_value为当前采样值滤波程序返回有效的实际值。

09、中位值滤波法

中位值滤波法能有效克服偶然因素引起的波动或采样不稳定引起的误码等脉冲干扰。对温度、液位等缓慢变化的被测参数用此法能收到良好的滤波效果,但是对于流量压力等快速变化的参数一般不宜采用中位值滤波法。

对某一被测参数连续采样 n次(一般 n 取奇数) ,然后再把采样值按大小排列 ,取中间值为本次采样值。

下面是中位值滤波程序:

https://cdn.china-scratch.com/timg/190802/142450O51-9.jpg

10、算术平均滤波法

算术平均滤波法适用于对一般的具有随机干扰的信号进行滤波。这种信号的特点是信号本身在某一数值范围附近上下波动,如测量流量、液位。

按输入的N个采样数据,寻找这样一个Y,使得Y与各个采样值之间的偏差的平方和最小。

  • 编写算术平均滤波法程序时严格注意:
    为了加快数据测量的速度 ,可采用先测量数据 存放在存储器中 ,测完 N 点后 ,再对 N 个数据进行平均值计算;

  • 选取适当的数据格式 ,也就是说采用定点数还是采用浮点数。

https://cdn.china-scratch.com/timg/190802/14245029A-10.jpg

11、递推平均滤波法

采用队列作为测量数据存储器,设队列的长度为N。每进行一次测量,把测量结果放于队尾。而扔掉原来队首的一个数据,这样在队列中始终就有N个“最新”的数据。

当计算平均值时,只要把队列中的N个数据进行算数平均,就可得到新的算数平均值。这样每进行一次测量,就可得到一个新的算术平均值。

https://cdn.china-scratch.com/timg/190802/1424501453-11.jpg

12、一阶滞后滤波法

优点:对周期性干扰具有良好的抑制作用,适用于波动频率较高的场合。

缺点:相位滞后,灵敏度低。滞后程度取决于a值大小,不能消除滤波频率高于采样频率的1/2的干扰信号。程序如下:

https://cdn.china-scratch.com/timg/190802/1424514b3-12.jpg

13、PID控制算法

在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器,是应用最为广泛的一种自动控制器。

对于过程控制的典型对象“一阶滞后+纯滞后”与“二阶滞后+纯滞后”的控制对象,PID控制器是一种最优控制。PID调节规律是连续系统动态品质校正的一种有效方法,它的参数整定方式简便,结构改变灵活(PI、PD、…)。

https://cdn.china-scratch.com/timg/190802/14245161b-13.jpg

程序片段如下:

https://cdn.china-scratch.com/timg/190802/1424513214-14.jpg

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com