您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页《C语言程序设计教程(第二版)》习题答案

《C语言程序设计教程(第二版)》习题答案

来源:小侦探旅游网
1 【C语言】《C语言程序设计教程(第二版)》习题答案 说 明

1. 本文所指的《C语言程序设计教程(第二版)》是李凤霞主编、北京理 工大学出版社出版的,绿皮。

2 第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\\n\"); 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\\n\执行结果: 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=a+b;b=b+a;}} 递归法 源程序: main() {int i;

for(i=0;i<=19;i++) printf(\"%8d\fib(int i)

{return(i<=1?1:fib(i-1)+fib(i-2));} 执行结果:

1 1 2 3 5 8 13 21 34 55

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\\n\执行结果: 1.3247179572

5.源程序略。(分子、分母均构成斐波那契数列) 结果是32.660260798 6.源程序: main() {int a,b,c,m;

printf(\"Please input a,b and c:\"); scanf(\"%d %d %d\if(aPlease input a,b and c:123 456 7 7 456 123 7.源程序: main() {int a;

scanf(\"%d\

printf(a%21==0?\"Yes\":\"No\");} 执行结果: 42 Yes

3 第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\c=a;a=b;b=c; printf(\"%d %d\执行结果: 12 34 34 12

4 第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~10^308) 3.int(整数) 4.单目 自右相左 5.函数调用 6.a或b 7.1 8.65, 三、应用题(第78页) 1.10 9 2.执行结果: 11 0 0 12 1

5 第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\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\printf(\"%d\\n\执行结果: 9:23 563 3.源程序: main()

{int a[]={-10,0,15,34},i; for(i=0;i<=3;i++)

printf(\"%d\\370C=%g\\370F\\执行结果:

-10℃=14°F 0℃=32°F 15℃=59°F 34℃=93.2°F 4.源程序: main()

{double pi=3.141592653579,r=5;

printf(\"r=%lg A=%.10lf S=%.10lf\\n\,2*pi*r,pi*pi*r);} 执行结果:

r=5 A=31.4159265359 S=49.34802200 5.源程序: #include \"math.h\"; main() {double a,b,c;

scanf(\"%lf%lf%lf\if (a+b>c&&a+c>b&&b+c>a) {double s=(a+b+c)/2;

printf(\"SS=%.10lf\\n\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\\nd=%g\\ne=%6.2f\\nf=%-10.4f**\\n\7.源程序: main() {int a,b,c,m;

scanf(\"%d %d %d\m=a;a=b;b=c;c=m;

printf(\"%d %d %d\\n\执行结果: 5 6 7 6 7 5 8.源程序: main() {int a,b,c;

scanf(\"%d %d %d\

printf(\"average of %d,%d and %d is %.2f\\n\执行结果: 6 7 9

average of 6,7 and 9 is 7.33 9.不能。修改后的源程序如下: main() {int a,b,c,x,y;

scanf(\"%d %d %d\x=a*b;y=x*c;

printf(\"a=%d,b=%d,c=%d\\n\printf(\"x=%d,y=%d\\n\

6 第5章 选择结构程序设计 一、单项选择题(第113页) 1-4.DCBB 5-8.DABD 二、填空题(第115页) 1.非0 0 2.k==0

3.if (abs(x)>4) printf(\"%d\

4.if((x>=1&&x<=10||x>=200&&x<=210)&&x&1)printf(\"%d\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\

printf(\"min=%d\\n\2.源程序: main()

{unsigned long a; scanf(\"%ld\

for(;a;printf(\"%d\

执行结果: 12345 321 3.(1)源程序: main() {int x,y; scanf(\"%d\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\\n\(2)源程序: main() {int x,y; scanf(\"%d\

if(x<10) if(x>-5) if(x>=0) if(x>=5)y=x+1; else y=x-1; else y=x; printf(\"%d\\n\(3)源程序: main() {int x,y; scanf(\"%d\if(x<10) if(x>=5)y=x+1; else if(x>=0)y=x-1; else if(x>-5)y=x; printf(\"%d\\n\(4)源程序: main() {int x,y; scanf(\"%d\switch(x/5)

{case -1:if(x!=-5)y=x;break; case 0:y=x-1;break; case 1:y=x+1;} printf(\"%d\\n\

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下) http://img378.photo.163.com/nxgt/41463572/1219713927.jpg

5.源程序: main()

{unsigned a,b,c;

printf(\"请输入三个整数:\"); scanf(\"%d %d %d\

if(a&&b&&c&&a==b&&a==c)printf(\"构成等边三角形\\n\"); else if(a+b>c&&a+c>b&&b+c>a)

if(a==b||a==c||b==c)printf(\"构成等腰三角形\\n\"); else printf(\"构成一般三角形\\n\"); else printf(\"不能构成三角形\\n\");} 执行结果:

请输入三个整数:5 6 5 构成等腰三角形 6.源程序: main() {int x,y; scanf(\"%d\if(x<20)y=1; else switch(x/60) {case 0:y=x/10;break; default:y=6;}

printf(\"x=%d,y=%d\\n\7.源程序: main()

{unsigned m;float n; scanf(\"%d\if(m<100)n=0; else if(m>600)n=0.06; else n=(m/100+0.5)/100;

printf(\"%d %.2f %.2f\\n\执行结果: 450

450 429.75 20.25

8. 2171天(起始日期和终止日期均算在内)

本题可利用第4小题编好的程序进行计算。把起始日期和终止日期分别打入“生日”和“今日”栏内,单击“实足年龄”按钮,将所得到的天数再加上1天即可。 9.源程序: #include \"math.h\"; main()

{unsigned long i; scanf(\"%ld\

printf(\"%ld %d\\n\执行结果: 99887 7 5

10.源程序: main()

{unsigned long i;unsigned j[10],m=0; scanf(\"%ld\

for(;i;){j[m++]=(i+2)%10;i/=10;} for(;m;m--)i=i*10+j[m-1]; printf(\"%ld\\n\执行结果: 6987 8109

(注:要加密的数值不能是0或以0开头。如果要以0开头需用字符串而不能是整数。)

7 第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 ②xwhile(i<101){sum+=i=-i-2;sum+=i=-i+2;} printf(\"%d\\n\执行结果:

51 2.源程序: main()

{double p=0,n=0,f;int i; for(i=1;i<=10;i++) {scanf(\"%lf\ if (f>0)p+=f; else n+=f;} printf(\"%lf %lf %lf\\n\3.源程序: main() {unsigned a; scanf(\"%ld\

for (;a;printf(\"%d,\printf(\"\\b \\n\");} 执行结果: 23456 6,5,4,3,2 4.源程序: main()

{unsigned long a,b,c,i; scanf(\"%ld%ld\c=a%1000;

for(i=1;i6.原题提供的计算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\\n\执行结果:

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\\n\执行结果:

e=2.7183 7.源程序: main()

{unsigned long a=0,b=1,c=0;int i,d; scanf(\"%d\

for (i=1;i<=(d+2)/3;i++)

printf(\"%10ld%10ld%10ld\本题还可以用递归算法(效率很低),源程序如下: unsigned long fun(int i)

{return i<=3?i:fun(i-1)+fun(i-2)+fun(i-3);} main()

{int i,d; scanf(\"%d\for(i=1;i<=d;i++) printf(\"%10ld\执行结果: 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\执行结果:

1024 1026 1028 1032 1034 1036 …… …… 9874 9876 9.源程序: main() {int i,j,k;

printf(\"apple watermelon pear\\n\"); 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\\n\执行结果:

apple watermelon pear 5 5 90 24 4 72 43 3 62 2 36 81 1 18 10.源程序: #include \"stdio.h\";

#define N 4 /* N为阶数,可以改为其他正整数 */

main() {int m=N*2,i,j;

for(i=1;iputchar(N-abs(i-N)<=abs(j++-N)?' ':'*'));} 如果把N值改为5,则执行结果如下: * *** ***** ******* ********* ******* ***** *** *

作者:宁西贯通 2006-5-7 23:41 回复此发言

-------------------------------------------------------------------------------- 8 说明

注意:上面最后一题的输出结果应该是由星号组成的一个菱形,

9 第7章 数 组

一、单项选择题(第192页) 1-4.BBCC 5-8.AABA 二、填空题(第194页) 1.1 2 4 8 16 32 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]{int a[4][4],i,j,s=0; for(i=0;i<4;i++) for(j=0;j<4;j++) scanf(\"%d\for(i=0;i<4;i++) for(j=0;j<4;j++)

if(i==j||i+j==3)s+=a[i][j];

printf(\"%d\\n\注: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\\执行结果:

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 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(); if(mfor(i=0;i<=29;i++)if(a[i]==m)a[i]=-1; printf(\"\\n-----------------\\n\"); for(i=0;i<=29;i++) if(~a[i])printf(\"%d\\printf(\"\\n\");} 执行结果:

20679 29377 185 9034 27083 4959 3438 5241 32278 23344

32499 29305 22340 5927 13031 2161 2583 31855 22977 14283 4851 22038 6992 11394 20887 27381 6293 18347 114 10210 -----------------

20679 29377 185 9034 27083 4959 3438 5241 32278 23344 29305 22340 5927 13031 2161 2583 31855 22977 14283 4851 22038 6992 11394 20887 27381 6293 18347 114 10210 4.源程序: main()

{int i,n=0,b[16]; scanf(\"%d\

for(;i;i>>=1)b[n++]=i&1; for(;n;)printf(\"%d\执行结果: 9876

10011010010100

本题也可以不用数组。源程序如下: #include \"stdio.h\" main() {int i,n; scanf(\"%d\for(n=16;n;n--) {asm ROL i,1 putchar(i&1|48);}

} /* ROL是循环左移的汇编指令 */ 5. 源程序: #include \"stdlib.h\" #include \"time.h\" #define M 5 #define N 6 main()

{int a[M][N],i,j,t[M]; randomize();

/*生成M行N列随机数*/ for(i=0;iprintf(\"%4d\

/*找出每行的最小数,t[M]是第M行的最小数所在的列数*/ for(i=0;ia[i][j])t[i]=j;

/*比较每个最小数在其所在的列上是否也是最小*/ for(j=0;jif(a[j][t[j]]>a[i][t[j]]) {t[j]=-1;break;} }

printf(\"-------------------\\n\"); /*输出在行和列上均为最小的数*/ for(i=0;iprintf(\"a[%d,%d]=%d\\n\}

执行结果: 13 19 13 20 0 1 20 41 6 16 35 30 3 5 37 8 23 15 6 36 24 29 18 1 1 5 28 21 46 34 ------------------- a[0,4]=0 a[1,2]=6 a[3,5]=1 a[4,0]=1 6. 源程序: #include \"stdlib.h\" #include \"time.h\" #define M 5 #define N 7 main()

{int a[M][N],i,j,t=0; randomize(); for(i=0;i{printf(\"%4d\ a[i][N-1]+=a[i][j];} printf(\"%4d\\n\for(i=1;iif(a[i][N-1]>a[t][N-1])t=i; if(t)for(j=0;j{i=a[0][j];a[0][j]=a[t][j];a[t][j]=i;} printf(\"-----------------\\n\"); for(i=0;i10 第7章 数 组 for(j=0;j执行结果:

17 32 95 35 20 288 39 48 22 27 73 22 231 51 87 39 71 84 46 378 84 94 97 77 27 26 405 69 50 56 37 46 347 -----------------

84 94 97 77 27 26 405 39 48 22 27 73 22 231 51 87 39 71 84 46 378 17 32 95 35 20 288 69 50 56 37 46 347 7. 源程序: #include \"stdlib.h\" #include \"time.h\" #define M 5 #define N 6 main() {int a[M][N],i,j;

struct data{int value,x,y;}max,min; max.value=0;min.value=100; randomize();

for(i=0;i{printf(\"%4d\ if(max.value{max.value=a[i][j];max.x=i;max.y=j;} if(min.value>a[i][j])

{min.value=a[i][j];min.x=i;min.y=j;} }

printf(\"-----------------\\n\");

i=a[0][N-1];a[0][N-1]=max.value;a[max.x][max.y]=i; i=a[M-1][0];a[M-1][0]=min.value;a[min.x][min.y]=i; for(i=0;i执行结果: 51 53 74 65 30 40

30 26 50 6 61 27 47 16 58 76 19 57 74 44 92 71 48 73 57 60 32 73 67 ----------------- 51 53 74 65 30 92 30 26 50 73 61 27 47 16 58 76 19 57 74 44 40 71 48 6 57 60 32 73 67 9. 源程序: main()

{char s[255];int i,j,b=1; printf(\"Input a string:\"); scanf(\"%s\i=strlen(s); for(j=1;j<=i/2;j++) b=b&&(s[j-1]==s[i-j]); printf(b?\"Yes\\n\":\"No\\n\");} 执行结果: Input a string:level Yes

10. 源程序: main()

{char s[255],t,max=0,min=0,l,i; printf(\"Input a string(length>4):\"); gets(s); l=strlen(s); for(i=0;i{if(s[max]s[i])min=i;} t=s[1];s[1]=s[max];s[max]=t;if(min==1)min=max; t=s[l-2];s[l-2]=s[min];s[min]=t; printf(\"%s\\n\执行结果:

Input a string(length>4):C++Builder Cu+Beild+r 11. 源程序: main()

{char m[13][10]={\"****\\"April\\"October\int i,j,k,a,s,n;

printf(\"Please input an integer(100..999):\"); scanf(\"%d\

printf(\"%d:%d+%d+%d=%d, 执行结果:

Please input an integer(100..999):539 539:5+3+9=17, 17%13=4, April

11 第8章 函 数

一、单项选择题(第241页)

1-5.BCCAA 6-10.CCDDD 11-15.ACACB 二、填空题(第243页)

%d%%13=%d, %s\\n\

n,i,j,k,s,s,a,m[a=((s=(i=n/100)+(j=n/10%10)+(k=n%10))%13)]);}

1.看不出原题的意图。因为要计算1~n的累加和,n应是一个≥1的正整数。可是题目中却出现了n=0的情况。除非另加规定当n=0时1~n的累加和为0,或者把原题中的计算式改为计算0~n的累加和。据此猜测,原题应填为:①return(0) ②return(n+sum(n-1)) 根据题意,如下程序较为合理: int sum(int n)

{if(n<=0)return(-1); /* -1是出错标志 */ else if(n==1)return(1); else return(n+sum(n-1));} 2. ①return(1) ②return(n*facto(n-1)) 三、编程题(第244页) 3.源程序: main() {int i,a,b,c;

for(i=100;i<999;i++)

if((a=i/100)*a*a+(b=i/10%10)*b*b+(c=i%10)*c*c==i) printf(\"%d\\执行结果: 153 370 371 407 8.源程序(非递归算法):

#define P 13 /* P可以改为其他正整数 */ main() {int a[P],r,c; for(r=0;r<=P;r++) {a[r]=1;

for(c=r-1;c>=1;a[c--]+=a[c-1]); printf(\"%*d\ for(c=1;c<=r;printf(\"%6d\ printf(\"\\n\");} }

执行结果:

(应该排列成一个三角形,是贴吧造成现在这个样子的,不是程序有问题) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1

1 10 45 120 210 252 210 120 45 10 1 1 11 55 165 330 462 462 330 165 55 11 1 1 12 66 220 495 792 924 792 495 220 66 12 1 1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1 9.源程序(递归算法): #include \"stdio.h\"

void printOCT(unsigned long n) {unsigned long i; if(i=n>>3)printOCT(i); putchar((n&7)+48);} main()

{unsigned long i; scanf(\"%ld\printOCT(i);} 执行结果: 12345670 111401322

本题也可以不用递归算法,源程序请参考第7章第三题4。

12 回复:【C语言】《C语言程序设计教程(第二版)》习题答案

但是不同时间印刷的版本课后题不太一样呢,象我们的是1999年12月第2版,2005年12月第69次印刷的。没有选择填空,应用题和楼主不知道有多少相同的,因为看不到原题。这个比较麻烦呢。

作者:210.77.204.* 2006-5-9 18:38 回复此发言

--------------------------------------------------------------------------------

13 回复:【C语言】《C语言程序设计教程(第二版)》习题答案 你对照一下主编和出版社,看看对吗?(见说明的第一条。)

我不是说叫你有问题另发帖子吗?

14 第9章 指 针

一、单项选择题(第276页)

1-5.DCDAC 6-10.CCABC 11-16.AABBB 16-20.DCDBD 二、填空题(第278页) 1.①int * ②*z 2.*p++ 3.①'\\0' ②++

4.①q=p+1 ②qmax ④*q{int i=0;char c[20]; do{scanf(\"%s\while(strcmp(c,\"stop\")); printf(\"%d\\n\执行结果:

This car ran form Nanyang to Luoyang without a stop 10 9.源程序: main()

{char s[255],c[255]={0};int i; gets(s);

for(i=0;s[i];c[s[i++]]++); for(i=0;i<255;i++)

if(c[i])printf(\"%c=%d\\执行结果: abcedabcdcd

a=2 b=2 c=3 d=3 e=1

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务