### 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 << '*'; } } ```
A. 2 次    B. 6 次    C. 3 次    D. 5 次
( ) 3. 要输出 3 行、每行 4 个星号,换行语句应放在哪里?
A. 内层循环体中                B. 外层循环开始之前
C. 外层循环结束之后            D. 内层结束后、外层循环体内
( ) 4. 下面的程序输出什么?选项中“/”表示换行,实际输出中没有“/”。 ```cpp for (int i = 1; i <= 2; i++) { for (int j = 1; j <= 3; j++) { cout << j; } cout << '\n'; } ```
A. 123/123    B. 111/222
C. 123/456    D. 12/12/12
( ) 5. 如果将第 4 题中的 `cout << j;` 改为 `cout << i;`,输出是什么?选项中“/”表示换行。
A. 123/123    B. 12/12/12
C. 111/222    D. 111/111
( ) 6. 数字直角三角形的第一行有 `n` 个数,以后每行少一个。当 `n=6` 时,第 4 行有几个数?
A. 2 个    B. 3 个    C. 4 个    D. 6 个
( ) 7. 求 $$1!+2!+\cdots+n!$$,且 `1≤n≤20`。为了保存较大的乘积和总和,`factor` 和 `ans` 应使用下列哪种类型?
A. char    B. bool    C. int    D. long long
( ) 8. 执行下面的代码后,`digit` 和 `tmp` 的值分别是多少? ```cpp int tmp = 92, digit = tmp % 10; tmp /= 10; ```
A. 2 和 9    B. 9 和 2    C. 2 和 92    D. 9 和 92
( ) 9. 下面的代码中,`cnt++` 一共执行多少次? ```cpp int cnt = 0; for (int i = 1; i <= 4; i++) { for (int j = 1; j <= i; j++) { cnt++; } } ```
A. 4 次    B. 8 次    C. 10 次    D. 16 次
( ) 10. 统计从 1 到 20 的所有整数中,数字 1 出现的总次数。每个数位都要统计,答案是多少?
A. 12    B. 11    C. 10    D. 13
#### **三、 判断题 (对的打“√”,错的打“×”)** ( ) 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; ```