/*
将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");
}
/*
将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");
}
/* 检测字符串是否是回文:
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");
}
}
/*
有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
************************************************************************
编程思路:将输入值从左到右开始于数组比较,若小于或等于此数组元素,
则把输入值存到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]);
}
/*
把两个字符串连接
编程思路:调用库函数,将一段字符串添加到另一段字符串后面
*/
#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);
}
/*
判断闰年
编程思路:闰年能被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);
}
/*
在一个现字符串中查找另一个字符串,如果找到返回匹配子字符的指针,没有找到返回空指针。
编程思路:用原有字符串与输入的字符串逐一比较,若原字符中有一个字符与输入字符相同,则开始比较后面的字符是否也
与输入的字符串一一对应,若有不对应的则跳出此次循环,再判断对比次数是否与输入字符串个数一致,若一致则认为找到对应字符串
并返回相应地址与长度
*/
#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");
}
/*
把整数按照进制数转换为相应进制的字符串(要考虑符号),
比如 -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);
}
/*
打印出所有的“水仙花数”, 所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
例如: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");
}
/*
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);
}
/*
画实心圆
* * *
* * * * *
* * * * *
* * * * *
* * *
************
**************
****************
******************
******************
******************
****************
**************
************
编程思路:用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");
}
/*
有一对兔子,从出生后第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");
}
/*
判断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");
}
/*
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
将输入的字符一一与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);
}
/*
求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);
}
/*
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第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);
}
}
//这不科学 第一天 猴子就撑死啦!
/*
利用递归方法求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; //返回函数值
}