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

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

    • 1-1.冒泡法排序
    • 1-2 冒泡法排序 - 函数调用
    • 2 回文
    • 4 添加并排序
    • 5 合并字符串
    • 6 判断闰年
    • 7查找字符串
    • 8把整数按照进制数转换为相应进制的字符串(要考虑符号)
    • 9求直角三角形: 斜边长度L
    • 10“水仙花数”
    • 11阶乘
    • 12画圆
    • 13兔子数列
    • 14素数
    • 15统计不同数据个数
    • 16求N个数字
    • 17猴子吃桃
    • 18递归阶乘

1-1.冒泡法排序

/*
将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]<niu[k-1])    //比前一个数小则交换位置
			{	
				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");

}

在这里插入图片描述

1-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]<niu[k-1])    //比前一个数小则交换位置
			{	
				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");

}

在这里插入图片描述

2 回文

/*  检测字符串是否是回文:
    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<i/2;j++)
	{
		if(hw[j]!=hw[i-j-1]) //比较相对应的字符 若不相等 就跳出循环 
			                 //并记录相同的个数为j
		{
			break;
		}
	}

	if(j==i/2)               //比较输入个数与匹配次数从而判断是否为回文
    {
		printf("您输入的字符串是回文\n");
	}
	else
	{
		printf("您输入的字符串不是回文\n");
	}
}

在这里插入图片描述
在这里插入图片描述

4 添加并排序

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

在这里插入图片描述

5 合并字符串

/*
把两个字符串连接
编程思路:调用库函数,将一段字符串添加到另一段字符串后面
*/

#include 
#include  

main() 
{
	char a[40],b[20];

	printf("请输入第一个字符串!回车结束!\n");
	scanf("%s",&a);                                  //输入第一段字符串
	printf("请输入第二个字符串!回车结束!\n");
	scanf("%s",&b);                                 //输入第二段字符串
	strcat(a,b);                                    //调用库函数实现字符串的连接
	printf("输出如下所示:\n");
	printf("%s\n",a);
} 

嵌入式C语言常用算法范例_第1张图片

6 判断闰年

/*
    判断闰年  
	 编程思路:闰年能被4整除 而不能被100或者400整除
*/

#include 

#define uint unsigned int

void main()
{
	uint a;

	printf("请输入查询的年份!回车结束!\n");
	scanf("%d",&a);
	if((a%400==0)||(a%4==0)&&(a%100!=0))           //设置闰年的条件 能被4整除 而不能被100或者400整除
		printf("您查询的%d年是润年!\n",a);
	else
		printf("您查询的%d年不是润年!\n",a);
}

在这里插入图片描述

7查找字符串

/*
在一个现字符串中查找另一个字符串,如果找到返回匹配子字符的指针,没有找到返回空指针。
编程思路:用原有字符串与输入的字符串逐一比较,若原字符中有一个字符与输入字符相同,则开始比较后面的字符是否也
 与输入的字符串一一对应,若有不对应的则跳出此次循环,再判断对比次数是否与输入字符串个数一致,若一致则认为找到对应字符串
  并返回相应地址与长度
*/

#include 

#define uchar unsigned char

void main()
{
	uchar a[]="qwertyuiopasdfghjklzxcvbnm1234567890",b[20],*sp,j,i,m=0,n;  //设置现有字符串

	printf("请输入一段字符串!回车结束!\n");
	for(j=0;j<20;j++)
	{
	scanf("%c",&b[j]);                   //输入查找的字符串 并统计字符串个数为i
	if(b[j]=='\n')
		break;
	}
	sp=a;                                //设置指针指向
	for(n=0;n<36;n++)
	{
		if(*sp==b[0])                    //若原字符串有一个字符与输入字符串第一字符相等 则进入循环
		{
			for(i=0;i<j;i++)            //设置比对次数
			{
				if(*sp!=b[i])          //若不相同 则跳出循环 指针指向原字符串下一位
				break;
				sp=sp+1;
			}
			if((i==j)&&(i>1))          //若匹配的次数与输入字符串个数一致则认为 找到对应的字符串
			{	
				printf("查找到相应字符串为第%d个开始的%d个字符里\n",n+1,i);
			}
		}
		else
			sp=sp+1;                 
	}
	if((i!=j)||(i<=1))
		printf("无相应的字符串与之对应!\n");
}

在这里插入图片描述
在这里插入图片描述

8把整数按照进制数转换为相应进制的字符串(要考虑符号)

/*
    把整数按照进制数转换为相应进制的字符串(要考虑符号),
     比如 -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");

	}
}

在这里插入图片描述

9求直角三角形: 斜边长度L

/*
	求直角三角形:  斜边长度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);
}	

在这里插入图片描述

10“水仙花数”

/*
   打印出所有的“水仙花数”, 所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
     例如:153是一个“水仙花数”,
     因为153=1的三次方+5的三次方+3的三次方。
     1+125+27=126+27=153.
	 编程思路:将一个三位数的百位 十位 个位 分解出来 再 根据公式判断是否为水仙花数。
*/

#include 

#define uchar unsigned char
#define  uint unsigned int

void main()
{
	uchar j,k,m;
	uint n,i=100;

	printf("所有的水仙花如下:\n");
	while(i<1000)                         //设置循环判断所有的三位数
	{
		j=i/100;                          //分解三位数的百位数出来
		k=i%100/10;                       //分解三位数的十位数出来
		m=i%100%10;                       //分解三位数的个位数出来
		n=j*j*j+k*k*k+m*m*m;
		if(n==i)                          //相等则输出水仙花
		{
			printf("%d\t",i);
			i=i+1;
		}
		else
			i=i+1;
	}	
	printf("\n");
}

在这里插入图片描述

11阶乘

/*
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<m+1;i++)                          //设置相乘次数
	{
		a=a*i;                                  //本次相乘结果是上一次结果*相乘次数
	}
	printf("输出的结果为:\n");
	printf("%d\n",a);
}

在这里插入图片描述

12画圆

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

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

  编程思路:用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<j;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");
}

嵌入式C语言常用算法范例_第2张图片

13兔子数列

/*
	有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,
	假如兔子都不死,问每个月的兔子总数为多少?
	编程思路:小   中  大  总数
         1月  1对  0   0    1
		 2月  0    1   0    1
		 3月  1    0   1    2
		 4月  1    1   1    3
		 5月  2    1   2    5
		 规律:从第三个月开始 每个月总数 是上两月总数之后。
*/

#include 

#define uchar unsigned char
#define uint unsigned int

void main()
{
	uchar i,j=1,k=1;
	uint m,n;

	printf("请输入月份!回车结束!\n");
	scanf("%d",&i);                       //输入月份
	if(i>2)
	{
		for(m=3;m<=i;m++)                
		{
			n=j+k;                    //n为本个月的总数
			j=k;                      //j为上上个月总数
			k=n;                      //k为上个月总数
		}
		printf("%d\n",n*2);
	}
	else
		printf("2\n");
}

在这里插入图片描述

14素数

/*
判断101-200之间有多少个素数,并输出所有素数。
判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。
编程思路:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。
*/

#include 
#include 

#define uchar unsigned char

void main()
{
	uchar i,j,k;

	for(i=101;i<200;i+=2)
	{
		j=sqrt(i);                 //求出算术平方根
		for(k=2;k<=j;k++)		   //用判断的数 除以一个从2到算术平方根的数 若有被整除的 则跳出循环 此数不是素数
		{
			if(i%k==0)
				break;
		}
		if(k>=j+1)                //若都没被整除的数 则此数为素数 输出此数
		{
			printf("%d\t",i);
		}
	}
	printf("\n");
}

在这里插入图片描述

15统计不同数据个数

/*
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
将输入的字符一一与ASCII的字符比较 若相符 则相应字符数加1.
*/

#include 

#define uchar unsigned char

void main()
{
	uchar i,j,a[20],k=0,m=0,n=0,r=0;

	printf("请输入一段字符串!回车结束!\n");
	for(i=0;i<20;i++)
	{
		scanf("%c",&a[i]);
		if(a[i]=='\n')
			break;
	}
	for(j=0;j<i;j++)
	{
		if((('A'<=a[j])&&(a[j]<='Z'))||(('a'<=a[j])&&(a[j]<='z'))) //判断大小写英文字母
			k=k+1;
		else if(('0'<=a[j])&&(a[j]<='9'))                          //判断数字
			m=m+1;
		else if(a[j]==32)                                          //判断空格
			r=r+1;
		else                                                       //其他字符
			n=n+1;
	}
	printf("字母共有%d个!\n",k);
	printf("数字共有%d个\n",m);
	printf("空格共有%d个\n",r);
	printf("其他字符共有%d个\n",n);
}

嵌入式C语言常用算法范例_第3张图片

16求N个数字

/*
求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
编程思路:推算出规律:第几个数=2*10几次方+前一个数。例如:第3个数为4*1000+444=4444 注意这里的4为输入的数字
*/

#include 

#define uchar unsigned char
#define uint unsigned int

void main()
{
	uchar i,m;
	uint s,j=1,k;

	printf("请输入相加的个数!回车结束!\n");
	scanf("%d",&m);
	s=m;
	for(i=1;i<m;i++)                           //设置相加次数
	{
		j=j*10;                                //计算每次相加的乘数  
		k=s+m*j;                               //计算此次的加数
		s=s+k;                                 //计算此时的和
	}
	printf("%d\n",s);
}

在这里插入图片描述

17猴子吃桃

/*
	猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,
	第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
	以后每天早上都吃了前一天剩下的一半零一个。
	到第10天早上想再吃时,见只剩下一个桃子了。
	求第一天共摘了多少。
编程思路:从最后一天算起,最后一天1个,前一天个数为后一天个数加一再乘2
*/

#include 

#define uchar unsigned char
#define uint unsigned int

void main()
{
	uchar day,i;
	uint s=0,j=1,k=0;

	printf("请输入第几天剩下一个桃子!回车结束!\n");
	scanf("%d",&day);                                    //输入第几天剩下一个桃子
	if(day==1)
		printf("第一天共有桃子1个!\n");
	else
	{
		for(i=1;i<day;i++)
		{
			s=(j+1)*2;                         //计算公式  从最后一天算起,最后一天1个,前一天个数为后一天个数加一再乘2
			j=s;
		}
		printf("第一天共有桃子%d个!\n",s);
	}
}

//这不科学 第一天 猴子就撑死啦!

在这里插入图片描述

18递归阶乘

/*
利用递归方法求5!
编程思路:用递归法 
*/

#include 

#define uchar unsigned char
#define uint unsigned int

long jc(uchar x);

void main()
{
	uchar i,j;
	uint s;

	printf("请输入所要求阶乘的数!回车结束!\n");
	scanf("%d",&j);
	s=jc(j);                                         //调用递归函数
	printf("结果为:%d\n",s);	
}

long jc(uchar x)                                        
{
	long m,n;
    
	if(x==0||x==1)                                  //输入为0或1的时候 输出结果为1
		m=1;
	else
		m=x*jc(x-1);                               //递归调用
	return m;                                      //返回函数值
}

在这里插入图片描述
在这里插入图片描述

你可能感兴趣的:(数据结构与算法,C语言)