《C Primer Plus》第 3 章复习题和编程练习

目录

一、复习题

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

答:
a. int 类型最大存储 21 亿,可以存储世界上任何一个国家的人口。人口不为负数,也可以使用 unsigned int 类型。

b. 价格可能需要小数,所以使用 double 类型(或者 float 类型)。

c. 存储字母等字符,使用 char 类型

d. 使用 int 类型足够

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

答:在两者存储位数有差异的系统上,需要存储较大数值的时候,使用 long 类型。因为 C 语言规定,long 的类型至少和 int 一样大。

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

答:C 语言在可移植的 stdint.h 和 inttypes.h 中规定了精确宽度整数类型,如:int32_t 作为标准的 32 为整型数据。

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

答:
a. char 类型,转义字符表示退格
b. int 类型,整数 1066
c. double 类型,浮点数 99.44
d. unsigned int 类型,十六进制整数 AA
e. double 类型,浮点数 2.0e30

5. Dottie Cawm 编写了一个程序,请找出程序中的错误。

答:错误程序就不写了,大家自己看。程序的主要错误有:

1)包含头文件漏了 # 号

2)main 后面紧跟小括号,然后函数体放在花括号里

3)没有正确书写指数计数法

4)使用了未初始化的变量 rate

5)没有 return 0;语句

c 复制代码
#include <stdio.h>

int main()
{
	float g = 0, h = 0;  // 创建变量的同时初始化,是一个好习惯
	float tax = 0, rate = 0;
	g = 1.0e21;
	tax = rate * g;

	return 0;
}

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

答:如下代码所示:

c 复制代码
int                                %d
unsigned int                       %#X
char                               %c
double                             %E
char                               %c
double                             %f
long                               %ld
float                              %f
float                              %a

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

答:如下代码所示:

c 复制代码
unsigned int                       %#o
long double                        %Le
char                               %c
long                               %ld
char                               %c
float                              %f
unsigned int                       %#x
int                                %d

8. 假设程序的开头有如下声明:
int imate = 2;
long shot = 53456;
char grade = 'A';
float log = 2.71828;
把下面 printf()语句中的转换字符补充完整:

答:一行一句:

d 和 ld

f 和 c

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

答:如下代码:

c 复制代码
char ch = 0;

ch = '\r';  // 转义字符
ch = 13;  // 十进制
ch = '\015';  // 八进制
ch = '\x0D';  // 十六进制

10. 修正下面的程序(在 C 中,/ 表示除以)。

答:这里就不给出错误的程序了。该代码的具体错误如下:

1)没有包含头文件 stdio.h

2)没有正确声明变量的类型,也没有使用正确使用注释

3)没有使用正确的输入格式和输出格式

4)没有 return 0; 语句

正确代码如下:

c 复制代码
#include <stdio.h>

int main()
{
	int cows, legs;
	printf("How many cow legs did you count?\n");
	scanf("%d", &legs);
	cows = legs / 4;
	printf("That implies there are %f=d cows.\n", cows);
	
	return 0;
}

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

答:
a. 换行符
b. 反斜杠
c. 双引号
d. 水平制表符

二、编程练习

1. 通过试验(即编写带有此类问题的程序)观察系统如何处理整数上溢、浮点数上溢和浮点数下溢的情况。

答:
程序设计分析: 让存储的值超过该类型的最大值或者低于该类型的最小值即可。

代码如下:

c 复制代码
#include <stdio.h>
#include <limits.h>

int main()
{
	// 观察整数上溢、浮点数上溢和浮点数下溢的情况
	int i = INT_MAX;
	printf("%d\n", i);
	i = i + 1;
	printf("%d\n", i);

	float f = 100.0f;
	printf("%f\n", f);
	f *= 10e100;
	printf("%f\n", f);
	
	f /= 10e200;
	printf("%f\n", f);

	return 0;
}

2. 编写一个程序,要求提示输入一个 ASCII 值(如,66),然后打印输入的字符。

答:
程序设计分析: 使用整型变量进行输入,然后使用字符输出格式进行输出。

代码如下:

c 复制代码
#include <stdio.h>

int main()
{
	// 输入一个 ASCII 码值并打印
	printf("Please enter an ASCII code value : ");

	int ch = 0;
	scanf("%d", &ch);

	printf("%c", ch);
}

3. 编写一个程序,发出一声警报,然后打印下面的文本。

答:
程序设计分析: 发出警报的转义字符为 \a

代码如下:

c 复制代码
#include <stdio.h>

int main()
{
	printf("\a Startled by the sudden sound, Sally shouted,\n");
	printf("\"By the Gewat Pumpkin, what was that!\"\n");

	return 0;
}

4. 编写一个程序,读取一个浮点数,先打印成小数格式,再打印成指数形式。然后,如果系统支持,在打印成 p 计数法(即十六进制计数法)。按以下格式输出(实际显示的指数位数因系统而异)。

答:
程序设计分析: 小数格式------%f,指数形式------%e或者%E,p 计数法------%a

代码如下:

c 复制代码
#include <stdio.h>

int main()
{
	printf("Enter a floating-point values : ");
	float f = 0.0;
	scanf("%f", &f);

	printf("fixed-point notation: %f\n", f);
	printf("exponential notation: %e\n", f);
	printf("p natation: %a\n", f);
}

5. 一年大约有 3.156 * 10^7 次方秒。编写一个程序,提示用户输入年龄,然后显示年龄对应的秒数。

答:
程序设计分析: 使用一个 double 变量记录秒数,然后使用 int 变量输入年龄。

代码如下:

c 复制代码
#include <stdio.h>

int main()
{
	printf("Enter your age: ");
	int year = 0;
	scanf("%d", &year);
	long long seconds = year * 3.156e7;
	printf("Your age is %lld seconds.\n", seconds);

	return 0;
}

6. 1 个水分子的质量约为 3.0 * 10 ^ -23 克。1 夸脱水大约是 950 克。编写一个程序,提示用户输入水的夸脱数,并显示水分子的数量。

答:
程序设计分析: 使用合适的变量存储转换单位,或者定义符号常量。或者直接使用。

代码如下:

c 复制代码
#include <stdio.h>

int main()
{
	int num = 0;
	printf("Please enter the quantity : ");
	scanf("%d", &num);
	
	double quality = num * 950 / 3.0 * 10e23;
	printf("Its quality is %lf", quality);

	return 0;
}

7. 1 英寸相当于 2.54 厘米。编写一个程序,提示用户输入身高(/英寸),然后以厘米为单位显示身高。

答:
程序设计分析 使用 #define 定义符号常量进行换算,或者直接使用。

代码如下:

c 复制代码
#include <stdio.h>

int main()
{
	printf("Please enter your height (inch) : ");
	double height = 0.0;
	scanf("%lf", &height);
	printf("Your height in cm is %lf", height * 2.54);

	return 0;
}

8. 在美国的体积测量系统中,1 品脱等于 2 杯,1 杯等于 8 盎司,1 盎司等于 2 大汤勺,1 大汤勺等于 3 茶勺。编写一个程序,提示用户输入杯数,兵役品脱、盎司、汤勺、茶勺为单位显示等价容量。思考对于该程序,为何使用浮点类型比整形数据更合适。

答:
程序设计分析: 使用符号常量来记录转换单位,或者直接使用。使用整型在换算中涉及除法时,会进行整数除法,这样会损失精度。

代码如下:

c 复制代码
#include <stdio.h>
int main()
{
	printf("请输入杯数:");
	int cup = 0;
	scanf("%d", &cup);

	printf("%f 脱品\n", cup / 2.0f);
	printf("%f 盎司\n", cup * 8.0f);
	printf("%f 汤勺\n", cup * 16.0f);
	printf("%f 茶勺\n", cup * 48.0f);
	return 0;
}
相关推荐
小牛itbull5 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i13 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落16 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
GIS瞧葩菜25 分钟前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming198730 分钟前
STL关联式容器之set
开发语言·c++
带多刺的玫瑰34 分钟前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
yigan_Eins1 小时前
【数论】莫比乌斯函数及其反演
c++·经验分享·算法
GIS 数据栈1 小时前
每日一书 《基于ArcGIS的Python编程秘笈》
开发语言·python·arcgis
Mr.131 小时前
什么是 C++ 中的初始化列表?它的作用是什么?初始化列表和在构造函数体内赋值有什么区别?
开发语言·c++