Initial commit: C++ courseware

This commit is contained in:
xiaolinquan committed 2026-11-05 22:51:02 +08:00
commit 4a4ee7c287
1789 files changed
+373489

No files matched your search

@@ -0,0 +1,165 @@
### C++ 多重循环与循环嵌套 课后习题
姓名: \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
#### **一、 填空题**
1. 在一个循环的循环体里再放入另一个循环,这种写法叫作\_\_\_\_\_\_\_\_。外面的循环叫作\_\_\_\_\_\_\_\_循环,里面的循环叫作\_\_\_\_\_\_\_\_循环。
2. 下面的程序共输出\_\_\_\_\_\_\_\_行,每一行的输出内容为\_\_\_\_\_\_\_\_。
```cpp
for (int i = 1; i <= 2; i++) {
for (int j = 1; j <= 5; j++) { cout << '*'; }
cout << '\n';
}
```
3. 在下面的程序中,每进入新的一行,内层变量 `j` 都会重新从\_\_\_\_\_\_\_\_开始;换行语句一共执行\_\_\_\_\_\_\_\_次。
```cpp
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 4; j++) { cout << '*'; }
cout << '\n';
}
```
4. 数字直角三角形的第一行有 `n` 个数,以后每行少一个。第 `i` 行有\_\_\_\_\_\_\_\_个数(用含 `n`、`i` 的式子表示)。当 `n=7`、`i=3` 时,这一行有\_\_\_\_\_\_\_\_个数。
5. 编号从 1 开始、换行后接着增加时,应将 `int cnt = 1;` 写在外层循环\_\_\_\_\_\_\_\_(填“之前”或“之内”)。每输出一个编号后,`cnt` 的值应增加\_\_\_\_\_\_\_\_。
6. 下面的代码执行后,输出结果为\_\_\_\_\_\_\_\_。
```cpp
long long factor = 1;
for (int j = 1; j <= 3; j++) { factor *= j; }
cout << factor;
```
7. 阶乘之和 $$1!+2!+3!$$ 的值为\_\_\_\_\_\_\_\_。
8. 已知 `int tmp = 1020;`,则 `tmp % 10` 的结果为\_\_\_\_\_\_\_\_;执行 `tmp /= 10;` 后,`tmp` 的值为\_\_\_\_\_\_\_\_。
9. 下面的程序在第一行输出 `010203`。第二行的输出内容为\_\_\_\_\_\_\_\_,第三行的输出内容为\_\_\_\_\_\_\_\_;全部循环结束后,`cnt` 的值为\_\_\_\_\_\_\_\_。
```cpp
int n = 3, cnt = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i + 1; j++) {
if (cnt < 10) { cout << '0'; }
cout << cnt; cnt++;
}
cout << '\n';
}
```
10. 下面的代码保留上一项阶乘,避免从头计算。循环结束后,`factor` 的值为\_\_\_\_\_\_\_\_,`ans` 的值为\_\_\_\_\_\_\_\_。
```cpp
long long ans = 0, factor = 1;
for (int i = 1; i <= 4; i++) { factor *= i; ans += factor; }
```
#### **二、 单项选择题**
( ) 1. 下列哪种情况属于循环嵌套?
A. 先执行一个 `for`,结束后再执行另一个 `for`
B. 在一个 `if` 的分支中放入一个 `for`
C. 在一个 `for` 的循环体中放入一个 `while`
D. 在一个 `for` 的循环体中放入两条输出语句
( ) 2. 下面输出星号的语句一共执行多少次?
```cpp
for (int i = 1; i <= 2; i++) {
for (int j = 1; j <= 3; j++) { cout << '*'; }
}
```
<pre>A. 2 次 B. 6 次 C. 3 次 D. 5 次</pre>
( ) 3. 要输出 3 行、每行 4 个星号,换行语句应放在哪里?
<pre>A. 内层循环体中 B. 外层循环开始之前
C. 外层循环结束之后 D. 内层结束后、外层循环体内</pre>
( ) 4. 下面的程序输出什么?选项中“/”表示换行,实际输出中没有“/”。
```cpp
for (int i = 1; i <= 2; i++) {
for (int j = 1; j <= 3; j++) { cout << j; }
cout << '\n';
}
```
<pre>A. 123/123 B. 111/222
C. 123/456 D. 12/12/12</pre>
( ) 5. 如果将第 4 题中的 `cout << j;` 改为 `cout << i;`,输出是什么?选项中“/”表示换行。
<pre>A. 123/123 B. 12/12/12
C. 111/222 D. 111/111</pre>
( ) 6. 数字直角三角形的第一行有 `n` 个数,以后每行少一个。当 `n=6` 时,第 4 行有几个数?
<pre>A. 2 个 B. 3 个 C. 4 个 D. 6 个</pre>
( ) 7. 求 $$1!+2!+\cdots+n!$$,且 `1≤n≤20`。为了保存较大的乘积和总和,`factor` 和 `ans` 应使用下列哪种类型?
<pre>A. char B. bool C. int D. long long</pre>
( ) 8. 执行下面的代码后,`digit` 和 `tmp` 的值分别是多少?
```cpp
int tmp = 92, digit = tmp % 10;
tmp /= 10;
```
<pre>A. 2 和 9 B. 9 和 2 C. 2 和 92 D. 9 和 92</pre>
( ) 9. 下面的代码中,`cnt++` 一共执行多少次?
```cpp
int cnt = 0;
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= i; j++) { cnt++; }
}
```
<pre>A. 4 次 B. 8 次 C. 10 次 D. 16 次</pre>
( ) 10. 统计从 1 到 20 的所有整数中,数字 1 出现的总次数。每个数位都要统计,答案是多少?
<pre>A. 12 B. 11 C. 10 D. 13</pre>
#### **三、 判断题 (对的打“√”,错的打“×”)**
( ) 1. 两个 `for` 循环只要出现在同一个程序里,就构成循环嵌套。
( ) 2. 外层循环执行一轮时,内层循环的循环体一定只执行一次。
( ) 3. C++ 根据大括号判断语句属于哪一层循环;把缩进改了,不会改变语句的归属。
( ) 4. 在星号矩形的写法中,内层为 `for (int j = 1; j <= 4; j++)`,每次外层执行到这条语句时,都会重新执行 `int j = 1`。
( ) 5. 数字三角形要求编号跨行连续,因此应在每一轮外层循环开始时,将 `cnt` 重新设为 1。
( ) 6. 用累乘的方法计算阶乘时,将累乘器的初值设为 0,也能得到正确的阶乘。
( ) 7. 对于本课 `n≤20` 的阶乘之和,乘积和总和可以用 `long long` 保存,但 `long long` 也有上限。
( ) 8. 逐位统计数字出现次数时,无论当前数位是否等于目标数字,都需要执行 `tmp /= 10;`,继续处理下一位。
( ) 9. 使用 `printf("%02d", 123)` 输出整数时,只会显示最后两位,结果为 `23`。
( ) 10. 下面的代码没有在每一项开始时重置 `factor`,最终输出的是 15。
```cpp
long long ans = 0, factor = 1;
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= i; j++) { factor *= j; }
ans += factor;
}
cout << ans;
```
@@ -0,0 +1,64 @@
### 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`。