Skip to content

第 13 章 一层不够——嵌套循环


🏗️ 前情回顾:上章你问了「循环里干的事,本身也需要循环怎么办?」这一章就是答案。闹钟的秒针每跑一圈,分针才走一格——一层循环管一行,两层循环管一张表。


🎯 本章目标

学完这一章,你能:

  • 写出嵌套的 for 循环,理解外层和内层的关系
  • 用嵌套循环打印矩形、三角形、菱形和空心图案
  • 独立写出九九乘法表
  • 在脑中模拟嵌套循环的执行过程

📖 故事引入

你有没有盯着墙上的时钟发过呆?

时钟有三根针:时针、分针、秒针。它们的运动是"嵌套"的——秒针每走 60 圈,分针走 1 格;分针每走 60 圈,时针走 1 格

如果你要模拟这个时钟,你会怎么写?你会写三个循环,一个套在另一个里面:

对于时针从 1 到 12:
    对于分针从 0 到 59:
        对于秒针从 0 到 59:
            滴答!

这就是嵌套循环——一个循环里面还装着另一个循环。


🧱 知识讲解

13.1 什么是嵌套循环

嵌套循环就是一个循环的"身体"里面又写了一个循环。外面那个叫外层循环,里面那个叫内层循环

想象你在上体育课。老师说:"全班 4 排,每排同学依次报数 1 到 5"。你脑子里自动就会:

对于每一排(1 到 4):
    对于排里的每个人(1 到 5):
        报数!

写成 C++ 就是这样:

cpp
for (int row = 1; row <= 4; row++) {
    for (int col = 1; col <= 5; col++) {
        cout << row << "排" << col << "号  ";
    }
    cout << endl;  // 一排报完,换行
}

输出:

1排1号  1排2号  1排3号  1排4号  1排5号
2排1号  2排2号  2排3号  2排4号  2排5号
3排1号  3排2号  3排3号  3排4号  3排5号
4排1号  4排2号  4排3号  4排4号  4排5号

🧠 执行顺序:外层循环每走一次,内层循环要完整地跑一轮。就像体育课,每换一排,那一排的 5 个人全部报完数,才轮到下一排。

13.2 打印矩形

学会了嵌套循环,你就可以在屏幕上"画画"了。先从最简单的矩形开始——5 行 8 列的星星:

cpp
for (int i = 1; i <= 5; i++) {       // 控制行数
    for (int j = 1; j <= 8; j++) {   // 控制每行的列数
        cout << "*";
    }
    cout << endl;                     // 每行打印完,换行
}

输出:

********
********
********
********
********

i 控制"画几行",j 控制"每行画几个"。先想清楚哪层管行、哪层管列。

13.3 打印三角形

矩形太简单了。来个三角形——第一行 1 颗星,第二行 2 颗,第三行 3 颗……

关键发现:第 i 行的星星数 = i

cpp
for (int i = 1; i <= 5; i++) {
    for (int j = 1; j <= i; j++) {   // j <= i:第i行打印i颗星
        cout << "*";
    }
    cout << endl;
}

输出:

*
**
***
****
*****

🎨 内层循环的上限 j <= i 是动态的——它会随着外层 i 变大而变大。这就是"三角形"的秘密。

如果要打印倒三角形,把上限改成 j <= 6 - i

cpp
for (int i = 1; i <= 5; i++) {
    for (int j = 1; j <= 6 - i; j++) {
        cout << "*";
    }
    cout << endl;
}

输出:

*****
****
***
**
*

13.4 打印菱形

菱形 = 正三角形 + 倒三角形。先画上半部分,再画下半部分:

cpp
int n = 4;  // 菱形一半的高度

// 上半部分(正三角)
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;
}

// 下半部分(倒三角)
for (int i = n - 1; i >= 1; i--) {
    for (int j = 1; j <= n - i; j++) cout << " ";
    for (int j = 1; j <= 2 * i - 1; j++) cout << "*";
    cout << endl;
}

输出:

   *
  ***
 *****
*******
 *****
  ***
   *

13.5 打印空心图形

"空心"的意思是——只在边框上画星,中间留白。规律:第一行、最后一行、第一列、最后一列才打印星

空心矩形:

cpp
for (int i = 1; i <= 5; i++) {
    for (int j = 1; j <= 8; j++) {
        if (i == 1 || i == 5 || j == 1 || j == 8)
            cout << "*";
        else
            cout << " ";
    }
    cout << endl;
}

输出:

********
*      *
*      *
*      *
********

|| 是"或"运算符(第 9 章学过)。"只要满足任意一个边框条件,就打星"。

13.6 九九乘法表

学嵌套循环,九九乘法表是必修课。对每一对 (i, j),输出 i × j = 积

cpp
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {        // j <= i:只打下半三角
        cout << j << "×" << i << "=" << i * j << "\t";
    }
    cout << endl;
}

输出:

1×1=1
1×2=2   2×2=4
1×3=3   2×3=6   3×3=9
1×4=4   2×4=8   3×4=12  4×4=16
...
1×9=9   2×9=18  3×9=27  4×9=36  5×9=45  6×9=54  7×9=63  8×9=72  9×9=81

\t 是制表符(Tab),让各列自动对齐,看起来更整齐。


✋ 动手试试

试试 1:把 13.3 节的三角形程序跑起来。然后把 j <= i 改成 j <= 6,看看输出变成了什么形状。

试试 2:修改三角形程序,让它打印数字三角形:第一行 1,第二行 12,第三行 123……(提示:星号改成输出 j。)

试试 3:打印一个 6 行的等腰三角形——每行星号前面有空格,让三角形居中。

试试 4:修改九九乘法表的程序,让它输出完整的矩形乘法表(j <= 9 而不是 j <= i)。


⚠️ 你踩过这些坑吗

  • [ ] 坑 1:内外层变量搞混——内层循环里写 i 却想操作列,或者内外层用同样的变量名。记住:外层用 i、内层用 j,这是全世界的习惯。
  • [ ] 坑 2:搞错内外层换行时机——cout << endl; 应该放在外层循环里、内层循环之后。如果放在内层里,每打印一个星就换一行,输出变成一竖条。
  • [ ] 坑 3:三角形内层上限写死——for (int j = 1; j <= 5; j++) 打印出来永远是矩形。三角形的关键是内层上限要用外层变量 ij <= i
  • [ ] 坑 4:空心图形的条件写反了——把"什么时候该打星"写成了"什么时候不该打"。想清楚边框是 i==1 || i==n || j==1 || j==m

📝 练习

基础题

1. 选择题

(1)嵌套循环中,外层循环执行 5 次,内层循环每次执行 10 次,内层循环总共执行多少次?   A. 5   B. 10   C. 15   D. 50

(2)以下代码输出几行星号?

cpp
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 4; j++) {
        cout << "*";
    }
    cout << endl;
}

A. 3 行,每行 4 个   B. 4 行,每行 3 个   C. 12 行,每行 1 个   D. 1 行 12 个

(3)打印三角形时,内层循环的上限通常和什么有关?   A. 固定数字   B. 外层循环变量   C. 用户输入   D. 随机数

2. 填空题

(1)嵌套循环中,____ 层循环每执行一次,____ 层循环要执行完整的一轮。

(2)打印矩形时,外层循环控制 ____,内层循环控制 ____。

(3)九九乘法表可以用嵌套循环实现:外层 i 从 1 到 ____,内层 j 从 1 到 ____。

3. 代码找错

以下代码想打印 3 行 5 列的矩形星号,有什么问题?

cpp
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 5; j++) {
        cout << "*" << endl;
    }
}

4. 读代码写输出

cpp
for (int i = 1; i <= 4; i++) {
    for (int j = 1; j <= i; j++) {
        cout << j;
    }
    cout << endl;
}

写出上面代码的输出。

提高题

5. 编程题 — 数字三角形

用嵌套循环打印下面的图案:

1
12
123
1234
12345

6. 编程题 — 等腰三角形

输入 n,打印一个 n 行的等腰三角形(居中,每行星号前面有空格):

如 n=4:

   *
  ***
 *****
*******

7. 编程题 — 空心正方形

输入一个边长 n,用星号打印一个 n×n 的空心正方形(只有四条边是星号,中间是空格)。

示例 n=5:

*****
*   *
*   *
*   *
*****

挑战题

8. 编程题 — 矩形九九乘法表

打印完整的矩形九九乘法表,格式如下(9×9 全部显示):

1×1=1   1×2=2   1×3=3   ...  1×9=9
2×1=2   2×2=4   2×3=6   ...  2×9=18
...
9×1=9   9×2=18  9×3=27  ...  9×9=81

9. 编程题 — 空心菱形

输入一个奇数 n(如 7),打印一个 n 行的空心菱形。例如 n=7 时:

   *
  * *
 *   *
*     *
 *   *
  * *
   *

🧠 本章小结

嵌套循环:
  外层(行)─── for (int i = ...)
  内层(列)─── for (int j = ...)   ← 外层每走一步,内层跑完整轮

经典应用:
  矩形    → 五行八列,内层 j<=定值
  三角形  → 第i行打i个,内层 j<=i
  倒三角  → 内层 j<=n+1-i 或 j<=6-i
  菱形    → 正三角 + 倒三角,两段组合
  空心    → 边框用 if 判断 (i==1 || i==n || j==1 || j==m)
  乘法表  → 两层 1~9,内层 j<=i(三角)或 j<=9(矩形)

📝 配套练习

共10题。嵌套循环从矩形→三角形→蛇形→杨辉三角逐级加难度。。★核心(课堂必做) ◆拓展(课后练习)

级别题号链接覆盖知识点
★ 核心J0047https://hydro.ac/d/srqc/p/J0047嵌套for、内层依赖外层
◆ 拓展J0061https://hydro.ac/d/srqc/p/J0061嵌套for、空格+字符、空心
◆ 拓展J0079https://hydro.ac/d/srqc/p/J0079嵌套for、方向控制、蛇形
◆ 拓展J0080https://hydro.ac/d/srqc/p/J0080嵌套for、递推、杨辉三角
◆ 拓展J0070https://hydro.ac/d/srqc/p/J0070三重循环、坐标空间
◆ 拓展luogu-P1980https://hydro.ac/p/luogu-P1980嵌套for+while、逐位统计
◆ 拓展luogu-P1217https://hydro.ac/p/luogu-P1217嵌套、回文构造、质数
◆ 拓展J0052https://hydro.ac/d/srqc/p/J0052双重for、等差数列求和
◆ 拓展luogu-P5720https://hydro.ac/p/luogu-P5720嵌套for、图形输出、格式
◆ 拓展luogu-P5721https://hydro.ac/p/luogu-P5721嵌套for、数字三角形变体

💡 练习建议:先完成 1 道★核心题,确保掌握本章基本方法;再完成 9 道◆拓展题,覆盖不同变式和细节。


配套练习

共10题。嵌套循环从矩形→三角形→蛇形→杨辉三角逐级加难度。★核心(课堂必做) · ◆拓展(课后练习)

级别题号链接覆盖知识点
★ 核心J0047https://hydro.ac/d/srqc/p/J0047嵌套for、内层依赖外层
◆ 拓展J0061https://hydro.ac/d/srqc/p/J0061嵌套for、空格+字符、空心
◆ 拓展J0079https://hydro.ac/d/srqc/p/J0079嵌套for、方向控制、蛇形
◆ 拓展J0080https://hydro.ac/d/srqc/p/J0080嵌套for、递推、杨辉三角
◆ 拓展J0070https://hydro.ac/d/srqc/p/J0070三重循环、坐标空间
◆ 拓展luogu-P1980https://hydro.ac/p/luogu-P1980嵌套for+while、逐位统计
◆ 拓展luogu-P1217https://hydro.ac/p/luogu-P1217嵌套、回文构造、质数
◆ 拓展J0052https://hydro.ac/d/srqc/p/J0052双重for、等差数列求和
◆ 拓展luogu-P5720https://hydro.ac/p/luogu-P5720嵌套for、图形输出、格式
◆ 拓展luogu-P5721https://hydro.ac/p/luogu-P5721嵌套for、数字三角形变体

练习建议:先在课堂完成 1 道★核心题,掌握本章基本方法;课后完成 9 道◆拓展题,覆盖不同变式和细节。

自查清单

  • [ ] 我能解释嵌套循环的内外层执行顺序
  • [ ] 我会用嵌套循环打印矩形和三角形
  • [ ] 我能组合正三角和倒三角打印菱形
  • [ ] 我能用 if 配合嵌套循环打印空心图形
  • [ ] 我能独立写出九九乘法表的三角版和矩形版

🚀 下章预告:你学会在循环里套循环了。但如果你跑到一半想停下来怎么办——脚崴了还继续跑完这圈?下章学 break 和 continue,给循环装上刹车和跳过键。