CC++ & Algorithm

C++ 循环控制与综合应用

困难15
语言版本:C++Python
概述:学会用break、continue在循环中做“急刹车”和“跳过”,并综合运用循环解决问题。

循环里的“刹车”和“跳过”——用 break 和 continue 控制程序节奏

在写循环的时候,我们常常需要根据情况临时改变执行流程。比如:

  • 跑接力赛时,有人犯规,整场比赛直接结束(break)。
  • 跑接力赛时,有人摔倒了,裁判让他重新跑这一棒,比赛继续(continue)。

break 可以让你立刻跳出整个循环,不再执行后面的任何一轮;continue 则让你跳过当前这一轮剩下的代码,直接开始下一轮。学会这两个小工具,你的程序就能像小管家一样灵活应对各种突发状况。


一、break:急刹车,立刻终止整个循环

想象你在数数:从1开始加,一直加到100,但你想在总和超过1000时就停下来。用 break 就能轻松做到。

#include <iostream>
using namespace std;

int main() {
    int sum = 0;                // 总和
    for (int i = 1; i <= 100; i++) {   // 循环变量i从1到100
        sum = sum + i;          // 把i累加到sum
        if (sum > 1000) {       // 如果总和超过1000
            cout << "加到" << i << "时总和已超过1000,停止" << endl;
            break;              // 立即跳出整个for循环
        }
    }
    cout << "最终和 = " << sum << endl;
    return 0;
}

运行结果
加到45时总和已超过1000,停止
最终和 = 1035

生活中的例子
老师让同学们轮流报数,当报到的数超过50时,老师就说“停,下节课再继续”。break 就是那个“停”的口令。

常见错误
在嵌套循环(循环里还有循环)中,break 只会跳出它所在的最内层循环,不会跳出所有层。比如你写了两层 for 循环,内层的 break 只跳出内层,外层还会继续。
解决方法是:如果真想跳出所有层,可以用标志变量(后面会讲到)或者改用 return 直接结束函数。


二、continue:跳过本轮,直接进入下一轮

如果你只想打印1~10之间的奇数,遇到偶数就不打印,可以用 continue 跳过偶数。

#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 10; i++) {   // 循环变量i从1到10
        if (i % 2 == 0) {             // 如果i是偶数
            continue;                 // 跳过本轮,直接执行i++进入下一轮
        }
        cout << i << " ";             // 只有奇数才会被执行到
    }
    cout << endl;
    return 0;
}

运行结果
1 3 5 7 9

生活中的例子
跳绳比赛,每个人跳一次。如果某个人绊倒了,裁判说“不算,重新跳一次”,这个人就相当于被 continue 了——跳过这次计数,直接让下一个人跳。注意:这里不是退出比赛,只是跳过这一轮。

常见错误
while 循环中使用 continue 时,如果忘记更新循环变量,很容易造成死循环。例如:

int i = 0;
while (i < 10) {
    if (i % 2 == 0) {
        continue;   // 这里跳过了 i++,i 永远不变,会无限循环
    }
    i++;
}

正确的做法是:把循环变量的更新放在 continue 之前,或者用 for 循环(for 的更新表达式在每次循环末尾自动执行,即使 continue 也会执行)。


三、综合应用:找出100以内的所有质数

质数是只能被1和它本身整除的数(比如2、3、5、7……)。我们用一个循环检查每个数,内层判断它是否能被2到它本身减1之间的数整除。如果发现能整除,就说明它不是质数,用 break 跳出内层循环;如果内层循环完整跑完(没有 break),就说明它是质数。

#include <iostream>
using namespace std;

int main() {
    cout << "100以内的质数有:";
    for (int num = 2; num <= 100; num++) {   // num:当前检查的数
        bool isPrime = true;                 // 默认是质数
        for (int i = 2; i < num; i++) {      // i:可能的除数
            if (num % i == 0) {              // 如果num能被i整除
                isPrime = false;             // 标记为不是质数
                break;                       // 立即停止内层循环,不用再检查更大的i
            }
        }
        if (isPrime) {                       // 如果标记仍为true,说明是质数
            cout << num << " ";
        }
    }
    cout << endl;
    return 0;
}

运行结果
100以内的质数有:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

为什么用 break?
内层循环一旦发现 num 能被某个 i 整除,就已经确认不是质数了,继续检查更大的 i 毫无意义。用 break 直接跳出内层循环,节省时间。这叫做提前终止

巧妙利用“没有break”
其实还可以不用 isPrime 变量,直接利用 break 后的循环结束方式判断。但用标志变量更易懂,初学者建议先用这种方法,熟悉后再尝试更高级的技巧。


四、新手容易犯的错误汇总

  1. break 只跳出当前循环
    在嵌套循环中使用 break,它会跳出它所在的那一层,外层依然继续。如果想一次跳出所有层,可以把循环条件设为假,或者用 return 直接结束函数。

  2. continue 忘记更新循环变量(尤其在 while 中)
    如前面说的死循环。解决办法是:尽量用 for 循环,或者在 while 循环里把变量更新放在 continue 之前。

  3. 滥用 break 和 continue 让代码难读懂
    比如在很长的循环里突然 break,别人很难一眼看出什么时候会中断。建议:

    • 尽量把条件写清楚,或者把复杂逻辑拆成单独的函数。
    • 如果有多个跳出点,加注释说明。
  4. 在 switch 语句里误解 break
    switch 里的 break 是跳出 switch,不是跳出循环。如果循环里面有 switch,想跳出循环要小心使用。


五、完整可运行的示例:输入密码(最多尝试3次)

这是一个结合 whilebreak 的经典小项目:用户有3次机会输入密码,输对就成功,3次全错则锁定账户。

#include <iostream>
using namespace std;

int main() {
    int password = 123456;      // 正确的密码
    int guess;                  // 用户每次输入的猜测
    int tries = 0;              // 已经尝试的次数

    while (tries < 3) {
        cout << "请输入密码(还有" << 3 - tries << "次机会):";
        cin >> guess;

        if (guess == password) {
            cout << "登录成功!" << endl;
            break;              // 密码正确,立刻结束循环
        }

        tries++;                // 密码错误,尝试次数加1
    }

    if (tries == 3) {
        cout << "密码错误,账户锁定。" << endl;
    }

    return 0;
}

运行示例
输入111111 → 提示还有2次机会
输入222222 → 提示还有1次机会
输入123456 → 登录成功!

如果三次都错:
输入111111 → 提示2次机会
输入222222 → 提示1次机会
输入333333 → 密码错误,账户锁定。

代码解释

  • while (tries < 3) 保证最多循环3次。
  • 如果密码正确,break 跳出循环,后面的 tries++ 不再执行。
  • 如果密码错误,tries++ 增加次数,然后继续下一轮循环。
  • 循环结束后,检查 tries 是否等于3,等于说明一次都没正确过。

思考:如果不用 break,你会怎么写?可以用额外的标志变量或者 return,但 break 是最简洁的。


六、相关知识点指引

  • 嵌套循环:循环里面再套循环,是处理二维问题(如乘法表、矩阵)的基础。
  • 标志变量(flag):用一个 bool 变量记录状态,常和 break 搭配来控制多级跳出。
  • 循环优化:通过提前 break 减少不必要的计算,比如找质数时只检查到 sqrt(num) 就能加快速度。
  • 其他控制语句return 可以跳出整个函数,goto 可以跳转到任意位置(但一般不推荐使用)。

掌握了 breakcontinue,你的程序就能像交通警察一样,随时指挥车流(循环)停下来或绕过障碍物。多写几个小练习,比如“猜数字游戏”“求不大于100的最大质数”,你会越来越熟练!

例题精讲

1单选题

运行以下代码,输出结果是? for (int i = 0; i < 5; i++) { if (i == 2) break; cout << i; }

A01234
B012
C01
D0
2判断题

在C++循环中,执行continue语句后,循环体内continue之后的代码将不再执行,但循环会继续下一次迭代(如果有)。

3填空题
下面的程序输出1到10中所有不能被3整除的数。请在空白处填入合适的语句。

for (int i = 1; i <= 10; i++) {
    if (i % 3 == 0) ___;
    cout << i << " ";
}
4单选题

关于break和continue,下列描述正确的是?

Abreak只能用于switch语句
Bcontinue可以用于switch语句
Cbreak可用于循环和switch,continue只能用于循环
Dbreak和continue都可以用于任何语句块
5填空题
下面的程序计算1+2+3+...+n,但遇到5的倍数时跳过(即不加)。请补充代码。

int sum = 0, n = 10;
for (int i = 1; i <= n; i++) {
    if (___ ) continue;
    sum += i;
}
cout << sum;