C语言习题.docx
《C语言习题.docx》由会员分享,可在线阅读,更多相关《C语言习题.docx(45页珍藏版)》请在冰豆网上搜索。
C语言习题
《C语言程序设计》习题集
第1章C语言概述
1.1c语言程序的总体结构是怎样的。
解:
一个完整的c语言程序,是由一个、且只能由一个main()函数(又称主函数)和若
干个其他函数结合而成的,或仅由一个main()函数构成。
1.2c语言程序的基本单位是什么?
它的结构又如何?
解:
函数是c语言程序的基本模块单元。
任何函数(包括主函数main())都是由函数说明和函数体两部分组成。
其一般结构如下:
[函数类型]函数名(函数参数表)
{说明语句部分;
执行语句部分;}
1.3主函数main()在程序中的地位如何。
程序总是从哪个函数开始执行,到哪个函数执行完后结束?
解:
main()函数的作用相当于其他高级语言中的主程序;其他函数的作用相当于子程序。
一个c语言程序,总是从main()函数开始执行,而不论其在程序中的位置。
当主函数执
行完毕时,亦即程序执行完毕。
习惯上,将主函数main()放在最前头。
1.4c语言的语句分为哪几类?
解:
按照语句功能或构成的不同,可将c语言的语句分为五类。
控制语句、函数调用语句、表达式语句、空语句和复合语句。
1.5执行一个c语言程序的一般过程是什么?
解:
运行一个c语言程序的一般过程,如下图所示。
1)启动Tc,进入Tc集成环境。
2)编辑(或修改)源程序。
3)编译。
如果编译成功,则可进行下一步操作;否则,返回2)修改源程序,再重新编译,直至编译成功。
4)连接。
如果连接成功,则可进行下一步操作;否则,根据系统的错误提示进行相应修改,再重新连接,直至连接成功。
5)运行。
通过观察程序运行结果,验证程序的正确性。
6)退出Tc集成环境,结束本次程序运行。
1.6在Tc集成环境下,下列操作的快捷键分别是什么
解:
存盘:
F2;编译与连接:
F9;运行:
nF9;查看运行结果:
Alt+F5。
第2章 数据类型、运算符与表达式
2.1指出下列变量名中,哪些是合法的,哪些是非法的。
如果非法,为什么?
Int,char,345,ABdf,c&d,string*,_322,alpf_beat,JOHN.smith,3ab
解:
ABdf,_322,alpf_beat合法,其它的非法
Int,char非法是因为它们都是C语言关键字;
345,3ab非法是因为变量名不能以阿拉伯数字开头;
c&d,string*,JOHN.smith非法是因为变量名中只能由字母、数字和下划线组成。
2.2计算下列表达式的值
(1)a+b%3*(int)(a-b)/4(设a=13.6,b=8)
(2)(x+y)/2+(int)x%(int)y(设x=4.5,y=2.5)
(3)z*=3+6,z/z=z/2,z+=z-=z*=z(设z=6)
解:
(1)15.600000;
(2)3.500000;(3)0。
第3章顺序结构程序设计
3.1若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765,c1=‘a’,c2=‘b’。
想得到以下输出格式和结果,请写出程序(包括定义变量类型和设计输出)。
a=□3□□b=□4□□c=□5
x=1.200000,y=2.400000,z=-3.600000
x+y=□3.600□□y+z=-1.20□□z+x=-2.40
c1=ˊaˊ□or□97(ASCII)
c2=ˊbˊ□or□98(ASCII)
(□表示空格,下同)
参考源程序如下:
main()
{inta=3,b=4,c=5;
longintu=51274,n=128765;
floatx=1.2,y=2.4,z=3.6;
charc1='a',c2='b';
printf("a=%2db=%2dc=%2d\n",a,b,c);
printf("x=%f,y=%f,z=%f\n",x,y,z);
printf("x+y=%5.2fy+z=%5.2fz+x=%5.2f\n",x+y,y+z,z+x);
printf("u=%6ldn=%9ld\n",u,n);
printf("%s%s%d%s\n","c1='a'","or",c1,"(ASCII)");
printf("%s%s%d%s\n","c2='a'","or",c2,"(ASCII)");
}
3.2用scanf下面的函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=ˊAˊ,c2=ˊaˊ,问在键盘上如何输入?
main()
{
inta,b;floatx,y;charc1c2;
scanf("a=%d_b=%d",&a,&b);
scanf("_x=%f_y=%e",&x,&y);
scanf("_c1=%c_c2=%c",&c1,&c2);
}
输入方法如下:
a=3□b=7
□x=8.5□y=71.82
□c1=A□c2=a
3.2设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。
用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。
请编程序。
参考源程序:
main()
{floatr,h,C1,Sa,Sb,Va,Vb;
scanf("%f,%f",&r,&h);
C1=2*3.14*r;
Sa=3.14*r*r;
Sb=4*Sa;
Va=4*3.14*r*r*r/3;
Vb=Sa*h;
printf("C1=%.2f\n",C1);
printf("Sa=%.2f\nSb=%.2f\nVa=%.2f\nVb=%.2f\n",Sa,Sb,Va,Vb);
}
3.3输入一个华氏温度,要求输出摄氏温度。
公式为c=5(F-32)/9,输出要求有文字说明,取位2小数。
参考源程序如下:
main()
{floatF,c;
scanf("%f",&F);
c=5*(F-32)/9;
printf("输入的华氏温度为:
%.2f,则摄氏温度为%.2f",f,c);
}
3.4已知三角形的三边长,求其面积。
解:
假设输入的三边能构成三角形,三角形的面积公式为:
Area=
其中S=(a+b+c)/2。
参考源程序如下:
#include“math.h”
Main()
{
Floata,b,c,s,area;
Printf(“请输入三角形的三边:
”);
Scanf(“%f,%f,%f”,&a,&b,&c);
S=(a+b+c)/2.0;
Area=sqrt(s*(s-a)*(s-b)*(s-c));
Printf(“三角形的三边为:
%7.2f,%7.2f,%7.2f\n”,a,b,c);
Prinft(“三角形的面积为:
%7.2f\n”,area);
}
第4章选择结构程序设计
4.1写出下面表达式的值(设a=1,b=2,c=3,x=4,y=3)
(1)a+b>c&&b==c
(2)!
a
=c||x+y<=3
(3)a+(b>=x+y)?
c-a:
y-x
(4)!
(x=a)&&(y=b)&&0
(5)!
(a+b)+c-1&&b+c/2
(6)a||1+’a’&&b&&’c’
解:
(1)0;
(2)1;(3)2;(4)0;(5)1;(6)1。
4.2有三个整数a、b、c,由键盘输入,输出其中最大的数。
参考源程序:
main()
{inta,b,c,t;
scanf("%d%d%d",&a,&b,&c);
if(a>b)
if(a>c)t=a;
elset=c;
elseif(b>c)t=b;
elset=c;
printf("%d\n",t);
}
4.3给出一百分制成绩,要求输出成绩等级'A'、'B'、'C'、'D'、'E'。
90分以上为'A',80~89分为'B',70~79分为'C',60~69分为'D',60分以下为'E'。
参考源程序:
main()
{intnumber,md;charc1;
scanf("%d",&number);
md=number/10;
switch(md)
{
case10:
case9:
c1='A';break;
case8:
c1='B';break;
case7:
c1='C';break;
case6:
c1='D';break;
case5:
case4:
case3:
case2:
case1:
case0:
c1='E';break;
}
printf("%c\n",c1);
}
4.4给一个不多于5位的正整数,要求:
①求出它是几位数;②分别打印出每一位数字;③按逆顺序打印出各位数字,例如原来为321,应输出123。
参考源程序:
main()
{inta,b,c,d,e,n;longm;
scanf("%ld",&m);
a=0.0001*m;
b=10*(0.0001*m-a);
c=100*(0.0001*m-a-0.1*b);
d=1000*(0.0001*m-a-0.1*b-0.01*c);
e=m-10000*a-1000*b-100*c-10*d;
if(a!
=0)
n=5,printf("%d%d,%d,%d,%d,%d%d%d%d%d%d\n",n,a,b,c,d,e,e,d,c,b,a);
elseif(b!
=0)n=4,printf("%d%d,%d,%d,%d%d%d%d%d\n",n,b,c,d,e,e,d,c,b);
elseif(c!
=0)n=3,printf("%d%d,%d,%d%d%d%d\n",n,c,d,e,e,d,c);
elseif(d!
=0)n=2,printf("%d%d,%d%d%d\n",n,d,e,e,d);
elsen=1,printf("%d%d%d\n",n,e,e);
}
4.5企业发放的奖金根据利润提成。
利润(I)低于或等于10万元的,奖金可提10%;利润高于10万元,低20万元(10000010000000时,超过100万元的部分按1%提成。
从键盘输入当月利润I,求应发奖金总数。
要求:
⑴用if语句编程序;⑵用switch语句编程序。
⑴用if语句编程序:
main()
{inta,b,c,d,e;floatd1=0.01,d2=0.015,d3=0.03,d4=0.05,d5=0.075,d6=0.10;
doublejj,k;longi;
scanf("%ld",&i);
k=0.00001*i;a=k-10;b=k-6;c=k-4;d=k-2;e=k-0;
if(a<0)a=0;
if(b<0)b=0;
if(c<0)c=0;
if(d<0)d=0;
jj=a*d1+(b-a)*d2+(c-b)*d3+(d-c)*d4+(e-d)*d5+(k-e)*d6;
printf("jj=%.3f\n",100000*jj);
}
⑵用switch语句编程序:
main()
{inta,b,c,d,e,n,x;
floatd1=0.01,d2=0.015,d3=0.03,d4=0.05,d5=0.075,d6=0.10;
doublejj,k;longi;
scanf("%ld",&i);
k=0.00001*i;a=k-10;b=k-6;c=k-4;d=k-2;e=k-0;x=k;
switch(x)
{case0:
e=0;
case1:
d=0;
case3:
c=0;
case5:
b=0;
case9:
a=0;
default:
n=0;
}
jj=a*d1+(b-a)*d2+(c-b)*d3+(d-c)*d4+(e-d)*d5+(k-e)*d6;
printf("jj=%.3f\n",100000*jj);
}
4.6输入四个整数,要求按大小顺序输出。
参考源程序:
main()
{inta,b,c,d,t;scanf("%d,%d,%d,%d",&a,&b,&c,&d);
if(a
if(aif(aif(bif(bif(cprintf("%d,%d,%d,%d\n",a,b,c,d);
}
4.7有四个圆塔,圆心分别为(2,2),(-2,2),(-2,-2),(2,-2),圆半径为1。
见下图。
这四个塔的高度为10米,塔外无建筑物。
今输入任一点的坐标,求该点的建筑物高度(塔外高度为零)。
参考源程序:
#include"math.h"
main()
{floatx,y,n,m,r;inth;
scanf("%f,%f",&x,&y);
n=fabs(x);m=fabs(y);
r=sqrt((n-2)*(n-2)+(m-2)*(m-2));
if(r>1)h=0;
elseh=10;
printf("%d\n",h);
}
第5章循环结构程序设计
5.1求∑n!
(n=1->20),(即求1!
+2!
+3!
+4!
+5!
+…+20!
)
参考源程序:
main()
{intn,i=1;longsum=0,s=1;
scanf("%d",&n);
while(i<=n)
{s=s*i;sum=sum+s;i++;}
printf("sum=%ld\n",sum);
}
5.2输入两个正整数m和n,求其最大公约数和最小公倍数。
main()
{longm,n,i=1,j,s;
scanf("%ld,%ld",&m,&n);
for(;i<=m&&i<=n;i++)
{
if(m%i==0&&n%i==0)s=i;
}
if(m>=n)j=m;
elsej=n;
for(;!
(j%m==0&&j%n==0);j++);
printf("s=%ld,j=%ld\n",s,j);
}
5.3输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
参考源程序:
#include"stdio.h"
main()
{charc;inti=0,j=0,k=0,l=0;
while((c=getchar())!
='\n')
{if(c>=65&&c<=90||c>=97&&c<=122)i++;
elseif(c>=48&&c<=57)j++;
elseif(c==32)k++;
elsel++;
}
printf("i=%d,j=%d,k=%d,l=%d\n",i,j,k,l);
}
5.4求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。
例如:
2+22+222+2222+22222(n=5),n由键盘输入。
参考源程序:
#include"math.h"
main()
{intn,sum=0,i=1,s=2;
scanf("%d",&n);
while(i<=n)
{sum=sum+s;s=s+2*pow(10,i);i++;}
printf("sum=%d\n",sum);
}
5.5打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。
例如:
153是一个水仙花数,因为153=1^3+5^3+3^3。
参考源程序:
#include"math.h"
main()
{intx=100,a,b,c;
while(x>=100&&x<1000)
{a=0.01*x;b=10*(0.01*x-a);c=x-100*a-10*b;
if(x==(pow(a,3)+pow(b,3)+pow(c,3)))printf("%5d",x);
x++;
}
}
5.6一个数如果恰好等于它的因子之和,这个数就称为"完数"。
例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。
编程序找出1000之内的所有完数,并按下面格式输出其因子:
6 its factors are 1、2、3
参考源程序:
main()
{intm,i,j,s;
for(m=6;m<1000;m++)
{
s=1;
for(i=2;iif(m%i==0)s=s+i;
if(m-s==0)
{printf("%5ditsfastorsare1",m);for(j=2;jprintf("%d",j);printf("\n");}
}
}
或
main()
{intm,i,j,s;
for(m=6;m<1000;m++)
{s=m-1;
for(i=2;iif(m%i==0)s=s-i;
if(s==0)
{printf("%5ditsfastorsare1",m);for(j=2;jprintf("%d",j);printf("\n");}
}
}
5.7有一分数序列:
2/1,3/2,5/3,8/5,13/8,21/13…
求出这个数列的前20项之和。
参考源程序:
main()
{inti=1,n;doublet,x=1,y=2,s,sum=0;
scanf("%ld",&n);
while(i<=n){s=y/x;sum=sum+s;t=y;y=y+x;x=t;i++;}
printf("%f\n",sum);
}
5.8一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。
求它在第10次落地时共经过多少米?
第10次反弹多高?
参考源程序:
main()
{inti,n;doubleh=100,s=100;
scanf("%d",&n);
for(i=1;i<=n;i++)
{h*=0.5;
if(i==1)continue;s=2*h+s;
}
printf("h=%f,s=%f\n",h,s);
}
5.9猴子吃桃问题。
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉一半,又多吃一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。
求第一天共摘多少桃子。
参考源程序:
main()
{inti=1,sum=0;
for(;i<=10;i++);sum=2*sum+1;
printf("sum=%d\n",sum);
}
5.10用迭代法求x=。
求平方根的迭代公式为:
Xn+1=(Xn+1/Xn)/2
要求前后两次求出的得差的绝对值少于0.00001。
参考源程序:
#include"math.h"
main()
{floatx0,x1,a;
scanf("%f",&a);
x1=a/2;
do
{x0=x1;x1=(x0+a/x0)/2;}while(fabs(x0-x1)>=0.00001);
printf("%.3f\n",x1);
}
5.11用二分法求方程在(-10,10)之间的根
2x3-4x2+3x-6=0
参考源程序:
main()
{doublex1,x2,y1,y2;x1=-10;x2=10;
do{y1=2*x1*x1*x1-4*x1*x1+3*x1-6;
x1=x1-y1/(6*x1*x1-8*x1+3);}while(y1!
=0);
do{y2=2*x2*x2*x2-4*x2*x2+3*x2-6;
x2=x2-y2/(6*x2*x2-8*x2+3);}while(y2!
=0);
printf("x1=%.3f,x2=%.3f\n",x1,x2);
}
5.12打印以下图案
*
***
*****
*******
*****
***
*
参考源程序:
#include"math.h"
main()
{inti=1,k,l,m;
for(;i<=49;i++)
{k=i%7;l=3-fabs((i-1)/7-3);m=fabs(i-4-7*((i-1)/7));
if(k==1)printf("\n");
if(m<=l)printf("*");
elseprintf("");}
printf("\n");
}
第6章数组
6.1用筛选法求100以内的素数。
参考源程序:
main()
{inti,j,a[100];
for(i=2;i<100;i++)
{a[i]=i;
for(j=2;j<=i;j++)
{if(j
if(a[i]-j==0)printf("%5d",a[i]);}
}
printf("\n");
}
或
#include"math.h"
main()
{staticinti,j,k,a[98];
for(i=2;i<100;i++)
{a[i]=i;k=sqrt(i);
for(j=2;j<=a[i];j++)
if(jif(j>=k+1)printf("%5d",a[i]);
}
printf("\n");
}
6.2求一个矩阵对角线元素之和。
解:
以3*3矩阵为例,参考源程序如下:
main()
{inti=0,j=0,a[3][3],s1,s2;
for(i=0;i<3;i++)
for(j=0;j<3;j++)scanf("%d",&a[i][j]);
s1=a[0][0]+a[1][1]+a[2][2];
s2=a[0][2]+a[1][1]+a[2][0];
printf("s1=%d,s2=%d\n",s1,s2);
}
6.3一个已按从小到大的顺序排好的数组,今输入一个数要求按原来排序的规律将它插入数组中。
解:
我们以一个10元素的数组为例,参考源程序如下:
main()
{staticinta[10]={1,7,8,17,23,