C语言题解.docx
《C语言题解.docx》由会员分享,可在线阅读,更多相关《C语言题解.docx(65页珍藏版)》请在冰豆网上搜索。
C语言题解
第4章
4.1C语言中的语句有哪几类?
C语句与其他语言中的语句有哪些不同?
(1)控制语句
(2)函数调用语句
(3)表达式语句
(4)空语句
(5)复合语句
C语言允许一行写几个语句,也允许一个语句拆开写在几行上,书写格式无固定要求,而其他语言一般对书写格式有严格要求。
4.2怎样区分表达式和表达式语句?
C语言为什么要设表达式语句?
什么时候用表达式,什
么时候用表达式语句?
表达式没有分号,语句是有分号的,将表达式加上一个分号就成了表达式语句。
两者最
大的区别是,表达式只是一个值,而表达式语句是指令,完成指定的操作。
C语言设表达式语句的作用是用简短的指令代替了复杂的函数运算,程序运行效率高。
表达式是为了进行求值运算而设定的计算公式,用于语句中,但不构成完整的语句。
如
果要完成该运算,必须使用表达式语句。
4.3C语言为什么要把输入输出的功能用函数来实现,而不作为语言的基本部分?
因为输入输出的对象是数据,而数据是以介质为载体的,因此进行输入输出就要与各种外部设备打交道。
由于不同的系统进行输入输出的差异较大,所以必须使用函数和操作系统
进行交互,以便存取不同的设备文件。
4.4若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765,c1=‘a'c2=‘b'想得到以下的输出格式和结果,请写出程序。
要求输出结果如下:
a=3b=4c=5
x=1.200000,y=2.400000,z=-3.600000
x+y=3.60y+z=-1.20z+x=-2.40
u=51274n=128765
c1='a'or97(ASCII)
c2='b'or98(ASCII)
intmain(){
inta=3,b=4,c=5;
doublex=1.2,y=2.4,z=-3.6;
unsignedintu=51274,n=128765;
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=%6un=%10u\n",u,n);
printf("c1=%cor%d(ASCII)\n",c1,c1);
printf("c2=%cor%d(ASCII)\n",c2,c2);
return0;
}
4.5请写出下面程序的输出结果:
intmain()
{
inta=5,b=7;
floatx=67.8564,y=-789.124;
charc='A:
longn=1234567;
unsignedu=65535;
printf("%d%d\n",a,b);
printf("%3d%3d\n",a,b);
printf("%f,%f\n",x,y);
printf("%-10f,%-10f\n",x,y);
printf("%8.2f,%8.2f,%.4f,%.4f,%3f,%3f\n",x,y,x,y,x,y);
printf("%e,%10.2e\n",x,y);
printf("%c,%d,%o,%x\n",c,c,c,c);
printf("%ld,%lo,%x\n",n,n,n);
printf("%u,%o,%x,%d\n",u,u,u,u);
printf("%s,%5.3s\n",”COMPUTER","COMPUTER");
return0;
}
57
57
67.856400,-789.124023
67.856400,-789.124023
67.86,-789.12,67.8564,-789.1240,67.856400,-789.124023
6.785640e+001,-7.89e+002
A,65,101,41
1234567,4553207,12d687
65535,177777,ffff,65535
c1='A',c2='a',
COMPUTER,COM
4.6用下面的scanf函数输入数据,使a=3,b=7,x=8.5,7=71.82,
问在键盘上如何输入?
intmain()
{
inta,b;
floatx,y;
charc1,c2;
scanf("%d%d%f%f%c%c",&a,&b,&x,&y,&c1,&c2);
printf("%d%d\n",a,b);
printf("%f%f\n",x,y);
printf("%c%c\n",c1,c2);
return0;
4.7用下面的scanf函数输入数据,使a=10,b=20,c仁'A,c2='a',x=1.5,y=-3.75,z=67.8,请问在键盘上如何输入数据?
intmain()
{
inta,b;
charc1,c2;
floatx,y,z;
scanf("%d%d%c%c%f%f%f",&a,&b,&c1,&c2,&x,&y,&z);
printf("%d%d\n",a,b);
printf("%f%f%f\n",x,y,z);
printf("%c%c\n",c1,c2);
return0;
}
4.8设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。
用scanf输入数据,然后输出计算结果。
输出时要求有文字说明并取小数点后两位数字,请编程序。
#definePi3.1415926
intmain()
{
doubler,h;
scanf("%lf%lf",&r,&h);
printf("圆的周长=%.2f\n",2*Pi*r);
printf("圆的面积=%.2f\n",Pi*r*r);
printf("圆球表面积=%.2f\n",Pi*r*r/6);
printf("圆球体积=%.2f\n",4*Pi*r*r*r/3);
printf("圆柱体积=%.2f\n",Pi*r*r*h);
return0;
}
4.9输入一个华氏温度的取值F,要求输出摄氏温度的取值C。
公式为
C=5(F-32)/9
输出要有文字说明,取两位小数。
#include
doubleCentigradeTemperture(doubleFahrenheit);
intmain()
{
doubleF;
printf(”请输入华氏温度:
");
scanf("%lf",&F);
printf("摄氏温度为%.2f\n",CentigradeTemperature(F));
return0;
}
doubleCentigradeTemperature(doubleFahrenheit)
{
return5*(Fahrenheit-32)/9;
}
4.10编程序:
用getchar函数读入两个字符cl,c2,然后分别用putchar函数和printf
函数输出这两个字符,并思考以下问题:
(1)变量c1,c2应定义为字符型还是整型,或二
者皆可?
(2)要求输出c1和c2的ASCII码,应如何处理?
用putchar函数还是printf函数?
(3)整型变量与字符变量是否在任何情况下都可以互相代替?
如:
charc1,c2;
与intc1,c2;
是否无条件等价?
intmain()
{
charc1,c2;
c1=getchar();
c2=getchar();
putchar(c1);
putchar(c2);
printf("\n%c%c\n",c1,c2);
return0;
}
(1)二者皆可。
(2)用printf函数将printf("\n%c%c\n”,c1,c2)改成printf("\n%d%d\n",c1,c2)即可。
(3)不是,整型可以代替字符型,但字符无法完全替代整型。
5.1什么是算术运算?
什么是关系运算?
什么是逻辑运算?
算术运算:
+-*/%++--
关系运算:
<>==>=<=!
=
逻辑运算:
!
&&||
5.2C语言中如何表示真假?
系统如何判断一个量的真假?
C语言用整数1和0表示真假
5.3写出下面各逻辑表达式的值,设a=3,b=4,c=5。
(1)a+b>c&&b==c
⑵a||b+c&&b-c
(3)!
(a>b)&&!
c&&!
1
⑷!
(x=a)&&(y=b)&&0
⑸!
(a+b)+c-1&&b+c/2
(1)0
(2)1(3)0⑷0(5)1
5.4有三个整数a,b,c,由键盘输入,输出其中最大的数。
intMax3(inta,intb,intc);
intmain()
{
inta,b,c;
scanf("%d%d%d",&a,&b,&c);
printf(”最大的数是%d\n",Max3(a,b,c));
return0;
}
intMax3(inta,intb,intc)
{
inttemp;
temp=a>b?
a:
b;
returntemp>c?
temp:
c;
}
5.5有一函数:
x
x
1
y2x
1
1
x10
3x
11
x
10
编写一程序,输入x,输出y值。
doublefuncy(doublex);
intmain()
{
doublex,y;
scanf("%lf",&x);
y=funcy(x);
printf("最大的数是%lf\n",y);
return0;
}
doublefuncy(doublex)
{
if(x<1)returnx;
else
if(x<10)return2*x-1;
elsereturn3*x-11;
}
5.6给出百分制成绩,要求输出成绩等级’A''B','C','D''E'。
90分以上为’A',
81〜89分为’B',70〜79分为’C',60〜69分为’D',60分以下为’E'。
intmain()
{
doublescore;
scanf("%lf",&score);
if(score>100||score<0)return0;
if(score>=90)printf("A\n");
else
if(score>=80)printf("B\n");
else
if(score>=70)printf("C\n");
else
if(score>=60)printf("D\n");
elseprintf("E\n”);
return0;
}
5.7给一个不多于5位的正整数,要求:
(1)求出它是几位数;
(2)分别打印出每一位数
字;(3)按逆序打印出各位数字,例如原数为321,应输出123。
intmain()
{
inti,k;
inta⑸;
unsignedintx;
scanf("%u",&x);
if(x>99999||x<0)return0;
a[0]=x/10000;
a[1]=(x-a[0]*10000)/1000;
a[2]=(x-a[0]*10000-a[1]*1000)/100;
a[3]=(x-a[0]*10000-a[1]*1000-a[2]*100)/10;a[4]=x-a[0]*10000-a[1]*1000-a[2]*100-a[3]*10;
/*求出它的几位数*/
printf("
(1):
");
if(a[0])printf("5位数\n");
else
if(a[1])printf("4
else
位数\n");
if(a[2])printf("3
位数\n”);
else
if(a[1])printf("2elseprintf("1
位数\n");位数\n");
/*计算无效0的个数*/
k=0;
while(k<5&&a[k]==0)k++;
/*打印每一位数字*/
printf("
(2):
");
for(i=k;i<5;i++)printf("%d",a[i]);
printf("\n");
/*逆序打印每一位数字*/
printf("(3):
");
for(i=4;i>=k;i--)printf("%d",a[i]);
printf("\n");
return0;
}
5.8企业发放的奖金根据利润提成。
禾U润(I)低于或等于10万元的,奖金可提10%利润高
于10万元,低于20万元(100000V<200000)时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;当200000V<400000时,高于20万元的部分按5%是成;当
400000V<600000时,高于40万元的部分按3%提成;当600000V<1000000时,高于60
万的部分按1.5%提成;当I>1000000时,超过100万元的部分按1澀成。
从键盘输入当月利润I,求应发奖金总数。
intmain()
{
doubleI,bouns;
printf("请输入本月利润(万元):
”);
scanf("%lf",&l);
if(l<0)return0;
if(l<=10)bouns=l*0.1;
else
if(l<=20)
bouns=10*0.1+(l-10)*0.75;
else
if(l<=40)
bouns=10*0.1+10*0.75+(l-20)*0.05;
else
if(l<=60)
bouns=10*0.1+10*0.75+20*0.05+(l-40)*0.03;
else
if(l<=100)
bouns=10*0.1+10*0.75+20*0.05+
20*0.03+(1-60)*0.15;
else
bouns=10*0.1+10*0.75+20*0.05+20*0.03+40*0.15+(1-100)*0.01;
printf(”本月总奖金数为%lf万元\n",bouns);
return0;
}
5.9输入四个整数,要求按大小顺序输出
#defineN4
intbubble(inta[],intk);
intmain()
{
inti;
inta[N];
for(i=0;iif(bubble(a,N)){
for(i=0;i<4;i++)printf("%d",a[i]);
printf("\n”);
}
return0;
}
intbubble(inta[],intk)
{
inti,j;
intt,temp;
if(k<1)return0;
for(i=1;i<=k-1;i++){
t=k-i;
for(j=0;j<=t-1;j++)
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
return1;
}
1。
这四个塔
(塔外的高
5.10有四个圆塔,圆心分别为(2,2),(-2,2),(-2,-2),(2,-2),圆半径为
的高度都为10米,塔以外无建筑物。
今输入任一点的坐标,求该点相应的高度度为0)。
doubleTowerHeight(doublex,doubley,doublez);
intmain()
{
doublex,y,z;
scanf("%lf%lf%lf",&x,&y,&z);
printf(”该点的高度为%lf\n",TowerHeight(x,y,z));
return0;
}
doubleTowerHeight(doublex,doubley,doublez)
{
if((x-2)*(x-2)+(y-2)*(y-2)<=1||
(x+2)*(x+2)+(y-2)*(y-2)<=1||
(x-2)*(x-2)+(y+2)*(y+2)<=1||
(x+2)*(x+2)+(y+2)*(y+2)<=1)
return乙
else
return0;
}
6.1输入两个正整数m和n,求其最大公约数和最小公倍数。
intGreatestCommonDivisor(intm,intn)/*返回最大公约数*/
{
intu,v,r;
if(m==0||n==0)return0;
u=m;
v=n;
while(r=u%v){
u=v;
v=r;
}
returnv;
}
intLeastCommonMultiple(intm,intn)/*返回最小公倍数*/
{
intu;
u=GreatestCommonDivisor(m,n);
if(!
u)return0;
returnu*(m/u)*(n/u);
}
6.2输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
#defineN100
intmain()
{
chars[N];
char*p;
inti=0,j=0,k=0,m=0;
gets(s);
p=s;
while(*p!
='\0'){
if(*p<123&&*p>64)i++;
else
if(*p==32)j++;
else
if(*p<58&&*p>47)k++;
elsem++;
p++;
}
printf("英文字符个数为:
%d\n",i);
printf("空格数为:
%d\n",j);
printf("数字个数为:
%d\n",k);
printf(”其它字符个数为:
%d\n",m);
return0;
}
6.3求Sn=a+aa+aaa+…+aa--a(n个a)之值,其中a是一个数字。
longintSumOfaa(inta,intk)
{
if(a<1||k<1)return0;
if(k==1)returna;
else
return1O*(SumOfaa(a,k-1)-SumOfaa(a,k-2))+a+SumOfaa(a,k-1);
}
20
6.4求n!
(即求1!
+2!
+3!
+--+20!
)。
n1
longintSumOfRfact(intk)
{
if(k<1)return0;
else
if(k<2)return1;
else
returnk*(SumOfRfact(k-1)-SumOfRfact(k-2))+SumOfRfact(k-1);}
10050
2
6.5求kk
k1k1
longintSumOfk(intk)
{
inti,sum=0;if(k<1)return0;for(i=1;i<=k;i++)sum+=i;returnsum;
}
longintSumOfk2(intk)
{
inti,sum=0;if(k<1)return0;
for(i=1;i<=k;i++)sum+=i*i;returnsum;
}
doubleSumOfk1(intk)
inti;
doublesum=0.0;
if(k<1)return0;
for(i=1;i<=k;i++)sum+=1.0/i;returnsum;
}
6.6打印出所有“水仙花数”。
所谓水仙花数是指一个三位数,其各位数字立方和等于该数本身。
例如,153=13+53+33。
intmain()
{
inti=0;
intx,y,z;
for(x=1;x<10;x++)
for(y=0;y<10;y++)
for(z=0;z<10;z++)
if(x*x*x+y*y*y+z*z*z==x*100+y*10+z){
printf("%d\n",x*100+y*10+z);
i++;
}
printf("共有%d个水仙花数\n”,i);
return0;
}
6.7一个数如果恰好等于它的因子之和,这个数就称之为“完数”。
例如,6的因子为1,2,
3,而6=1+2+3,因此6是“完数”。
编程序找出1000之内的所有完数。
并按下面的格式输出其因子。
#defineN1000
intAIIFactors(inta[],intk);
intOverNum(intk);
intmain()
{
inti,k=0;
for(i=1;i<=N;i++){
if(OverNum(i)){
printf("%disOverNum\n",i);
k++;
}
}
printf("Thereare%dOverNums\n",k);
return0;
}
/*求k的所有因子,因子保存在数组a中,返回因子的个数*/
intAIIFactors(inta[],intk)
{
inti;
intm=1;/*用以记录因子的个数*/
if(k<1)return0;
a[0]=1;
for(i=2;i}
returnm;
}
intOverNum(intk)
{
是因子*/
因子送数组保存*/
}
6.8
inta[100];
intj,m;
intsum=O;
m=AIIFactors(a,k);/*
for(j=0;jreturn1;
else
return0;
记录因子个数*/
求出各因子的累加和*/
是完数*/
有一分数序列:
2358
1,2,3,5
求出这个序列的前
1321§,13,20项之和。
#defineN20
doubleSumFractions(intk);
intmain()
{
printf("%lf\n”,SumFractions(N));
return0;
}
doubleSumFractions(intk)
{
inti;
doub