《C语言经典问题.doc》由会员分享,可在线阅读,更多相关《C语言经典问题.doc(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 C语言经典程序1.求1-1/2+1/3-1/4+1/99-1/100的值#include void main()int sign=1;float sum=1;int i=2;while(i=100) sign=-sign; sum=sum+sign*(1.0/i); i+; printf(该式子的值为%d,sum); 2.判断一个年份是不是闰年#includevoid main()int year;printf(Please input a year:n); scanf(%d,&year);if(year%4=0)&(year%100!=0)|(year%100=0)&(year%400=0
2、)printf(%d is a leap yearn,year);else printf(%d is not a leap yearn0,year);3.海伦公式求三角形面积#include#includevoid main()float a,b,c,p,area; printf(请输入三角形的三边长n); scanf(%f,%f,%f,&a,&b,&c);p=1.0/2*(a+b+c);if(a+bc&b+ca&a+cb) area=sqrt(p*(p-a)*(p-b)*(p-c);printf(三角形的面积为:%7.2fn,area); else printf(不能构成三角形n);(1)此
3、程序还可加入一个函数判断三角形形形状,但是较为复杂(2)其他的凸多边形可以通过分割成若干三角形,用此公式计算各三角形面积后相加得多边形面积4.鸡兔同笼问题:鸡头兔头的总个数m,脚的总个数n计算鸡和兔的只数#includevoid main()int m,n,x,y;printf(请输入鸡、兔子的头以及脚的的个数和都应为偶数n);scanf(%d,%d,&m,&n);if(4*m-n0)&(n-2*m0)x=(4*m-n)/2;y=(n-2*m)/2;printf(鸡的个数为%d,兔子的个数为为%dn,x,y);elseprintf(不存在这样的组合n);2. 5.计算分段函数的函数值y= Si
4、n x (-5x0)#include#includevoid main()float x,y;printf(请输入x的值:n); scanf(%f,&x);if(x-5&x0)y=3*x-3;printf(当x=%f时,y=%10.6f,x,y); 6.给出一百分制成绩,要求输出成绩等级A、B、C、D、E,90以上为A; 80-89为B,70-79为C,60-69分为D,60分以下为E #includevoid main() float score,i; char grade; printf(请输入学生的成绩n); scanf(%f,&score); i=score/10; while(sco
5、re100) printf(输入的成绩值有误,重新输入n); scanf(%f,&score); switch(int)i) case 0:grade=E; break;case 1:case 2:case 3:case 4:case 5:case 6:grade=D; break;case 7:grade=C; break;case 8:grade=B; break;case 9:grade=A; break;case 10:; printf(输入的成绩为%8.2f,其对应的等级为%cn,score,grade); 7.用微元法(梯形法)计算积分:x3+2x2+4x在规定区间的值 #incl
6、udevoid main()float f(float x0);float x0,x1,y=0;int n,i;printf(请输入区间等分数,值越大,结果越精确n);scanf(%d,&n);printf(输入函数的区间:n);scanf(%f,%f,&x0,&x1);for(i=1;i=n;i+) y=y+(f(x0+(x1-x0)*(i-1)/n)+f(x0+(x1-x0)*i/n)*(x1-x0)/n)*(1.0/2); printf(所求积分值为%8.2f,y);float f(float x0)float z;z=x0*x0*x0+2*x0*x0+4*x0;return(z);8.
7、计算阶乘,用递归法#includevoid main()float num,z;float factor(int num);printf(输入要计算阶乘的正数:n);scanf(%f,&num);z=factor(num);if(num0)|(int)num-num)!=0) printf(无效的数值n);elseprintf(%8.0f !=%10.8f,num,z); float factor(int num) float f;if(num=0|num=1) f=1; elsef=factor(num-1)*num;return(f);9.求sqrt(2+sqrt(2+sqrt(2+)+s
8、qrt(2),次数由键盘输入#include#includevoid main()float result=sqrt(2);int n,m;printf(请输入根号的个数:n);scanf(%d,&n);m=n;while(n1)result=sqrt(2+result);n-;printf(如果有%d个根号,则结果为%f,m,result);10计算形如Ax2+Bx+C=0的方程的解,按情况讨论#include#includevoid main()float a,b,c,di,x1,x2,p,q;printf(请依次输入方程的系数abcn);scanf(%f,%f,%f,&a,&b,&c);
9、di=b*b-4*a*c;if(a=0)if(b!=0)x1=-c/b;printf(方程为一元一次方程,有一实根x=%8.2fn,x1);else if(c=0)printf(方程是一个恒等式,x可以取任意值n);elseprintf(这是一个矛盾式n);elseif(di0) p=-b/(2.0*a);q=sqrt(-di);x1=q;printf(该二元一次方程有两个复根x1=%6.2f+%6.2fi x2=%6.2f-%6.2fin,p,x1,p,x1);else if(di=0)x1=-b/(2.0*a);printf(该二元一次方程有一个实根x=%8.2fn,x1);elsex1=
10、(-b/(2.0*a)+sqrt(di);x2=(-b/(2.0*a)-sqrt(di);printf(该二元一次方程有两个实根x1=%8.2f x2=%8.2fn,x1,x2);11设圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积圆柱体积。由键盘输入数据,用宏定义圆周率,结果取两位小数。#include#define pi 3.14159void main()float r,h;float c,cs,bs,bv,zv;printf(请输入圆的半径以及圆柱体的高n);scanf(%f,%f,&r,&h);c=2.0*pi*r;cs=pi*r*r;bs=4*pi*r*r;
11、bv=(4.0/3)*pi*r*r*r;zv=cs*h;printf(圆周长为%6.2f,圆面积为%6.2f,圆球表面积为%6.2f,圆球体积为%6.2f,圆柱体积为%6.2f,c,cs,bs,bv,zv);12.将输入的字母变为其后的第四个字母,若到z就返回字母表顶端的a,变换前后大小写一致,例如a-e,z-a#includevoid main()char c,s;printf(输入字符串n);while(c=getchar()!=n)if(c=a&c=A&c=w&c=w&c=z)s=c-22;printf(%c,s); printf(n);13.判断输入的字符串中是否含大写字母,若是大写字
12、母将其转换为小写字母#includevoid main()char c,s;printf(输入字符串n);while(c=getchar()!=n)if(c=A&c=a&c=z) s=c;printf(%c,s); printf(n);14.打印出斐波那契数列的前20项:1,1,2,3,5,8,13 #includevoid main() intFibonacci(int num);int num,m=0; printf(斐波那契数列的前20项为n);for(num=1;num=20;num+)printf(%10d,Fibonacci(num);m+;if(m%5=0)printf(n);i
13、nt Fibonacci(int num)int f;if(num=2|num=1)f=1; elsef=Fibonacci(num-1)+Fibonacci(num-2);return(f);15.输入两个整数,求它们相除的余数。用带参数的宏来定义。#include#define mod(a,b) a%bvoid main() int m,n; printf(从大到小依次输入两个整数n); scanf(%d,%d,&m,&n); printf(%d和%d相除的余数为%dn,m,n,mod(m,n);16.判断一个数是否为素数#include#includevoid main() int i,
14、m,k; printf(请输入一个整数:n); scanf(%d,&m); for(i=2;i=sqrt(m);i+) if(m%i!=0) printf(%d是素数n,m); break; else printf(%d不是素数n,m); 17.分解合数#includevoid main() int m,k; printf(请输入一个数: n); scanf(%d,&m); printf(%d=,m); for(k=2;km;) if(m%k!=0) /不能被k整除,就让k自加1 k+; else /能被k整除,就让m等于被除后的数 printf(%d*,k); m=m/k; k=2; /让k
15、重新等于2 printf(%d,k);18,计算两个数的最大公约数和最小公倍数#includevoid main() int mi(int,int);int di(int,int,int);int m,n,x,y;printf(请输入两个整数n);scanf(%d,%d,&m,&n);x=mi(m,n);y=(m*n)/x;printf(这两个数的最大公约数为%d,最小公倍数为%d,x,y);int mi(int u,int v)int r,t;if(vu)t=u;u=v;v=t;while(r=u%v)!=0)u=v;v=r;return v;int di(int u,int v,int h
16、)return (u*v)/h);19完数:因子之和等于它本身的数,打印1000内的完数,例如6=1*2*3=1+2+3#includevoid main() int m,i,sum;printf(1000以内的完数如下所示:n);for(m=1;m=1000;m+)sum=0;for(i=1;im;i+)if(m%i)=0) sum=sum+i;if(sum=m)printf(%d its factors are:,m);for(i=1;im;i+)if(m%i)=0)printf(%d,i);20.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。#includevoid
17、main() int word=0,space=0,digit=0,other=0;char c;printf(输入一行字符n);while(c=getchar()!=n)if(c=a&c=A&c=0&c=9)digit+; else if(c= ) space+; else other+;printf(字母的个数为%dn,word);printf(空格的个数为%dn,space);printf(数字的个数为%dn,digit);printf(其他字符的个数为%dn,other);该题也可通过字符数组和gets(str)函数实现21求Sn=a+aa+aaa+,若n为a的位数,求一直到有n个a时
18、多项式的值,a和n由键盘输入。#includevoid main() int tn=0,sn=0,a,n,i; printf(依次输入a,n的值:n); scanf(%d,%d,&a,&n); for(i=1;i=n;i+) tn=tn+a; sn=sn+tn; a=a*10; printf(sn=%dn,sn);22.输出所有水仙花数:指各位数字立方和等于该数的三位数#includevoid main() int m,a,b,c; printf(水仙花数如下所示n); for(m=100;m=999;m+) a=(m%100)%10; b=(m%100)-a)/10; c=(m-b*10-a
19、)/100; if(m=a*a*a+b*b*b+c*c*c) printf(%6d,m); 23. 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,有多吃了一个。以后每天都如此。第十天只剩下一个桃子。求第一天摘的桃子的总个数 #includevoid main() int sum=1,day; for(day=10;day1;day-) sum=2*(sum+1); printf(第一天摘的桃子总数为%dn,sum);24.用迭代法求x=sqrt(a),求平方根的迭代公式为:xn+1=1/2(xn+a/xn),要求前后两次求出的x
20、的差的绝对值小于10-5#include#includevoid main() float a; float x0,x1; printf(请输入要求平方根的数:n); scanf(%f,&a); x0=a/2; x1=(x0+a/x0)/2; while(fabs(x0-x1)=1e-5) x0=x1; x1=(x0+a/x0)/2; printf(%6.2f的平方根为%8.5f,a,x1);25.(1)打印出一个由*构成的菱形图案(2)打印数字金字塔类似题型难点在于找出列控制与行控制变量间的关系(1)#includevoid main()int i,j,k;for(i=0;i=3;i+)fo
21、r(j=0;j=2-i;j+)printf( );for(k=0;k=2*i;k+)printf(*); printf(n);for(i=0;i=2;i+)for(j=0;j=i;j+)printf( );for(k=0;k=4-2*i;k+)printf(*);printf(n);(2) 1121123211234321#include #define N 9/N可换为任意整数,由于没有设置格式,故超出9无法正确显示void main() int i,j,k,m;for(i=1;i=N;i+)for(j=1;j=N-i;j+)printf( ); for(k=1;k=2;m-)printf(
22、%d,m-1);printf(n);26.两乒乓球队进行比赛,甲队ABC三人,乙队XYZ三人,已知A不和X比,C不和XZ比, 编程找出三队比赛名单。#includevoid main() int i,j,k; printf(比赛名单如下:n); for(i=X;i=Z;i+) for(j=X;j=Z;j+) if(i!=j) for(k=X;k%cnB-%cnC-%cn,i,j,k);27.用筛选法求100之内的素数#include#includevoid main() int i,j,a101;printf(0-100内的素数为:n); for(i=1;i=100;i+) ai=i; for
23、(i=2;isqrt(100);i+) for(j=i+1;j=100;j+) if(ai!=0&aj!=0&(aj%ai=0) aj=0; for(i=1;i=100;i+) if(ai!=0) printf(%5d,ai); 28.对输入的数进行(1)选择排序(2)冒泡排序 (1) #includevoid main()int i,j,a10,min,t;printf(请输入要排序的数:n);for(i=0;i=9;i+)printf(a%d=,i);scanf(%d,&ai);printf(n);printf(待排序的数:n);for(i=0;i=9;i+)printf(%4d,ai);
24、printf(n); for(i=0;i=9;i+)min=i;for(j=i+1;jaj) min=j;t=amin; amin=ai;ai=t;printf(排序后的数:n);for(i=0;i=9;i+)printf(%4d,ai); printf(n);(2) #includevoid main()void bubble(int a);int i,a10;printf(请输入要排序的数:n);for(i=0;i=9;i+)printf(a%d=,i);scanf(%d,&ai);printf(n);printf(待排序的数:n);for(i=0;i=9;i+)printf(%4d,ai
25、);printf(n);bubble(a);printf(排序后的数:n);for(i=0;i=9;i+)printf(%4d,ai); printf(n);void bubble(int a)int i,j,t;for(j=0;j=9;j+)for(i=0;iai+1)t=ai;ai=ai+1;ai+1=t;29.有一个已经排好序的数组,今输入一个数要求按原来排列规律将其插入#includevoid main()int num,i,j,a11=1,2,5,7,8,9,11,34,55,65;printf(已经排好序的数为:n);for(i=0;ia9)a10=num;elsefor(i=0;
26、inum) for(j=9;j=i;j-)aj+1=aj; ai=num;break;printf(插入数字后的数为:n);for(i=0;i=10;i+)printf(%4d,ai);printf(n);30.将一个数组中的值按逆序重新存放 #include#define N 5void main()int i,aN,t;printf(请输入要逆序存储的数:n);for(i=0;i=N-1;i+)printf(a%d=,i);scanf(%d,&ai);printf(n);printf(待逆序存储的数:n);for(i=0;i=N-1;i+)printf(%4d,ai);printf(n);
27、for(i=0;iN/2;i+)t=ai;ai=aN-i-1;aN-i-1=t;printf(逆序后的数:n);for(i=0;i=N-1;i+)printf(%4d,ai); printf(n);31.输出杨辉三角形的前N行#include#define N 10/*通过改变N的值来改变行数,行数为N-1,例如现在是9行*/void main()int i,j,aNN;for(i=1;i=N-1;i+)ai1=1;aii=1;for(i=3;i=N-1;i+)for(j=2;j=i-1;j+)aij=ai-1j-1+ai-1j; for(i=1;i=N-1;i+)for(j=1;j=i;j+
28、)printf(%5d,aij);printf(n);printf(n);*32.一些复杂问题33.不用strcat函数将两个字符串连接起来#includevoid main()char s110,s210;int i=0,j=0;printf(n请输入字符串1:n);scanf(%s,s1);printf(请输入字符串2:n);scanf(%s,s2);while(s1i!=0)i+;while(s2j!=0)s1i+=s2j+;s1i=0;printf(连接后的新字符串为%s,s1);也可通过函数实现34.卷入的数 1 2 3 4 5 6 7 14 13 12 11 10 9 8 15 1
29、6 17 18 19 20 21#include #define M 8#define N 8void main() void change(int aN);int m=0,i,j,aMN; for(i=0;i=M-1;i+) for(j=0;j=N-1;j+) aij=m+; change(a); for(i=0;i=M-1;i+) for(j=0;j=N-1;j+) printf(%5d,aij); printf(n); void change(int aN)int temp,i,j; for(i=0;i=M-1;i+)for(j=0;jN/2;i+)if(i%2!=0)temp=aij;
30、aij=aiN-j-1;aiN-j-1=temp;else35.不用strcmp函数实现两个字符串比较,其差值为两字符串第一个不同字符的ASCII码之差#include void main()char str180,str280;int i=0,res;printf(请输入字符串1:n);gets(str1);printf(请输入字符串2:n);gets(str2);if(str10!=0&str20!=0)&str1i=str2i)i+;res=str1i-str2i;printf(两字符串差值为:%dn,res);可以用自己编写的函数完成所有string.h中封装好的函数!36.给定一个3
31、*3的二位数组,写函数求其转置矩阵#include #define N 3int aNN;void main()void trans(int a3);int i,j;printf(请输入一个3*3二维数组:n);for(i=0;i=N-1;i+)for(j=0;j=N-1;j+)scanf(%d,&aij);printf(初始的3*3二维数组:n);for(i=0;i=N-1;i+)for(j=0;j=N-1;j+)printf(%5d,aij); printf(n);printf(转置后的的3*3二维数组:n);trans(a);void trans(int a3)int i,j,t,bNN
32、;for(i=0;i=N-1;i+)for(j=0;j=N-1;j+)bij=aji;for(i=0;i=N-1;i+)for(j=0;j=N-1;j+)printf(%5d,bij); printf(n);37.编写一个函数,将一个字符串中的元音字母复制到另一个字符串中然后输出#include void main()void copy(char s,char c);char s80,c80;printf(输入一个字符串n);gets(s);copy(s,c);printf(其中的元音字母为%sn,c);void copy(char s,char c)int i,j=0; for(i=0;si!=0;i+) if(si=a|si=e|si=i|si=o|si=u|si=A|si=E|si=I|si=O|si=U)cj+=si;cj=0;38.编写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字字符之间空一格空格。如输下 1990,应输出1 9 9 0#include #include void main() voi