Files

65 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### C++ 多重循环与循环嵌套 课后习题参考答案
本卷共 30 题:填空、选择、判断各 10 题。其中基础题 24 题,占 80%;基础应用与迁移题 6 题,占 20%。每类题的第 1~8 题为基础题,第 9~10 题为应用与迁移题。
考查范围限于本课的循环嵌套、循环范围、变量初始化、星号矩形、数字三角形、阶乘之和及数位计数。判断题第 9 题的 `%02d` 来自所提供的 PPT 内容。
#### **一、 填空题**
| 题号 | 参考答案 | 简要说明 |
| --- | --- | --- |
| 1 | 循环嵌套(或“多重循环”);外层;内层 | 循环之间存在包含关系 |
| 2 | 2;`*****` | 外层执行 2 轮,每轮在同一行输出 5 个星号 |
| 3 | 1;3 | 每次进入内层都重新初始化;每轮外层换行一次 |
| 4 | `n - i + 1`(或 `n - (i - 1)`);5 | 第 3 行比第一行少 2 个 |
| 5 | 之前;1 | 每输出一个编号就增加 1,编号跨行保留 |
| 6 | 6 | 累乘结果为 $$1\times1\times2\times3=6$$ |
| 7 | 9 | $$1!+2!+3!=1+2+6=9$$ |
| 8 | 0;102 | 取出个位 0,再通过整数除法去掉个位 |
| 9 | `0405`;`06`;7 | 各行数量为 3、2、1,共输出 6 个编号;最后的变量记录下一个编号 |
| 10 | 24;33 | 四轮的阶乘依次为 1、2、6、24,总和为 33 |
第 4 题中,与参考答案等价的表达式也可判为正确。填写输出内容时,前导零应保留。
#### **二、 单项选择题**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 答案 | C | B | D | A | C | B | D | A | C | A |
1. **C。** `while` 放在 `for` 的循环体内,形成包含关系。前后执行的两个循环不属于嵌套。
2. **B。** 外层执行 2 轮,每轮内层执行 3 次,共 $$2\times3=6$$ 次。
3. **D。** 先输出当前行的全部星号,再换行;换行仍属于外层的任务。
4. **A。** 每一行的 `j` 都从 1 开始,依次输出 1、2、3。
5. **C。** 第一行中 `i` 始终为 1,输出 `111`;第二行中 `i` 始终为 2,输出 `222`。
6. **B。** 第 4 行有 $$6-4+1=3$$ 个数。
7. **D。** 常见的 32 位 `int` 无法保存 `13!`。本题范围内的乘积和总和可以用 `long long` 保存。
8. **A。** `92 % 10` 得到 2,整数除法 `92 / 10` 得到 9。
9. **C。** 每轮内层分别执行 1、2、3、4 次,总共 $$1+2+3+4=10$$ 次,不能直接算成 4×4。
10. **A。** 整数 1 贡献一次;10~19 的十位共贡献 10 次;11 的个位再贡献一次;20 不贡献,总共 $$1+10+1=12$$ 次。
#### **三、 判断题**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 答案 | × | × | √ | √ | × | × | √ | √ | × | √ |
1. **×。** 要有包含关系:一个循环位于另一个循环的循环体内。
2. **×。** 内层执行多少次由自己的初始化、条件、更新及循环体决定。本课矩形例子中,一轮外层对应内层的多次执行。
3. **√。** 大括号决定归属,缩进帮助阅读。
4. **√。** 每次执行到内层 `for`,都先执行其初始化部分。
5. **×。** `cnt` 应在外层之前初始化;放进外层会让每行编号重新从 1 开始。
6. **×。** 从 0 开始累乘,之后乘任何数仍然为 0。累乘器应从 1 开始。
7. **√。** `long long` 足以保存本题范围内的结果,但不能保存任意大的整数。
8. **√。** 不匹配的数位也已经检查完毕,应去掉它并继续。把去位语句放进匹配成功的分支,可能导致程序停留在同一数位。
9. **×。** 2 表示最小宽度,不会截断超过两位的整数,实际输出为 `123`。
10. **√。** 这段程序的结果不是正确的阶乘之和,变量变化如下。
| 外层 `i` | 进入本轮时的 `factor` | 内层计算后的 `factor` | 累加后的 `ans` |
| --- | --- | --- | --- |
| 1 | 1 | `1 × 1 = 1` | 1 |
| 2 | 1 | `1 × 1 × 2 = 2` | 3 |
| 3 | 2 | `2 × 1 × 2 × 3 = 12` | 15 |
这里沿用了“每项从头乘 1 到 i”的内层循环,所以每项开始时应把 `factor` 重置为 1。若改用保留上一项阶乘的方法,则应删除内层循环,每轮只执行 `factor *= i`。