Files
T

166 lines
5.8 KiB
Markdown
Raw 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++ 多重循环与循环嵌套 课后习题
姓名: \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
#### **一、 填空题**
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;
```