内容正文:
CCF-GESP C++二级
CCF-GESP C++二级
编程能力等级认证
1
多层分支
多层分支
第七课
2
分支结构的嵌套
01
01
3
if语句的嵌套
当if语句中的执行语句又是if语句时,则形成了if语句嵌套。
if (条件1){
if (条件2) 语句1;
else 语句2;
}else{
语句3;
}
在嵌套的if语句中,if和else按照“ 就近配对 ”的原则配对,
即相距最近且还没有配对的一对if和else首先配对。
知识讲解
当程序中需要多层条件判断,实现一些复杂的功能的时候,依靠简单的分支结构和多重分支结构等等是远远不够的。所以我们还需要分支嵌套结构。此时会根据不同的条件组合,来跳转执行不同的处理语句。
4
if语句嵌套的不同形式
if (条件1){
if (条件2) 语句1;
if (条件3) 语句2;
......
}
if (条件1){
if (条件2) 语句1;
else 语句2;
}else if (条件3) {
语句3;
}else{
语句4;
}
知识讲解
if语句的嵌套还有一些其他形式:例如if语句中嵌套if语句,if else if语句中嵌套ifelse语句或者if语句
5
switch语句的嵌套
switch (表达式){
case 数值1:if (条件1) 语句1;break;
case 数值2:语句2;break;
....
case 数值n: 语句n; break;
default: 语句n+1; break;
}
switch语句中也可以嵌套if语句或者switch语句。
switch (表达式1){
case 数值1:switch (表达式2){...}
case 数值2:语句2;break;
....
case 数值n: 语句n; break;
default: 语句n+1; break;
}
知识讲解
注意switch中表达式的结果一定需要是数值(整数,字符,布尔值)。
switch语句中可以包含多个case分支语句,执行switch语句时,如果有匹配的case直接跳转到匹配的那一行往下一直执行到break为止。如果没有匹配项直接跳转到default执行到break为止。
6
判断题
(2023年3月)在if...else语句中,else子句可以嵌套if...else语句,但if子句不可以,因为会造成二义性。
正确 错误
真题解析
解析:在if...else语句中,else子句可以嵌套if...else语句,if子句也可以嵌套if else语句,所以题目中的说法是错误的。
7
判断题
嵌套的if语句可以有任意多层。
正确 错误
课堂练习
解析:if语句进行嵌套时,可以按照需求,嵌套任意多层。
8
判断题
在分支语句中,if的个数一定不小于else的个数,因为每个else的前面必须有一个if与之相对应。
正确 错误
课堂练习
解析:在分支语句中,if语句可以单独出现,else语句不能单独出现,每个else语句必须有一个与之匹配的if语句。
9
选择题
为了避免嵌套的条件分支语句if...else的二义性,程序中else总是与( )组成配对关系。
其上面距它最近的,并且没有其他else与其配对的if相配对
在同一行上的if
缩进位置相同的if
在其之前未配对的if
A
课堂练习
解析:在嵌套的分支语句中,else总是其上面距它最近的,并且没有其他else与其配对的if相配对。
10
#include<iostream>
using namespace std;
int main(){
int m,n;
cin>>m>>n;
int pay=0;
if(m<4) pay=3*n;
else{
if(m<=9) pay=4*n;
else pay=5*n;
}
cout<<pay;
return 0;
}
选择题
阅读如下程序,当输入5 2时,程序的运行结果为( )。
6
10
8
0
C
课堂练习
解析:当输入5,2时,m的值为5,n的值为2。首先判断m<4是否成立,不成立,执行else中的语句,继续判断m<=9是否成立,成立,则执行pay=4*n这条与语句。执行完成后,pay的值是8。最终输出pay的值为8。
11
选择题
现有一分段函数:
则下列程序段哪个是正确的?( )
A
x=1 a<b且c=d
x=2 a>=b
A.
if(a<b){
if(c==d) x=1;
}else x=2;
B.
if(a<b){
if(c==d) x=1;
else x=2;
}
C.
if(a>b){
if(c==d) x=1;
}else x=2;
if(a>b)
x=2;
else{
if(c==d) x=1;
}
D.
课堂练习
解析:选项A,当a<b成立时,c==d也成立, x=1; 当a<b不成立,也就是a>=b时,x=2, 所以该选项正确;
选项B,当a<b成立时,c==d也成立,x=1,否则a<b成立,c==d不成立时,x=2,所以该选项错误;
选项C,当a>b成立时,并且c==d也成立,x=1,当a>b不成立,也就是a<=b时,x=2,所以该选项错误;
选项D,当a>b成立时,x=2,当a>b不成立,也就是a<=b,并且c==d成立时,x=1,所以该选项错误;
12
选择题
现有x和y的关系如下表:
x y
x<0 x-1
x=0 x
x>0 x+1
给出的程序段中能正确表示上面关系的是( )
A.
y=x+1;
if(x>=0){
if(x==0) y=x;
else y=x-1;
}
B.
y=x-1;
if(x!=0){
if(x>0) y=x+1;
else y=x;
}
C.
if(x<=0){
if(x<0) y=x-1;
else y=x;
}else y=x+1;
D.
y=x;
if(x<=0){
if(x<0) y=x-1;
else y=x+1;
}
C
课堂练习
本题正确选项C,详见下一页题目解析。
13
题目解析
A.
y=x+1;
if(x>=0){
if(x==0) y=x;
else y=x-1;
}
B.
y=x-1;
if(x!=0){
if(x>0) y=x+1;
else y=x;
}
C.
if(x<=0){
if(x<0) y=x-1;
else y=x;
}else y=x+1;
D.
y=x;
if(x<=0){
if(x<0) y=x-1;
else y=x+1;
}
x y
x<0 x-1
x=0 x
x>0 x+1
x y
x<0 x-1
x=0 x + 1
x>0 x
x y
x<0 x + 1
x=0 x
x>0 x - 1
x y
x<0 x
x=0 x - 1
x>0 x+1
课堂练习
题目解析:
选项A,当x的值为0时,y=x, 当x>0时,y=x-1,当x<1时,y=x+1, 所以该选项错误;
选项B,当x的值为0时,y=x-1,当x>0时,y=x+1,当x<0时,y=x,所以该选项错误;
选项C,当x的值为0时,y=x,当x>0时,y=x+1,当x<1时,y=x-1,所以该选项正确;
选项D,当x的值为0时,y=x+1,当x>0时,y=x,当x<1时,y=x-1,所以该选项错误;
14
选择题
下列条件语句中输出结果与其他语句不同的是( )。
A.
D
if(a) cout<<x;
else cout<<y;
B.
if(a==0) cout<<y;
else cout<<x;
C.
if(a!=0) cout<<x;
else cout<<y;
D.
if(a==0) cout<<x;
else cout<<y;
课堂练习
解析:选项A,如果a的结果为真,则输出x,否则输出y;
选项B,如果a的结果为假,则输出y,否则输出x;
选项C,如果a的结果不为假,则输出x,否则输出y;
选项D,如果a的结果为假,输出x,否则输出y。
前三个选项都是a为真,输出x,为假,输出y。只有最后一个选项与前三个选项相反。
15
选择题
int a=100, x=10, y=20, m=5, n=0;
if(x<y){
if(!m) a=1;
}else{
if(n) a=10;
}
cout<<a;
阅读如下程序,分析以下程序的执行结果为( )。
D
1
10
0
100
课堂练习
解析:首先判断x<y是否成立,成立则继续!m的结果是否为true,m的值为5,!m的值则为0,因此不能执行a=1。此时if-else语句执行结束,直接输出a的值为100。
16
选择题
已知a=1, b=0,则执行以下语句后输出为( )。
B
**0**
**0****2**
**0****1****2**
有语法错误
switch(a){
case 1:
switch(b){
case 0: cout<<"**0**"; break;
case 1: cout<<"**1**"; break;
}
case 2:
cout<<"**2**";break;
}
课堂练习
解析:外层switch语句根据a的值,执行case 1分支,执行另一个switch语句,根据b的值,执行case0分支,输出**0**。由于外层switch语句的case1分支没有break语句,因此继续执行外层switch语句的case2分支,输出**2**。所以程序执行之后输出的应该为**0****2**。
17
判断生肖
【问题描述】
我们中国人对老鼠的感情可不一般,鼠是中国传统十二生肖之首。2020年是鼠年,那么 2020 年出生的“20 后”是否都是“鼠宝宝"呢?
其实不是,2020年1月1日~1月24 日出生的“20 后”,仍然是“猪宝宝",因为他们出生在农历己亥猪年;大年初一(1月25日)及之后出生的“20 后”才是“鼠宝宝”。
输入一个2020年出生的宝宝的生日,请你编写程序判断一下,是“猪宝宝”还是“鼠宝宝”?
【输入描述】
一行,两个正整数 month, day,中间使用一个空格隔开,分别代表宝宝出生的月份及日子。(1≤month≤12, 1≤day≤31)
【输出描述】
若是“猪宝宝”请输出 "Pig";若是“鼠宝宝”请输出 "Mouse"。
【输入样例】
1 23
【输出样例】
Pig
【注意】
输入的日期为有效的日期。例如:6月31日非有效日期。
课堂练习
强调:输入的日期为2020年的有效日期。
18
思路分析
输入月 m和日 d。
int m,d;
cin>>m>>d;
根据输入日期判断生肖。
if(m==1){
if(d>=1&&d<=24) cout<<"Pig";
else cout<<"Mouse";
}
月(m) 日(d)
1 1~24
25~31
鼠
猪
鼠
2 1~29
3 1~31
4 1~30
5 1~31
6 1~30
7 1~31
8 1~31
9 1~30
10 1~31
11 1~30
12 1~31
else{
cout<<"Mouse";
}
课堂练习
题目解析:
1、输入要查询的某月和某日,存储到整形变量m和d中
2、根据输入的日期判断生肖。
题目中已知,1月份中,1~24日出生的孩子属性为猪,25~31日出生的孩子属性为鼠。因此程序中,我们需要判断如果输入的月份为1月,即m==1成立时,当输入的日在1~24之间,则输出Pig,否则输出“Mouse”。除了1月之外,其余月份出生的孩子属性均为鼠,因此需要再添加一条else语句,如果m==1不成立,则执行else语句,直接输出"Mouse"。
19
【完整代码】
#include <iostream>
using namespace std;
int main(){
int m,d;
cin>>m>>d;
if(m==1){
if(d>=1&&d<=24) cout<<"Pig";
else cout<<"Mouse";
}else{
cout<<"Mouse";
}
return 0;
}
课堂练习
完整代码
20
判断日期格式
【问题描述】
要求输入两个正整数,表示2020年的一个日期,判断此日期是否输入正确。
【输入描述】
第一行,两个正整数a、b,分别表示2020年的某月、某日。(1≤a、b≤10000)
【输出描述】
判断输入的日期是否正确,若正确输出"yes",否则输出"no"。
【输入样例1】
2 30
【输出样例1】
no
【输入样例2】
6 28
【输出样例2】
yes
课堂练习
读题
21
思路分析
输入某月 a、某日 b。
int a,b;
cin>>a>>b;
判断输入的日期是否正确,正确输出"yes",否则输出"no"。
//判断月份是否正确(月:1~12)
if(a>=1&&a<=12){
}else{
}
//根据输入月份,判断日是否正确
cout<<"no";
课堂练习
题目解析:
1、输入要查询的月和日,保存到两个整型变量中
2、判断输入的日期是否正确,如果正确则输出"yes",错误则输出"no"。
日期由月和日组成,月份之间的有些日期范围是不同的,只有当月份正确时,才能根据月份判断日是否正确。如果月份都不正确,就不用判断日额,可以直接输出"no"。一年一共有12个月,因此月份的范围是1~12。如果a>=1&&a<=12成立,则要根据输入的月份,判断日是否正确,否则,直接输出“no”。
22
根据输入月份,判断日是否正确
月(a) 日(b)
1、3、5、7、8、10、12 1~31
4、6、9、11 1~30
2 1~29
if(a==1||a==3||a==5||a==7||a==8||a==10||a==12){
}
else if(a==4||a==6||a==9||a==11){
}
else{
}
if(b>=1&&b<=31) cout<<"yes";
else cout<<"no";
if(b>=1&&b<=30) cout<<"yes";
else cout<<"no";
if(b>=1&&b<=29) cout<<"yes";
else cout<<"no";
课堂练习
如何根据输入月份,判断日是否正确呢?
我们应该先明确2020年每个月,日期的范围。其中1、3、5、7、8、10、12月,应该是1~31日,另外4、6、9、11月,应该是1~30日,每年的2月比较特殊,闰年是29天,平年是28天,由于2020年是闰年,所以2月,应该是从1~29日。
因此我们需要根据这三种情况分别进行判断,其中1、3、5、7、8、10、12是一种情况,4、6、9、11是一种情况,2月单独是一种情况。
这里我们可以使用if else if语句进行判断,如果a==1||a==3||a==5||a==7||a==8||a==10||a==12条件成立时,需要判断日期是否在1~31之间,也就是判断b>=1&&b<=31是否成立,如果成立则输出yes,否则输出no。否则如果a==1||a==3||a==5||a==7||a==8||a==10||a==12条件成立时,需要判断日期是否在1~30之间,也就是判断b>=1&&b<=30是否成立,如果成立则输出yes,否则输出no。否则,就是2月的情况,需要判断日期是否在1~29之间,也就是判断b>=1&&b<=29是否成立,如果成立则输出yes,否则输出no。
23
思路分析
//判断月份是否正确(月:1~12)
if(a>=1&&a<=12){
//根据输入月份,判断日是否正确
if(a==1||a==3||a==5||a==7||a==8||a==10||a==12){
if(b>=1&&b<=31) cout<<"yes";
else cout<<"no";
}
else if(a==4||a==6||a==9||a==11){
if(b>=1&&b<=30) cout<<"yes";
else cout<<"no";
}
else{
if(b>=1&&b<=29) cout<<"yes";
else cout<<"no";
}
}else cout<<"no";
判断输入的日期是否正确,正确输出"yes",否则输出"no"。
课堂练习
这样我们就完成了第二步,使用if语句的嵌套,先判断输入的月份是否正确,再根据输入的月份,判断日期是否正确。
24
【完整代码】
#include <iostream>
using namespace std;
int main() {
int a, b;
cin>>a>>b;
if(a>=1&&a<=12){
if(a==1||a==3||a==5||a==7||a==8||a==10||a==12){
if(b>=1&&b<=31) cout<<"yes";
else cout<<"no";
}
else if(a==4||a==6||a==9||a==11){
if(b>=1&&b<=30) cout<<"yes";
else cout<<"no";
}
else{
if(b>=1&&b<=29) cout<<"yes";
else cout<<"no";
}
}else cout<<"no";
return 0;
}
课堂练习
完整代码
25
景区出票系统
【问题描述】
某新开景区想要实现出票系统,已知该景区在4~10月为旺季,成人(18-60)票价为60元,儿童(<18)票价为半价,老人(>60)票价为20。其余月份为淡季,成人票价为40,其他人票价均为20。编写程序:输入月份,购票人数,以及每个购票人的年龄,计算买票需要支付的总钱数。
【输入描述】
一行,一个正整数,代表月份m。(1≤m≤12)
一行,一个正整数,代表购票人数n。(1≤n≤1000)
一行,n个整数,每个数字之间使用空格隔开,代表每个购票人的年龄age。(0≤age≤100)
【输出描述】
一个正整数,代表买票需要支付的总钱数。
【输入样例】
6
5
26 27 2 60 62
【输出样例】
230
课堂练习
读题时需要重点强调景区的票价如何规定。
26
思路分析
int m,n;
cin>>n;
输入月份m 和 购票人数 n。
根据输入的月份选择不同的购票方案,计算购票总钱数。
if(m>=4&&m<=10){
}else{
}
旺季
淡季
1、输入n名购票人的年龄
2、计算购票总支出
1、输入n名购票人的年龄
2、计算购票总支出
月份 人员 票价
4~10(旺季) 成人(18~60) 60元
儿童(<18) 30元
老人(>60) 20元
1~3
11~12
(淡季) 成人 40元
老人、儿童 20元
课堂练习
题目解析:
1、输入月份和购票人数,分别保存到整型变量m和n中
2、根据输入的月份选择不同的购票方案,计算购票总钱数。景区的收票根据月份分为旺季和淡季,它们定的票价各不相同。4~10月为旺季,1~3,11~12月为淡季,因此我们需要先根据月份来判断是旺季还是淡季,再根据不同的票价计算购票花费。这里我们使用if else语句根据两种情况进行判断,如果m>=4&&m<=1成立,则为旺季,否则是淡季,无论是这两种情况中的哪一种,都需要先输入n名购票人的年龄,再计算购票总支出。
27
for(int i=1; i<=n; i++){
cin>>age;
//边输入,边统计
if(age>=18&&age<=60) sum+=60;
else if(age<18) sum+=30;
else sum+=20;
}
思路分析
根据输入的月份选择不同的购票方案,计算购票总钱数。
if(m>=4&&m<=10){
}else{
}
1、输入n名购票人的年龄
2、计算购票总支出
1、输入n名购票人的年龄
2、计算购票总支出
月份 人员 票价
4~10(旺季) 成人(18~60) 60元
儿童(<18) 30元
老人(>60) 20元
1~3
11~12
(淡季) 成人 40元
老人、儿童 20元
int age;
int sum=0;
for(int i=1; i<=n; i++){
cin>>age;
if(age>=18&&age<=60) sum+=40;
else sum+=20;
}
记录总钱数
课堂练习
题目解析:
我们先来看如何计算在旺季的时候,n名购票人所需要的花费。这里我们先利用循环来逐一输入每名购票人的年龄,循环的次数为n次,这里创建一个变量age来记录每名购票人的年龄。之后根据每个人的年龄来计算票价,最终我们要计算的是总票价,因此先创建一个变量sum用来记录总票价。如果年龄在18~60,则为成人,票价为60,令sum+=60,否则如果年龄<18,则为儿童,票价为30,令sum+=30。否则年龄>60,为老人,票价为20元,令sum+=20。当售票为淡季的时候也是这样处理,先循环输入n每名购票人的年龄,如果年龄在18~60,为成人,票价则为40,令sum+=40,否则,票价均为20。
28
【完整代码】
#include <iostream>
using namespace std;
int main(){
int m,n;
cin>>m>>n;
int age, sum=0;
if(m>=4&&m<=10){
for(int i=1; i<=n; i++){
cin>>age;
if(age>=18&&age<=60) sum+=60;
else if(age<18) sum+=30;
else sum+=20;
}
}else{
for(int i=1; i<=n; i++){
cin>>age;
if(age>=18&&age<=60) sum+=40;
else sum+=20;
}
}
cout<<sum;
return 0;
}
课堂练习
完整代码
29
感谢你的学习
30
$$