《C语言程序设计教程(第二版)》习题答案
说明
1. 本习题答案是我自己做的,错误和疏漏在所难免。编程题全部调试通过,但选择题和填空题不敢保证全对。
2. 凡未指明解题所用的程序设计语言的,均指C语言。
3. 凡未指明执行程序所需的操作系统的,均可在DOS下执行。
4. 本文中文字下面划线的表示输入。
第1章程序设计基础知识
一、单项选择题(第23页)
1-4.CBBC 5-8.DACA
二、填空题(第24页)
1.判断条件
2.面向过程编程
3.结构化
4.程序
5.面向对象的程序设计语言7.有穷性8.直到型循环9.算法10.可读性11.模块化12.对问题的分析和模块的划分
三、应用题(第24页)
2.源程序:
main()
{int i,j,k; /* i:公鸡数,j:母鸡数,k:小鸡数的1/3 */
printf("cock hen chick
");
for(i=1;i<=20;i++)
for(j=1;j<=33;j++)
for(k=1;k<=33;k++)
if (i+j+k*3==100&&i*5+j*3+k==100)
printf(" %d %d %d
",i,j,k*3);}
执行结果:
cock hen chick
4 18 78
8 11 81
12 4 84
3.现计算斐波那契数列的前20项。
递推法源程序:
main()
{long a,b;int i;
a=b=1;
for(i=1;i<=10;i++) /*要计算前30项,把10改为15。*/
{printf("%8ld%8ld",a,b);
a=a+b;b=b+a;}}
递归法源程序:
main()
{int i;
for(i=0;i<=19;i++)
printf("%8d",fib(i));}
fib(int i)
{return(i<=1?1:fib(i-1)+fib(i-2));}
执行结果:
1 1
2
3 5 8 13 21 3
4 5
5 89 144 233 377 610 987 1597 2584 4181 6765
4.源程序:
#include "math.h";
main()
{double x,x0,deltax;
x=1.5;
do {x0=pow(x+1,1./3);
deltax=fabs(x0-x);
x=x0;
}while(deltax>1e-12);
printf("%.10f
",x);}
执行结果:
1.3247179572
5.源程序略。(分子、分母均构成斐波那契数列)
结果是32.66026079864
6.源程序:
main()
{int a,b,c,m;
printf("Please input a,b and c:");
scanf("%d %d %d",&a,&b,&c);
if(a
if(a if(b printf("%d %d %d ",a,b,c);} 执行结果: Please input a,b and c:123 456 789 789 456 123 7.源程序: main() {int a; scanf("%d",&a); printf(a%21==0?"Yes":"No");} 执行结果: 42 Yes 第2章C语言概述 一、单项选择题(第34页) 1-4.BDCB 5-8.AABC 二、填空题(第35页) 1.主 2.C编译系统 3.函数函数 4.输入输出 5.头 6. .OBJ 7.库函数 8.文本 三、应用题(第36页) 5.sizeof是关键字,stru、_aoto、file、m_i_n、hello、ABC、SIN90、x1234、until、cos2x、s_3是标识符。 8.源程序: main() {int a,b,c; scanf("%d %d",&a,&b); c=a;a=b;b=c; printf("%d %d",a,b);} 执行结果: 12 34 34 12 第3章数据类型与运算规则 一、单项选择题(第75页) 1-5.DBACC 6-10.DBDBC 11-15.ADCCC 16-20.CBCCD 21-25.ADDBC 26-27.AB 二、填空题(第77页) 1.补码 2.±(10-308~10308) 3.int(整数) 4.单目自右相左 5.函数调用 6.a或 b 7.1 8.65,89 三、应用题(第78页) 1.10 9 2.执行结果: 11 12 1 第4章顺序结构程序设计 一、单项选择题(第90页) 1-5.DCDAD 6-10.BACBB 二、填空题(第91页) 1.一; 2. 5.169000 3.(1)-2002500 (2)I=-200,j=2500 (3)i=-200 j=2500 4.a=98,b=765.000000,c=4321.000000 5.略 6.0,0,3 7.3 8.scanf("%lf%lf%lf",&a,&b,&c); 9. 13 13.000000,13.000000 10.a=a^c;c=c^a;a=a^c;(这种算法不破坏b的值,也不再定义中间变量。) 三、编程题(第92页) 1.仿照教材第27页例2-1。 2.源程序: main() {int h,m; scanf("%d:%d",&h,&m); printf("%d ",h*60+m);} 执行结果: 9:23 563 3.源程序: main() {int a[]={-10,0,15,34},i; for(i=0;i<=3;i++) printf("%d\370C=%g\370F\t",a[i],a[i]*1.8+32);} 执行结果: -10℃=14°F 0℃=32°F 15℃=59°F 34℃=93.2°F 4.源程序: main() {double pi=3.14159265358979,r=5; printf("r=%lg A=%.10lf S=%.10lf ",r,2*pi*r,pi*pi*r);} 执行结果: r=5 A=31.4159265359 S=49.3480220054 5.源程序: #include "math.h"; main() {double a,b,c; scanf("%lf%lf%lf",&a,&b,&c); if (a+b>c&&a+c>b&&b+c>a) {double s=(a+b+c)/2; printf("SS=%.10lf ",sqrt(s*(s-a)*(s-b)*(s-c)));} else printf("Data error!");} 执行结果: 4 5 6 SS=9.9215674165 6.源程序: main() {int a=3,b=4,c=5;float d=1.2,e=2.23,f=-43.56; printf("a=%3d,b=%-4d,c=**%d d=%g e=%6.2f f=%-10.4f** ",a,b,c,d,e,f);} 7.源程序: main() {int a,b,c,m; scanf("%d %d %d",&a,&b,&c); m=a;a=b;b=c;c=m; printf("%d %d %d ",a,b,c);} 执行结果: 5 6 7 6 7 5 8.源程序: main() {int a,b,c; scanf("%d %d %d",&a,&b,&c); printf("average of %d,%d and %d is %.2f ",a,b,c,(a+b+c)/3.); 执行结果: 6 7 9 average of 6,7 and 9 is 7.33 9.不能。修改后的源程序如下: main() {int a,b,c,x,y; scanf("%d %d %d",&a,&b,&c); x=a*b;y=x*c; printf("a=%d,b=%d,c=%d ",a,b,c); printf("x=%d,y=%d ",x,y);} 第5章选择结构程序设计 一、单项选择题(第113页) 1-4.DCBB 5-8.DABD 二、填空题(第115页) 1.非0 0 2.k==0 3.if (abs(x)>4) printf("%d",x);else printf("error!"); 4.if((x>=1&&x<=10||x>=200&&x<=210)&&x&1)printf("%d",x); 5.k=1 (原题最后一行漏了个d,如果认为原题正确,则输出k=%。) 6. 8! Right!11 7.$$$a=0 8.a=2,b=1 三、编程题(第116页) 1.有错。正确的程序如下: main() {int a,b,c; scanf("%d,%d,%d",&a,&b,&c); printf("min=%d ",a>b?b>c?c:b:a>c?c:a);} 2.源程序: main() {unsigned long a; scanf("%ld",&a); for(;a;printf("%d",a%10),a/=10);} 执行结果: 12345 54321 3.(1)源程序: main() {int x,y; scanf("%d",&x); if (x>-5&&x<0)y=x; if (x>=0&&x<5)y=x-1; if (x>=5&&x<10)y=x+1; printf("%d ",y);} (2)源程序: main() {int x,y; scanf("%d",&x); if(x<10) if(x>-5) if(x>=0) if(x>=5)y=x+1; else y=x-1; else y=x; printf("%d ",y);} (3)源程序: main() {int x,y; scanf("%d",&x); if(x<10) if(x>=5)y=x+1; else if(x>=0)y=x-1; else if(x>-5)y=x; printf("%d ",y);} (4)源程序: main() {int x,y; scanf("%d",&x); switch(x/5) {case -1:if(x!=-5)y=x;break; case 0:y=x-1;break; case 1:y=x+1;} printf("%d ",y);} 4.本题为了避免考虑每月的天数及闰年等问题,故采用面向对象的程序设计。现给出Delphi源程序和C++ Builder源程序。 Delphi源程序: procedure TForm1.Button1Click(Sender: TObject); begin edit3.Text:=format('%.0f天',[strtodate(edit2.text) -strtodate(edit1.text)]); end; procedure TForm1.FormCreate(Sender: TObject); begin Edit2.Text:=datetostr(now); button1click(form1) end; C++ Builder源程序: void __fastcall TForm1::Button1Click(TObject *Sender) { Edit3->Text=IntToStr(StrToDate(Edit2->Text)-StrToDate(Edit1->Text))+"天"; } void __fastcall TForm1::FormCreate(TObject *Sender) { Edit2->Text=DateToStr(Now()); Button1Click(Form1); } 执行结果:(运行于Windows下) 5.源程序: main() {unsigned a,b,c; printf("请输入三个整数:"); scanf("%d %d %d",&a,&b,&c); if(a&&b&&c&&a==b&&a==c)printf("构成等边三角形 "); else if(a+b>c&&a+c>b&&b+c>a) if(a==b||a==c||b==c)printf("构成等腰三角形 "); else printf("构成一般三角形 "); else printf("不能构成三角形 ");} 执行结果: 请输入三个整数:5 6 5 构成等腰三角形 6.源程序: main() {int x,y; scanf("%d",&x); if(x<20)y=1; else switch(x/60) {case 0:y=x/10;break; default:y=6;} printf("x=%d,y=%d ",x,y);} 7.源程序: main() {unsigned m;float n; scanf("%d",&m); if(m<100)n=0; else if(m>600)n=0.06; else n=(m/100+0.5)/100; printf("%d %.2f %.2f ",m,m*(1-n),m*n);} 执行结果: 450 450 429.75 20.25 8. 2171天(起始日期和终止日期均算在内) 本题可利用第4小题编好的程序进行计算。把起始日期和终止日期分别打入“生日”和“今日”栏内,单击“实足年龄”按钮,将所得到的天数再加上1天即可。 9.源程序: #include "math.h"; main() {unsigned long i; scanf("%ld",&i); printf("%ld %d ",i%10,(int)log10(i)+1);} 执行结果: 99887 7 5 10.源程序: main() {unsigned long i;unsigned j[10],m=0; scanf("%ld",&i); for(;i;){j[m++]=(i+2)%10;i/=10;} for(;m;m--)i=i*10+j[m-1]; printf("%ld ",i);} 执行结果: 6987 8109 (注:要加密的数值不能是0或以0开头) 第6章循环结构程序设计 一、单项选择题(第142页) 1-4.BCCB 5-8.CBCA 二、填空题(第143页) 1.原题可能有误。如无误,是死循环 2.原题有误。如果把b=1后面的逗号改为分号,则结果是8。 3.20 4.11 5. 2.400000 6.*#*#*#$ 7.8 5 2 8.①d=1.0 ②++k ③k<=n 9.①x>=0 ②x 三、编程题(第145页) 1. 源程序: main() {int i=1,sum=i; while(i<101){sum+=i=-i-2;sum+=i=-i+2;} printf("%d ",sum);} 执行结果: 51 2.源程序: main() {double p=0,n=0,f;int i; for(i=1;i<=10;i++) {scanf("%lf",&f); if (f>0)p+=f; else n+=f;} printf("%lf %lf %lf ",p,n,p+n);} 3.源程序: main() {unsigned long a; scanf("%ld",&a); for (;a;printf("%d,",a%10),a/=10); printf("\b ");} 执行结果: 23456 6,5,4,3,2 4.源程序: main() {unsigned long a,b,c,i; scanf("%ld%ld",&a,&b); c=a%1000; for(i=1;i if(c<100)printf("0"); if(c<10)printf("0"); printf("%ld ",c);} 执行结果: 129 57 009 5.略 6.原题提供的计算e的公式有误(前面漏了一项1)。正确的公式是e= 1 + 1 + 1/2! + 1/3! + …+ 1/n! + … (1)源程序: main() {double e=1,f=1;int n; for(n=1;n<=20;n++){f/=n;e+=f;} printf("e=%.14lf ",e);} 执行结果: e=2.71828182845905 (2)源程序: main() {double e=1,f=1;int n; for(n=1;f>1e-4;n++){f/=n;e+=f;} printf("e=%.4f ",e);} 执行结果: e=2.7183 7.源程序: main() {unsigned long a=0,b=1,c=0;int i,d; scanf("%d",&d); for (i=1;i<=(d+2)/3;i++) printf("%10ld%10ld%10ld",a,b,(a+=b+c,b+=c+a,c+=a+b));} 本题还可以用递归算法(效率很低),源程序如下: unsigned long fun(int i) {return i<=3?i:fun(i-1)+fun(i-2)+fun(i-3);} main() {int i,d; scanf("%d",&d); for(i=1;i<=d;i++) printf("%10ld",fun(i));} 执行结果: 15 1 2 3 6 11 20 37 68 125 230 423 778 1431 2632 4841 8.源程序: main() {int i; for(i=1010;i<=9876;i+=2) if(i/100%11&&i%100%11&&i/10%100%11&&i/1000!=i%10&&i/1000!=i/10%10&&i/100%10! =i%10)printf(" %d",i);} 执行结果: 1024 1026 1028 1032 1034 1036 …… …… 9874 9876 9.源程序: main() {int i,j,k; printf("apple watermelon pear "); for(i=1;i<=100;i++) for(j=1;j<=10;j++) if((k=100-i-j)*2==400-i*4-j*40) printf("%4d%7d%9d ",i,j,k);} 执行结果: apple watermelon pear 5 5 90 24 4 72 43 3 54 62 2 36 81 1 18 10.源程序: #include "stdio.h"; #define N 4 /* N为阶数,可以改为其他正整数*/ main() {int m=N*2,i,j; for(i=1;i "),i++) for(j=1;j putchar(N-abs(i-N)<=abs(j++-N)?' ':'*'));} 如果把N值改为5,则执行结果如下: * *** ***** ******* ********* ******* ***** *** * 第7章数组 一、单项选择题(第192页) 1-4.BBCC 5-8.AABA 二、填空题(第194页) 1. 1 2 4 8 16 32 64 128 256 512(每个数占一行) 2. ①a[age]++ ②i=18;i<26 3.①break ②i==8 4. ①a[i]>b[j] ②i<3 ③j<5 5. ①b[j]=a[j][0] ②b[j] 6.a[k++]=a[j] 三、编程题(第196页) 1.源程序: main() {int a[4][4],i,j,s=0; for(i=0;i<4;i++) for(j=0;j<4;j++) scanf("%d",&a[i][j]); for(i=0;i<4;i++) for(j=0;j<4;j++) if(i==j||i+j==3)s+=a[i][j]; printf("%d ",s);} /* 注:5×5矩阵不能照此计算! */ 执行结果: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 68 2. 源程序: main() {int i,a[36]; a[0]=2; for(i=1;i<=29;i++)a[i]=a[i-1]+2; for(;i<=35;i++)a[i]=a[(i-30)*5+2]; for(i=0;i<=35;i++)printf("%d\t",a[i]);} 执行结果: 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 6 16 26 36 46 56 3. 源程序: #include "stdlib.h" #include "time.h" main() {int a[30],i,m=0; randomize(); for(i=0;i<=29;i++) {a[i]=rand();