C Primer Plus(第6版)中文版 1-3章复习题答案

1.12 复习题

1. 对编程而言,可移植性意味着什么?

1.完美的可移植程序是,其源代码无需修改就能在不同计算机系统中成功编译的程序。

2. 解释源代码文件、目标代码文件和可执行文件有什么区别?

2.源代码文件包含程序员使用的任何编程语言编写的代码。目标代码文 件包含机器语言代码,它不必是完整的程序代码。可执行文件包含组成可执行程序的完整机器语言代码。

3. 编程的 7 个主要步骤是什么?

3.1)定义程序目标;(2)设计程序;(3)编写程序;(4)编译程序;(5)运行程序;(6)测试和调试程序;(7)维护和修改程序。

4. 编译器的任务是什么?

4.编译器把源代码(如,用C语言编写的代码)翻译成等价的机器语言代码(也叫作目标代码)。

5. 链接器的任务是什么?
5. 链接器把编译器翻译好的源代码以及库代码和启动代码组合起来,生成一个可执行程序。

 2.11 复习题

 1.C语言的基本模块是什么?

1.它们都叫作函数。

2. 什么是语法错误?写出一个英语例子和 C 语言例子。

2.语法错误违反了组成语句或程序的规则。这是一个有语法错误的英文

例子:Me

speak

English

good.。这是一个有语法错误的C语言例子:

printf"Where are the parentheses?";

3. 什么是语义错误?写出一个英语例子和 C 语言例子。

3.语义错误是指含义错误。这是一个有语义错误的英文例子:This sentence isexcellent Czech.[1]。这是一个有语义错误的C语言例子: thrice_n = 3 + n;[2]

4.Indiana Sloth 编写了下面的程序,并征求你的意见。请帮助他评定。
include studio.h
int main{void} /* 该程序打印一年有多少周 /*
(
int s
s := 56;
print(There are s weeks in a year.);
return 0;

4.1行:以一个#开始;studio.h应改成stdio.h;然后用一对尖括号把stdio.h括起来。

2行:把{}改成();注释末尾把/*改成*/

3行:把(改成{

4行:int s末尾加上一个分号。

5行没问题。

6行:把:=改成,赋值用=,而不是用:=(这说明Indiana Sloth了解 Pascal)。另外,用于赋值的值56也不对,一年有52周,不是56周。

7行应该是:printf("There are %d weeks in a year.\n", s);

9行:原程序中没有第9行,应该在该行加上一个右花括号}。

修改后的程序如下:

#include <stdio.h>

int main(void) /* this prints the number of weeks in a year */

{

int s;

s = 52;

printf("There are %d weeks in a year.\n", s);

return 0;

}

5. 假设下面的 4 个例子都是完整程序中的一部分,它们都输出什么结果?
a. printf("Baa Baa Black Sheep.");
printf("Have you any wool?\n");
b. printf("Begone!\nO creature of lard!\n");
c.printf("What?\nNo/nfish?\n");
d.int num;
num = 2;
printf("%d + %d = %d", num, num, num + num);

5.a.Baa Baa Black Sheep.Have you any wool?(注意,Sheep.Have之间没有空格)

b.Begone!

O creature of lard!

c.What?

No/nfish?

(注意斜杠/和反斜杠\的效果不同,/只是一个普通的字符,原样打印)

d.2 + 2 = 4

(注意,每个%d与列表中的值相对应。还要注意,+的意思是加法,可以在printf()语句内部计算)

6. main int function char = 中,哪些是 C 语言的关键字?

6.关键字是intcharmain是一个函数名;function是函数的意思;=是一个运算符)。

7. 如何以下面的格式输出变量 words lines 的值(这里, 3020 350 代表两个变量的值)? There were 3020 words and 350 lines.
7.printf("There were %d words and %d lines.\n", words, lines);
8. 考虑下面的程序:
#include <stdio.h>
int main(void)
{
int a, b;
a = 5;
b = 2; /* 7 */
b = a; /* 8 */
a = b; /* 9 */
printf("%d %d\n", b, a);
return 0;
}
请问,在执行完第 7 、第 8 、第 9 行后,程序的状态分别是什么?

8.执行完第7行后,a5b2。执行完第8行后,ab都是5。执行完第9行后,ab仍然是5(注意,a不会是2,因为在执行a = b;时,b的值已经 被改为5)。

9. 考虑下面的程序:
#include <stdio.h>
int main(void)
{
int x, y;
x = 10;
y = 5; /* 7 */
y = x + y; /* 8 */
x = x*y; /* 9 */
printf("%d %d\n", x, y);
return 0;
}
请问,在执行完第 7 、第 8 、第 9 行后,程序的状态分别是什么?

9.执行完第7行后,x10b5。执行完第8行后,x10y15。执行完第9行后,x150y15

3.10 复习题

1. 指出下面各种数据使用的合适数据类型(有些可使用多种数据类型):
a.East Simpleton 的人口
b.DVD 影碟的价格
c. 本章出现次数最多的字母
d. 本章出现次数最多的字母次数

1.a.int类型,也可以是short类型或unsigned short类型。人口数是一个整数。

b.float类型,价格通常不是一个整数(也可以使用double类型,但实际上不需要那么高的精度)。

c.char类型。

d.int类型,也可以是unsigned类型。

2. 在什么情况下要用 long 类型的变量代替 int 类型的变量?

2.原因之一:在系统中要表示的数超过了int可表示的范围,这时要使用long类型。

原因之二:如果要处理更大的值,那么使用一种在所有系统上都保证至少是 32 位的类型,可提高程序的可移植性。

3. 使用哪些可移植的数据类型可以获得 32 位有符号整数?选择的理由是什么?

3.如果要正好获得32位的整数,可以使用int32_t类型。要获得可储存至少32位整数的最小类型,可以使用int_least32_t类型。如果要为32位整数提供最快的计算速度,可以选择int_fast32_t类型(假设你的系统已定义了上述类型)。

4. 指出下列常量的类型和含义(如果有的话):
a.'\b'
b.1066
c.99.44
d.0XAA
e.2.0e30

4.a.char类型常量(但是储存为int类型)

b.int类型常量

c.double类型常量

d.unsigned int类型常量,十六进制格式

e.double类型常量

5.Dottie Cawm 编写了一个程序,请找出程序中的错误。
include <stdio.h>
main
(
float g; h;
float tax, rate;
g = e21;
tax = rate*g;
)

5.1行:应该是#include <stdio.h>

2行:应该是int main(void)

3行:把(改为{

4行:gh之间的;改成,

5行:没问题

6行:没问题

7行:虽然这数字比较大,但在e前面应至少有一个数字,如1e21

1.0e21都可以。

8行:没问题,至少没有语法问题。

9行:把)改成}

除此之外,还缺少一些内容。首先,没有给rate变量赋值;其次未使用h变量;而且程序不会报告计算结果。虽然这些错误不会影响程序的运行(编译器可能给出变量未被使用的警告),但是它们确实与程序设计的初衷不符合。另外,在该程序的末尾应该有一个return语句。

下面是一个正确的版本,仅供参考:

#include <stdio.h>

int main(void)

{

float g, h;

float tax, rate;

rate = 0.08;

g = 1.0e5;

tax = rate*g;

h = g + tax;

printf("You owe $%f plus $%f in taxes for a total of $%f.\n", g, tax, h);

return 0;

}

6.写出下列常量在声明中使用的数据类型和在printf()中对应的转换说明:

7.写出下列常量在声明中使用的数据类型和在printf()中对应的转换说明(假设int16位):

8. 假设程序的开头有下列声明:
int imate = 2;
long shot = 53456;
char grade = 'A';
float log = 2.71828;
把下面 printf() 语句中的转换字符补充完整:
printf("The odds against the %__ were %__ to 1.\n",
imate, shot);
printf("A score of %__ is not an %__ grade.\n", log,
grade);

8.printf("The odds against the %d were %ld to 1.\n", imate, shot);printf("A score of %f is not an %c grade.\n", log, grade);

9. 假设 ch char 类型的变量。分别使用转义序列、十进制值、八进制字
符常量和十六进制字符常量把回车字符赋给 ch (假设使用 ASCII 编码值)。

9.ch = '\r';

ch = 13;

ch = '\015'

ch = '\xd'

10. 修正下面的程序(在 C 中, / 表示除以)。
void main(int) / this program is perfect /
{
cows, legs integer;
printf("How many cow legs did you count?\n);
scanf("%c", legs);
cows = legs / 4;
printf("That implies there are %f cows.\n", cows)
}

10.最前面缺少一行(第0行):#include <stdio.h>

1行:使用/**/把注释括起来,或者在注释前面使用//

3行:int cows, legs;

4行:country\n");

5行:把%c改为%d,把legs改为&legs

7行:把%f改为%d

另外,在程序末尾还要加上return语句。

下面是修改后的版本:

#include <stdio.h>

int main(void) /* this program is perfect */

{

int cows, legs;

printf("How many cow legs did you count?\n");

scanf("%d", &legs);

cows = legs / 4;

printf("That implies there are %d cows.\n", cows);

return 0;

}

11. 指出下列转义序列的含义:
a.\n
b.\\
c.\"
d.\t

11.a.换行字符

b.反斜杠字符

c.双引号字符

d.制表字符

  • 41
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值