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;
}

执行过程:

  1. 外层初始化:i = 1。
  2. 判断外层条件:i <= 3 成立。
  3. 进入外层循环体,执行内层循环:
    • 内层初始化:j = 1。
    • 判断 j <= 4,成立,执行 cout << "*"。
    • j++,重复直到 j = 5,内层结束。
  4. 内层结束后,执行 cout << endl;。
  5. 外层更新:i++,回到第 2 步。
  6. 当 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+2+3+⋯+n=n(n+1)21 + 2 + 3 + \dots + n = \frac{n(n+1)}{2}。


四、常见图形打印

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 次。

二级考试中三层嵌套较少,但需要能读懂。


八、易错点

  1. 内外层循环变量同名

    for (int i = 1; i <= 3; i++) {
        for (int i = 1; i <= 4; i++) {   // 错误,变量名冲突
        }
    }
    
  2. 内层循环变量未重新初始化

    int j;
    for (int i = 1; i <= 3; i++) {
        while (j <= 4) {   // j 没有重置,只执行一次
        }
    }
    
  3. 换行位置错误

    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 4; j++) {
            cout << "*";
            cout << endl;   // 错误,每打印一个星号就换行
        }
    }
    
  4. 循环边界错误
    i <= n 和 i < n 结果不同。

  5. 累加变量在循环内重复初始化

    for (int i = 1; i <= n; i++) {
        int sum = 0;   // 每次外层循环都清零
        for (int j = 1; j <= i; j++) {
            sum += j;
        }
    }
    
  6. break 误以为能跳出所有循环
    break 只跳出当前层。

  7. 内层循环次数依赖外层变量时写错

    for (int j = 1; j <= n; j++)   // 应为 j <= i
    
  8. 忘记 cout << endl; 导致所有输出在一行
    换行应放在内层循环结束后。

  9. 循环变量作用域混淆

    for (int i = 1; i <= 3; i++) { }
    cout << i;   // 错误,i 只在循环内有效
    
  10. 输出格式错误
    注意空格、换行,严格按题目要求输出。

九、阅读程序写结果

题目 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 二级循环结构的核心。

  1. 嵌套 for 就是 for 里面再写 for。
  2. 外层走一步,内层跑一圈。
  3. 总次数 = 外层次数 × 内层次数。
  4. 外层控制行,内层控制列。
  5. 换行放在内层结束后、外层内。
  6. 内层循环次数可以依赖外层变量,如 j <= i。
  7. break 只跳出当前层,continue 只跳过当前层本次。
  8. 内外层循环变量不能同名。
  9. 累加变量要在循环外初始化,累乘变量初始化为 1。
  10. 常见应用:打印图形、九九乘法表、枚举、统计。

复习建议:多练“阅读程序写结果”和“打印图形”两类题,重点注意循环边界、内外层关系、换行位置、break/continue 的作用范围。考试中先确定外层循环控制什么、内层循环控制什么,再逐行模拟输出。