前言
本人在通过《C语言程序设计:现代方法(第2版)》自学C语言时,发现国内并没有该书完整的课后习题答案,所以就想把自己在学习过程中所做出的答案分享出来,以供大家参考。这些答案是本人自己解答,并参考GitHub上相关的分享和Chegg.com相关资料。因为并没有权威的答案来源,所以可能会存在错误的地方,如有错误还希望大家能够帮助指出。
第二章练习题和编程题答案
练习题
2.2节
1.建立并运行由Kernighan和Ritchie编写的著名的“hello world”程序:
1 #include
2 int main(void)
3 {
4 printf("hello world!\n");
5 }
在编译时是否有警告信息?如果有,需要如何改进呢?
答:如果使用部分比较老的编译器如turbo C等,会生成警告信息,指出main函数并没有返回任何值。这是因为在声明main函数时使用了int,表明函数会返回一个整型数值,这个数值为任意(因为main后面是void)。 但是上面的代码中并没有return语句,所以并不会返回任何值。加入return语句后便可消除警告。
1 / 加入return语句后的版本 /
2 #include
3 int main(void)
4 {
5 printf("Hello world!\n");
6 return 0;
7 }
如果是使用IDE中的编译器,且IDE版本比较新(如本人目前使用的Code:Blocks)即使没有return语句,编译器也不会生成警告信息。
2.思考下面的程序:
1 #include
2 int main(void)
3 {
4 printf("Parkinson's Law:\nWork expands so as to ");
5 printf("fill the time\n");
6 printf("available for its completion.\n");
7 return 0;
8 }
(a)请指出程序中的指令和语句。
(b)程序的输出是什么?
答:(a)给出的程序中有一个指令#include和三条printf语句和一条return语句组成。
(b)程序的输出结果为
Parkinson's Law:
Work expands so as to fill the time
available for its completion.
2.4节
3.通过下列方法缩写程序dweight.c: (1)用初始化式替换对变量height、length和width的赋值;(2)去掉变量weight,在最后的printf语句中计算(volume + 165)/ 166。
答:
1 #include
2 int main(void)
3 {
4 / 用初始化替代对变量赋值就是在声明变量时直接为其赋值 /
5 int height = 8, length = 12, width = 10, volume = height length width;
6 printf("Dimensions: %dx%dx%d\n", length, width, height);
7 printf("Volume (cubic inches): %d\n", volume);
8 / 此处则省略原来对于weight,并将计算公式直接放入printf语句中 /
9 printf("Dimensional weight (pounds): %d\n", (volume + 165) / 166);
10 return 0;
11 }
4.编写一个程序来声明几个int型和float型变量,不对这些变量进行初始化,然后直接显示它们的值。这些值是否有规律?(通常情况下没有)。
答:
1 #include
2 int main(void)
3 {
4 int a, b, c;
5 float e, f, g;
6 printf("a:%d\nb:%d\nc:%d\ne:%f\n%f:f\ng:%f\n"a, b, c, d, e, f, g);
7 return 0;
8 }
实际上并没有什么规律,上面这些变量既没有被初始化也没有在程序中被赋值,这时变量被显示出来的值取决于许多因素,所以无法确定最终显示的结果。
2.7节
5.判断下列C语言标识符哪些不是合法的?
(a) 100_bottles
(b) _100_bottles
(c) one_hundred_bottles
(d) bottles_by_thehundred
答:不合法的标识符只有(a),因为标识符只能以字母或下划线开头,而100_bottles是以数字开头的,所以不会发。另外C语言还规定了下划线后跟一个大写字母是保留字,不应该在程序中使用(书中后面有提及)。
6.为什么说在标识符中使用多个相邻的下划线(如current_balance)不太合适?
答:因为在阅读程序时很难分清到底有几个相邻的下划线,如current__balance和current_balance,前者是4个下划线后者是5个下划线。在未来维护程序时不论是编写者本人还是他人,都容易弄混下划线的数量,造成不必要的混乱。
7.判断下列哪些是C语言的关键字?
(a) for
(b) If
(c) main
(d) printf
(e) while
答:只有(a)for和(e)while是关键字,其余全都不是。(b) If 是因为C语言区分大小写,所以If和if并不相同,if是关键字但是If不是。(c)main和(d)printf也不是关键字,main()函数是C语言自动调用的函数,但是我们依旧可以将变量命名为main(不建议这样做)。printf()则是我们头文件内包含的函数,如果不调用这个头文件那么我们一样可以将变量命名为printf。总的来说只有在关键字表里的单词才是关键字,其余都不是关键字。
2.8节
8.下面的语句中有多少个记号?
answer=(3q-pp)/3;
答:14个记号,分别是answer、=、(、3、、q、-、p、、p、)、/、3、;。
9.在练习题8的记号之间插入空格,使该语句更易于阅读。
答:answer = (3 q - p p) / 3//代码效果参考:http://www.zidongmutanji.com/zsjx/3761.html
;10.在dweight.c程序(2.4节)中,哪些空格是必不可少的?
答:程序当中出现两次的int后面空格不能少,return 0; 中间的空格不能少。程序其他部分的空格都是为了易于阅读而存在的,即使可去掉程序本身依旧能够正常执行,只是增加了阅读困难。
编程题
1.编写一个程序,使用printf在屏幕上显示下面的图形:
答:
1 #include
2
3 int main(void)
4 {
5 printf(" \n");
6 printf(" \n");
7 printf(" \n");
8 printf(" \n");
9 printf(" \n");
10 printf(" \n");
11
12 return 0;
13 }
2.编写一个计算球体体积的程序,其中球体半径为10m,参考公式v=4/3πr 3。注意,分数4/3应写为4.0f/3.0f。(如果分数写成4/3会产生什么结果?)提示:C语言没有指数运算符,所以需要对r自乘两次来计算r 3。
答:
1 #include
2 / 定义名为PI和SCALE_FACTOR的宏 /
3 #define PI 3.14f
4 #define SCALE_FACTOR 4.0f/3.0f
5
6 int main(void)
7 {
8
9 / 声明变量并对其初始化,r是半径,volume为计算结果,r_3是r的立方结果 /
10 float r = 10.0f;
11 float volume = 1.0f;
12 float r_3 = 0.0f;
//代码效果参考:http://www.zidongmutanji.com/zsjx/193341.html
1314 / 计算半径为10m的球体体积 /
15 r_3 = rrr;
16 volume = SCALE_FACTOR PI r_3;
17
18 / 显示结果 /
19 printf("Result is:%f\n", volume);
20
21 return 0;
22 }
如果把分数4.0f/3.0f编程4/3,则会导致计算结果出现错误,因为4/3的结果是1,而不是1.33333333。C语言中整数相除会舍掉后面的小数。
3.修改上题中的程序,使用户可以自行录入球体的半径。
答:
1 #include
2 / 定义名为PI和SCALE_FACTOR的宏 /
3 #define PI 3.14f
4 #define SCALE_FACTOR 4.0f/3.0f
5
6 int main(void)
7 {
8
9 / 声明变量并对其初始化,r是半径,volume为计算结果,r_3是r的立方结果 /
10 float r = 1.0f;
11 float volume = 1.0f;
12 float r_3 = 0.0f;
13
14 / 输入球体半径,注意变量r前面要有符号 /
15 printf("Enter number:");
16 scanf("%f", r);
17
18 / 计算半径为10m的球体体积 /
19 r_3 = rrr;
20 volume = SCALE_FACTOR PI r_3;
21
22 printf("Result is:%f\n", volume);
23
24 return 0;
25 }
4.编写一个程序,要求用户输入一个美元数量//代码效果参考:http://www.zidongmutanji.com/bxxx/255622.html
,然后显示出增加5%税率后的相应金额。格式如下所示:Enter an amount: 100.00
With tax added: $105.00
答:
1 #include
2
3 int main(void)
4 {
5 / 声明变量money和taxed_money并初始化,前者表示金额,后者表示税后的金额 /
6 float money = 0.0f;
7 float taxed_money = 0.0f;
8
9 / 金额录入 /
10 printf("Enter an amount:");
11 scanf("%f", money);
12
13 /计算税后的金额 /
14 taxed_money = money 1.05;
15
16 /显示结果,使用.2f是因为题目中税后的金额只保留了两位小数 /
17 printf("With tax added: $%.2f\n", taxed_money);
18
19 return 0;
20 }
5.编写要求用户输入x的值,然后显示如下多项式的值:
3x5+2x4-5x3-x2+7x-6
提示:C语言没有指数运算符,所以需要对x进行自乘来计算其幂。(例如,xxx就是x的三次方。)
答:
1 #include
2
3 int main(void)
4 {
5 / 声明并初始化变量x和计算结果result,选择float型是因为题目中没有说用户不能输入小数 /
6 float x = 0.0f;
7 float result = 0.0f;
8
9 / 用户输入x的值,然后将值写入变量x中 /
10 printf("Enter the value of x:");
11 scanf("%f", x);
12
13 / 计算公式的结果 /
14 result = 3 x x x x x + 2 x x x x - 5 x x x -x x + 7 * x - 6;
15
16 printf("The result is: %f", result);
17
18 return 0;
19 }
6.修改上题,用如下公式对多项式求值:
((((3x+2)x-5)x-1)x+7)x-6
注意,修改后的程序所需的乘法次数减少了。这种多项式求值方法即Horner法则(Horner's Rule)。
答:
1 #include
2
3 int main(void)
4 {
5 float x = 0.0f;
6 float result = 0.0f;
<span style="color