C语言教材后习题及答案.docx
《C语言教材后习题及答案.docx》由会员分享,可在线阅读,更多相关《C语言教材后习题及答案.docx(33页珍藏版)》请在冰点文库上搜索。
C语言教材后习题及答案
第一章
1.什么是程序?
什么是程序设计语言?
2.C语言有什么特点?
3.什么是算法?
算法的描述有哪些基本方法?
第一章主要关注两个概念:
一是程序的三种结构(顺序、分支或叫选择、循环);二是函数,主函数main()
第二章
1.指出下列哪些是C语言合法的用户识别符。
voida3_b3For2adefine_123_abcDO
2.指出下列哪些是C语言合法的常量。
"3'4""0x1g33"a"E20'\18'\0xa'1.E-53.F'\0'.12'\a'
"3'4""双引号内表示字符串,但要在一个串内含有单引号、双引号要用转义字符正确的是:
"3\’4\""
0x是十六进制的表示形式之一,但十六进制里没有g这个数值
\0xa'带一个单引号、0开头,无意义.这里要注意\ddd,1-3位八进制数,\xhh,1-2位十进制数,他们都表示对应的ASCII值
E20,E表示指数形式,但两边必须都有数字。
将此题全部弄懂,所有关于常量的分基本跑不掉了。
3.指出下列定义变量语句中的错误。
inta;b=5;//同类型的两个变量,中间不能用分号。
doubelh;//double
intx,floaty;//中间要用分号
floatf(x);//非法符号
定义变量要注意,数据类型的关键字,还有就是变量名称必须是合法标识符。
4.写出能表示数学式子1╱(2a+1╱2a)的C语言表达式。
1.0/(2*a+1/(2*a))
5.⑴#include
intmain()
{
doublex=1,y;
y=x+3/2;
printf("y=%f\n",y);
return0;
}结果是:
2.000000,注意3/2=1
(2)
#include
intmain()
{
floatx=2.9,y=3.2,z;
inta=8;
z=x+a%3*(int)(x+y)/2;
printf("z=%f\n",z);
return0;
}
结果是:
8.900000,注意(int)(x+y)=6。
(3)
#include
intmain()
{
inta=65,b=-20;
charch='A';
floatx=12.345678f;
printf("abc\n\101\t\x41\\101\n");
printf("a=%d,%c,%o,%x\n",a,a,a,a);
printf("b=%d,%o,%x,%u\n",b,b,b,b);
printf("ch=%d,%c\n",ch,ch);
printf("x=%f,%.2f,%10.2f,%-10.f\n",x,x,x,x);
return0;
}
此题包含的内容较多,都是细节,希望对照教材仔细分析结果。
6程序设计。
(1)输出如下的图形。
*
***
*****
***
*
此题答案参考实验指导书。
这题在这章出现,主要是练习printf(),
(2)已知铁的比重是7.86,计算并输出直径为100毫米的铁球重量
#include
#definePI3.1415926
voidmain()
{doublew,r=100.0/20,p=7.86;
w=p*4.0*PI*r*r*r/3.0;
printf("%.2f\n",w);
}
第三章
1.写出表示变量x的值在[0,100]范围内的逻辑表达式。
x>=0&&x<=100
2.写出表示整型变量x的值能被5或7整除的逻辑表达式。
x%5==0||x%7==0
3.已知变量a、b、c的值分别是3、2、1,逻辑表达式a>b>c的值是多少?
0
4.已知变量x,y的值分别为5,9,逻辑表达式x&&y-9)*6-!
x的值是多少?
0
5.已知变量m,n的值都为1,逻辑表达式m--&&n++执行后,m,n的值是多少?
m=0,n=2,逻辑表达式的值是真。
6
(1):
#include
intmain()
{
intx=2,y;
if(x)y=x;
elsey=3*x-1;
printf("y=%d\n",y);
return0;
}
运行结果是:
y=2
(2)
#include
intmain()
{
inta=2,b=2,c=3;
if(a==b)
if(b==c)printf("a==b==c\n");
elseprintf("a!
=b\n");
return0;
}
运行结果是:
a!
=b
(3)
#include
intmain()
{
intx=1,y=0,a=0,b=0;
switch(x)
{
case1:
switch(y)
{
case0:
a++;break;
case1:
b++;break;
}
case2:
a++;b++;break;
case3:
a++;b++;
}
printf("a=%d,b=%d\n",a,b);
return0;
}
运行结果是:
a=2,b=1
(4)
#include
intmain()
{intn=5;
while(n>2)
{n--;
printf("%d\n",n);}
return0;}
运行结果是:
4
3
2
(5):
#include
intmain()
{
inta,b;
for(a=1,b=1;a<=100;a++)
{
if(b>=20)break;
if(b%3==1)
{
b+=3;
continue;
}
b-=5;
}
printf("%d\n",a);
return0;
}
运行结果是:
8
7.程序设计
(1)从键盘输入一个字符。
若该字符是小写,输出相应的大写字母;若该字符是大写字母,输出对应的小写字母;若是其他字符,则原样输出。
#include
intmain()
{chars;
scanf("%c",&s);
if(s>='A'&&s<='Z')
s=s+32;
elseif(s>='a'&&s<='z')
s=s-32;
printf("%c\n",s);
return0;
}
(2)从键盘输入3个整数,输出其中的最大值。
#include
voidmain()
{inta,b,c;
intm;
printf("Pleaseinputabc\n");
scanf("%d,%d,%d",&a,&b,&c);
m=a>b?
a:
b;
m=m>c?
m:
c;
printf("Maxis%d\n",m);
}
本题解法比较多。
注意此题的逻辑关系。
(3)从键盘输入一个整数,输出分段函数f(x)的值。
1-x^2(x<2)
f(x)=1+2x-x^2(2<=x<10)
1-x+x^2(x>=10)
#include
intmain()
{
floatx,y;
scanf("%f",&x);
if(x<2)
y=1-x*x;
elseif(x<10)
y=1+2*x-x*x;
else
y=1-x+x*x;
printf("a=%f\n",y);
return0;
}
此类题,注意数轴方向。
从一边为起点。
(4)从键盘上输入一个整数,求其中每个数位的数字之和。
#include
intmain(){
intsum=0,a;
scanf("%d",&a);
if(a<10)
sum=a;
else
{
do{
sum=sum+a%10;
a=a/10;
}while(a>0);
}
printf("%d\n",sum);
return0;
}
此题答案只考虑输入的是正整数,如果输入的是小于0的整数,加个判读,用绝对值函数处理下即可。
(5)将100元换成1元,5元,10元的零钱有多少种换法?
#include
intmain()
{intx,y,z,i=0;
for(x=0;x<=10;x++)
for(y=0;y<=20;y++)
for(z=0;z<=100;z++)
{if(x*10+5*y+z==100)
{printf("%5d,%5d,%5d\n",x,y,z);
i++;}}
printf("Thereare%dways.\n",i);
return0;
}
(6)计算方程X^2+Y^2=1989的所有整数解。
#include
#include
voidmain()
{intv,i,j;
v=(int)sqrt(1989);
for(i=0;i<=v;i++)
for(j=0;j<=v;j++)
{if(i*i+j*j==1989)
{printf("%5d,%5d\n",i*i,j*j);}
}
}
(7)输出所有的3位水仙花数。
3位水仙花数是指一个整数的每个数位上的数字的3次方之和等于它本身,例如:
1^3+5^3+3^3=153.
#include
voidmain()
{
inta,b,c,d;
for(a=100;a<=999;a++)
{b=a/100;
c=a%10;
d=(a/10)%10;
if(b*b*b+c*c*c+d*d*d==a)printf("%5d\n",a);
}
}
(8)在印度有一个古老的传说:
舍罕王打算奖赏国际象棋的发明人——宰相西萨班达依尔。
国王问他想要什么,他对国王说:
“陛下,请你在这张棋盘的第1个小格里,赏给我一粒麦子,在第二个格子里给2粒,第三格给4粒,以后每一小格都比前一小格加一一倍。
陛下啊,把这样摆满棋盘上所有64个小方格的麦粒,都赏赐给你的仆人吧!
”。
请帮国王计算一下,放完整个棋盘要多少颗小麦。
#include
voidmain()
{inti;
doublen,s;
i=1;n=1.0;s=1.0;
for(i=2;i<=64;i++)
{n=n*2;s=s+n;
printf("%lf\n",n);}
printf("s=%lf\n",s);
getch();
}
(9)验证哥德巴赫猜想:
任何充分大(>=4)的偶数都可以用2个素数之和表示,将4~100所有偶数分别用两个素数之和的形式输出。
(例如:
4=2+2,100=3+97)
#include
#include
intss(intn)/*检查n是否为素数,如果是则返回1,否则返回0*/
{inti;
for(i=2;i<=(int)sqrt(n);i++)
if(n%i==0)return0;
return1;}
intmain(void)
{inti,j,k=0;/*k用来控制打印换行*/
for(i=4;i<=100;i+=2)
for(j=2;j
{if(ss(j)&&ss(i-j))
{printf("%d=%d+%d",i,j,i-j);
k++;
if(k%5==0)putchar('\n');
break;}
}
return0;}
注意判断素数的3种方法。
n-1,n/2,(int)sqrt(n)
(10)一球从100米高度自由落下,每次漏地后反跳回原高度的一半,求在第10次落地时,共经过多少米?
第10次反弹多高?
#include
intmain()
{floatsn=100.0,hn=sn/2;
intn;
for(n=2;n<=10;n++)
{sn=sn+2*hn;/*第n次落地时共经过的米数*/
hn=hn/2;}/*第n次反跳高度*/
printf("thetotalofroadis%f\n",sn);
printf("thetenthis%fmeter\n",hn);
return0;}
第4章
1.程序填空。
(1)请在横线上填空,使程序输出数组s中最大元素的下标。
#include
intmain()
{
intk,p,s[]={1,-9,7,2,-10,3};
for(p=0,k=0;p<6;p++)
if(s[p]>s[k])k=p;
printf("%d\n",k);
return0;
}
注意:
红色部分为原题填空部分,下同。
(2)请在横线
上填空,使程序输出以下形式的图标。
1234
678
1112
16
#include
intmain()
{
intnum[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}},i,j;
for(i=0;i<4;i++)
{
for(j=i;j<4;j++)printf("%-5d",num[i][j]);
printf("\n");
}
return0;
}
2.阅读下列程序,写出程序运行结果。
(1)#include
intmain()
{
inti,k,a[10],p[3];
k=5;
for(i=0;i<10;i++)a[i]=i;
for(i=0;i<3;i++)p[i]=a[i*(i+1)];
for(i=0;i<3;i++)k+=p[i]*2;
printf("%d\n",k);
return0;
}
运行结果:
21
(2)#include
intmain()
{
intp[7]={11,13,14,15,16,17,18},i=0,k=0;
while(i<7&&p[i]%2)
{
k=k+p[i];
i++;
}
printf("%d\n",k);
return0;
}
运行结果:
24
(3)#include
intmain()
{
inti;
inta[3][3]={1,2,3,4,5,6,7,8,9};
for(i=0;i<3;i++)
printf("%d",a[2-i][i]);
return0;
}
运行结果:
753
3.程序设计。
(1)从键盘输入10个成绩,输出最高分和最低分。
(2)在一次评奖中有10个评委对5个参赛选手打分,选手的最终得分为:
去掉一个最高分、一个最低分后剩余8个分数的平均值。
从键盘输入每个选手的得分,输出每个选手最终得分。
(3)从键盘输入5门课程6个同学的成绩,。
输出每门课程的最高分。
(4)从键盘上输入一个4x5的矩阵,输出矩阵个周边元素的和。
例如输入以下矩阵,输出:
32。
10203
04891
70970
80451
第五章
1、程序填空。
(1)请在横线上填空,使fun()函数实现
的功能。
intfun(inta,intb)
{
intmul;
mul=(a+b)*(a+b);
returnmul;
}
注意:
红色部分就是原来需要填空的地方,下同
(2)请在横线上填空,使fun()函数返回参数s所表示的数组中各元素的和,其中参数len表示数组s的长度。
doublefun(doubles[],intn)
{
inti;
doubley=0;
for(i=0;iy+=s[i];
returny;
}
2、阅读下列程序,写出程序运行结果。
#include
#defineLEN10
voidreverse(inta[],intn)
{
inti,t;
for(i=0;i{
t=a[i];a[i]=a[n-1-i];a[n-1-i]=t;
}
return;
}
intmain()
{intb[LEN]={1,2,3,4,5,6,7,8,9,10},i,s=0;
reverse(b,8);
for(i=6;i<10;i++)s+=b[i];
printf("s=%d\n",s);
return0;
}
运行结果:
s=34
(2)#include
intd=1;
voidfun(intp)
{
intd=5;
d+=p++;
printf("%d",d);
return;
}
intmain()
{
inta=3;
fun(a);
d+=a++;
printf("%d\n",d);
return0;
}
运行结果:
84
(3)#include
voidfun(intx,inty,intz)
{
z=x*x+y*y;
return;
}
intmain()
{
inta=31;
fun(5,2,a);
printf("%d",a);
return0;
}
运行结果:
31
(4)#include
#defineMAX(x,y)(x)>(y)?
(x):
(y)
intmain()
{
inta=5,b=2,c=3,d=3,t;
t=MAX(a+b,c+d)*10;
printf("%d\n",t);
return0;
}
运行结果:
7
3、程序设计。
(1)编写函数sum,计算m到n的累加和(m小于n),在主函数中调用sum()函数,计算并输出
+
+
的值。
(2)编写函数item,计算1到n的累加和的倒数,在主函数中调用item()函数,计算并输出
+
+
+
+
的值。
(3)一个正整数如果等于它的因子(包括1,但不包括自身)之和,则称为“完数”(例如6是一个“完数”,6=1+2+3)。
编写函数fun,计算n的因子之和(不包括n),在主函数中调用fun()函数,输出1000以内的所有完数。
(4)已知数列的递归关系如下,编写函数fun,计算数列的第n项,在主函数中调用fun()函数,输出该数列的前20项。
f(n)=
第六章
1.程序填空。
(1)请在横线上填空,使程序完成计算数组a中元素的平均值并输出。
floataverage(int*pa,intn)
{
inti,avg;
avg=0;
for(i=0;iavg+=pa[i];
return(float)avg/n;
}
intmain()
{
inta[5]={2,4,6,8,10};
floatmean;
mean=average(a,5);
printf("mean=%.2f\n",mean);
}
注意:
红色部分即为原题填空部分,下同。
2.请在横线上填空,使函数实现计算指针p所指向的字符串的长度。
intmyStrlen(char*p){
intlen=0;
for(;*p!
='\0';p++)
len++;
returnlen;
}
阅读下列程序,写出程序运行结果。
(1)#include
intmain()
{
inta=1,b=3,c=5;
int*p1=&a,*p2=&b,*p=&c;
*p=(*p1)*(*p2);
printf("%d\n",c);
return0;
}
运行结果:
3
(2)#include
intmain()
{
inta[3][3],*p,i;
p=&a[0][0];
for(i=0;i<9;i++)
p[i]=i+1;
printf("%d\n",a[1][2]);
return0;
}
运行结果:
6
(3)#include
intmain()
{
inta[]={2,4,6,8,10},y=1,i,*p;
p=&a[1];
for(i=0;i<3;i++)
y+=*(p+1);
printf("%d\n",y);
return0;
}
运行结果:
19
(4)
#include
#include
intmain()
{
charp1[]="abcd",p2[]="efgh",str[50]="ABCDEFG";
strcat(str,p1);
strcat(str,p2);
printf("%c\n",str);
return0;
运行结果:
ABCDEFGabcdefgh
(5)
#include
intmain()
{
charstr[]="1a2b3c";
inti;
for(i=0;str[i]!
='\0';i++)
if(str[i]<'0'||str[i]>'9')printf("%c",str[i]);
printf("\n");
return0;}
运行结果:
abc
3.程序设计
(1)编写函数Mystrcmp(char*str1,char*str2),该函数的功能是比较字符串str1和str2,如果相同返回0,否则返回两个字符串中第1个不相同的ASCII码值之差作为函数值返回,要求不采用库函数strcmp()实现。
(2)编函数fun(int*a,intn,int*odd,int*even),函数的功能是分别求出形参a所指向的数组中所有奇数、偶数之和,并分别保存在Odd、even所指向的变量中形参n表示形参a所指向的数组的长度。
(3)从键盘输入英文的星期几,输出对应的中文星期几。
(4)从键盘输入一个字符串,然后将字符串按照如下规则重新排列:
字母排在前面,数字排在后面,并不改变原来字母之间以及数字之间的字符顺序。
例如输入字符串“a12bcd45”,则排列后的字符串为”abcd1234”.
(