第 17 课:循环中断与继续
在很多情况下,当满足特定条件时,我们不需要继续执行循环。
比如我们要计算从 1 开始的累加和,直到累加和超过 100 时停止,并输出此时累加的数。我们可以使用 while 循环,条件为 1,即一直成立。当累加值达到 100 时,使用循环中断可以立即跳出循环,提高程序效率。
循环继续则允许我们在满足某些条件时,跳过本次循环的剩余部分,直接进入下一次循环。
例如,在遍历一组数时,若只想对奇数进行某些操作,而跳过偶数,就可以使用循环继续,当遇到偶数时,直接进入下一次循环,从而避免了对偶数进行不必要的处理。
具体怎么做呢?还需要氪町博士带我们学习一下。
17.1 循环中断 break
break 语句:在循环结构里,break 语句的作用是立即终止当前所在的循环。程序会跳出该循环体,继续执行循环之后的语句。
比如 for 循环从 0 遍历到 10,但我们希望循环到 5 的时候就终止,则可以在 for 循环内添加 break 语句,提前终止循环,程序如下:
#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。
解析
- 从 m 到 n 内寻找 a 的最小倍数,相当于从 m 开始,每次加 1,判断是不是 a 的倍数,即:
for(int i = m;i <= n;i++)- 从 m 开始,每次加 1,如果当前数是 a 的倍数,则输出并终止循环,循环体内可以这样写:
if (i % a == 0)
{
cout << i;
break;
}注:原书此处条件语句括号为中文全角括号
if(i % a == 0),已修正为英文半角括号。
参考代码
#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,输出下一个数,程序如下:
#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)补全,以保证样例自洽。
解析
- 这题要求我们首先输入 n 个数,可以使用 for 循环,i 从 1 开始,到 n 结束,每次加 1,循环体内为输入一个数,即:
for (int i = 1; i <= n; i++)
{
cin >> a;
}- 使用变量 s 用来保存累加的和,初始值为 0。输入的数直到第 m 个数之前,是不需要我们累加到 s 中去的,所以我们要剔除第 m 个数之前所有输入的数。也就是在循环体内添加一个判断语句,第 m 个数之前所有输入的数全部使用 continue 跳过,即:
if (i < m)
continue;
s += a;参考代码
#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
解析
- 本题使用 while 循环,在循环体内输入字符型变量 a,直到输入 # 的时候才会跳出循环,即:
while (1)
{
cin >> a;
if (a == '#') // 如果输入的是 #
break; // 则跳出循环
}- 循环体内需要判断 a 是不是数字,如果是数字(数字:'0' <= a <= '9'),则使用 continue 语句跳出本次循环,如果不是数字,则使用 cnt 记下非数字的个数,即:
if (a >= '0' && a <= '9')
continue;
cnt++;参考代码
#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;
}