C Primer Plus 第五章 复习题&编程练习 答案

第五章 复习题&编程练习

  • 复习题
        • 1. 假设所有变量的类型都是int,下列各项变量的值是多少:
        • 2. 假设所有变量的类型都是int,下列各项变量的值是多少:
        • 3. 对下列各表达式求值:
        • 4. 请找出下面的程序中的错误。
        • 5. 这是程序清单 5.9 的另一个版本。从表面上看,该程序只使用了一条scanf()语句,比程序清单5.9简单。请找出不如原版之处。
        • 6. 下面的程序将打印出什么内容?
        • 7. 下面的程序将打印出什么内容?
        • 8. 下面的程序将打印出什么内容?
        • 9. 修改上一个程序,使其可以打印字母a~g。
        • 10. 假设下面是完整程序中的一部分,它们分别打印什么?
        • 11. 下面的程序会打印出什么?
        • 12. 分别编写一条语句,完成下列各任务(或者说,使其具有以下副作用):
        • 13. 分别编写一条语句,完成下列各任务:
  • 编程练习
        • 1. 编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时间。使用#define或const创建一个表示60的符号常量或const变量。通过while循环让用户重复输入值,直到用户输入小于或等于0的值才停止循环。
        • 2. 编写一个程序,提示用户输入一个整数,然后打印从该数到比该数大10的所有整数(例如,用户输入5,则打印5~15的所有整数,包括5和15)。要求打印的各值之间用一个空格、制表符或换行符分开。
        • 3. 编写一个程序,提示用户输入天数,然后将其转换成周数和天数。例如,用户输入18,则转换成2周4天。以18 days are 2 weeks, 4 days.的格式显示结果。通过while循环让用户重复输入天数,当用户输入一个非正值时(如0或-20),循环结束。
        • 4. 编写一个程序,提示用户输入一个身高(单位:厘米),并分别以厘米和英寸为单位显示该值,允许有小数部分。程序应该能让用户重复输入身高,直到用户输入一个非正值。其输出示例如下:
        • 5. 修改程序addemup.c(程序清单5.13),你可以认为addemup.c是计算20天里赚多少钱的程序(假设第1天赚$1、第2天赚$2、第3天赚$3,以此类推)。修改程序,使其可以与用户交互,根据用户输入的数进行计算(即,用读入的一个变量来代替20)。
        • 6. 修改编程练习5的程序,使其能计算整数的平方和(可以认为第1天赚$1、第2天赚$4、第3天赚$9,以此类推,这看起来很不错)。C没有平方函数,但是可以用n * n来表示n的平方。
        • 7. 编写一个程序,提示用户输入一个double类型的数,并打印该数的立方值。自己设计一个函数计算并打印立方值。main()函数要把用户输入的值传递给该函数。
        • 8. 编写一个程序,显示求模运算的结果。把用户输入的第1个整数作为求模运算符的第2个运算对象,该数在运算过程中保持不变。用户后面输入的数是第1个运算对象。当用户输入一个非正值时,程序结束。其输出示例如下:
        • 9. 编写一个程序,要求用户输入一个华氏温度。程序应读取double类型的值作为温度值,并把该值作为参数传递给一个用户自定义的函数Temperatures()。该函数计算摄氏温度和开氏温度,并以小数点后面两位数字的精度显示3种温度。要使用不同的温标来表示这3个温度值。华氏温度转摄氏温度的公式:摄氏温度 = 5.0 / 9.0 * (华氏温度 - 32.0) 开氏温标常用于科学研究,0表示绝对零,代表最低的温度。摄氏温度转开氏温度的公式:开氏温度 = 摄氏温度 + 273.16。 Temperatures()函数中用const创建温度转换中使用的变量。在main()函数中使用一个循环让用户重复输入温度,当用户输入 q 或其他非数字时,循环结束。scanf()函数返回读取数据的数量,所以如果读取数字则返回1,如果读取q则不返回1。可以使用==运算符将scanf()的返回值和1作比较,测试两值是否相等。

复习题

1. 假设所有变量的类型都是int,下列各项变量的值是多少:

a. x = (2 + 3) * 6;
b. x = (12 + 6) / 2 * 3;
c. y = x = (2 + 3) / 4;
d. y = 3 + 2 * (x = 7 / 2);

a. 30
b. 27
c. x = y = 1
d. x=3 , y=9

2. 假设所有变量的类型都是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. 6(由3 + 3.3截断而来)
b. 52
c. 0(0 * 22.0)
d. 13(66.0 / 5或13.2,然后把结果赋给int类型变量)

3. 对下列各表达式求值:

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(7.5 *5.0)
b. 1.5 (30.0 / 20.0)
c. 35 (7*5)
d. 37 (150 / 4)
e. 37.5(7.5*5)
f. 35.0 (7*5.0)

4. 请找出下面的程序中的错误。

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 
int main(void)
{
	int i = 1;			//第3行:末尾用分号,而不是逗号
	float n;
	printf("Watch out! Here come a bunch of fractions!\n");
	while (i++ < 30)      //第6行:while语句创建了一个无限循环。因为i的值始终为1,所以它总是小于30。推测一下,应该是想写while(i++ < 30)。
	{						//这样的缩进布局不能使第7行和第8行组成一个代码块。由于没有用花括号括起来, while循环只包括第7行,所以要添加花括号。
		n = 1.0/i;		//第7行:因为1和i都是整数,所以当i为1时,除法的结果是1;当i为更大的数时,除法结果为0。用n = 1.0/i,i在除法运算之前会被转换为浮点数,这样就能得到非零值。
		printf(" %f\n", n);	//第8行:在格式化字符串中没有换行符(\n),这导致数字被打印成一行。
	}
	printf("That's all, folks!\n");
	return 0;				//第10行:应该是return 0;
}

5. 这是程序清单 5.9 的另一个版本。从表面上看,该程序只使用了一条scanf()语句,比程序清单5.9简单。请找出不如原版之处。

程序清单 5.9

// min_sec.c -- 把秒数转换成分和秒
#include 
#define SEC_PER_MIN 60		//1分钟 60秒
int main(void)
{
	int sec, min, left;
	
	printf("Convert seconds to minutes and seconds!\n");
	printf("Enter the number of seconds (<=0 to quit):\n");
    scanf("%d", &sec);     // 读取秒数
	while(sec > 0)
	{
		min = sec / SEC_PER_MIN;
		left = sec % SEC_PER_MIN;
		printf("%d seconds is %d minutes, %d seconds.\n", sec, min, left);
		printf("Enter the number of seconds (<=0 to quit):\n");
		scanf("%d", &sec);
	}
	printf("Done!\n");
	
    return 0;
}

另一个版本

#include 
#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;
}

答:这个版本最大的问题是测试条件(sec是否大于0?)和scanf()语句获取sec变量的值之间的关系。具体地说,第一次测试时,程序尚未获得sec的值,用来与0作比较的是正好在sec变量内存位置上的一个垃圾值。一个比较笨拙的方法是初始化 sec(如,初始化为 1)。这样就可通过第一次测试。不过,还有另一个问题。当最后输入0结束程序时,在循环结束之前不会检查sec,所以0也被打印了出来。因此,更好的方法是在while测试之前使用scanf()语句。可以这样修改:

scanf("%d", &sec);
while ( sec > 0 ) {
  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”);
  scanf("%d", &sec);
}

while循环第一轮迭代使用的是scanf()在循环外面获取的值。因此,在while循环的末尾还要使用一次scanf()语句。这是处理类似问题的常用方法。

6. 下面的程序将打印出什么内容?

#include 
#define FORMAT "%s! C is cool!\n"
int main(void)
{
	int num = 10;
	
	printf(FORMAT,FORMAT);
	printf("%d\n", ++num);
	printf("%d\n", num++);
	printf("%d\n", num--);
	printf("%d\n", num);
	return 0;
}

答:
C Primer Plus 第五章 复习题&编程练习 答案_第1张图片
解释一下。第1个printf()语句与右面的语句相同:printf("%s! C is cool!\n","%s! C is cool!\n");
第2个printf()语句首先把num递增为11,然后打印该值。第3个printf()语句打印num的值(值为11)。第 4个printf()语句打印n当前的值(仍为12),然后将其递减为11。最后一个printf()语句打印num的当前值(值为11)。

7. 下面的程序将打印出什么内容?

#include 
int main(void)
{
	char c1, c2;
	int diff;
	float num;
	
	c1 = 'S';
	c2 = 'O';
	diff = c1 - c2;
	num = diff;
	printf("%c%c%c:%d %3.2f\n", c1, c2, c1, diff, num);
	return 0;
}

答:

C Primer Plus 第五章 复习题&编程练习 答案_第2张图片

表达式c1 -c2的值和’S’ - '0’的值相同(其对应的ASCII值是83 - 79)。

8. 下面的程序将打印出什么内容?

#include 
#define TEN 10
int main(void)
{
	int n = 0;
	
	while (n++ < TEN)
		printf("%5d", n);
	printf("\n");
	return 0;
}

答:
把1~10打印在一行,每个数字占5列宽度,然后开始新的一行:

C Primer Plus 第五章 复习题&编程练习 答案_第3张图片

9. 修改上一个程序,使其可以打印字母a~g。

#include 
int main(void)
{
	char ch = 'a';
	while (ch <= 'g')
		printf("%5c", ch++);
	printf("\n");
	return 0;
}

运行结果:
C Primer Plus 第五章 复习题&编程练习 答案_第4张图片

10. 假设下面是完整程序中的一部分,它们分别打印什么?

a.
  int x = 0;
  while (++x < 3)
    printf("%4d", x);

a. 1 2
注意,先递增x的值再比较。光标仍留在同一行。

b.
  int x = 100;
  while (x++ < 103)
    printf("%4d\n",x);
    printf("%4d\n",x);

b. 101
 102
 103
 104
注意,这次x先比较后递增。在示例a和b中,x都是在先递增后打印。另外还要注意,虽然第2个printf()语句缩进了,但是这并不意味着它是while循环的一部分。因此,在while循环结束后,才会调用一次该printf()语句。

c.
  char ch = ‘s’;
  while (ch < ‘w’)
  {
    printf("%c", ch);
    ch++;
  }
  printf("%c", ch);

c.stuvw
该例中,在第1次调用printf()语句后才会递增ch。

11. 下面的程序会打印出什么?

#define MESG "COMPUTER BYTES DOG"
#include 
int main(void)
{
	int n = 0;
	while ( n < 5 )
		printf("%s\n", MESG);
		n++;
	printf("That's all.\n");
	return 0;
}

答:这个程序有点问题。while循环没有用花括号把两个缩进的语句括起来,只有printf()是循环的一部分,所以该程序一直重复打印消息COMPUTER BYTES DOG,直到强行关闭程序为止。

12. 分别编写一条语句,完成下列各任务(或者说,使其具有以下副作用):

a. 将变量 x 的值增加10
b. 将变量 x 的值增加1
c. 将 a 与 b 之和的两倍赋给 c
d. 将 a 与 b 的两倍之和赋给 c

a. x = x + 10;
b. x++; or ++x; or x = x + 1;
c. c = 2 * (a + b);
d. c = a + 2 * b;

13. 分别编写一条语句,完成下列各任务:

a. 将变量 x 的值减少1
b. 将 n 除以 k 的余数赋给 m
c. q 除以 b 减去 a,并将结果赋给 p
d. a 与 b 之和除以 c 与 d 的乘积,并将结果赋给 x

a. x–; or --x; or x = x - 1;
b. m = n % k;
c. p = q / (b - a);
d. x = (a + b) / (c * d);

编程练习

1. 编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时间。使用#define或const创建一个表示60的符号常量或const变量。通过while循环让用户重复输入值,直到用户输入小于或等于0的值才停止循环。

#include 
#define Min_Per_Hour 60
int main(void)
{
	int time, hour, min; 
	
	printf("请输入您想表示的时间的分钟数:");
	scanf("%d",&time); 
	while(time >0)
	{
		min = time % Min_Per_Hour;
		hour = time / Min_Per_Hour;
		printf("%d分钟是 %d小时 %d分钟\n", time, hour, min);
		printf("请输入下一个您想表示的时间的分钟数(0退出):");
		scanf("%d",&time); 
	}
	printf("End\n");
	
	return 0;
 }

运行结果:
C Primer Plus 第五章 复习题&编程练习 答案_第5张图片

2. 编写一个程序,提示用户输入一个整数,然后打印从该数到比该数大10的所有整数(例如,用户输入5,则打印5~15的所有整数,包括5和15)。要求打印的各值之间用一个空格、制表符或换行符分开。

#include 
int main(void)
{
	int num,  upper_limit;
	printf("输入一个整数:");
	scanf("%d",&num);
	upper_limit = num+10;
	
	while(num <= upper_limit)
	{
		printf("%d ",num);
		num++;
    } 
    printf("\n");
    
    return 0;
}

运行结果:
C Primer Plus 第五章 复习题&编程练习 答案_第6张图片

3. 编写一个程序,提示用户输入天数,然后将其转换成周数和天数。例如,用户输入18,则转换成2周4天。以18 days are 2 weeks, 4 days.的格式显示结果。通过while循环让用户重复输入天数,当用户输入一个非正值时(如0或-20),循环结束。

#include 
#define Days_Per_Week 7
int main(void)
{
	int days, Day, Week;
	
	printf("输入天数:");
	scanf("%d", &days); 
	while(days > 0)
	{
		Week = days / Days_Per_Week;
		Day = days % Days_Per_Week;
		printf("%d days are %d weeks, %d days.\n", days, Week, Day);
		printf("输入天数(非正值退出程序):");
		scanf("%d", &days); 
	}
	printf("End\n");
	
	return 0; 
}

运行结果:
C Primer Plus 第五章 复习题&编程练习 答案_第7张图片

4. 编写一个程序,提示用户输入一个身高(单位:厘米),并分别以厘米和英寸为单位显示该值,允许有小数部分。程序应该能让用户重复输入身高,直到用户输入一个非正值。其输出示例如下:

Enter a height in centimeters: 182
182.0 cm = 5 feet, 11.7 inches
Enter a height in centimeters (<=0 to quit): 168.7
168.0 cm = 5 feet, 6.4 inches
Enter a height in centimeters (<=0 to quit): 0
bye

#include 
#define CONVERT 0.3937 
int main(void)
{
	float height, inch;
	int feet;
	
	printf("Enter a height in centimeters:");
	scanf("%f", &height);
	
	while(height > 0)
	{
		feet = height / 31;
		inch = CONVERT * height - feet * 12;
		printf("%.1f cm = %d feet, %.1f inches\n", height, feet, inch);
		printf("Enter a height in centimeters (<=0 to quit):");
		scanf("%f", &height); 
	}
	printf("bye\n");
	
	return 0; 
}

运行结果:
C Primer Plus 第五章 复习题&编程练习 答案_第8张图片

5. 修改程序addemup.c(程序清单5.13),你可以认为addemup.c是计算20天里赚多少钱的程序(假设第1天赚$1、第2天赚$2、第3天赚$3,以此类推)。修改程序,使其可以与用户交互,根据用户输入的数进行计算(即,用读入的一个变量来代替20)。

#include 
int main(void)						
{
	int day, money, upper_limit;					
	
	day = 0;						
	money = 0;	
	printf("输入天数:");
	scanf("%d", &upper_limit);
						
	while(day++ < upper_limit)				
		money = money + day;
	printf("money = %d\n", money);	
	
	return 0;					
 } 

运行结果:
C Primer Plus 第五章 复习题&编程练习 答案_第9张图片

6. 修改编程练习5的程序,使其能计算整数的平方和(可以认为第1天赚$1、第2天赚$4、第3天赚$9,以此类推,这看起来很不错)。C没有平方函数,但是可以用n * n来表示n的平方。

#include 
int main(void)
{
	int day, money, upper_limit;					
	
	day = 0;						
	money = 0;	
	printf("输入天数:");
	scanf("%d", &upper_limit);
						
	while(day++ < upper_limit)				
		money = money + day * day;
	printf("money = %d\n", money);	
	
	return 0;
}

运行结果:
C Primer Plus 第五章 复习题&编程练习 答案_第10张图片

7. 编写一个程序,提示用户输入一个double类型的数,并打印该数的立方值。自己设计一个函数计算并打印立方值。main()函数要把用户输入的值传递给该函数。

#include 
void cube(double num);
int main(void)
{
	double number;
	
	printf("输入一个double类型的数:");
	scanf("%lf", &number); 
	cube(number);

	return 0;
}

void cube(double num)
{
	double result = num * num * num;
	printf("%lf 的立方值是 %lf\n", num, result); 
}

运行结果:
C Primer Plus 第五章 复习题&编程练习 答案_第11张图片

8. 编写一个程序,显示求模运算的结果。把用户输入的第1个整数作为求模运算符的第2个运算对象,该数在运算过程中保持不变。用户后面输入的数是第1个运算对象。当用户输入一个非正值时,程序结束。其输出示例如下:

This program computes moduli.
Enter an integer to serve as the second operand: 256
Now enter the first operand: 438
438 % 256 is 182
Enter next number for first operand (<= 0 to quit): 1234567
1234567 % 256 is 135
Enter next number for first operand (<= 0 to quit): 0
Done

#include 
int main(void)
{
	int first, last, result;
	
	printf("This program computes moduli.\n");
	printf("Enter an integer to serve as the second operand: ");
	scanf("%d", &first);
	printf("Now enter the first operand: ");
	scanf("%d", &last);
	while(last > 0)
	{
		result = last % first;
		printf("%d %% %d is %d\n", last, first, result);
		printf("Enter next number for first operand (<= 0 to quit): ");
		scanf("%d", &last);
	}
	printf("Done\n"); 
	
	return 0;
}

运行结果:
C Primer Plus 第五章 复习题&编程练习 答案_第12张图片

9. 编写一个程序,要求用户输入一个华氏温度。程序应读取double类型的值作为温度值,并把该值作为参数传递给一个用户自定义的函数Temperatures()。该函数计算摄氏温度和开氏温度,并以小数点后面两位数字的精度显示3种温度。要使用不同的温标来表示这3个温度值。华氏温度转摄氏温度的公式:摄氏温度 = 5.0 / 9.0 * (华氏温度 - 32.0) 开氏温标常用于科学研究,0表示绝对零,代表最低的温度。摄氏温度转开氏温度的公式:开氏温度 = 摄氏温度 + 273.16。 Temperatures()函数中用const创建温度转换中使用的变量。在main()函数中使用一个循环让用户重复输入温度,当用户输入 q 或其他非数字时,循环结束。scanf()函数返回读取数据的数量,所以如果读取数字则返回1,如果读取q则不返回1。可以使用==运算符将scanf()的返回值和1作比较,测试两值是否相等。

#include 
void Temperatures(double tem);
int main(void)
{
	double Fahrenheit;
	printf("输入一个华氏温度(非数字时,程序结束):");
	 
	while( scanf("%lf",&Fahrenheit) == 1)
	{
		Temperatures(Fahrenheit);
		printf("输入一个华氏温度(非数字时,程序结束):");
	}
	printf("End\n");
	
	return 0; 
}
void Temperatures(double tem)
{
	double Centigrade, Kelvin;
	const double h_convert_c1 = 5.0 / 9.0, h_convert_c2 = 32.0, c_convert_k = 273.16;
	Centigrade = h_convert_c1 * (tem - h_convert_c2);
	Kelvin = Centigrade + c_convert_k;
	printf("华氏温度:%.2lf 		摄氏温度:%.2lf 		开氏温度:%.2lf\n", tem, Centigrade, Kelvin);
}

运行结果:
C Primer Plus 第五章 复习题&编程练习 答案_第13张图片
转换软件验证结果:
C Primer Plus 第五章 复习题&编程练习 答案_第14张图片

你可能感兴趣的:(C Primer Plus 第五章 复习题&编程练习 答案)