07-第6章复习题答案
A.6 第6章复习题答案
1. 2 , 7 , 70 , 64 , 8 , 2 。
2.该循环的输出是:
36 18 9 4 2 1
如果 value 是 double 类型,即使 value 小于1,循环的测试条件仍然为真。循环将一直执行,直到浮点数下溢生成 0 为止。另外, value 是 double 类型时, %3d 转换说明也不正确。
3.a. x > 5
b. scanf("%lf",&x) != 1
c. x == 5
4.a. scanf("%d", &x) == 1
b. x != 5
c. x >= 20
5.第 4 行:应该是 list[10] 。
第 6 行:逗号改为分号。 i 的范围应该是 0 ~ 9 ,不是 1 ~ 10 。
第 9 行:逗号改为分号。 >= 改成 <= ,否则,当 i 等于 1 时,该循环将成为无限循环。
第 10 行:在第 10 行和第 11 行之间少了一个右花括号。该右花括号与第 7 行的左花括号配对,形成一个 for 循环块。然后在这个右花括号与最后一个右花括号之间,少了一行 return 0; 。
下面是一个正确的版本:
#include <stdio.h>
int main(void)
{ /* 第3行 */
int i, j, list(10); /* 第4行 */
for (i = 1, i <= 10, i++) /* 第6行 */
{ /* 第7行 */
list[i] = 2*i + 3; /* 第8行 */
for (j = 1, j > = i, j++) /* 第9行 */
printf(" %d", list[j]); /* 第10行 */
printf("\n"); /* 第11行 */
}
return 0;
}
6.下面是一种方法:
#include <stdio.h>
int main(void)
{
int col, row;
for (row = 1; row <= 4; row++)
{
for (col = 1; col <= 8; col++)
printf("$");
printf("\n");
}
return 0;
}
7.a. Hi! Hi! Hi! Bye! Bye! Bye! Bye! Bye!
b. ACGM (因为代码中把 int 类型值与 char 类型值相加,编译器可能警告会损失有效数字)
8.a. Go west, youn
b. Hp!xftu-!zpvo
c. Go west, young
d. $o west, youn
9.其输入如下:
31|32|33|30|31|32|33|
***
1
5
9
13
***
2 6
4 8
8 10
***
======
=====
====
===
==
10.a. mint
b. 10 个元素
c. double 类型的值
d.第 ii 行正确, mint[2] 是 double 类型的值, &mingt[2] 是它在内存中的位置。
11.因为第 1 个元素的索引是 0 ,所以循环的范围应该是 0 ~ SIZE - 1 ,而不是 1 ~ SIZE 。但是,如果只是这样更改会导致赋给第 1 个元素的值是 0 ,不是 2 。所以,应重写这个循环:
for (index = 0; index < SIZE; index++)
by_twos[index] = 2 * (index + 1);
与此类似,第 2 个循环的范围也要更改。另外,应该在数组名后面使用数组索引:
for( index = 0; index < SIZE; index++)
printf("%d ", by_twos[index]);
错误的循环条件会成为程序的定时炸弹。程序可能开始运行良好,但是由于数据被放在错误的位置,可能在某一时刻导致程序不能正常工作。
12.该函数应声明为返回类型为 long ,并包含一个返回 long 类型值的 return 语句。
13.把 num 的类型强制转换成 long 类型,确保计算使用 long 类型而不是 int 类型。在 int 为 16 位的系统中,两个 int 类型值的乘积在返回之前会被截断为一个 int 类型的值,这可能会丢失数据。
long square(int num)
{
return ((long) num) * num;
}
14.输出如下:
1: Hi!
k = 1
k is 1 in the loop
Now k is 3
k = 3
k is 3 in the loop
Now k is 5
k = 5
k is 5 in the loop
Now k is 7
k = 7