6 多层循环结构(一)嵌套for循环
正在加载视频播放器…
GESP C++ 二级:多层循环结构嵌套 for 循环精讲
核心目标:掌握嵌套
for循环的语法、执行流程、内外层关系,能熟练打印各种图形、编写九九乘法表、解决枚举与统计问题,理解break、continue在嵌套中的行为。
外层走一步,内层跑一圈;外层控制行,内层控制列;总次数 = 外层次数 × 内层次数。
一、什么是嵌套 for 循环
嵌套 for 循环,就是在一个 for 循环的循环体里,再写一个完整的 for 循环。
外层循环每执行一次,内层循环都会从头到尾完整执行一遍。
for (初始化1; 条件1; 更新1) {
for (初始化2; 条件2; 更新2) {
循环体;
}
}
常见命名习惯:
- 外层循环变量:
i - 内层循环变量:
j - 更内层:
k
二、执行流程
以如下代码为例:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 4; j++) {
cout << "*";
}
cout << endl;
}
执行过程:
- 外层初始化:
i = 1。 - 判断外层条件:
i <= 3成立。 - 进入外层循环体,执行内层循环:
- 内层初始化:
j = 1。 - 判断
j <= 4,成立,执行cout << "*"。 j++,重复直到j = 5,内层结束。
- 内层初始化:
- 内层结束后,执行
cout << endl;。 - 外层更新:
i++,回到第 2 步。 - 当
i = 4时,外层条件不成立,整个嵌套循环结束。
输出:
****
****
****
口诀:
外层一次,内层一圈;
内层跑完,外层才更新;
换行通常放在内层结束后、外层内。
三、循环次数计算
总执行次数 = 外层循环次数 × 内层循环次数。
for (int i = 1; i <= 3; i++) { // 外层 3 次
for (int j = 1; j <= 4; j++) { // 内层 4 次
// 循环体执行 3 × 4 = 12 次
}
}
如果内外层次数不同:
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
// 内层次数随 i 变化
}
}
内层总次数 = 。
四、常见图形打印
1. 矩形
打印 n 行 m 列星号。
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cout << "*";
}
cout << endl;
}
输入 3 5,输出:
*****
*****
*****
2. 直角三角形(左下)
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cout << "*";
}
cout << endl;
}
输入 4,输出:
*
**
***
****
3. 倒直角三角形
for (int i = n; i >= 1; i--) {
for (int j = 1; j <= i; j++) {
cout << "*";
}
cout << endl;
}
输入 4,输出:
****
***
**
*
4. 等腰三角形
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
// 打印空格
for (int j = 1; j <= n - i; j++) {
cout << " ";
}
// 打印星号
for (int j = 1; j <= 2 * i - 1; j++) {
cout << "*";
}
cout << endl;
}
输入 4,输出:
*
***
*****
*******
5. 数字三角形
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cout << j << " ";
}
cout << endl;
}
输入 4,输出:
1
1 2
1 2 3
1 2 3 4
6. 九九乘法表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
cout << j << "*" << i << "=" << i * j << " ";
}
cout << endl;
}
输出:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
...
五、枚举与统计
1. 枚举所有组合
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
cout << i << j << " ";
}
cout << endl;
}
输出:
11 12 13
21 22 23
31 32 33
2. 统计满足条件的数
int cnt = 0;
for (int i = 1; i <= 100; i++) {
for (int j = 1; j <= 100; j++) {
if (i + j == 50 && i < j) {
cnt++;
}
}
}
cout << cnt << endl;
3. 百钱百鸡(经典枚举)
公鸡 5 元一只,母鸡 3 元一只,小鸡 1 元三只,100 元买 100 只鸡。
for (int x = 0; x <= 20; x++) { // 公鸡
for (int y = 0; y <= 33; y++) { // 母鸡
int z = 100 - x - y; // 小鸡
if (z >= 0 && 5 * x + 3 * y + z / 3 == 100 && z % 3 == 0) {
cout << x << " " << y << " " << z << endl;
}
}
}
六、break 与 continue 在嵌套中的行为
1. break
break 只跳出当前所在的那一层循环,不影响外层。
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 5; j++) {
if (j == 3) break; // 只跳出内层循环
cout << i << j << " ";
}
cout << endl;
}
输出:
11 12
21 22
31 32
2. continue
continue 只跳过当前层本次循环的剩余语句。
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 5; j++) {
if (j == 3) continue; // 跳过内层 j=3 的打印
cout << i << j << " ";
}
cout << endl;
}
输出:
11 12 14 15
21 22 24 25
31 32 34 35
3. 想跳出多层循环
可以用标志变量:
bool found = false;
for (int i = 1; i <= 5 && !found; i++) {
for (int j = 1; j <= 5; j++) {
if (i * j == 12) {
found = true;
break;
}
}
}
或者使用 goto(不推荐)。
七、三层嵌套
三层嵌套就是外层、中层、内层。
for (int i = 1; i <= 2; i++) {
for (int j = 1; j <= 3; j++) {
for (int k = 1; k <= 2; k++) {
cout << i << j << k << " ";
}
cout << endl;
}
}
总次数 = 2 × 3 × 2 = 12 次。
二级考试中三层嵌套较少,但需要能读懂。
八、易错点
-
内外层循环变量同名
for (int i = 1; i <= 3; i++) { for (int i = 1; i <= 4; i++) { // 错误,变量名冲突 } } -
内层循环变量未重新初始化
int j; for (int i = 1; i <= 3; i++) { while (j <= 4) { // j 没有重置,只执行一次 } } -
换行位置错误
for (int i = 1; i <= 3; i++) { for (int j = 1; j <= 4; j++) { cout << "*"; cout << endl; // 错误,每打印一个星号就换行 } } -
循环边界错误
i <= n和i < n结果不同。 -
累加变量在循环内重复初始化
for (int i = 1; i <= n; i++) { int sum = 0; // 每次外层循环都清零 for (int j = 1; j <= i; j++) { sum += j; } } -
break误以为能跳出所有循环
break只跳出当前层。 -
内层循环次数依赖外层变量时写错
for (int j = 1; j <= n; j++) // 应为 j <= i -
忘记
cout << endl;导致所有输出在一行
换行应放在内层循环结束后。 -
循环变量作用域混淆
for (int i = 1; i <= 3; i++) { } cout << i; // 错误,i 只在循环内有效 -
输出格式错误
注意空格、换行,严格按题目要求输出。
九、阅读程序写结果
题目 1
for (int i = 1; i <= 2; i++) {
for (int j = 1; j <= 3; j++) {
cout << i << j << " ";
}
cout << endl;
}
输出:
11 12 13
21 22 23
题目 2
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= i; j++) {
cout << "*";
}
cout << endl;
}
输出:
*
**
***
题目 3
for (int i = 3; i >= 1; i--) {
for (int j = 1; j <= i; j++) {
cout << j;
}
cout << endl;
}
输出:
123
12
1
题目 4
int sum = 0;
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
sum += i * j;
}
}
cout << sum << endl;
输出:
36
计算:外层 i=1,2,3;内层 j=1,2,3;总和 = (1+2+3)×(1+2+3)=6×6=36。
题目 5
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 5; j++) {
if (j == 3) break;
cout << i << j << " ";
}
cout << endl;
}
输出:
11 12
21 22
31 32
题目 6
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 5; j++) {
if (j == 3) continue;
cout << i << j << " ";
}
cout << endl;
}
输出:
11 12 14 15
21 22 24 25
31 32 34 35
十、编程题示例
1. 打印矩形
输入 n 和 m,输出 n 行 m 列星号。
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cout << "*";
}
cout << endl;
}
return 0;
}
2. 打印等腰三角形
输入 n,输出 n 行等腰三角形。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i; j++) {
cout << " ";
}
for (int j = 1; j <= 2 * i - 1; j++) {
cout << "*";
}
cout << endl;
}
return 0;
}
3. 九九乘法表
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
cout << j << "*" << i << "=" << i * j << " ";
}
cout << endl;
}
return 0;
}
4. 求 1! + 2! + ... + n!
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
long long sum = 0;
for (int i = 1; i <= n; i++) {
long long fac = 1;
for (int j = 1; j <= i; j++) {
fac *= j;
}
sum += fac;
}
cout << sum << endl;
return 0;
}
十一、速查表
| 需求 | 写法 |
|---|---|
嵌套 for 基本结构 |
for (...) { for (...) { ... } } |
| 矩形 | 外层行,内层列 |
| 左下直角三角形 | 内层 j <= i |
| 倒直角三角形 | 外层 i 从 n 到 1 |
| 等腰三角形 | 先打印空格,再打印星号 |
| 九九乘法表 | 内层 j <= i |
| 枚举组合 | 双层循环遍历所有可能 |
| 总次数 | 外层次数 × 内层次数 |
| 跳出当前层 | break |
| 跳过本次 | continue |
| 跳出多层 | 标志变量或 goto(不推荐) |
| 换行位置 | 内层结束后、外层内 |
十二、总结
嵌套 for 循环是 GESP 二级循环结构的核心。
- 嵌套
for就是for里面再写for。 - 外层走一步,内层跑一圈。
- 总次数 = 外层次数 × 内层次数。
- 外层控制行,内层控制列。
- 换行放在内层结束后、外层内。
- 内层循环次数可以依赖外层变量,如
j <= i。 break只跳出当前层,continue只跳过当前层本次。- 内外层循环变量不能同名。
- 累加变量要在循环外初始化,累乘变量初始化为 1。
- 常见应用:打印图形、九九乘法表、枚举、统计。
复习建议:多练“阅读程序写结果”和“打印图形”两类题,重点注意循环边界、内外层关系、换行位置、break/continue 的作用范围。考试中先确定外层循环控制什么、内层循环控制什么,再逐行模拟输出。