C语言经典例题.docx
- 文档编号:29593626
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:119
- 大小:1.10MB
C语言经典例题.docx
《C语言经典例题.docx》由会员分享,可在线阅读,更多相关《C语言经典例题.docx(119页珍藏版)》请在冰豆网上搜索。
C语言经典例题
代码算法积累:
1:
兔子数列覆盖思想,控制每行输出数据个数的办法
#include
intmain()
{
doublef1,f2;//防止数据溢出
inti;
f1=f2=1;
printf("%.0lf\t%0.lf\t",f1,f2);
for(i=1;i<=10;i++)
{
f1=f1+f2;
f2=f1+f2;
if(i%2==0)//每行输出4个数据,一次输了2个数据嘛
{
printf("\n");
}
printf("%.0lf\t%.0lf\t",f1,f2);//\t也可以用成%12d靠左嘛
}
return0;
}
递归的办法:
#include"stdio.h"
inttuzi(intn);
inta[100];
intmain()
{
intf1=1,f2=1,n;
scanf("%d",&n);
if(n==1||n==2)
{
printf("1\n");
return0;
}
tuzi(n);
return0;
}
inttuzi(intn)
{
intz;
if(n==1||n==2)
{
z=1;
}else
{
z=tuzi(n-2)+tuzi(n-1);
}
if(a[n]==0)//打印出来的数据的办法
{
a[n]=1;
printf("%d\n",z);
}
returnz;
}
这种是用a[i]==0来控制的。
。
但是并不一定按顺序,只是1、2刚好是一样的。
#include"stdio.h"
inttol(intn);
inta[13]={0};
intmain()
{
inta,i,b;
for(i=1;i<=12;i++)
{
printf("%4d",tol(i));
}//调用12次来打印就是了
printf("\nTotal=%d\n",tol(12));
return0;
}
inttol(intn)
{
intz;
if(n==1)
{
z=1;
}elseif(n==2)
{
z=2;
}else
{
z=tol(n-2)+tol(n-1);
}
returnz;
}
2;打星星,研究行数与输出个数的关系
#include
intmain()
{
intj,i,k;
for(j=0;j<6;j++)
{
for(k=5;k>j;k--)
{
printf("");//每一轮打印空格数从5逐减.
}
for(i=0;i<=j;i++)//j-i+1={1,2,3,4,5,6}[每进行一轮外层循环,内层循环数+1]
{
printf("*");
}
printf("\n");//循环一次换行
}
return0;
}
3:
研究对输入字节的统计
#include
intmain()
{
charc;
intn=0;
for(n=0;c=getchar(),c!
='\n';)
{
n++;//每进行了一次,循环内的变量就++
}
printf("%d",n);
return0;
}
4:
统计各种字母出现的次数
#include
intmain()
{
inta[150]={0},i,c;//可以优化下数组a[i-65]
intj;
while((j=getchar())!
='\n')/*先用一个变量j存储ASCII码,再用一个变量i循环*/
{
for(i=65;i<=122;i++)/*用这两个变量相互比较,相等时,a【第一个变量j】++*/
{
if(j==i)
{
a[i]++;
}
}
}
for(c=65;c<=122;c++)
{
if(a[c]!
=0)
{
printf("%c出现过%d次。
",c,a[c]);
}
}
return0;
}
5:
找数组中最大的数
#include
intmain()
{
intmax,a[10],i,j,temp;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
max=a[0];
for(i=1;i<10;i++)
{
if(a[i]>max)
{
max=a[i];
}/*把a【0】先给max,再用a【i】与max比较,*/
/*每次都把大的给max*/
}
printf("maxnumberis%d",max);
return0;
}
6:
给数组赋值的表示:
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("a[%d][%d]=",i,j);
scanf("%d",&a[i][j]);
}
}
7:
利息计算公式:
输入存款金额money,存期year和年利率rate,根据下列公式计算存款到期时的利息interest(税前),输出时保留2位小数。
interest=money(1+rate)year-money
8:
二分法算法
#include
#defineM10
intmain()
{
staticinta[M]={1,3,5,7,9,10,11,13,15,17};
intn,low,found=0,high,mid;
printf("请输入你要查找的数:
");
scanf("%d",&n);
low=0;
high=9;
while(high>=low)//过后会low>high
{
mid=(high+low)/2;//中间数
if(a[mid]==n)//是a【mid】,不要少写了
{
found=1;
break;
}
elseif(mid { low=mid+1; } else { high=mid-1; } } if(found==1)//布偶变量,单一出口 { printf("你要找的数是%d,在这个排序的第%d位。 ",n,mid); } else { printf("这个数不在这个数组中。 "); } return0; } Static: 静态变量。 一个程序在编译运行的时候,普通变量是存放在栈区的,在函数调用完成之后会释放这个栈。 static会使得变量存储在数据区(data)【这里的变量不能被改变,比如常量、字符串、用static声明的变量(不会因为一个函数的退出而消失,要整个程序停止来了才会消失)】。 所写的代码是放在代码区的。 整个内存主要分为四大区: CODE(代码区),DATA(数据区),STACK(栈)。 。 【程序在运行的时候】。 HEPU(这个空间由程序员来安排) 9: 万能拆数 #include intmain() { inta,i,n[100]={0},b=0; printf("请输入数: "); scanf("%d",&a); while(a! =0) { n[b]=a%10;//取个位 a/=10;//去个位 b++; } for(i=0;i<100;i++) { if(n[i]! =0) { printf("%d",n[i]); } } return0; } abc%10=; abc/10=ab;取余和整除恰好分完这个数。 。 。 10: 获得随机数 T=rand()%100+1;【得到一个1到100的随机数】{但是每次运行程序的随机数是一样的,要想不一样,要在括号里加上种子。 。 (如时间)}。 Rand(),生成0到32767之间的int,使用的时候用上math.h 11: 判断是不是三角形 判断三角形问题代码: #include void main() { float a,b,c; printf("请输入三角形的三条边长a,b,c: \n"); scanf("%f",&a); scanf("%f",&b); scanf("%f",&c); if((a>=1&&a<=100)&&(b>=1&&b<=100)&&(c>=1&&c<=100)) { if(a+b<=c||a+c<=b||b+c<=a) /*判断是否能构成三角形*/ printf("非三角形! \n"); else if((a==b&&(a! =c))||(a==c&&(b! =c))||(b==c&&(a! =c))) /*判断是否为等腰三角形*/ printf("等腰三角形\n"); else if(a==c && a==b) /*判断是否为等边三角形*/ printf("等边三角形\n"); else printf("一般三角形! \n"); } else printf("请输入1-100之间的数! \n"); } ***********************************4/26************************************ 12: 抵御非法输入(整形%d中输入char型) while(scanf(“%d”,&n)! =1) { Printf(“输入非法。 ”); Printf(“请重新输入: ”); Getchar();//释放输入流 } Scanf函数的返回值,有几个输入项正确,返回值就是几。 。 当输入后出现错误时或者end OfFile,返回值时EOF. 13: 水仙花数(运算之后的改变)【循环的陷阱】 水仙花数: 每个位的三次方之和等于本身。 #include intmain() { inti,k,y,sum=0; for(i=100;i<=999;i++) { k=i;//k要参与运算,i的值在运算完成之后不能变 while(k! =0) { y=k%10;//取个位 sum+=y*y*y; k=k/10;//去个位 }//不能用i,不然完成之后i=0,i++是1了。 if(i==sum) { printf("%d\t",sum); } sum=0;//一轮循环完成之后sum又要回到0才行。 } return0; } 14: 找质因数 #include #include intmain() { inta,i,j,f=0,k=0,m; doublet; printf("请输入一个整数: "); scanf("%d",&a); printf("%d=",a); for(i=2;i<=a;i++)//i用来控制质因数的范围 { t=sqrt((double)i);//找i内的质数 if(t=(int)t) { m=i; } else { for(j=2;j++;j<(int)t)//找寻找i内的质数 { if(i%j==0) { m=i;//将i内的质数给m break; } } } while(a%m==0)//从最小的质数开始除,直到无法了,再下一个 { if(f! =0) { printf("*");//f的值是用来控制*号的 } printf("%d",m); a=a/m; f=1; } } printf("\b"); return0; } 15: 找最大公约数与最小公倍数 1: 找最大公约数用辗转相除 辗转相除法是求最大公约数和最小公倍数的另一种方法。 具体做法是: 用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。 如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。 把这些数相乘就是最小公倍数。 例如: 求112和77的最大公约数。 把112和77并列,用77去除112,商1余35, 因为余数不是0,所以继续用35去除77,商2余7 因为余数不是0,继续用7去除35,商5余0 当最后余数是0时,辗转相除的过程已经完成,最后的除数7就是112和77的最大公约数。 2: 最小公倍数=两数之积(a*b)/最大公约数。 代码: #include #include intmain() { intmaxy(inta,intb); intmaxb(intm,intn,inty); inty,a,b,bs; printf("Iputtwonumbers: "); scanf("%d%d",&a,&b); y=maxy(a,b); bs=maxb(a,b,y);//参数就相当于赋值,在main中的a,b值仍然没变. printf("最大公约数是: %d\n",y); printf("最小公倍数是: %d\n",bs); return0; } intmaxy(inta,intb) { inttemp,z; if(a { temp=a; a=b; b=temp; }//让b是最小的那个数. if(a%b==0) { z=b; }//当b就是最大公约数时 while(b%a! =0) { z=b%a; b=a; a=z; }//上一次的除数作被除数,新得的余数作除数,最后余数是0的除数就是所求。 。 //开始的时候是用大的那个数除以小的那个数 returnz; } intmaxb(intm,intn,inty) { intf; f=m*n/y; returnf; } 16: 变态的函数与空格 #include #include voidstar2(inta);//分步混用的时候,用函数,局部变量 voidstar1(inta); intmain() { inta; scanf("%d",&a); star2(a); star1(a); return0; } voidstar2(inta) { inti,j,k,m; for(i=1;i<=a;i++)//控制行数简单 { for(j=1;j<=a-i;j++)//打印数量递减时,用j<=总行数-从小到大的行数数学关系.控制。 递增时就是j<=每行数量的数学关系(j<=i)。 。 反正这两者是反的。 { printf(""); } for(k=1;k<=2*i-1;k++)//打印数量递增时,k<=每行的数学关系。 反之就是用总数-每行数学关系 { printf("*"); } printf("\n"); } } voidstar1(inta) { inti,j,k,m; m=2*(a-1)-1; for(i=1;i<=a;i++) { for(j=1;j<=i;j++) { printf(""); } for(k=1;k<=m;k++) { printf("*"); } printf("\n"); m-=2; } } 17: 真假值的关系 有几个人真话假话时,用真为1假为0的加法和来表示 学校某班A、B、C、D四位同学中的一位做了好事不留名,表扬信来了之后,班主任问这四位是谁做了好事,四位回答如下: A说: 不是我。 B说: 是C。 C说: 是D。 D说: 他胡说。 已知三个人说的是真话,一个人说的是假话。 请根据这些信息,找出做了好事的人。 #include intmain() { inti; charc; for(i=1;i<=4;i++)//就是说a对应1,b对应2,.......... { if((i! =1)+(i==3)+(i==4)+(i! =4)==3) { break;//真为1,假为0,最终结果是3 } } if(i==1) { c='a'; }elseif(i==2) { c='b'; }elseif(i==3) { c='c'; }else { c='d'; } printf("%c做了好事。 。 ",c); return0; } 18: 冒泡排序 /******************** **冒泡排序* *********************/ #include intmain() { intj,k,i,a[10],temp; printf("请输入10个数: "); for(i=0;i<10;i++) { scanf("%d",&a[i]); } for(i=0;i<9;i++) { for(j=0;j<9-i;j++)//递减就是总数-个数规律 {//每进行一轮就少一轮 if(a[j]>a[j+1])//每进行一轮,最大的数就推到了末尾 { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } for(i=0;i<10;i++) { printf("%6d",a[i]); } return0; } 19: 逻辑判断思路 一组以循环表示,一组以单个元素表示 /************************************** **题目: 两个乒乓球队进行比赛,各出* **三人。 甲队为a,b,c三人,乙队为x,* **y,z三人。 已抽签决定比赛名单。 有* **人向队员打听比赛的名单。 a说他不* **和x比,c说他不和x,z比,请编程序* **找出* ** 三队赛手的名单。 * ***************************************/ #include intmain() { chari,j,k;//a对手i,b对手j,c对手k for(i='x';i<='z';i++)//a可能面对x,y,z三个对手 { if(i! ='x')//a不和x比 { for(j='x';j<='z';j++) { for(k='x';k<='z';k++) { if(k! ='z'&&k! ='x')//c不和x、z比 { if(i! =j&&i! =k&&j! =k)//没有重复的对手 { printf("a: %c\nb: %c\nc: %c",i,j,k); } } } } } } return0; } 20: 不用第三个变量,交换两个变量的值 如果不用中间变量tmp,有以下两种方法: 方法1: a=a+b; b=a-b; a=a-b; 方法2: a=a^b; b=a^b; a=a^b; 21: 实现整数的次方: inti,result=1; for(i=1;i<=b;i++) { result*=a;//用循环来实现 } 22: File1: #include"stdio.h" voidmain() { externvoidenter_string(charstr[]); externvoiddelete_string(charstr[],charch); externvoidprint_string(charstr[]); /*表明将在其他文件调用函数*/ charc; charstr[80]; enter_string(str); scanf("%c",&c); delete_string(str,c); print_string(str); } File2: #include"stdio.h" //定义enter_string()函数 voidenter_string(charstr[80]) { gets(str);//向字符数组输入字符串 } File3: voiddelete_string(charstr[],charch) { inti,j; for(i=j=0;str[i]! ='\0';i++) { if(str[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 经典 例题