C语言程序设计教程(第2版)课后习题答案

更新时间:2023-04-15 08:19:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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

第一章C语言程序设计概述

-习题答案1

算法的描述有哪些基本方法?

答1、自然语言

2、专用工具

2 C语言程序的基本结构是怎样的?举一个例子说明。

1、C语言程序由函数构成;

2、“/*”与“*/”之间的内容构成C语言程序的注释部分;

3、用预处理命令#include、#define可以包含有关文件或预定义信息;

4、大小写字母在C语言中是有区别的;

5、除main()函数和标准库函数外,用户也可以自己编写函数,应用程序一般由多个函数组成,这些函数指定实际所需要做的工作。

3 C语言有什么特点?

答1、具有结构语言的特点,程序之间很容易实现段的共享;

2、主要结构成分为函数,函数可以在程序中被定义完成独立的任务,独立地编译代码,以实现程序的模块化;

3、运算符丰富,包含的范围很广;

4、数据类型丰富;

5、允许直接访问物理地址,即可直接对硬件进行损伤,实现汇编语言的大部分功能;

6、限制不太严格,程序设计自由度大,这样使C语言能够减少对程序员的束缚;

7、生成的目标代码质量,程序执行效率高,同时C语言编写的程序的可移植性好。

4

★指出合法与不合法的标识符命名。

AB12--√

leed_3-- a*b2--× 8stu--× D.K.Jon--× EF3_3--√ PAS--√ if--× XYZ43K2 --√ AVE#XY--× _762--√ #_DT5--× C.D--×

5

说明下列Turbo C热键的功能。

F2:源文件存盘 F10:调用主菜单 F4:程序运行到光标所在行(用于调试程序) Ctrl+F9:编译并链接成可执行文件 Alt+F5:将窗口切换到 DOS 下,查看程序运行结果。

6

说明下列Turbo C方式下输入并运行下列程序,记录下运行结果。

①main()

{printf("********************\n");

printf(" welcome you \n");

printf(" very good \n);

printf("********************\n");

1

}

②main()

{ int a,b,c,t;

printf("please input three numbers;");

scanf("%d,%d,%d",&a,&b,&c); /*教材S是错误的*/

t=max(max(a,b),c);

printf("max number is:%d\n",t);

}

int max(int x, int y)

{ int z;

if(x>y)z=x;

else z=y;

return(z);

}

运行结果:

********************

welcome you

very good

********************

运行结果:

please input three numbers;3,1,4 /*左侧下划线内容为键盘输入*/

max number is:4

7

一个C程序是由若干个函数构成的,其中有且只能有一个___函数。

main()

8

在Turbo C环境下进行程序调试时,可以使用Run下拉菜单的___命令或按___键转到用户屏幕查看程序运行结果。

1、User screen

2、Alt+F5

9

★C语言对标识符与关键字有些什么规定?

1、标识符用来表示函数、类型及变量的名称,它是由字母、下划线和数字组成,但必须用字母或下划线开头。

2、关键字是一种语言中规定具有特定含义的标识符,其不能作为变量或函数名来使用,用户只能

2

根据系统的规定使用它们。

10

C源程序输入后是如何进行保存的?

是以C为扩展名保存的纯文本文件。

第二章C语言程序的基本数据类型与表达式

-习题答案

1

★指出下列常数中哪些是符合C语法规定的。

'\'--× '101'--× "\"--× e3--× 019--√ 0x1e--√"ab\n"--√ 1.e5--× (2+3)e(4-2)--× 5.2e2.5--×

2

请找出下列程序中的错误,改正后写出程序运行结果。

①void main()

{int x,y=z=5,aver;

x=7

AVER=(x+y+z)/3

printf("AVER=%d\n",aver);

}

②void main()

{ char c1='a';c2='b';c3='c';

int a=3.5,b='A'

printf("a=%db=\'\"end\n",a,b);

printf("a%cb%c\bc%c\tabc\n",c1,c2,c3);

}

main()

{int x,y=5,z=5,aver;

x=7;

aver=(x+y+z)/3;

printf("AVER=%d\n",aver);

}

3

运行结果:AVER=5

②main()

{ char c1='a', c2='b', c3='c';

int a=3,b='A';

printf("a=%d,b=\'%c\'\"end\"\n",a,b);

printf("a%cb%c\bc%c\tabc\n",c1,c2,c3);

}

运行结果:a=3,b='A'"end"

aabcc abc

3

写出下列赋值的结果,表格中写了数值的是要将它赋给其他类型的变量,将所有的空格填上赋值后的数据(实数保留到小数点后两位)。

int

99

-1

char

'h'

unsigned int

66

float

55.78

4

long int

68

int

99

104

66

55

68

-1

char

'c'

'h'

'B'

'7'

'D'

unsigned int

99

104

66

55

68

65535

float

99.00

104.00

66.00

55.78

68.00

-1.00

long int

99

5

104

66

55

68

-1

4

★写出程序运行结果。

①void main()

{int i,j;

i=8,j=10;

printf("%d,%d,%d,%d\n",i,j,++i,j++);

}

②main()

{ int a=1,b=2,c=30;;

printf("%d,%d,%d,%d\n",a=b=c,a=b==c,a==(b=c),a==(b==c)); }

注意:a=b=c,a=b==c之间应为逗号,教材有误

运行结果:

9,11,9,10

运行结果:

30,1,0,0

③void main()

{int a=10,b=20,c=30,d;

d=++a<=10||b-->=20||c++;

printf("%d,%d,%d,%d\n",a,b,c,d);

}

运行结果:

11,19,30,1

5

★写出下面表达式的值(设a=10,b=4,c=5,d=1,x=2.5,y=3.5)。

⑴a%=(b%=3)

⑵n++,a+=a-=a*=a

6

⑶(float)(a+c)/2+(int)x%(int)y

⑷a*=b+c

⑸++a-c+b++

⑹++a-c+++b

⑺a

⑻b++==c

⑼a+b,18+(b=4)*3,(a/b,a%b)

⑽x+a%3*(int)(x+y)%2/4+sizeof(int)

⑾a

⑿b++==c

⒀a*=b=c=2

⒁a=b==c

⑴0 ⑵0 ⑶9.500000 ⑷90 ⑸10 ⑹10 ⑺'A' ⑻2 ⑼4.5 ⑽1 ⑾0 ⑿20 ⒀0

6

下列每组表达式中,被执行后结果完全等价的是哪些(设a、b、m是已被赋值的整型变量)?

①m=(a=4,4*5)与m=a=4,4*5

②(float)(a/b)与(float)a/b

③(int)a+b与(int)(a+b)

④m%=2+a*3与m=m%2+a*3

⑤m=1+(a=2)+(b=3)与a=2,b=3,m=1+a+b

①前面是赋值表达式,而后面的是一个逗号表达式,所以一定不同;

②前面的表达式中a/b结果为一整数,结果已经取整,精度可能受到影响,之后强制float后才为浮点型,后面的是先将a转换为float后再与b相除,其值保证了精度,所以不同。

③因为a、b均为整数,其前后两个表达式的计算结果是一致的。

④前一表达式是一算术表达式,而后者为一赋值表达式,此为一点不同;另外,前一表达式的m只被赋过一次值,后一表达式中的m曾两次被赋值,第一次赋值时与第一表达式中的值一致,第二次赋值后即不再相同。

⑤前后表达式的计算结果应该是一致的:a=2, b=3, m=6

7

条件表达式x>0?x:-x的功能是什么?

如果x的值是一正数,则表达式的值为x值;如果x的值是一非正数,则表达式的值为-x。其实该表达式的值即为x的绝对值,C语言中提供了一个函数fabs(x)即可完成此功能,该函数包含在math.h头文件中。

8

用一个条件表达式描述从a、b、c中找出最大都赋给max.

7

max=a>(b>c?b:c)?a:(b>c?b:c);

9

★若x为int型变量,则执行以下语句后x的值为()。

x=6;

x+=x-=x*x;

A. 36

B. -60

C. 60

D. -24

B.

10

★若有以下类型说明语句:

char w; int x; float y; double z;

则表达式w*x+z-y的结果为()类型。

A. float

B. char

C. int

D. double

D.

第三章顺序结构程序设计

-习题答案

1

变量k为float类型,调用函数scanf("%d",&k),不能使变量k得到正确数值的原因是___。

格式修饰符与变量类型不一致。因为%d输入的数据类型应该为十进制整数,而&k为占用4个字节的float类型变量的地址。

2

★a=1234,b=12,c=34,则执行“printf("|%3d%3d%-3d|\n",a,b,c);”后的输出是___。

|1234 1234 |

分析如下:

①%3d为右对齐输出变量,且指定输出变量的值宽度为3个字符位,如果变量实际位数小于3,则左端补空格,如果变量实际位数大于3,则按实际长度输出,不受限制。

②%-3d为左对齐输出变量,在输出变量时,如是变量实际位数小于3,则在右端补空格,否则按实际输出。

8

3

★设有“int a=255,b=8;”,则“printf("%x,%o\n",a,b);”输出是___。

ff,10

①如果“printf("%X,%o\n",a,b);”则输出为FF,10。说明在输出十六进制字母时,其大小写受格式修饰符的限制,如果是“%x”则输出小写,如果是“%X”则输出大写。

②如果希望在输出十六进制时输出前导符0x或0X,则以上输出语句应改

“printf("%#x,%o\n",a,b);”为或“printf("%#X,%o\n",a,b);”。本条解释不必须掌握。

4

★以下程序输出的结果是___。

main()

{

int a1=1,a2=0,a3=2;

printf("%d,%d,%d\n",a1,a1+a2+a3,a3-a1);

}

1,3,1

5

printf函数中用到格式符%5s,其中5表示输出字符占用5列。如果字符串长度大于5,则按___输出;如果字符串长度小于5,则按___输出。

①实际②左端补空格

6

★已定义变量如下:

int a1,a2;

char c1,c2;

若要求输入a1、a2、c1和c2的值,正确的输入函数调用语句是___。

scanf("%d,%d,%c,%c",&a1,&a2,&c1,&c2);

7

输入两个整型变量a、b的值,输出下列算式以及运算结果___。

a+b、a-b、a*b、a/b、(float)a/b、a%b

每个算式占一行。如a=10,b=5,a+b输出为:10+5=15

设int a=10,b=5;以下为输出语句及结果:

①printf("%d+%d=%d\n",a,b,a+b); 10+5=15

②printf("%d-%d=%d\n",a,b,a-b); 10-5=5

③printf("%d*%d=%d\n",a,b,a*b); 10*5=50

9

④printf("%d/%d=%d\n",a,b,a/b); 10/5=2

⑤printf("%(float)d/%d=%f\n",a,b,(float)a/b); (float)10/5=2.000000

⑥printf("%d%%%d=%d\n",a,b,a%b); 10%5=0

8

★输入一个非负数,计算以这个数为半径的圆周长和面积。

#define PI 3.1415926

main()

{

float r,l,area;

printf("Input a positive:");

scanf("%f",&r);

l=2*PI*r;

area=PI*r*r;

printf("l=%f\tarea=%f\n",l,area);

}

9

输入任意一个3位数,将其各位数字反序输出(例如输入123,输出321)。

main()

{

int x,y;

printf("Input a number(100-999):");

scanf("%d",&x);

y=100*(x%10)+10*(x/10%10)+x/100; /*注意分析此处算法*/

printf("%d--->%d\n",x,y);

}

10

★输入任意大小的3个整数,判断其中是否有两个奇数一个偶数。若是则输出YES,不是则输出NOT(要求用条件表达式进行判断,不使用if语句)。

main()

{

int x,y,z,oddcount=0; /*奇数数计数变量*/

printf("Input x,y,z:");

scanf("%d,%d,%d",&x,&y,&z);

x%2==1?oddcount++:0;

y%2==1?oddcount++:0;

z%2==1?oddcount++:0;

oddcount==2?printf("YES"):printf("NOT");

}

10

11

求前驱字符和后继字符。输入一个字符,找出它的前驱字符和后继字符,并按ASCII码值,按从大到小的顺序输出这3个字符及其对应的ASCII码值。

本题考查同学们对字符类型数据的认识,如果在ASCII范围内则即可以显示为字符,又可以显示为整数值;无论是否能够显示为字符,字符类型数据是可能参与数值运算的,切记。

main()

{

char c;

printf("Input character:");

scanf("%c",&c);

printf("%c----->%d\n",c-1,c-1);

printf("%c----->%d\n",c,c);

printf("%c----->%d\n",c +1,c+1);

getch(); /*为便于调试程序,运行至此程序停顿,此时可以看到运行结果,按任意键程序真难得结束并返回到编辑环境*/

}

12

★输入三角形的边长,求三角形面积(面积=sqrt(s(s-a)(s-b)(s-c)),s=(a+b+c)/2)。

#include"math.h" /*由于程序中使用了开平方函数sqrt(),所以需要包含数学头文件*/ main()

{

float a,b,c,s,area;

int ok=0;

printf("Input a,b,c:");

scanf("%f,%f,%f",&a,&b,&c);

a+b>c?ok++:0; /*以下3条语句为判断是否输入的数据是否构成封闭三角形*/

a+c>b?ok++:0;

b+c>a?ok++:0;

ok==3?(s=(a+b+c)/2,area=sqrt(s*(s-a)*(s-b)*(s-c)),printf("area=%f",area)):printf ("error");

getch();

}

第四章选择结构程序设计

-习题答案

1

★设x、t均为int型变量,则执行语句“x=10;t=x&&x>10;”后,t的值为___。

11

2

★假定所有变量均已正确定义,则程序段:

int a=0, y=10;

if(a=0)y- -; else if(a>0)y++;

else y+=y;

运行后 y 的值是___;

20

3

★能表述 20

x>20&&x<30||+x<-100

4

★若有定义语句“int a=25,b=14,c=19;”,则以下语句执行结果是___。

if(a<=25 && b<=2 && c)

printf("***a+b=%d, a-b=%d***\n", a+b, a-b);

else printf("***a=%d, b=%d, c=%d***\n",a, b, c);

***a=25, b=14, c=19***

5

★假定 i 和 j 为 int 型变量,则执行以下语句后 i 的值是___。

int i=1;

switch(i)

{

case 1: { for(j=0; j<9; j++) i+=j; break;}

case 2: { for(j=1; j<10; j++) i+=j; break;}

case 3: i++;

}

37

分析:执行了case 1: 和case 3: 中的代码。同时case 1:语句中的{}是可以取消的。

12

6

★以下两条 if 语句可合并成一条 if 语句,即___。

if(a<=b) x=1;

else y=2;

if(a>b)printf("***y=%d\n", y);

else printf("***x=%d\n",x);

if(a<=b) printf("***x=%d\n",x=1);

else printf("***y=%d\n", y=2);

7

★输入两个字符,若这两个字符的序号(ASCII码)之差为偶数,则输出它们的后继字符,否则输出它们的前驱字符。

main()

{

char a,b;

printf("Input two chatacter a,b:");

scanf("%c,%c",&a,&b);

if((a-b)/2==0)

printf("%c,%c",a+1,b+1);

else printf("%c,%c",a-1,b-1);

}

8

★输入整数 a 和 b ,如果 a 能被 b 整除,就输出算式和商,否则输出算式、整数商和余数。答

main()

{

int a,b;

printf("Input two integer numbers a,b:");

scanf("%d,%d",&a,&b);

if(b!=0&&a%b==0)

printf("%d/%d=%d",a,b,a/b);

else

printf("%d/%d=%d......%d",a,b,a/b,a%b);

}

9

输入某个点 A 的平面坐标 (x,y),判断(输出)A点是在圆内、圆外还是在圆周上,其中圆心坐标为 (2,2),半径为 1。

13

include"math.h"

main()

{

float x,y,d;

printf("Input x,y:");

scanf("%f,%f",&x,&y);

d=sqrt((x-2)*(x-2)+(y-2)*(y-2));

if(d>1)printf("outside");

else if(d<1)printf("inside");

else printf("inside");

}

10

★输入年号和月份,输出这一年该月的天数(一个年份,先判断是否闰年)。

main()

{

int y,m,d,f;

printf("Input year and month y-m:");

scanf("%d-%d",&y,&m);

f=(y%4==0&&y/100!=0||y/400==0);

if(m==2)

d=28+f; /*依据是否闰年决定2月份的实际天数,若是闰年,则f=1,d即为29天*/ else

d=31-(m==4)+(m==6)+(m==9)+(m==11);/*m==4时其值为1,则本月为30天,典型算法,重要啊*/

printf("%d-%d is %d days.\n",y,m,d);

}

11

★请将以下语句改写成 switch 语句(a>0)。

if(a<30) m=1;

else if(a<40) m=2;

else if(a<50) m=3;

else if(a<60) m=4;

else m=5

switch(a/10)

{

case 1:

case 2:

case 3:m=1;break;

case 4:m=2;break;

14

case 5:m=3;break;

case 6:m=4;break;

default:m=5;

}

12

有一函数

x-1 -5

y= x x=0

x+1 0

编写一程序,要求输入 x 的值,输出 y 的值。分别用不嵌套的 if 语句,嵌套的 if 语句,switch 语句编写。

使用不嵌套的 if 语句程序如下:

main()

{

float x,y;

printf("Input x:");

scanf("%f",&x);

if(x>-5&&x<0)y=x-1;

if(x==0)y=0;

if(x>0&&x<8)y=x+1;

printf("y=%f\n",y);

}

使用嵌套的 if 语句程序如下:

main()

{

float x,y;

scanf("%f",&x);

if(x>-5&&x<8)

if(x<0)y=x-1;

else if(x==0)y=0:

else y=x+1;

printf("y=%f\n",y);

}

main()

float x,y;

scanf("%f",&x);

if(x<8)

if(x>0)y=x+1;

else if(x==0)y=0;

15

else if(x>-5)y=x-1;

printf("y=%f\n",y);

}

使用多分支语句程序如下:

main()

{

float x,y;

int m;

printf("Input x:");

scanf("%f",&x);

if(x>-5&&x<8)

if(x<0)m=-1;

else if(x==0)m=0:

else m=1;

switch(m)

{

case -1:y=x-1;break;

case 0:y=0;break;

case 1:y=x+1;break;

}

printf("y=%f\n",y);

}

以下为假设对int类型的变量进行处理,但毕竟不算完美

main()

{

int x,y;

printf("Input x:");

scanf("%d",&x);

switch(x)

{

case -4:

case -3:

case -2:

case -1: y=x-1; break;

case 0: y=0; break;

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

case 7: y=x+1; break;

}

16

printf("y=%d\n",y);

}

第五章循环结构程序设计

-习题答案

1

★输入 n 个整数,求这 n 个数之中的偶数平均值,并输出。

main()

{

int n,i,x,sum=0,count=0;

printf("Input n:");

scanf("%d",&n);

for(i=0;i

{

printf("Input [%d]:",i+1);

scanf("%d",&x);

if(x%2==0){sum+=x;count++;}

}

printf("Average is:%f\n",(float)sum/count);

getch();

}

2

★输入一串字符,直到输入一个星号(*)为止,统计(输出)其中的字母个数和数字字符个数。

#include"stdio.h"

main()

{

char ch;

int charcnt=0,numcnt=0;

while((ch=getchar())!='*')

{

if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')charcnt++;

if(ch>='0'&&ch<='9')numcnt++;

}

printf("Characters number:%d\nDigits number:%d\n",charcnt,numcnt);

getch();

}

3

17

★从键盘输入一个正整数 n,计算该数的各位数字之和并输出。例如,输入数是5246,则计算5+2+4+6=17并输出。

#include"stdio.h"

main()

{

int n,i,sum=0,count=0;

printf("Input n:");

scanf("%d",&n);

while((n/10)!=0)

{

count++;

sum+=n%10;

printf("%d+",n%10);

n/=10;

}

printf("=%d",sum+n);

getch();

}

4

★输入一个字符串,将其中的大写字母改为小写字母,小写字母改为大写字母,然后输出。

#include"stdio.h"

main()

{

char ch;

printf("Input string:");

while((ch=getchar())!='\n')

{

if(ch>='a'&&ch<='z')printf("%c",ch-32);

if(ch>='A'&&ch<='Z')printf("%c",ch+32);

}

getch();

}

5

设某县2000年工业总产值为200亿元,如果该县预计平均年工业总产值增长率为4.5%,那么多少年后该县年工业总产值将超500亿元。

main()

{

float x=200;

int n=0;

18

do

{

x*=(1+0.045);

n++;

}while(x<500);

printf("n=%d",n);

getch();

}

6

★输出1~999中能被3整除,而且至少有一位数字是5的所有数字。

main()

{

int x,y,flag;

for(x=1;x<1000;x++)

{

flag=0;

y=x;

if(y%3==0) /*余数为0说明该数能够被3整除*/

{

while(y%10!=0)

{

if(y%10==5)flag=1; /*依个位、十位、百位顺序判断是否余数为5*/

y/=10;

}

if(flag==1)printf("%d\t",x);

}

}

getch();

}

7

求爱因斯坦数学题。有一条长阶,若每步跨2阶,则最后剩1阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶每步跨6阶,则最后剩5阶每步跨7阶,最后正好1阶。

main()

{

int x=0,flag=0;

while(1)

{

x++;

if(x%2==1)

19

if(x%3==2)

if(x%5==4)

if(x%6==5)

if(x%7==0)

{

printf("%d",x);

break;

}

}

getch();

}

8

输入一个3位数,判断是否是一个“水仙花数”。水仙花数是指3位数的各位数字的立方和等于这个3位数本身。例如,153=1*1*1+5*5*5+3*3*3

main()

{

int x,a,b,c;

printf("Input number:");

scanf("%d",&x);

a=x/100; /*变量a中记录x的百位数字*/

b=x/10%10; /*变量b中记录x的十位数字*/

c=x%10; /*变量c中记录x的个位数字*/

if(a*a*a+b*b*b+c*c*c==x)

{

printf("%d=%d*%d*%d+%d*%d*%d+%d*%d*%d\n",x,a,a,a,b,b,b,c,c,c);

printf("YES");

}

else

printf("NOT");

getch();

}

9

★计算斐波那契分数序列前n项之和(n是某个常数,波那契分数序列为2/1,3/2,5/3,8/5,...)。

main()

{

int i,n=10;

float f1=1,f2=2,f,sum=0;

for(i=0;i

{

sum+=f2/f1;

20

f=f1+f2;

f1=f2;

f2=f;

}

printf("total=%d\nsum=%f",n,sum);

getch();

}

10

输入一个正整数,各输出n行的正(倒)三角形宝塔图案。

main()

{

int n,i,j;

printf("Input n:");

scanf("%d",&n);

for(i=0;i

{

for(j=i+1;j

for(j=0;j<2*i+1;j++)printf("*");

printf("\n");

}

for(i=0;i

{

for(j=0;j

for(j=2*i-1;j

printf("\n");

}

getch();

}

11

★输出九九乘法表。

main()

{

int i,j;

for(i=1;i<=9;i++)

{

for(j=1;j<=i;j++)

printf("%d*%d=%-3d",j,i,i*j);

printf("\n");

}

getch();

21

本文来源:https://www.bwwdw.com/article/h0zq.html

Top