内容正文:
CCF-GESP C++一级
CCF-GESP C++一级
编程能力等级认证
循环结构2
第九课
循环结构2
第九课是循环结构
2
while循环
01
01
第一部分是while循环
3
while(条件) 语句;
当
循环条件
循环体
开始
条件
语句;
true
false
结束
while循环的语法和执行流程
知识讲解
while循环的语法格式:
要先写一个while关键字,while翻译过来就是当的意思,表示当某某情况下。
后面是一对小括号,小括号中写入的是循环的条件
紧接着是循环语句,也就是循环体。
这里强调以下:循环题可以是一条语句,也可以是复合语句。
再看while循环的执行流程:
先条件成立是否成立,
如果成立的情况下,才执行循环体;
条件不成立,循环结束!
4
选择题
int n=5;
int cnt=1;
while(n>=0){
cnt+=1;
n-=2;
}
cout<<cnt;
(2023年9月)下面C++代码执行后的输出是( )。
3
4
6
7
B
n cnt
5 2
3 3
1 4
-1 循环结束
真题解析
n初始赋值为5,每次n减少2,循环条件是n>=0,所以while循环3次,cnt初始赋值为1,tnt=1+(1+1+1)=4
5
循环次数已知时,一般使用for循环:
循环次数未知时,一般使用while循环:
求班里n名学生的总分
计算1~n的数字之和
计算任意整数各个数位上的数字之和
登录时输入密码,输入错误则重复输入,直至正确为止
for循环和while循环都可以有循环变量、循环条件、循环步长,两种循环可以互相转换,同一种功能两种循环都能实现。
for循环和while循环
知识讲解
for循环和while循环都可以有循环变量、循环条件、循环步长,
两种循环可以互相转换,同一种功能两种循环都能实现。
但是两种循环有自己的适用场景,在不同的场景下,
我们需要去选择使用合适的循环。
6
(样题)能用while语句编写的循环,就可以使用for语句编写出具有同样功能的循环。
判断题
正确 错误
真题解析
能用while语句编写的循环,就可以使用for语句编写出具有同样功能的循环。for循环和while循环可以相互转换,题目说法正确
7
(2023年9月)小明的幸运数
【问题描述】
所有个位数为k的正整数,以及所有k的倍数,都被小明称为“k幸运数”。小明想知道正整数L和R之间(包括L和R) 所有k幸运数的和,你能帮帮他吗?
要求:使用while循环或者for循环实现。
【输入描述】
输入3行。第一行包含一个正整数k,第二行包含一个正整数L,第三行包含一个正整数R。约定2≤k≤9,1≤L≤R≤1000。
【输出描述】
输出1行,符合题意的幸运数之和。
【样例输入1】
7
1
10
【样例输出1】
7
【样例输入2】
7
10
20
【样例输出2】
31
真题解析
此题为2023年9月的真题,使用while循环或者for循环实现
8
(2023年9月)小明的幸运数
【样例输入1】
7
1
10
【样例输出1】
7
【样例输入2】
7
10
20
【样例输出2】
31
1 2 3 4 5 6 7 8 910
10 11 12 13 14 15 16 17 18 19 20
真题解析
样例解释1 1和10之间共有1个7幸运数:7。因为7既是7的倍数,个位数又为7。因此,结果为7。
样例解释2 10和20之间共有2个7幸运数:14和17。14是7的倍数,17的个位数为7。因此,结果为31。
9
思路分析
① 定义三个变量,按要求输入三个整数
int k,L,R;
cin>>k>>L>>R;
cout<<sum<<endl;
while(L<=R){
L++;
}
if(L%10==k||L%k==0)
sum+=L;
int sum=0;
② 使用while循环遍历范围内的整数
③ 定义变量sum,保存满足条件的数之和
如果 是k的倍数 或者 个位数为k
进行累加
④ 输出累加和sum
真题解析
1、定义三个变量,按要求输入三个整数
2、使用while循环遍历范围内的整数,循环条件为L<=R,步伐为1,在循环中进行判断,如果是k的倍数或者个位数为k,只要满足其中一个条件就说明L是幸运数,将该数进行累加
3、定义变量sum,保存满足条件的数之和,sum+=L
4、输出累加和sum
10
写一写(while循环)
#include <iostream>
using namespace std;
int main(){
int k,L,R,sum=0;
cin>>k>>L>>R;
while(L<=R){
if(L%10==k||L%k==0)
sum+=L;
L++;
}
cout<<sum<<endl;
return 0;
}
真题解析
11
写一写(for循环)
#include <iostream>
using namespace std;
int main(){
int k,L,R,sum=0;
cin>>k>>L>>R;
for(;L<=R;L++){
if(L%10==k||L%k==0)
sum+=L;
}
cout<<sum<<endl;
return 0;
}
真题解析
使用for循环实现时,循环变量开始值就是输入的变量L的值,循环条件是L<=R,循环步伐为1,在循环中进行判断,如果满足条件就进行累加,最后输出结果
12
do-while循环
02
02
第二部分是do-while循环
13
do
while (条件) ;
条件
结束
true
false
语句
开始
关键字
语句;
分号
循环语句可以是一条语句也可以是复合语句
当语句是复合语句时,需要使用大括号括起来
循环语句至少会执行一次
do while循环
知识讲解
循环语句可以是一条语句也可以是复合语句
当语句是复合语句时,需要使用大括号括起来
循环语句至少会执行一次
14
先判断条件是否成立,
成立则执行循环语句。
先执行一次循环语句,
再判断条件是否成立,
成立继续执行循环语句。
条件
结束
true
false
语句
开始
while循环
do while循环
条件
语句
结束
true
false
开始
while循环和do while循环
知识讲解
while循环和do while循环的区别:
while循环先判断条件是否成立,成立则执行循环语句。
do while循环先执行一次循环语句,再判断条件是否成立,成立继续执行循环语句。
15
(2023年6月)do…while语句的循环体至少会执行一次。
判断题
正确 错误
真题解析
本题主要考察 C++中的 do...while 语句执行逻辑;do...while 会先执行一 次循环体,然后再判别表达式。当表达式结果为“真”时,返回重新执行循环体, 如此反复,直到表达式结果为“假”为止,此时循环结束。所以本题正确。
16
(2023年9月)在C++语言中,do-while循环不可能导致死循环,但while有可能。
判断题
正确 错误
真题解析
都有可能。do-while 循环首先执行循环体,然后检查条件是否满足。这意味着即使条件一开始不满足,循环体至少会执行一次。如果条件永远不满足,do-while 循环就会导致死循环。
同样,while 循环也可以导致死循环,如果条件永远为真,循环将永不结束。所以题目说法错误
17
【问题描述】
小明刚刚学习了如何判断平年和闰年,他想知道两个年份之间(包含起始年份和终止年份)有几个闰年。你能帮帮他吗?
要求:使用while循环或者do-while循环实现。
【输入描述】
输入一行,包含两个整数,分别表示起始年份和终止年份。
约定年份在1到 2022之间。
【输出描述】
输出一行,包含一个整数,表示闰年的数量。
【样例输入1】
2018 2022
【样例输出1】
1
(样题)有几个闰年
【样例输入2】
2000 2004
【样例输出2】
2
真题解析
之前学习过如何判断一个年份是否为闰年,本题为给定一个范围内的年份,判断有几个闰年
18
思路分析
cout<<cnt<<endl;
① 定义两个变量,输入起始年份和终止年份
int s,t;
cin>>s>>t;
② 使用while循环遍历范围内的年份
while(s<=t){
s++;
}
if(s%400==0||(s%4==0&&s%100!=0))
cnt++;
int cnt=0;
如果是闰年
计数变量加1
③ 定义变量cnt,统计闰年的个数
④ 输出结果
真题解析
1、定义两个变量,输入起始年份和终止年份
2、使用while循环遍历范围内的年份,循环条件为s<=t,即开始年份小于等于截止年份,循环步伐为1,在循环中进行判断,判断是否为如年,利用之前学习的知识,判断闰年的条件为s%400==0||(s%4==0&&s%100!=0),如果条件成立说明是闰年,闰年的个数加1
3、定义变量cnt统计闰年的个数
4、输出结果cnt即闰年的个数
19
【完整代码】 (while循环)
#include <iostream>
using namespace std;
int main(){
int s,t,cnt=0;
cin>>s>>t;
while(s<=t){
if(s%400==0||(s%4==0&&s%100!=0))
cnt++;
s++;
}
cout<<cnt<<endl;
return 0;
}
真题解析
20
【完整代码】(do-while循环)
#include <iostream>
using namespace std;
int main(){
int s,t,cnt=0;
cin>>s>>t;
do{
if(s%400==0||(s%4==0&&s%100!=0))
cnt++;
s++;
}while(s<=t);
cout<<cnt<<endl;
return 0;
}
真题解析
此题也可以使用do-while循环实现,循环体就是判断是否为闰年,如果是进行累加,循环条件是s<=t,最后输出cnt的值即可
21
【问题描述】
对一个整数n,如果其各个位数的数字相加得到的数m能整除n,则称n为自整除数。例如21,21%(2+1)==0,所以21是自整除数。现要求输入一个整数,判断是否为自整除数。
【输入描述】
一行,整数n(10<=n<=1000)。
【输出描述】
如果是自整除数则输出Yes,否则输出No。
【样例输入1】
45
【样例输出1】
Yes
自整除数
【样例输入2】
155
【样例输出2】
No
课堂练习
22
【样例输入1】
45
【样例输出1】
Yes
自整除数
【样例输入2】
155
【样例输出2】
No
45%(4+5)==0
155%(1+5+5)==1
1、数位分离,计算各数位数字之和
2、判断能否整除,输出对应结果
课堂练习
样例1:先对输入的数字进行数位分离,45分离为4和5,和为9,45对9取余结果为0,所以45是自整除数,输出Yes
样例2:先对输入的数字进行数位分离,155分离为1、5、5,和为11,155对11取余结果为1,所以155不是自整除数,输出No
总结出需要两个步骤,第一步进行数位分离,并计算各数位数字之和,第二步判断能否整除,并输出对应的结果
23
n % 10;
n /=10;
n % 10;
n /=10;
n % 10;
5
n15
5
n1
1
n0
n /=10;
结束
例如:155
百 十 个
1 5 5
5
5
1
数位分离
课堂练习
怎样进行数位分离呢,以155为例:
先求个位上的数字,然后除10,将十位上的数字挪到个位上,
再求新数字中个位数字,再将新数字个位去除,
重复这个过程,就可以求出每个数位上的数字
之前我们都是一位一位求出每个数位上的数字,
但是这种方法针对与数位个数已知的数字是可行的,
但是在该题目中用户输入的数字,数位个数未知的,
所以我们要使用循环的方式来进行求解
24
n!=0
true
false
n%10
n/=10
数位分离
n % 10;
n /=10;
n % 10;
n /=10;
n % 10;
5
n15
5
n1
1
n0
n /=10;
结束
课堂练习
由于数位是不确定的,因此我们可以使用while循环来解决这个问题
再利用循环解决这个问题的时候,我们要分析循环条件是什么?
我们来看循环什么时候结束呢?
当n为0的时候循环结束,那么循环的条件我们就可以写成n!=0
循环中需要重复的就是两个步骤
第一步:要计算当前这个数的个位,也就是令n%10求出个位
第二步:再将新数字个位去除,将十位上的数字挪到个位上
也就是令n/=10
25
③ 判断能否整除,输出对应结果
if(n%sum==0) cout<<"Yes";
else cout<<"No";
思路分析
① 定义变量n,输入一个整数
int n;
cin>>n;
② 进行数位分离,并计算各数位数字之和
int m=n;
int sum=0;
while(m!=0){
sum+=m%10;
m/=10;
}
课堂练习
1、定义变量n,输入一个整数
2、进行数位分离,并计算各数位数字之和,因为输入的整数n在最后要进行取余运算,所以为了不改变n的值,将n的值保存到变量m中,对m进行数位分离,定义变量sum,将分离出来的数字保存到变量sum中
3、判断能否整除,输出对应结果,使用变量n对计算出的累加和sum进行取余运算,如果取余结果为0,说明能整除是自整除数,输出Yes,否则不能整除,说明不是自整除数,输出No
26
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int m=n;
int sum=0;
while(m!=0){
sum+=m%10;
m/=10;
}
if(n%sum==0) cout<<"Yes";
else cout<<"No";
return 0;
}
写一写
课堂练习
感谢你的学习
28
$$