查看: 3154|回复: 4

嵌入式C语言常用18种算法范例

[复制链接]
发表于 2016-3-29 11:13:02 | 显示全部楼层 |阅读模式
第一种:冒泡排序法

/*
将uchar niu[8]={1,28,8,4,100,79,89,11};  AD
    采用冒泡法进行排序;(两个for循环嵌套);
****************************************************
编程思路:用最后一个数与前一个数比较,若比前一个数小
则交换位置,然后再与前一个数比较,若比前一个数小再交换
位置,知道比前一个数大或者已经在最前面!如此循环8次就可以排好循序!
*/
#include

#define uchar unsigned char

uchar niu[8]={8,28,6,4,100,79,102,11};

main()
{
        uchar a,b,c,j,k;

        for(j=0;j<8;j++)           //设置循环次数为8
        {
                for(k=7;k>j;k--)                //从最后一个数开始与前一个数比较                               
                {
                        if(niu[k]                         {       
                                c=niu[k-1];
                                niu[k-1]=niu[k];
                                niu[k]=c;
                        }       
                }
        }
        for(j=0;j<8;j++)
        {
            printf("%d\t",niu[j]);          //输出排好的数列
        }
        printf("\n");

}
更多技术交流欢迎咨询高老师:3322386182

 楼主| 发表于 2016-3-29 11:39:04 | 显示全部楼层
第二种:冒泡法排序2函数调用-地址传递

/*
将uchar niu[8]={1,28,8,4,100,79,89,11};
该算法用途:AD采样时采样20次,选一个中间值作为最终采样的值,可以采取该算法。
    采用冒泡法进行排序;(两个for循环嵌套);
****************************************************
编程思路:用最后一个数与前一个数比较,若比前一个数小
则交换位置,然后再与前一个数比较,若比前一个数小再交换
位置,知道比前一个数大或者已经在最前面!如此循环8次就可以排好循序!
*/
#include

#define uchar unsigned char

uchar a,b,c,j,k;
uchar nsd[8]={8,28,6,4,100,79,102,11};

uchar maopao(uchar niu[8]);

uchar maopao(uchar niu[8])
{
        for(j=0;j<8;j++)           //设置循环次数为8
        {
                for(k=7;k>j;k--)                //从最后一个数开始与前一个数比较                               
                {
                        if(niu[k]                         {       
                                c=niu[k-1];
                                niu[k-1]=niu[k];
                                niu[k]=c;
                        }       
                }
        }
        return  0;//这条可以不要,空的
}

void main()
{
    maopao(nsd);
        for(j=0;j<8;j++)
    {
            printf("%d\t",nsd[j]);          //输出排好的数列
    }
            printf("\n");

}
 楼主| 发表于 2016-3-29 11:39:19 | 显示全部楼层
更多技术交流欢迎咨询高老师:3322386182
 楼主| 发表于 2016-4-2 17:35:09 | 显示全部楼层
第四种:添加并排序
/*
有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
************************************************************************
编程思路:将输入值从左到右开始于数组比较,若小于或等于此数组元素,
  则把输入值存到B数组的相应位置,再把A数组后面的元素传递到B数组相应的位置,
  若输入值大于它则把A数组元素传递到B数组元素
  相应位置,
*/

#include

#define uchar unsigned char
#define uint unsigned int

uchar a[10]={4,6,8,11,28,66,79,100,102},b[10];

main()
{       
        uint m;
        uchar i=0,j,k;

        printf("请输入一个数字!回车结束!\n");
        scanf("%d",&m);                           //输入值存m
        for(j=0;j<9;j++)                          //从数组左侧开始判断
        {
                if(m<=a[j])                                  //若输入值小于或等于此处数组元素 则把m赋值到b数组相应的位置 再跳出循环
                {       
                        b[j]=m;
                        break;
                }
                else                                 //若输入值大于此处的数组元素 则把a数组中的元素传递到b的相对位置
                        b[j]=a[j];
                        i=i+1;                                                         //设置标志位
        }
        if(i==9)                                 //若输入值小于数组最大值 则把m赋值到第10个元素
                b=m;
        else
        {
                for(k=0;k<(9-j);k++)                                //数组元素从a传递到b数组
                {
                        b[j+k+1]=a[j+k];
                }
        }
        for(k=0;k<10;k++)                       //输出数组b
                printf("%d\t",b[k]);
}
想学习技术参加培训(包括模电/数电,单片机,PCBlayout,FPGA,嵌入式ARM,STM32,linux,android等技术培训课程,有初级,中级,高级课程)可以联系高老师Q3322386182更多学习视频等你免费学习,欢迎免费注册信盈达网校http://www.edu118.cn/
 楼主| 发表于 2016-4-2 17:32:13 | 显示全部楼层
第三种:
/*  检测字符串是否是回文:
    abcba. 如果是返回1.如果不是:0
***************************************************************************
编程思路:用输入的字符串中的第一个字符与最后一个字符比较,若不相同则跳出比较
当比较的次数与输入的字符个数的一半相等时 则认为是回文!
*/

#include

#define uchar unsigned char

uchar hw[20];

void main()
{
        uchar i,j;

        printf("请连续输入字符串,按回车结束输入!\n");
        for(i=0;i<20;i++)                                    //设置输入 并记录输入个数为i
        {
                scanf("%c",&hw[i]);   
                if(hw[i]=='\n')                                  //输入回车时  结束输入   
                {
                        break;
                }   
        }

        for(j=0;j         {
                if(hw[j]!=hw[i-j-1]) //比较相对应的字符 若不相等 就跳出循环
                                         //并记录相同的个数为j
                {
                        break;
                }
        }

        if(j==i/2)               //比较输入个数与匹配次数从而判断是否为回文
    {
                printf("您输入的字符串是回文\n");
        }
        else
        {
                printf("您输入的字符串不是回文\n");
        }
}
想学习技术参加培训(包括模电/数电,单片机,PCBlayout,FPGA,嵌入式ARM,STM32,linux,android等技术培训课程,有初级,中级,高级课程)可以联系高老师Q:3322386182
更多学习视频等你免费学习,欢迎免费注册信盈达网校http://www.edu118.cn/
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表