当前位置:嗨网首页>书籍在线阅读

08-第7章复习题答案

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

A.7 第7章复习题答案

1. btrue

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. 15 确实大于 2 ,表达式为真,即是 1

b. 032 大,表达式为假,即是 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' 的数值码。 10 都不满足测试条件,所以整个表达式恒为 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;
}