Skip to content

第 17 课:循环中断与继续 ​

在很多情况下,当满足特定条件时,我们不需要继续执行循环。

比如我们要计算从 1 开始的累加和,直到累加和超过 100 时停止,并输出此时累加的数。我们可以使用 while 循环,条件为 1,即一直成立。当累加值达到 100 时,使用循环中断可以立即跳出循环,提高程序效率。

循环继续则允许我们在满足某些条件时,跳过本次循环的剩余部分,直接进入下一次循环。

例如,在遍历一组数时,若只想对奇数进行某些操作,而跳过偶数,就可以使用循环继续,当遇到偶数时,直接进入下一次循环,从而避免了对偶数进行不必要的处理。

具体怎么做呢?还需要氪町博士带我们学习一下。

17.1 循环中断 break ​

break 语句:在循环结构里,break 语句的作用是立即终止当前所在的循环。程序会跳出该循环体,继续执行循环之后的语句。

比如 for 循环从 0 遍历到 10,但我们希望循环到 5 的时候就终止,则可以在 for 循环内添加 break 语句,提前终止循环,程序如下:

cpp
#include <iostream>
using namespace std;
int main()
{
    for (int i = 0; i <= 10; i++)
    {
        cout << i << " ";
        if (i == 5)
        {                // 判断 i 是否等于 5
            break;       // 若等于 5,则通过 break 语句提前终止循环
        }
    }
    return 0;
}

输出结果:0 1 2 3 4 5

17.2 实例讲解一 ​

例 1:最小倍数 ​

输入三个正整数 m、n、a,求 m 到 n 内最小的 a 的倍数(数据保证 m 到 n 内有 a 的倍数)。

【输入格式】输入一行,三个用空格隔开的整数 m、n、a。

【输出格式】输出一行,一个整数,表示从 m 到 n 内 a 的最小倍数。

【输入样例】1 20 7

【输出样例】7

【数据范围】0 ≤ m ≤ n ≤ 10000,1 ≤ a ≤ 10000。

注:原书数据范围写作"0 ≤ a ≤ 10000",因 a 作为除数不能为 0,此处已修正为 1 ≤ a ≤ 10000。

解析

  1. 从 m 到 n 内寻找 a 的最小倍数,相当于从 m 开始,每次加 1,判断是不是 a 的倍数,即:
cpp
for(int i = m;i <= n;i++)
  1. 从 m 开始,每次加 1,如果当前数是 a 的倍数,则输出并终止循环,循环体内可以这样写:
cpp
if (i % a == 0)
{
    cout << i;
    break;
}

注:原书此处条件语句括号为中文全角括号 if(i % a == 0),已修正为英文半角括号。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int m, n, a;
    cin >> m >> n >> a;
    for (int i = m; i <= n; i++)
    {
        if (i % a == 0)
        {
            cout << i;
            break;
        }
    }
    return 0;
}

17.3 循环继续 continue ​

continue 语句:跳过本次循环体中余下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为仅结束本次循环。

注意:continue 语句并没有使整个循环终止。

比如 for 循环从 0 遍历到 10,但我们希望循环到 5 的时候就跳过,则可以在 for 循环内添加 continue 语句,直接跳过 5,输出下一个数,程序如下:

cpp
#include <iostream>
using namespace std;
int main()
{
    for (int i = 0; i <= 10; i++)
    {
        if (i == 5)
        {                // 判断 i 是否等于 5
            continue;    // 若等于 5,则通过 continue 语句跳过
        }
        cout << i << " ";
    }
    return 0;
}

输出结果:0 1 2 3 4 6 7 8 9 10

17.4 实例讲解二 ​

例 2:整数之和 ​

输入两个正整数 n 和 m(m ≤ n),再输入 n 个正整数,求第 m 个到第 n 个整数之和。

【输入格式】输入两行,其中第一行输入两个用空格隔开的整数 n、m,第二行输入 n 个以空格隔开的整数 a。

【输出格式】输出一行,一个整数,表示第 m 个到第 n 个整数的和。

【输入样例】

5 3
1 2 5 7 8

【输出样例】20

注:原书输入样例的第二行数据跨页丢失(仅剩"5 3"一行),此处按输出结果 20(第 3~5 个数的和 5 + 7 + 8)补全,以保证样例自洽。

解析

  1. 这题要求我们首先输入 n 个数,可以使用 for 循环,i 从 1 开始,到 n 结束,每次加 1,循环体内为输入一个数,即:
cpp
for (int i = 1; i <= n; i++)
{
    cin >> a;
}
  1. 使用变量 s 用来保存累加的和,初始值为 0。输入的数直到第 m 个数之前,是不需要我们累加到 s 中去的,所以我们要剔除第 m 个数之前所有输入的数。也就是在循环体内添加一个判断语句,第 m 个数之前所有输入的数全部使用 continue 跳过,即:
cpp
if (i < m)
    continue;
s += a;

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int n, m, s = 0, a;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        cin >> a;
        if (i < m)
            continue;
        s += a;
    }
    cout << s;
    return 0;
}

例 3:非数字个数 ​

输入若干个字符,以 # 结尾,统计其中非数字字符的个数,不包含结尾的 #。

【输入格式】输入一行,若干个用空格隔开的字符,以 # 结尾。

【输出格式】输出一行,一个整数,表示非数字字符的个数。

【输入样例】! @ a 1 4 G #

【输出样例】4

解析

  1. 本题使用 while 循环,在循环体内输入字符型变量 a,直到输入 # 的时候才会跳出循环,即:
cpp
while (1)
{
    cin >> a;
    if (a == '#') // 如果输入的是 #
        break;    // 则跳出循环
}
  1. 循环体内需要判断 a 是不是数字,如果是数字(数字:'0' <= a <= '9'),则使用 continue 语句跳出本次循环,如果不是数字,则使用 cnt 记下非数字的个数,即:
cpp
if (a >= '0' && a <= '9')
    continue;
cnt++;

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    char a;
    int cnt = 0;
    while (1)
    {
        cin >> a;
        if (a == '#')
            break;
        if (a >= '0' && a <= '9')
            continue;
        cnt++;
    }
    cout << cnt;
    return 0;
}

基于 MIT 协议发布