Skip to content

第8章 多层循环语句 ​

🎯 本章学习目标 ​

学完本章,你将能够:

  • ✅ 掌握 while、do-while、for 三种循环的语法
  • ✅ 理解循环三要素(初始化、条件、更新)
  • ✅ 区分 while 与 do-while 的执行时机差异
  • ✅ 掌握双重循环的执行规则(外层走一步,内层走一圈)
  • ✅ 学会计算嵌套循环的执行次数
  • ✅ 能用嵌套循环打印矩形、三角形、九九乘法表
  • ✅ 掌握 break 和 continue 的区别与使用
  • ✅ 理解 break 只跳出本层循环的特性
  • ✅ 学会用枚举思想解决简单问题
  • ✅ 掌握求和、计数、求最值三大循环套路
  • ✅ 理解死循环成因和 off-by-one 边界错误

🗺️ 本章知识图谱 ​

多层循环语句
├── 三种循环基础
│   ├── while:先判断后执行,最少0次
│   ├── do-while:先执行后判断,最少1次
│   ├── for:计数循环首选(初始化;条件;更新)
│   └── 循环三要素:初始化、条件、更新
├── 循环嵌套 ⭐⭐⭐⭐⭐
│   ├── 执行规则:外层走一步,内层走一圈
│   ├── 执行次数:外层×内层(内层随外层变化则逐圈累加)
│   ├── 外层控制"行",内层控制"列"
│   └── 循环变量跟踪表
├── 图形打印经典题型
│   ├── 矩形:外层固定行,内层固定列
│   ├── 直角三角形:内层j从1到i
│   ├── 倒三角形:外层倒着数
│   └── 九九乘法表:式子j*i=积
├── break 与 continue
│   ├── break:跳出本层循环(急刹车)
│   ├── continue:跳过本次循环(跨水坑)
│   └── break只跳一层,想跳多层需用标志变量
├── 枚举思想雏形
│   ├── 两数之和:双重循环枚举
│   ├── 凑硬币:两重循环+第三量计算
│   └── 鸡兔同笼:一重循环+第二量计算
├── 三大基础套路
│   ├── 求和:累加器 sum=0,sum+=x
│   ├── 计数:计数器 cnt=0,满足条件cnt++
│   └── 求最值:打擂法 max=首值,更大就替换
└── 常见错误
    ├── 死循环:忘记更新、更新方向反了
    ├── off-by-one:< 和 <= 混淆
    └── 内层循环变量忘记重置

一、三种循环语句回顾 ​

循环就是让计算机重复执行一段代码。二级考纲要求掌握三种循环:while、do...while、for。

1.1 while 循环:先判断,后执行 ⭐⭐⭐⭐ ​

cpp
while (条件) {
    循环体;
}

执行流程:先判断条件 → 条件为真才执行循环体 → 回来再判断。如果一开始条件就为假,循环体一次都不执行。

循环三要素(写循环缺一不可,忘记"更新"就会死循环🔥):

要素作用示例(求 1+2+…+100)忘记的后果
① 初始化循环开始前给变量赋初值int i = 1, sum = 0;变量是垃圾值,结果全错
② 循环条件决定什么时候继续/停止while (i <= 100)条件写错 → 少算或多算
③ 循环更新每次循环改变变量,推动走向结束i++;永远满足条件 → 死循环 ❌
cpp
#include <iostream>
using namespace std;
int main() {
    int i = 1, sum = 0;        // ① 初始化
    while (i <= 100) {         // ② 循环条件
        sum = sum + i;
        i++;                   // ③ 循环更新(千万不能忘!)
    }
    cout << sum << endl;       // 输出:5050
    return 0;
}

易错点 ⚠️: while (i <= 100) 条件为假时循环体一次都不执行。例如 int i = 5; while (i > 10) ...,循环体直接跳过——这是和 do-while 最大的区别,判断题高频出现。

1.2 do...while 循环:先执行,后判断 ⭐⭐⭐ ​

cpp
do {
    循环体;
} while (条件);      // 注意末尾有分号!

执行流程:先执行一次循环体 → 再判断条件 → 为真就继续。无论条件真假,循环体至少执行一次。

典型场景:菜单选择、密码重试——至少要让用户输入一次,输错了再重来。

cpp
#include <iostream>
using namespace std;
int main() {
    int pwd;
    do {
        cin >> pwd;                        // 先执行:至少输入一次
        if (pwd != 888)
            cout << "密码错误,重试" << endl;
    } while (pwd != 888);                  // 后判断:不对就继续
    cout << "登录成功!" << endl;
    return 0;
}
// 输入:
// 123
// 456
// 888
// 输出:
// 密码错误,重试
// 密码错误,重试
// 登录成功!

高频考点 🔥:

  • while:先判断后执行,条件为假时0 次;
  • do-while:先执行后判断,至少 1 次;
  • C++ 的 do-while 末尾必须有分号 while(条件);,漏写编译报错;

1.3 for 循环:计数循环的首选 ⭐⭐⭐⭐⭐ ​

当循环次数已知时(比如"打印 5 行""枚举 1~100"),for 最简洁。

C++ 写法: for (初始化; 条件; 更新) { 循环体; }

cpp
for (int i = 1; i <= 100; i++) {   // 初始化; 条件; 更新 三部分写在一行
    sum += i;
}

1.4 三种循环对比总表 ​

对比项whiledo-whilefor
判断时机先判断后执行先执行后判断先判断后执行
最少执行次数0 次1 次0 次
适用场景次数不定,靠条件结束(如读到特定值)至少执行一次(菜单、重试)次数已知的计数循环
C++ 语法while(c){...}do{...}while(c);for(init;c;upd){...}

三种循环本质上可以互相改写,考试中计数优先 for、条件不定用 while、至少一次用 do-while。


二、循环嵌套(本章核心 🔥🔥🔥) ​

2.1 什么是循环嵌套 ​

循环里面再写循环,就是循环嵌套。最常见的是双重循环(两层),二级考试以双重为主。

执行规则一句话记住:

外层循环走一步,内层循环走一整圈。

cpp
for (int i = 1; i <= 3; i++) {        // 外层:控制"行"
    for (int j = 1; j <= 4; j++) {    // 内层:控制"列"
        cout << i << "," << j << "  ";
    }
    cout << endl;                     // 内层走完一圈,外层换一行
}

输出(实际运行核对 ✅):

1,1  1,2  1,3  1,4
2,1  2,2  2,3  2,4
3,1  3,2  3,3  3,4

2.2 双重循环执行次数:外 × 内 ⭐⭐⭐⭐⭐ ​

内层循环体总执行次数 = 外层次数 × 内层次数。

  • 外层循环 m 次,每次内层都完整执行 n 次 → 内层循环体一共执行 m × n 次。
  • 上例:外层 3 次 × 内层 4 次 = 12 次。
外层 i内层 j 取值内层执行次数
i=11,2,3,44 次
i=21,2,3,44 次
i=31,2,3,44 次
合计—3×4 = 12 次

高频考点 🔥: 选择题常给一段双重循环问"循环体执行多少次"或"输出几个数"。算法:先数外层转几圈,再数每圈内层转几圈,相乘。注意内层范围若与外层变量有关(如 j 从 1 到 i),就要逐圈累加(见乘法表分析)。

2.3 循环变量跟踪表:读懂嵌套循环的神器 ​

遇到"阅读程序写输出"的题,不要用眼睛硬看,拿出草稿纸画跟踪表,把每一圈的变量值填进去。例如:

cpp
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= i; j++) {   // 注意:内层上界是 i!
        cout << "*";
    }
    cout << endl;
}
外层 i内层 j 取值内层次数本行输出
111*
21, 22**
31, 2, 33***

总执行次数 = 1+2+3 = 6 次(不是 3×3!因为内层上界随 i 变化)。

易错点 ⚠️: 内层循环的范围依赖外层变量时(j<=i、j<i 等),每一圈内层次数都不同,必须列表逐圈算,切忌直接 m×n。


三、经典图形打印 ⭐⭐⭐⭐⭐ ​

图形打印是二级编程题超高频题型。万能思路:外层循环控制行数,内层循环控制每行的符号个数,每行打完换行。

3.1 例题1:打印矩形 ​

题目: 打印 4 行、每行 5 个 * 的矩形。

思路: 行数固定 4 → 外层 i 循环 4 次;每行 5 个星 → 内层 j 循环 5 次打印 *(不换行);内层结束后 cout << endl; 换行。

cpp
#include <iostream>
using namespace std;
int main() {
    for (int i = 1; i <= 4; i++) {      // 外层:4行
        for (int j = 1; j <= 5; j++) {  // 内层:每行5个*
            cout << "*";
        }
        cout << endl;                   // 一行打完,换行
    }
    return 0;
}

输出(实际运行核对 ✅):

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

3.2 例题2:打印直角三角形 ​

题目: 打印 n=5 行的直角三角形,第 i 行有 i 个 *。

思路: 关键规律——第 i 行打印 i 个星,所以内层循环次数 = 外层变量 i。

cpp
#include <iostream>
using namespace std;
int main() {
    int n = 5;
    for (int i = 1; i <= n; i++) {      // 第 i 行
        for (int j = 1; j <= i; j++) {  // 本行打印 i 个*(次数随 i 增长!)
            cout << "*";
        }
        cout << endl;
    }
    return 0;
}

输出(实际运行核对 ✅):

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

3.3 例题3:打印倒三角形 ​

题目: 打印 n=5 行的倒三角,第 1 行 5 个星,逐行减少到 1 个。

思路: 外层倒着数:i 从 n 递减到 1,内层每行打印 i 个星。

cpp
#include <iostream>
using namespace std;
int main() {
    int n = 5;
    for (int i = n; i >= 1; i--) {      // 外层倒着数:5,4,3,2,1
        for (int j = 1; j <= i; j++) {  // 第 i 行打印 i 个*
            cout << "*";
        }
        cout << endl;
    }
    return 0;
}

输出(实际运行核对 ✅):

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

3.4 例题4:九九乘法表 🔥🔥🔥 ​

题目: 打印九九乘法表,第 i 行输出 i 个式子 j*i=积(j 从 1 到 i)。

思路: 外层 i 控制"行"(第二个乘数,1~9),内层 j 控制"列"(第一个乘数,1~i)。第 i 行有 i 个式子,内层共执行 1+2+…+9 = 45 次。

cpp
#include <iostream>
#include <iomanip>                    // setw 所需头文件
using namespace std;
int main() {
    for (int i = 1; i <= 9; i++) {          // 外层:行,i 是第二个乘数
        for (int j = 1; j <= i; j++) {      // 内层:列,j 从1到i
            cout << j << "*" << i << "="
                 << left << setw(2) << i*j  // 积占2位左对齐,排版整齐
                 << " ";
        }
        cout << endl;                       // 每行结束换行
    }
    return 0;
}

输出(实际运行核对 ✅):

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*5=5  2*5=10 3*5=15 4*5=20 5*5=25
1*6=6  2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7  2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8  2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
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

图形题万能模板 🔥:

  1. 定行数:外层循环跑几行(正三角 i 从小到大,倒三角 i 从大到小);
  2. 定每行符号数:内层循环跑几次——矩形是固定值,三角是 i 或 n-i+1;
  3. 定换行:内层走完一圈,立刻换行;
  4. 打印符号用"不换行输出"(cout<<"*";)。

把这个模板套到数字三角形、字母三角形上同样有效,比如把 * 换成 j 就打印出 1 / 12 / 123 / 1234。


四、break 与 continue:循环的"急刹车"和"跳过" ⭐⭐⭐⭐ ​

关键字作用生活类比范围
break立刻跳出本层循环,循环提前结束跑步遇到红灯,直接停赛只跳一层
continue跳过本次循环剩下的语句,直接进入下一次判断跑步跨过一个水坑,继续跑不结束循环
cpp
#include <iostream>
using namespace std;
int main() {
    for (int i = 1; i <= 10; i++) {
        if (i % 3 == 0) continue;   // 3的倍数:跳过本次,不打印
        if (i > 7) break;           // 超过7:立刻结束整个循环
        cout << i << " ";
    }
    cout << endl;
    return 0;
}
// 输出:1 2 4 5 7

执行过程跟踪:

ii%3==0?i>7?动作
1否否打印 1
2否否打印 2
3是—continue,跳过
4否否打印 4
5否否打印 5
6是—continue,跳过
7否否打印 7
8否是break,循环结束

高频考点 🔥:

  • break 只跳出"本层"循环!双重循环中内层写 break,只结束内层,外层照常转。想一次跳出多层需要借助标志变量,或 C++ 的 goto(了解即可:goto 标号; 可直接跳到指定位置,能跳出多层循环,但会破坏程序结构,考试只要求认识,不建议在编程题中使用)。
  • continue 是"这次算了,下次继续",循环没有结束;break 是"整个循环到此为止"。

五、枚举思想雏形:用双重循环"穷举" ⭐⭐⭐⭐ ​

三级会系统学习枚举法,二级阶段先建立雏形:把所有可能的情况一个个试过去,满足条件就记录。一个变量不确定用一层循环,两个变量都不确定就用双重循环。

5.1 例题1:穷举两数之和 ​

题目: 在 1~8 中找出两个不同的数,使它们的和等于 9,输出所有数对。

思路: 两个数 a、b 都不确定 → 双重循环枚举。为避免重复(如 1+8 和 8+1 算同一组),让 b 从 a+1 开始枚举。

cpp
#include <iostream>
using namespace std;
int main() {
    for (int a = 1; a <= 8; a++) {
        for (int b = a + 1; b <= 8; b++) {   // b 从 a+1 开始,避免重复数对
            if (a + b == 9) {
                cout << a << "+" << b << "=9" << endl;
            }
        }
    }
    return 0;
}

输出(实际运行核对 ✅):

1+8=9
2+7=9
3+6=9
4+5=9

5.2 例题2:百钱百鸡简化版(凑硬币) ​

题目: 用 1 分、2 分、5 分硬币凑出 1 角钱(10 分),每种硬币数量不限,共有多少种凑法?

思路: 枚举 5 分硬币 x 枚(0~2)、2 分硬币 y 枚(0~5),1 分硬币数量 z = 10 - 5x - 2y 直接算出,z ≥ 0 就是一种合法凑法。这正是"双重循环 + 第三量直接计算"的经典套路。

cpp
#include <iostream>
using namespace std;
int main() {
    int cnt = 0;
    for (int x = 0; x <= 2; x++) {          // 5分硬币:最多2枚
        for (int y = 0; y <= 5; y++) {      // 2分硬币:最多5枚
            int z = 10 - 5*x - 2*y;         // 1分硬币数量直接算
            if (z >= 0) {                   // 1分硬币数不能为负
                cnt++;
            }
        }
    }
    cout << "共有 " << cnt << " 种凑法" << endl;
    return 0;
}
// 输出:共有 10 种凑法

枚举套路小结 🔥: 确定枚举范围 → 双重循环逐一代入 → if 检验条件 → 计数或输出。范围尽量收紧(5 分硬币最多 2 枚而不是 10 枚),能直接算出来的量就不要再开第三层循环。


六、典型编程题:求和/计数/求最值、因子与质数 ⭐⭐⭐⭐⭐ ​

6.1 三大基础套路:求和、计数、求最值 ​

循环题的半壁江山都是这三个套路,务必形成肌肉记忆:

套路核心写法初始化循环内动作
求和累加器sum = 0满足条件 sum += x
计数计数器cnt = 0满足条件 cnt++ / cnt += 1
求最值打擂台max = 第一个数(或极小值)if (x > max) max = x;

例:输入 n 个整数,求和、计数(统计正数个数)、求最大值

cpp
#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    int sum = 0, cnt = 0, mx = -1000000;   // 求和、计数、最大值初始化
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        sum += x;                          // 求和:累加
        if (x > 0) cnt++;                  // 计数:正数才+1
        if (x > mx) mx = x;                // 打擂台:更大就替换
    }
    cout << "和=" << sum << " 正数个数=" << cnt << " 最大值=" << mx << endl;
    return 0;
}
// 输入:5  -3 8 2 -1 6
// 输出:和=12 正数个数=3 最大值=8

6.2 例题:找因子 ​

题目: 输入正整数 n,输出它的所有因子(能整除 n 的正整数)。

思路: 枚举 i 从 1 到 n,若 n % i == 0(余数为 0),i 就是因子。

cpp
#include <iostream>
using namespace std;
int main() {
    int n = 12;
    for (int i = 1; i <= n; i++) {
        if (n % i == 0) {          // 余数为0 → i 能整除 n
            cout << i << " ";
        }
    }
    cout << endl;
    return 0;
}
// 输出:1 2 3 4 6 12

6.3 例题:质数初步判断 ​

题目: 输出 2~20 之间所有的质数。质数:大于 1,且只能被 1 和自身整除的数。

思路(二级基础版): 对每个数 n,枚举除数 i 从 2 到 n-1,只要有一个能整除 n,就不是质数(用 break 提前结束);全部都不能整除,才是质数。

cpp
#include <iostream>
using namespace std;
int main() {
    for (int n = 2; n <= 20; n++) {
        bool isPrime = true;             // 先假设 n 是质数
        for (int i = 2; i < n; i++) {    // 枚举可能的因子
            if (n % i == 0) {
                isPrime = false;         // 找到因子 → 不是质数
                break;                   // 不用再试了,提前退出内层
            }
        }
        if (isPrime) cout << n << " ";
    }
    cout << endl;
    return 0;
}
// 输出:2 3 5 7 11 13 17 19

高频考点 🔥: 质数判断的"假设-推翻"模式——先用布尔变量 isPrime = true 假设是质数,内层循环一旦发现因子就置 false 并 break;循环结束后看标志位下结论。注意 1 不是质数,2 是最小的质数。


七、死循环与边界错误:循环题两大"坑" ⚠️ ​

7.1 死循环:程序停不下来 ​

死循环成因错误示例后果
忘记更新循环变量while(i<=10){ sum+=i; } 漏了 i++i 永远是初值,无限循环
更新方向写反for(int i=1;i<=10;i--)i 越来越小,永不到 10
条件恒为真while(1) / while(true) 且没有 break无限循环(故意写时必须配 break)
break 永远执行不到跳出条件写错死循环

while(true)(也可写 while(1);)本身不是错——模拟 do-while、菜单程序都要用它,但内部必须有能到达的 break,否则就是死循环。

7.2 差一错误(off-by-one):多一次还是少一次 ​

需求正确写法常见错误错误后果
循环 n 次i=1;i<=ni=1;i<n少循环 1 次
数组/累加边界<= 与 < 分清混用首尾元素出错

避坑方法:循环变量跟踪表。 考试时在草稿纸上列出:循环开始前变量初值 → 每一圈条件判断结果 → 变量更新后的值 → 循环结束时变量是多少。手工走 2~3 圈 + 检查"最后一圈",边界错误立刻现形。

易错点 ⚠️: 写完循环务必问自己三个问题:① 循环变量初始化了吗?② 条件在边界值(第一次、最后一次)时对吗?③ 每圈都在朝结束方向更新吗?三问能避开 90% 的循环错题。


八、📝 实战练习 ​

练习题 1(单选题) ​

题目: 下面程序中,cout 输出语句共执行多少次?( )

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

A. 7  B. 12  C. 3  D. 4

🔑 点击查看答案与解析

答案: B

解析: 外层 3 圈(i=1,2,3),每圈内层完整执行 4 次(j=1,2,3,4),总次数 = 3 × 4 = 12 次,选 B。


练习题 2(编程题) ​

题目: 输入正整数 n(1≤n≤9),打印 n 行数字三角形:第 i 行依次输出 1 到 i。

样例输入: 4样例输出:

1
12
123
1234
🔑 点击查看答案与解析

参考答案(C++11):

cpp
#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {       // 外层:n行
        for (int j = 1; j <= i; j++) {   // 第i行打印 1~i
            cout << j;
        }
        cout << endl;
    }
    return 0;
}

练习题 3(编程题) ​

题目: 鸡兔同笼简化版:笼子里有鸡和兔共 20 只,脚共 56 只。请用枚举法编程求鸡和兔各多少只。

🔑 点击查看答案与解析

思路: 枚举鸡 x 只(0~20),兔 = 20 - x 只;检验脚数 2x + 4(20-x) 是否等于 56。

参考答案(C++11):

cpp
#include <iostream>
using namespace std;
int main() {
    for (int x = 0; x <= 20; x++) {       // x:鸡的数量
        int y = 20 - x;                   // 兔的数量
        if (2*x + 4*y == 56) {            // 脚共56只
            cout << "鸡" << x << "只,兔" << y << "只" << endl;
        }
    }
    return 0;
}
// 输出:鸡12只,兔8只

练习题 4(程序阅读题) ​

题目: 阅读以下 C++ 程序,写出输出结果:

cpp
#include <iostream>
using namespace std;

int main() {
    int sum = 0;
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) continue;   // 偶数跳过
        if (i > 7) break;           // 大于7就结束
        sum += i;
    }
    cout << sum << endl;
    return 0;
}

A. 25  B. 16  C. 36  D. 10

🔑 点击查看答案与解析

答案: B

解析: 逐圈跟踪:

ii%2==0?i>7?动作sum
1否否累加sum=1
2是—continue,跳过sum=1
3否否累加sum=4
4是—continue,跳过sum=4
5否否累加sum=9
6是—continue,跳过sum=9
7否否累加sum=16
8否是break,跳出循环sum=16

最终 sum = 1+3+5+7 = 16,选 B。

🔥 考点总结:continue 是"这次算了,下次继续"(不结束循环);break 是"到此为止"(结束本层循环)。偶数被 continue 跳过了,i=8 时触发 break 提前退出。


练习题 5(单选题) ​

题目: 下列说法正确的是( )

① for(int i=0; i<5; i++) 循环体执行 5 次 ② do-while 循环的循环体至少执行一次 ③ while 循环的循环体至少执行一次 ④ 双重循环中,内层 break 可以跳出外层循环

A. ①②  B. ②③  C. ①④  D. ②④

🔑 点击查看答案与解析

答案: A

解析:

  • ① 正确 ✅:i 从 0 到 4,共 5 个值(0,1,2,3,4),循环体执行 5 次;
  • ② 正确 ✅:do-while 先执行后判断,无论条件真假,循环体至少执行一次;
  • ③ 错误 ❌:while 先判断后执行,条件一开始就为假时循环体一次都不执行(最少 0 次);
  • ④ 错误 ❌:break 只跳出当前所在那一层循环,内层 break 只能跳出内层,外层循环继续转。想一次跳出多层需要用标志变量或 goto。

选 A(①②)。

💡 记忆口诀:while 可能 0 次,do-while 至少 1 次,break 只跳一层。


练习题 6(程序阅读题) ​

题目: 阅读以下 C++ 程序,写出输出结果:

cpp
#include <iostream>
using namespace std;

int main() {
    int cnt = 0;
    for (int i = 1; i <= 4; i++) {
        for (int j = 1; j <= i; j++) {
            if (i + j > 4) cnt++;
        }
    }
    cout << cnt << endl;
    return 0;
}

A. 4  B. 5  C. 6  D. 10

🔑 点击查看答案与解析

答案: C

解析: 逐圈跟踪内层循环中满足 i+j > 4 的次数:

外层 i内层 j 取值i+j > 4?计数+1
i=1j=11+1=2 > 4?否0
i=2j=13 > 4?否0
j=24 > 4?否0
i=3j=14 > 4?否0
j=25 > 4?是+1
j=36 > 4?是+1
i=4j=15 > 4?是+1
j=26 > 4?是+1
j=37 > 4?是+1
j=48 > 4?是+1

合计:i=1 贡献 0 次,i=2 贡献 0 次,i=3 贡献 2 次,i=4 贡献 4 次,总计 = 0+0+2+4 = 6 次。

选 C。

🔥 解题技巧:内层循环次数依赖外层变量时,必须逐圈列表计算,不能简单用 外层×内层。列表法虽然慢,但不会错。


练习题 7(判断题) ​

题目: 判断下列说法是否正确,正确的打 ✓,错误的打 ×。

① for 循环的三个部分(初始化、条件、更新)都可以省略。( )

② 循环嵌套时,内层循环变量会在每次外层循环开始时自动重新初始化。( )

③ while(1) 一定是死循环。( )

④ continue 语句的作用是结束整个循环。( )

⑤ 打印 n 行直角三角形,内层循环体共执行 n(n+1)/2 次。( )

🔑 点击查看答案与解析

答案: ① ✓ ② ✓ ③ × ④ × ⑤ ✓

解析:

  • ① ✓:for 的三部分都可以省略(但分号不能省),如 for(;;) 相当于 while(1);
  • ② ✓:内层 for 循环的初始化语句(如 int j = 1)每次外层循环都会重新执行,所以 j 会被重置;
  • ③ ×:while(1) 本身条件恒为真,但如果循环体内有能到达的 break,就不是死循环。死循环的关键是"永远跳不出来";
  • ④ ×:continue 只跳过本次循环剩余语句,直接进入下一次判断,循环并没有结束;结束整个循环的是 break;
  • ⑤ ✓:直角三角形第 i 行 i 个星,总次数 = 1+2+3+…+n = n(n+1)/2。这是等差数列求和公式,选择题常考。

练习题 8(编程题) ​

题目: 输入正整数 n,打印 n 行的等腰三角形(用 * 组成)。

输入样例:

4

输出样例:

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

(提示:第 i 行有 2i−1 个星号,前面有 n−i 个空格)

🔑 点击查看答案与解析

参考代码(C++):

cpp
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    for (int i = 1; i <= n; i++) {          // 外层:n行
        // 第1步:打印前面的空格(n-i个)
        for (int j = 1; j <= n - i; j++) {
            cout << " ";
        }
        // 第2步:打印星号(2*i-1个)
        for (int j = 1; j <= 2 * i - 1; j++) {
            cout << "*";
        }
        // 第3步:换行
        cout << endl;
    }
    return 0;
}
// 输入 4:
// 第1行:3空格 + 1星 → "   *"
// 第2行:2空格 + 3星 → "  ***"
// 第3行:1空格 + 5星 → " *****"
// 第4行:0空格 + 7星 → "*******"

解析要点:

  • 等腰三角形 = 空格三角形 + 星号三角形,每行先打印空格再打印星号;
  • 第 i 行星号个数 = 2×i−1(奇数递增:1, 3, 5, 7…);
  • 第 i 行前面空格数 = n−i(逐行减少:n-1, n-2, …, 0);
  • 这是嵌套循环的进阶考法——一行里有两个内层循环(先打空格、再打星号)。

💡 图形题万能思路:先分析每行有什么(空格+符号),各有多少个(找规律),然后用内层循环分别打印,最后换行。


九、📊 考点总结表 ​

考点重要程度出题形式
while 循环三要素(初始化/条件/更新)⭐⭐⭐⭐选择/判断/编程
do-while 先执行后判断、至少一次⭐⭐⭐⭐选择/判断
C++ for(初始化;条件;更新) 语法⭐⭐⭐⭐程序填空
双重循环执行次数(m×n,内层依赖外层要逐圈累加)⭐⭐⭐⭐⭐选择/阅读
图形打印(矩形/三角/倒三角/九九乘法表)⭐⭐⭐⭐⭐编程大题
break(跳本层)与 continue(跳本次)⭐⭐⭐⭐选择/阅读/编程
枚举雏形(两数之和、凑硬币/百钱百鸡)⭐⭐⭐⭐编程题
求和/计数/求最值三大套路⭐⭐⭐⭐⭐编程大题
因子、质数初步判断⭐⭐⭐⭐编程/填空
死循环成因与 off-by-one 边界错误⭐⭐⭐⭐选择/判断

⭐ 必背速记卡 ​

┌─────────────────────────────────────────────────────┐
│  1. 循环三要素:初始化、条件、更新,缺一不可           │
│  2. while:先判断后执行,条件为假时最少0次            │
│  3. do-while:先执行后判断,循环体至少1次             │
│  4. do-while末尾有分号:while(条件);                  │
│  5. for循环:for(初始化;条件;更新),计数循环首选      │
│  6. 嵌套循环:外层走一步,内层走一整圈                │
│  7. 外层控制行,内层控制列,每行结束换行              │
│  8. 内层次数固定:总次数=外层次数×内层次数            │
│  9. 内层依赖外层:逐圈累加(如三角形:1+2+…+n)       │
│ 10. break:跳出本层循环(急刹车),只跳一层           │
│ 11. continue:跳过本次循环剩余语句(跨水坑)          │
│ 12. 求和套路:sum=0,循环中sum+=x                     │
│ 13. 计数套路:cnt=0,满足条件cnt++                    │
│ 14. 求最值套路:打擂法,mx=首值,更大就替换           │
│ 15. 死循环三大因:忘更新、方向反、条件恒真无break     │
└─────────────────────────────────────────────────────┘

📌 下一章:第 9 章《数学函数》——绝对值、平方根、最值、幂与取整、随机数。

百炼成钢,融会贯通