Appearance
L1-15 循环控制
循环控制语句包括 break 和 continue ,这两个语句可以让循环变得更强大,减少重复的代码。
break 和 continue 一般会配合某些条件判断使用。
break语句
格式
c++
for(循环语句)
{
代码段1
if(判断条件)
break;
代码段2
}
while(循环条件)
{
代码段1
if(判断条件)
break;
代码段2
}
以 for 循环作为例子:
c++
#include<bits/stdc++.h>
using namespace std;
int main() {
for(int i = 0; i < 100; i++)
{
if(i % 3 == 2 && i % 5 == 3)
{
cout << i << endl;
break;
}
}
return 0;
}
以上程序会输出最小的 %3=2&&%5=3
的数。
在之前的选择结构的学习中, switch 语句也需要配合 break 使用。
功能
break 语句是限定转向语句。常在 switch 语句和循环语句中出现。用于跳出该结构。在循环结构的循环体中出现时,常常与条件判断语句 if 语句一起使用,满足相应条件则跳出该循环。当循环出现嵌套时,内重循环的 break 只会跳出内重循环,而回到外重循环中去。
流程
text
开始循环表达式代码段1break条件结束代码段2yesnoyesno
break 会跳出循环,并且不会执行代码段 2 。
填空题
运行下面的程序,会输出()?
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int v;
for(int i = 1; i < 100; i++) {
if(i % 3 == 0 && i % 5 == 0 && i % 2 == 0)
break;
v = i;
}
cout << v;
return 0;
}
题解
29
1、从代码可知,代码是从1开始,到2、3、5的最小公倍数就跳出循环,此时v还在等于2、3、5的最小公倍数减1
课堂练习:启蒙练习-非负数的和
通过键盘不断输入整数,不断读取,输出其中(读到负数前)所有的非负数的和。
注意:对于每组数据,题目共提供n个整数。
这一题有2种写法 1、统计已输入数字之和,直到输入的数字为负数,跳出循环。 2、读完所有数字,但是只计算第一个负数前所有的非负数的和。 第一种写法程序不会读取完全部输入,但是不会被判错...
输入格式
第一行输入一个n,第二行输入n个整数,以空格隔开
输出格式
输出一个数,表示读到负数前,所有非负数的和。
输入样例
text
4
3 4 -6 7
输出样例
text
7
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, sum = 0;
cin >> n;
for(int i = 0; i < n; i++) {
int x;
cin >> x;
if (x < 0) break;
sum += x;
}
cout << sum << endl;
return 0;
}
- 题解 1
利用循环处理多组输入数据,利用 break 跳出循环。
continue语句
格式
c++
or(循环语句)
{
代码段1
if(判断条件)
continue;
代码段2
}
while(循环条件)
{
代码段1
if(判断条件)
continue;
代码段2
}
以 while 循环作为例子:
c++
#include<bits/stdc++.h>
using namespace std;
int main() {
int i = 0, sum = 0;
while(i <= 100)
{
i++;
if(i % 5 == 0 || i % 3 == 0)
continue;
sum += i;
}
cout << sum << endl;
return 0;
}
这段程序,将会计算 100 以内,所有即不是 5 的倍数也不是 3 的倍数的数之和。
功能
continue 语句被称为继续语句。故名思意,它用于让循环继续执行下去,而跳过循环体中剩余的语句段。提前结束本次循环。在 while 循环中直接进入下一次循环的条件判断,在 for 循环中需要先进入“表达式 3 ”再进行条件判断(如图所示)。
流程
text
开始循环表达式代码段1continue条件结束代码段2yesnoyesno
根据流程, continue 并不会跳出循环,只是在满足条件时,忽略代码段 2 不执行。所以我们也可以通过另一种不使用 continue 的方法,实现同样的逻辑。仍然以上面的程序为例:
c++
#include<bits/stdc++.h>
using namespace std;
int main() {
int i = 0, sum = 0;
while(i <= 100)
{
if(i % 5 != 0 && i % 3 != 0)
sum += i;
i++;
}
cout << sum << endl;
return 0;
}
这段程序,与上面 continue 的代码,运行结果相同,对应的流程图如下:
text
开始循环表达式代码段1continue的相反条件代码段2结束yesnoyesno
单选题
关于循环,下列说法正确的是( )
A. continue语句用来跳出循环
B. 循环体只有一句话时,花括号{ }可以省略
C. while{ }do和do{ }while循环没有区别
D. 循环的控制条件可有可无
题解
B
1、continue语句用来继续执行当前语句的,然而跳出当前循环的语句是break; 2、循环体只有一句话时,花括号{ }可以省略 3、while{ }do,先判断是否满足条件在执行循环语句、do{ }while是先执行先执行循环语句后判断。 4、如果没有循环控制条件就会跳不出循环,形成死循环,就会出现运行超时
单选题
下面的代码中,cnt 最终输出结果为( )
c++
int cnt = 0, q = 1;
for (int i = 1; i <= 100; i += q) {
q++;
if (i % 5 != 0)continue;
cnt += i;
}
cout << cnt << endl;
A. 125
B. 330
C. 455
D. 1050
题解
A
读程序可知:当i等于 10、15、45、55的时候分别相加等于125
单选题
以下程序的循环体执行了( )次
c++
int main(){
int a = 3, b = 4, c = 5;
for(int i = 1; ; i++){
if(a == 3 || c <= 10) c++;
else if(a + b < c) continue;
}
}
A. 无限次
B. 3次
C. 4次
D. 5次
题解
A
for循环里面没有设置跳出循环的条件因此会执行无数次
课堂练习:启蒙练习-正数的和
先给定n,再给定n个整数,请计算出里面所有正数的和。
输入格式
第一行输入一个n, 第二行输入n个整数,以空格隔开。
输出格式
输出一个数,表示所有正整数的和。
输入样例
text
4
3 4 -6 7
输出样例
text
14
数据范围
对于10%的数据,n≤10; 对于100%的数据,n≤100,-10≤每个整数≤30。
样例解释
4个数中,-6不是正数,和为3+4+7=14
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, sum = 0;
cin >> n;
for(int i = 0; i < n; i++) {
int x;
cin >> x;
if (x > 0)
sum += x;
}
cout << sum << endl;
return 0;
}
- 题解 1
利用循环处理多组输入数据,利用 continue 跳过负数和 0 的情况。
自己写猜数游戏
随机数
我们在最初的课程中,曾经为大家讲解过一个玩猜数游戏的方法。在学习过循环之后,我们可以自己动手来写一个猜数游戏了。
首先计算机在心里想好一个 [1,100] 之间的数字(整数),由你来猜到计算机心里的这个数字。每次你猜一个答案x,计算机都会告诉你是大了还是小了。
假如这个数是由你输入的,那么就不需要猜了。所以我们首先要解决一个问题,如何让计算机想一个数,这就需要用到随机了。
c++
#include<bits/stdc++.h>
using namespace std;
int main() {
srand((int)time(0));
cout << rand() << endl;
}
这段程序每次运行的结果都不一样,这是因为 rand() 会随机返回一个 0−32767 之间的数,每次都不确定。达到这个效果,还必须要配合 srand((int)time(0)); 这句话。
一个 0−32767 之间的数,如何转换为 1−100 之间的数呢?我们把 rand() 得到的结果 %100+1 就可以了。于是程序的整体流程大概出来了:
text
随机一个1-100的数n读入用户的输入vv > n大了v < n小了结束yesnoyesno
转化为代码如下:
c++
#include<bits/stdc++.h>
using namespace std;
int main() {
srand((int)time(0));
int n = rand() % 100 + 1, v;
while(v != n) {
cin >> v;
if(v > n)
cout << "大了" << endl;
else if(v < n)
cout << "小了" << endl;
else
cout << "猜对了" << endl;
}
}
为了游戏体验更好,你可以增加一些提示类的信息,比如:
c++
#include<bits/stdc++.h>
using namespace std;
int main() {
srand((int)time(0));
int n = rand() % 100 + 1, v;
cout << "我想了一个1-100之间数字,你来猜呀!" << endl;
while(v != n) {
cout << "请输入你猜的数:" << endl;
cin >> v;
if(v > n)
cout << "大了, 你的脑洞真大" << endl;
else if(v < n)
cout << "小了, 智商需要充值" << endl;
else
{
cout << "猜对了恭喜" << endl;
system("Pause"); //暂停当前程序
}
}
}
习题
进阶习题:启蒙练习-质数判断
读入一个数N,判断这个数是不是质数(prime number)。 质数:一个数 N 除了1和它本身不存在其他约数,这样的数叫做质数。 约数:整数a除以整数b(b≠0) 除得的商正好是整数而没有余数。则a称为b的倍数,b称为a的约数。
输入格式
输入一个数N
输出格式
如果N是质数,输出"yes" 如果N不是质数,输出"no"
输入样例
text
111
输出样例
text
no
数据范围
对于100%的数据,1<N≤100;
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
for(int i = 2; i < n; i++) {
if (n % i == 0) {
cout << "no" << endl;
return 0;
}
}
cout << "yes" << endl;
return 0;
}
- 题解 1
读入 n ,然后根据质数定义,从 2 开始向后枚举 i (即, i=2,3,4,....n ),同时判断 n 是否可以整除 i ,如果可以整除,则不是质数,输出 no ,否则输出 yes 。
text
开始读入n,i=2i小于nn是i的倍数输出no结束i=i+1输出yesyesnoyesno