08-第7章复习题答案
A.7 第7章复习题答案
1. b 是 true 。
2.a. number >= 90 && number < 100
b. ch != 'q' && ch != 'k'
c. (number >= 1 && number <= 9) && number != 5
d.可以写成 !(number >= 1 && number <= 9) ,但是 number < 1 || number > 9 更好理解。
3.第 5 行:应该是 scanf("%d %d", &weight, &height); 。不要忘记 scanf() 中要用 & 。另外,这一行前面应该有提示用户输入的语句。
第 9 行:测试条件中要表达的意思是 (height < 72 && height > 64) 。根据前面第 7 行中的测试条件,能到第 9 行的 height 一定小于 72 ,所以,只需要用表达式 (height > 64) 即可。但是,第 6 行中已经包含了 height > 64 这个条件,所以这里完全不必再判断, if else 应改成 else 。
第 11 行:条件冗余。第 2 个表达式( weight 不小于或不等于 300 )和第 1 个表达式含义相同。只需用一个简单的表达式 (weight > 300) 即可。但是,问题不止于此。第 11 行是一个错误的 if ,这行的 else if 与第 6 行的 if 匹配。但是,根据 if 的“最接近规则”,该 else if 应该与第 9 行的 else if 匹配。因此,在 weight 小于 100 且小于或等于 64 时到达第 11 行,而此时 weight 不可能超过 300 。
第 7 行~第 10 行:应该用花括号括起来。这样第 11 行就确定与第 6 行匹配。但是,如果把第 9 行的 else if 替换成简单的 else ,就不需要使用花括号。
第 13 行:应简化成 if (height > 48) 。实际上,完全可以省略这一行。因为第 12 行已经测试过该条件。
下面是修改后的版本:
#include <stdio.h>
int main(void)
{
int weight, height; /* weight in lbs, height in inches */
printf("Enter your weight in pounds and ");
printf("your height in inches.\n");
scanf("%d %d", &weight, &height);
if (weight < 100 && height > 64)
if (height >= 72)
printf("You are very tall for your weight.\n");
else
printf("You are tall for your weight.\n");
else if (weight > 300 && height < 48)
printf(" You are quite short for your weight.\n");
else
printf("Your weight is ideal.\n");
return 0;
}
4.a. 1 。 5 确实大于 2 ,表达式为真,即是 1 。
b. 0 。 3 比 2 大,表达式为假,即是 0 。
c. 1 。如果第 1 个表达式为假,则第 2 个表达式为真,反之亦然。所以,只要一个表达式为真,整个表达式的结果即为真。
d. 6 。因为 6 > 2 为真,所以 (6 > 2) 的值为 1 。
e. 10 。因为测试条件为真。
f. 0 。如果 x > y 为真,表达式的值就是 y > x ,这种情况下它为假或 0 。如果 x > y 为假,那么表达式的值就是 x > y ,这种情况下为假。
5.该程序打印以下内容:
*#%*#%$#%*#%*#%$#%*#%*#%$#%*#%*#%
无论怎样缩排,每次循环都会打印 # ,因为缩排并不能让 putchar('#'); 成为 if else 复合语句的一部分。
6.程序打印以下内容:
fat hat cat Oh no!
hat cat Oh no!
cat Oh no!
7.第 5 行~第 7 行的注释要以 / 结尾,或者把注释开头的 / 换成 // 。表达式 'a' <= ch >= 'z' 应替换成 ch >= 'a' && ch <= 'z' 。
或者,包含 ctype.h 并使用 islower() ,这种方法更简单,而且可移植性更高。顺带一提,虽然从 C 的语法方面看, 'a' <= ch >= 'z' 是有效的表达式,但是它的含义不明。因为关系运算符从左往右结合,该表达式被解释成 ('a' <= ch) >= 'z' 。圆括号中的表达式的值不是 1 就是 0 (真或假),然后判断该值是否大于或等于 'z' 的数值码。 1 和 0 都不满足测试条件,所以整个表达式恒为 0 (假)。在第 2 个测试表达式中,应该把 || 改成 && 。另外,虽然 !(ch< 'A') 是有效的表达式,而且含义也正确,但是用 ch >= 'A' 更简单。这一行的 'z' 后面应该有两个圆括号。更简单的方法是使用 isuupper() 。在 uc++; 前面应该加一行 else 。否则,每输入一个字符, uc 都会递增 1 。另外,在 printf() 语句中的格式化字符串应该用双引号括起来。下面是修改后的版本:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char ch;
int lc = 0; /*统计小写字母*/
int uc = 0; /*统计大写字母*/
int oc = 0; /*统计其他字母*/
while ((ch = getchar()) != '#')
{
if (islower(ch))
lc++;
else if (isupper(ch))
uc++;
else
oc++;
}
printf("%d lowercase, %d uppercase, %d other", lc, uc, oc);
return 0;
}
8.该程序将不停重复打印下面一行:
You are 65. Here is your gold watch.
问题出在这一行: if (age = 65)
这行代码把 age 设置为 65 ,使得每次迭代的测试条件都为真。
9.下面是根据给定输入的运行结果:
q
Step 1
Step 2
Step 3
c
Step 1
h
Step 1
Step 3
b
Step 1
Done
注意, b 和 # 都可以结束循环。但是输入 b 会使得程序打印 step 1 ,而输入 # 则不会。
10.下面是一种解决方案:
#include <stdio.h>
int main(void)
{
char ch;
while ((ch = getchar()) != '#')
{
if (ch != '\n')
{
printf("Step 1\n");
if (ch == 'b')
break;
else if (ch != 'c')
{
if (ch != 'h')
printf("Step 2\n");
printf("Step 3\n");
}
}
}
printf("Done\n");
return 0;
}