C primer plus 复习题答案
复习题答案目录
第一章 初识C语言
- 对编程而言,可移植性意味着什么
可移植性并不是指所写的程序不作修改就可以在任何计算机上运行,而是指当条件有变化时,程序无需作很多修改就可运行。
在软件工程中,可移植性,又译为移植性、可携性,是指使用高阶语言写成的软件,在不同环境下,是否具备可以被重复使用的性质。一般来说,软件是否具备可移植性的衡量标准,在于进行软件移植时,需要付出多少工时为代价。具备高可移植性的软件,在移植到不同系统平台时,并不需要做太多事情,因此能够减少软件开发及布署时的成本。为了使软件具备高度可移植性,程序员需要使应用程序界面抽象化以及模组化。
以低阶语言,例如汇编语言,写成的软件,一般来说,其可移植性都较低。
- 解释源代码文件,目标代码文件和可执行文件有什么区别?
源代码文件:程序语言编写的代码
目标代码:机器语言的代码组成
可执行代码:在计算机科学中指的是一种内容可以被电脑解释为程序的电脑文件
3.编程的7个主要的步骤是什么?
预编译又称为预处理, 是做些代码文本的替换工作。
- 编译器的任务是什么?
编译器将汇编或者高级计算机语言源程序作为输入,翻译为目标语言机器代码的等价程序
源代碼→預處理器 → 編譯器 → 目標代碼
- 连接器的任务是什么?
把目标文件和库文件链接成可执行文件
第二章 C语言概述
-
C语言的基本模块是什么? 函数
-
什么是语法错误?
写出一个英语例子和C语言例子 语法错误违反了组成语句或程序的规则 略 -
什么是语义错误?
一个英语例子和C语言例子 语义错误是指含义错误 -
Indiana Sloth编写了下面的程序,并征求你的意见。请帮助他评定。
#include stdio.h
int main{
void} /* 该程序打印一年有多少个周 */
(
int s
s := 56;
printf(There ars s weeks in a year.);
return 0;
//下面修改
#include<stdio.h>
int main(void)
{
int s;
s = 56;
printf("There are %d weeks in a year.",s);
return 0;
}
5. 假设下面的4个例子都是完整程序中的一部分,它们都输出什么结果?
a. printf("Baa Baa Black Shep.");
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);
Baa Baa Black Shep.Have you any wool?
Begone
O creature of lard!
What
No/nfish?
2 + 2 = 4
- 在main、int、function、char、= 中,哪些是C语言关键字?
int、char
main 是函数名,function是函数的意思 , = 是运算符
- 如何以下面的格式输出变量words和lines的值?
There were 3020 words and 350 lines.
int words = 3020;
int lines = 350;
printf(“There were %d words and %d lines”, words, lines);
- 考虑下面的程序:
#include <stdio.h>
int main(void)
{
int a, b;
a = 5;
b = 2; /* 第7行 */
b = a; /* 第8行 */
a = b; /* 第9行 */
printf("%d %d\n", a, b);
return 0;
}
代码分析:
第4行处声明了两个变量a和b
第6行,将值5赋给变量a,此时 a = 5,b由于未赋初值,暂不确定
第7行,将值2赋给变量b,此时a = 5, b = 2
第8行,将变量a的值赋给变量b,即将值5赋给变量b,此时 a = 5, b = 5
第9行,将变量b的值赋给变量a,即将值5赋给变量a,此时a = 5, b = 5
因此最终printf()函数输出 5 5。
VS运行结果如下:
- 考虑下面的程序:
#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行后,程序的状态分别是什么?
代码分析:
第4行处声明了两个变量x和y
第6行,将值10赋给变量x,此时 x = 10,y由于未赋初值,暂不确定
第7行,将值5赋给变量y,此时x = 10, y = 5
第8行,先计算表达式x + y的值,即 10 + 5 = 15,将值15赋值给y,此时x = 10, y = 15
第9行,先计算表达式x * y的值,即 15 * 10 = 150,将值150赋值给x,此时x = 150, y = 15
因此最终printf()函数输出 150 15。
第三章 数据和C
- 指出下面各种数据使用的合适的数据类型(有些可使用多种数据类型)
a. East Simpleton的人口 int
b.DVD影碟的价格 float
c.本章出现次数最多的字母 char
d.本次张出现次数自多的字母次数 short
-
在什么情况下要用long类型的变量代替int类型的变量
在数据足够大超过了int类型的时候 -
使用那些可移植的数据类型可以获得32位有符号整数?选择的理由是什么?
int32_t,可移植数据类型定义在inttypes.h头文件中,之所以有一个这样的头文件是,各个平台操作系统,对于基本类型关键字的存储范围不一,而有时候我们需要一种在各种平台下都要满足我们的需要固定范围的数据类型来存储,因此大家就定义了一个这样的头文件,这个头文件保证,它定义的数据类型别名,在各个系统下的存储范围(大小)一直,(ps:这里忽略此头文件中的最小长度类型,和最大长度类型) -
指出下列常量的类型和含义(如果有的话):
a. '\b' char类型常量(但是存储为int类型) b. 1066 int类型常量 c. 99.44 double类型常量 d. 0XAA unsigned int 类型常量,十六进制格式 e. 2.0e30 double类型常量
5.请找出程序中的错误。
include <stdio.h> main ( float g; h; //float g,h; float tax, rate; g = e21; //e21定义不明 tax = rate*g; //rate未定义,且可能会出现溢出的问题 )
-
填写下表:
常量 类型 转换说明(%转换字符) 12 int %d 0X3 unsigned %#X ’C’ char %c 2.34E+07 double %e ’\ 040’ char %c 7.0 double %f 6L long %ld 6.0f float %f 0x5.b6p12 double %a -
写出下列常量在声明中使用的数据类型和在printf()中对应的转换说明(假设int为16位):
常量 类型 转换说明(%转换字符) 12 unsigned int %#o 2.9e05L long double %Le ’s’ char %c 100000 int %d ’\ n’ char %c 20.0f float %f 0x44 unsigned int %x -40 int %d -
假设程序的开头有下列说明:
int imate = 2; long shot = 53456; char grade = ‘A’; float log = 2.71828; //把下面的printf()语句中的转换字符补充完整: 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);
-
假设ch是char类型的变量。分别使用转义序列、十进制值、八进制字符常量和十六进制字符常量把回车字符赋给ch(假设使用ASCII编码值)。
ch = '\r'; ch = 13; ch = '\015'; ch = '\xd';
-
修改下面的程序:
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)
}
答:
#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 制表字符
第四章 字符串和格式化输入/输出
- 再次运行程序清单 4.1,但是在要求输入名时,请输入名和姓(根据英文书写习惯,名和姓中间有一个空格),看看会发生什么情况?为什么?
程序运行不正常,输入时输入姓名,如果有空格则后一个输入仍然会在缓存区只会输出缓冲区空格之前的内容
- 假设下列示例都是完整程序中的一部分,它们打印的结果分别是什么?
a. He sold the painting for $234.50.
b. Hi!
c.His Hamlet was funny without being vulgar.
has 42 characters.
d . Is 1.20e+003 the same as 1201.00?
- 在第2题的c中,要输出包含双引号的字符串Q,应如何修改?
printf("\"%s\"\nhas %d characters.\n", Q, strlen(Q));
- 找出下面程序中的错误
define B booboo
define X 10
main(int)
{
int age;
char name;
printf("Please enter your first name.");
scanf("%s", name);
printf("All right, %c, what's your age?\n", name);
scanf("%f", age);
xp = age + X;
printf("That's a %s! You must be at least %d.\n", B, xp);
rerun 0;
}
#define B "booboo"
#define X 10
#include<string.h>
#include<stdio.h>
int main(void)
{
int age;
char name[15];
printf("Please enter your first name.");
scanf("%s",name);
printf("All right, %c, what's your age?\n",name);
scanf("%d",&age);
int xp = age + X;
printf("That's a %s!You must be at least %d.\n",B,xp);
return 0;
}
- 假设一个程序的开头是这样:
请构造一个使用BOOK,cost和percent的printf()语句,打印以下内容:
#define BOOK "War and Peace"
#include<stdio.h>
int main(void)
{
float cost = 12.99;
float percent = 80.0;
printf("This copy of \"%s\" sell for $%2.2f.",BOOK,cost);
printf("That is %2.0f%% of list .\n",percent);
return 0;
}
- 打印下列各项内容要分别使用什么转换说明?
a.%d
b.%4x
c.%10.3f
d.%12.2e
e.%-30s
- 打印下面各项内容要分别使用什么转换说明?
a.%15lu
b.%4x
c.%-12.2e
d.%+10.3f
e.%8.8s
- 打印下面各项内容要分别使用什么转换说明?
a.%6.4d
b.%*o
c.%2c
d.%+.2f
e.%-7.5s
- 分别写出读取下列各输入行的scanf()语句,并声明语句中用到变量和数组
a.
int a;
scanf("%d", &a);
b.
float b1, b2;
scanf("%f %f", &b1, &b2);
c.
char c[30];
scanf("%s", c);
d.
char d1[15];
int d2;
scanf("%s %d");
e.
int e;
scanf("%*s %d", &e);
- 什么是空白?
在C 中,这主要是指空格、制表符和(有时)换行符。 C++ 编译器通常会忽略空格,但有一些小例外。
- 下面的语句有什么问题?如何修正?
printf("The double type is %zd bytes..\n", sizeof(double));
z为修饰符,不是转换符
- 假设要在程序中用圆括号代替花括号,以下方法是否可行?
可以,但编译器无法识别哪些该换哪些不该换,所有的()都会被替换为{
}
第五章 运算符、表达式和语句
- 假设所有变量的类型都是int,下列各项变量的值是多少:
a.x = (2 + 3) * 6;
b.x = (12 + 6)/23;
c.y = x = (2 + 3)/4;
d.y = 3 + 2(x = 7/2);
a.x = 30
b.x = 27
c.y = 1, x = 1
d.y = 9, x = 3
- 假设所有变量的类型都是int,下列各项变量的值是多少:
a.x = (int)3.8 + 3.3;
b.x = (2 + 3) * 10.5;
c.x = 3 / 5 * 22.0;
d.x = 22.0 * 3 / 5;
a.x = 6
b.x = 52
c.x = 0
d.x = 13
- 对下列各表达式求值:
a.30.0 / 4.0 * 5.0;
b.30.0 / (4.0 * 5.0);
c.30 / 4 * 5;
d.30 * 5 / 4;
e.30 / 4.0 * 5;
f.30 / 4 * 5.0;
a.37.5
b.1.5
c.35
d.37
e.37.5
f.35.0
- 请找出下面的程序中的错误
int main(void)
{
int i = 1,
float n;
printf("Watch out! Here come a bunch of fractions!\n");
while (i < 30)
n = 1/i;
printf(" %f", n);
printf("That's all, folks!\n");
return;
}
#include <stdio.h>
int main(void)
{
int i = 1;
float n;
printf("Watch out! Here come a bunch of fractions!\n");
while (i < 30)
{
n = 1/i;
printf(" %f", n);
i++;
}
printf("That's all, folks!\n");
return 0;
}
- 这是程序清单 5.9 的另一个版本。从表面上看,该程序只使用了一条 scanf()语句,比程序清单5.9简单。请找出不如原版之处
#include <stdio.h>
#define S_TO_M 60
int main(void)
{
int sec, min, left;
printf("This program converts seconds to minutes and ");
printf("seconds.\n");
printf("Just enter the number of seconds.\n");
printf("Enter 0 to end the program.\n");
while (sec > 0)
{
scanf("%d", &sec);
min = sec/S_TO_M;
left = sec % S_TO_M;
printf("%d sec is %d min, %d sec. \n", sec, min, left);
printf("Next input?\n");
}
printf("Bye!\n");
return 0;
}