第 13 章 一层不够——嵌套循环
🏗️ 前情回顾:上章你问了「循环里干的事,本身也需要循环怎么办?」这一章就是答案。闹钟的秒针每跑一圈,分针才走一格——一层循环管一行,两层循环管一张表。
🎯 本章目标
学完这一章,你能:
- 写出嵌套的
for循环,理解外层和内层的关系 - 用嵌套循环打印矩形、三角形、菱形和空心图案
- 独立写出九九乘法表
- 在脑中模拟嵌套循环的执行过程
📖 故事引入
你有没有盯着墙上的时钟发过呆?
时钟有三根针:时针、分针、秒针。它们的运动是"嵌套"的——秒针每走 60 圈,分针走 1 格;分针每走 60 圈,时针走 1 格。
如果你要模拟这个时钟,你会怎么写?你会写三个循环,一个套在另一个里面:
对于时针从 1 到 12:
对于分针从 0 到 59:
对于秒针从 0 到 59:
滴答!这就是嵌套循环——一个循环里面还装着另一个循环。
🧱 知识讲解
13.1 什么是嵌套循环
嵌套循环就是一个循环的"身体"里面又写了一个循环。外面那个叫外层循环,里面那个叫内层循环。
想象你在上体育课。老师说:"全班 4 排,每排同学依次报数 1 到 5"。你脑子里自动就会:
对于每一排(1 到 4):
对于排里的每个人(1 到 5):
报数!写成 C++ 就是这样:
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 列的星星:
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。
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:
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 6 - i; j++) {
cout << "*";
}
cout << endl;
}输出:
*****
****
***
**
*13.4 打印菱形
菱形 = 正三角形 + 倒三角形。先画上半部分,再画下半部分:
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 打印空心图形
"空心"的意思是——只在边框上画星,中间留白。规律:第一行、最后一行、第一列、最后一列才打印星。
空心矩形:
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 = 积:
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++)打印出来永远是矩形。三角形的关键是内层上限要用外层变量i:j <= i。 - [ ] 坑 4:空心图形的条件写反了——把"什么时候该打星"写成了"什么时候不该打"。想清楚边框是
i==1 || i==n || j==1 || j==m。
📝 练习
基础题
1. 选择题
(1)嵌套循环中,外层循环执行 5 次,内层循环每次执行 10 次,内层循环总共执行多少次? A. 5 B. 10 C. 15 D. 50
(2)以下代码输出几行星号?
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 列的矩形星号,有什么问题?
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 5; j++) {
cout << "*" << endl;
}
}4. 读代码写输出
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= i; j++) {
cout << j;
}
cout << endl;
}写出上面代码的输出。
提高题
5. 编程题 — 数字三角形
用嵌套循环打印下面的图案:
1
12
123
1234
123456. 编程题 — 等腰三角形
输入 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=819. 编程题 — 空心菱形
输入一个奇数 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题。嵌套循环从矩形→三角形→蛇形→杨辉三角逐级加难度。。★核心(课堂必做) ◆拓展(课后练习)
| 级别 | 题号 | 链接 | 覆盖知识点 |
|---|---|---|---|
| ★ 核心 | J0047 | https://hydro.ac/d/srqc/p/J0047 | 嵌套for、内层依赖外层 |
| ◆ 拓展 | J0061 | https://hydro.ac/d/srqc/p/J0061 | 嵌套for、空格+字符、空心 |
| ◆ 拓展 | J0079 | https://hydro.ac/d/srqc/p/J0079 | 嵌套for、方向控制、蛇形 |
| ◆ 拓展 | J0080 | https://hydro.ac/d/srqc/p/J0080 | 嵌套for、递推、杨辉三角 |
| ◆ 拓展 | J0070 | https://hydro.ac/d/srqc/p/J0070 | 三重循环、坐标空间 |
| ◆ 拓展 | luogu-P1980 | https://hydro.ac/p/luogu-P1980 | 嵌套for+while、逐位统计 |
| ◆ 拓展 | luogu-P1217 | https://hydro.ac/p/luogu-P1217 | 嵌套、回文构造、质数 |
| ◆ 拓展 | J0052 | https://hydro.ac/d/srqc/p/J0052 | 双重for、等差数列求和 |
| ◆ 拓展 | luogu-P5720 | https://hydro.ac/p/luogu-P5720 | 嵌套for、图形输出、格式 |
| ◆ 拓展 | luogu-P5721 | https://hydro.ac/p/luogu-P5721 | 嵌套for、数字三角形变体 |
💡 练习建议:先完成 1 道★核心题,确保掌握本章基本方法;再完成 9 道◆拓展题,覆盖不同变式和细节。
配套练习
共10题。嵌套循环从矩形→三角形→蛇形→杨辉三角逐级加难度。★核心(课堂必做) · ◆拓展(课后练习)
| 级别 | 题号 | 链接 | 覆盖知识点 |
|---|---|---|---|
| ★ 核心 | J0047 | https://hydro.ac/d/srqc/p/J0047 | 嵌套for、内层依赖外层 |
| ◆ 拓展 | J0061 | https://hydro.ac/d/srqc/p/J0061 | 嵌套for、空格+字符、空心 |
| ◆ 拓展 | J0079 | https://hydro.ac/d/srqc/p/J0079 | 嵌套for、方向控制、蛇形 |
| ◆ 拓展 | J0080 | https://hydro.ac/d/srqc/p/J0080 | 嵌套for、递推、杨辉三角 |
| ◆ 拓展 | J0070 | https://hydro.ac/d/srqc/p/J0070 | 三重循环、坐标空间 |
| ◆ 拓展 | luogu-P1980 | https://hydro.ac/p/luogu-P1980 | 嵌套for+while、逐位统计 |
| ◆ 拓展 | luogu-P1217 | https://hydro.ac/p/luogu-P1217 | 嵌套、回文构造、质数 |
| ◆ 拓展 | J0052 | https://hydro.ac/d/srqc/p/J0052 | 双重for、等差数列求和 |
| ◆ 拓展 | luogu-P5720 | https://hydro.ac/p/luogu-P5720 | 嵌套for、图形输出、格式 |
| ◆ 拓展 | luogu-P5721 | https://hydro.ac/p/luogu-P5721 | 嵌套for、数字三角形变体 |
练习建议:先在课堂完成 1 道★核心题,掌握本章基本方法;课后完成 9 道◆拓展题,覆盖不同变式和细节。
自查清单:
- [ ] 我能解释嵌套循环的内外层执行顺序
- [ ] 我会用嵌套循环打印矩形和三角形
- [ ] 我能组合正三角和倒三角打印菱形
- [ ] 我能用 if 配合嵌套循环打印空心图形
- [ ] 我能独立写出九九乘法表的三角版和矩形版
🚀 下章预告:你学会在循环里套循环了。但如果你跑到一半想停下来怎么办——脚崴了还继续跑完这圈?下章学 break 和 continue,给循环装上刹车和跳过键。