Skip to content

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