这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 嵌入式C语言常用18种算法范例

共11条 1/2 1 2 跳转至

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

菜鸟
2016-04-03 11:29:39     打赏

第一种:

/*

将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");

}


第二种:/*
将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");

}

第三种:

/*  检测字符串是否是回文:
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");
}
}
第四种:

/*
有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
************************************************************************
编程思路:将输入值从左到右开始于数组比较,若小于或等于此数组元素,
则把输入值存到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[i]=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]);
}





关键词: 嵌入式     语言     数组    

专家
2016-04-04 20:40:05     打赏
2楼
沙发

助工
2016-04-07 22:20:28     打赏
3楼
只有四种

院士
2016-04-08 22:38:43     打赏
4楼
学习了。弱弱的问一下“检测字符串是否是回文”,在实际中应用有哪些?谢谢。

菜鸟
2016-04-11 11:07:27     打赏
5楼


第五种 整数转字符串

/*

把整数按照进制数转换为相应进制的字符串(要考虑符号),
比如 -1234,转换为 “-1234” ,支持10进制,16进制。
编程思路:先判断输入的整数的正负,若负数则取它相反数。将此数用短除法分别计算出10进制与16进制
的结果 再输出。
*/

#include

#define uchar unsigned char

void main()
{
int a,b[20],c;
uchar i=0;
char j;           //j一定为有符合的数 因为j--最后是负数

printf("请输入!回车结束!\n");
scanf("%d",&a);           //输入一个整数

c=a;
if(c>=0)              //判断正负
{
do
{                  //用短除法计算10进制的结果 存入数组
b[i]=c%10;
c=c/10;
i=i+1;
}while(c!=0);
for(j=i-1;j>=0;j--)
printf("%c",b[j]+48);  //输出结果 结果顺序 取反   输出的是字符 所有数字要加上48
printf("\n");
}
else
{
c=-c;                       //负数一样的求法
do
{
b[i]=c%10;
c=c/10;
i=i+1;
}while(c!=0);
for(j=i-1;j>=0;j--)
printf("%c",b[j]+48);
printf("\n");
}

i=0;
if(a>=0)
{
do
{                           //用短除法计算16进制的结果 存入数组
b[i]=a%16;
a=a/16;
i=i+1;
}while(a!=0);
printf("0x");
for(j=i-1;j>=0;j--)
{
if(b[j]>9)
printf("%c",b[j]+87);          //输出结果 结果顺序 取反   输出的是字符 所有字母加87 数字要加上48
else
printf("%c",b[j]+48);
}
printf("\n");
}
else
{
a=-a;                           //负数一样的求法
do
{
b[i]=a%16;
a=a/16;
i=i+1;
}while(a!=0);
printf("-0x");
for(j=i-1;j>=0;j--)
{
if(b[j]>9)
printf("%c",b[j]+87);
else
printf("%c",b[j]+48);
}
printf("\n");

}

}


第六种:求三角形直角边

/*
求直角三角形:  斜边长度L
求2个直角边:X,Y长度    正弦函数、余弦函数。
编程思路:调用库函数,用sin和cos计算出直角边。
*/

#include
#include

void main()
{
float a,b,R,L,r;

printf("请输入斜边长度:");
scanf("%f",&L);
printf("请输入其中一斜角度数:");
scanf("%f",&r);
R=r/180*3.1415926;               //计算弧度
a=sin(R)*L;                      //计算一直角边
b=cos(R)*L;                      //计算另一直角边
printf("%.2f\n",a);
printf("%.2f\n",b);
}


敬请关注后续阶段:


菜鸟
2016-04-12 17:52:49     打赏
6楼

第七种:相乘

/*

1*2*3*4*5*...*n
编程思路:阶乘,用1乘于一个变量,变量没乘一次自加一,再将结果成下一个变量,直到次数与输入数字一致为止。
*/

#include

#define uchar unsigned char
#define uint unsigned int

void main()
{
uchar i,m;
long a=1;

printf("请输入一个整数!回车结束!\n");
scanf("%d",&m);                             //输入一个数字
for(i=1;i {
a=a*i;                                  //本次相乘结果是上一次结果*相乘次数
}
printf("输出的结果为:\n");
printf("%d\n",a);
}

第八种:画圆

/*
画实心圆
* * *
* * * * *
* * * * *
* * * * *
* * *


************
**************
****************
******************
******************
******************
****************
**************
************

编程思路:用for循环打印*  成为一个圆 或直接打印*成一个圆
*/

#include

#define uchar unsigned char

void main()
{
uchar i,j,k;
//用for循环打印 * 成一个圆
for(j=0;j<4;j++)
{
for(i=0;i<3-j;i++)
printf(" ");
for(i=0;i<12+2*j;i++)
printf("*");
printf("\n");
}
for(i=0;i<18;i++)
printf("*");
printf("\n");
for(j=0;j<4;j++)
{
for(i=0;i printf(" ");
for(i=0;i<18-2*j;i++)
printf("*");
printf("\n");
}
printf("\n");
printf("  * * *  \n");   //直接打印  * 成一个圆
printf("* * * * *\n");
printf("* * * * *\n");
printf("* * * * *\n");
printf("  * * *  \n");
}
 


高工
2016-04-20 21:33:26     打赏
7楼
好有共享精神

菜鸟
2016-04-26 19:03:23     打赏
8楼
坐等。

工程师
2016-05-22 17:23:52     打赏
9楼
这才8种啊

菜鸟
2016-05-30 11:09:12     打赏
10楼
坐等更新

共11条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]