LESSON_2级_07_多层分支(课件)

2025-07-10
| 30页
| 17人阅读
| 0人下载
普通

内容正文:

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 $$

资源预览图

LESSON_2级_07_多层分支(课件)
1
LESSON_2级_07_多层分支(课件)
2
LESSON_2级_07_多层分支(课件)
3
LESSON_2级_07_多层分支(课件)
4
LESSON_2级_07_多层分支(课件)
5
LESSON_2级_07_多层分支(课件)
6
相关资源
示范课
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。