第四节 C++ 选择结构

news/2025/2/16 5:11:54/

文章目录

  • 前言介绍
  • 1. if 选择结构
    • 1.1 概述
    • 1.2. 单 if 语句执行
      • 1.2.1 分号和中括号注意事项
      • 1.2.2 案例:判断天气
    • 1.3. if - else 语句结构
      • 1.3.1 案例1:考试成绩
      • 1.3.2 案例2:判断闰年
      • 1.3.3 案例3:判断三角形
    • 1.4. 多分支结构
      • 1.4.1 语法结构
      • 1.4.2 案例:成绩区间使用
    • 1.5. 嵌套选择结构
      • 1.5.1 如何嵌套
      • 1.5.2 案例 :上车找座位程序设计
    • 1.6. if 阶段编程测试
      • 1.6.1 判断奇数和偶数
      • 1.6.2 输入三个数,判断哪个数最大
      • 1.6.3 商场购物哪家划算
      • 1.6.4 快递业务计费
    • 1.7. 扩展: 三元运算符
      • 1.7.1 语法结构
      • 1.7.2 案例: 判断奇偶数
  • 2. switch 选择结构
    • 2.1 概述
    • 2.2 语法结构
    • 2.3 switch 常见问题
    • 2.4 练习案例:设计计算器

前言介绍

  1. C++中支持的三种基本的运行流程:顺序结构,选择结构,循环结构(后面再讲)。
  2. 什么是 顺序结构?
    • 程序按照顺序执行,不发生跳转,写代码的解决思路也是如此 。

1. if 选择结构

1.1 概述

  1. 怎么理解选择结构 ? 如日常生活中,出现了 需要判断选择 的时候,需要参考某些特定的条件,根据这些条件的结果,作为依据来选择 是否执行 自己的选择。
    • 当我们走出家门时,通常会看下外面的天气,如果下雨就带上雨伞。
    • 过马路时,会根据红绿灯的信息选择是否过马路。
  2. 在计算机的语言中,同样需要引入 选择结构(分支结构)描述事件 的解决过程。
  3. 判断结构要求,指定一个或多个要测试的条件,以及条件为真时要执行的语句 (必需的) 和 条件为假时要执行的语句 (可选的)

1.2. 单 if 语句执行

  1. 就是根据某个条件进行判断,符合条件就执行条件里面的代码,不符合条件。

    • 执行流程如下所示:
      在这里插入图片描述
  2. 使用案例,注意语法格式{} 括号 的使用。

    • 从控制台输入考试成绩, 考试成绩小于60分就算不及格,请设计程序。
    #include <iostream> 
    using namespace std;int main(){/*1.单个if的语法格式: if(条件判断){成立执行; } 判断外语句; */double score ; //定义考试成绩 cout<<"请输入考试成绩:" <<endl; cin>> score ; //接受控制台输入成绩 //判断语法结构 if(score<60){//满足条件执行语句 cout<<"考试成绩不合格"<<endl;		}//判断外条件cout << "程序结束" <<endl; return 0;
    } 
    

1.2.1 分号和中括号注意事项

  1. 注意事项1: 切勿在 if(); 后面加分号,这样会导致不会根据判断条件执行,不管条件是否符合,都会执行{}中的语句体。

    • 下列代码为 上述代码片段。
    //判断语法结构 if(score<60);{//满足条件执行语句 cout<<"考试成绩不合格"<<endl;		}
    

    在这里插入图片描述

  2. 注意事项2:关于{}的约束范围(如果if 选择结构没有使用{}),只有最近的一个会被约束,第二行就不会被约束。

    • 下列代码为 上述代码片段。
    //判断语法结构 if(score<60)//满足条件执行语句 cout<<"考试成绩不合格"<<endl;		cout<<"我被约束了么?"<<endl;
    

    在这里插入图片描述

1.2.2 案例:判断天气

  1. 上述知道如何使用了if单分支结构,请思考下列案例。
    • 根据天气情况判断,如果天气好 (晴), 输出,出去玩,天气不好 (雨) ,输出,在室内玩。
    • 判断 两个字符串是否相同,使用比较运算符 ==
    #include <iostream>
    using namespace std;int main(){/*输出两个结果?思考,怎么处理 *///从控制台输入  string weather; cout<<"请输入今天,天气情况(晴或者雨)"<<endl;cin>>weather; //开始使用if判断if (weather=="晴"){cout<< "去室外" <<endl; }if (weather=="雨"){cout<< "在室内" <<endl; }cout<< "end.."<<endl; 
    } 
    

1.3. if - else 语句结构

  1. 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。
    • 回想两个单if 解决的问题,还有其它问题怎么解决,所以使用 if-esle 结构。
    #include <iostream>
    using namespace std;
    #include <string> //使用string空间 
    int main(){/*1. 使用选择结构 if-esle来解决双if结构的使用天气的例子. */string weather; cout<<"请输入天气状况"<<endl;cin >> weather ; if (weather == "晴"){//符合 cout<<"今天天气状况"<<weather<<"在室内玩"<<endl; }else{ //不符合走else cout<<"今天天气状况" <<weather<<"在室外玩"<<endl; } //程序执行结束. cout<< "end..." << endl; return 0 ;
    } 
    

1.3.1 案例1:考试成绩

  1. 通过上述案例,使用if-esle结构完成案例分析,找出关键条件。
    • 妈妈承诺,如果小明语文成绩大于90,或者 数学成绩大于80,给买游戏机,否则好好学习。
    • 提示:参考 配合第三节的 逻辑运算符使用。
    #include <iostream>
    using namespace std;
    int main(){/*1.考试成绩.语文成绩大于90 数学成绩大于80 或者条件 || 否则就需要好好学习. */double Chinese;  //语文 double Maths;  //数学 cout<<"请输入语文考试成绩:"<<endl;cin>>Chinese;  cout<<"请输入数学考试成绩:"<<endl;cin>>Maths; if (Chinese>=90||Maths>=80){ cout<< "买游戏机" <<endl; } else{cout<< "好好学习,下次努力"<<endl; } return 0;
    } 
    
  • 如果要是 并且 的条件呢 ?

1.3.2 案例2:判断闰年

  1. 什么是闰年 ? 需要搞清楚这样的一个事情 。
    • 涉及到一个普通闰年,是4的倍数,但不是100的倍数, 例如2008 。
    • 世纪闰年,是400的倍数。 例如:2000年。
    #include <iostream>
    using namespace std;int main(){/*1.判断闰年 普通闰年, 能被4整除,不能被400整除.世纪润年, 能被400整除  */int year; cout<<"请输入年份"<<endl;cin >> year;//判断是否闰年 需要满足条件if(year%4==0&&year%400!=0||year%400==0){cout<< "是闰年" <<endl; }else{cout<< "不是闰年" <<endl; } 	return 0; 
    } 
    

1.3.3 案例3:判断三角形

  1. 三角形的三条边,a,b,c的值,判断是否构成三角形,若构成三角形,求三角形面积。

    • 三角形构成定理,三角形三边满足任意两边之和大于第三边的条件。
    • 思考一下,怎么思考问题和分析 ,有几种方式?
    #include <iostream>
    using namespace std;int main(){//三角形定义规则,两边之和大于一定第三边. int a;int b;int c;cout<<"请依次输入三个边的值: "<<endl;cin >>a;cin >>b;cin >>c;//判断三角形,核心定理两边之和大于第三边. if ((a+b)>c && (a+c)>b && (b+c)>a) {cout<<"三角形的面积: "<<a*b*c<< endl;  }else{cout<<"不符合条件"<<endl; } return 0; 
    } 
    
    • 另一种思维方式,反向思考方法,小于等于都不符合情况。
    // 下述为代码片段if((a+b)<=c || (a+c)<=b || (b+c)<=a) {cout<<"不符合条件"<<endl; }else{cout<<"三角形面积"<<a*b*c<<endl; } return 0; 
    

1.4. 多分支结构

1.4.1 语法结构

  1. 多分支语法结构,如下:

    • 逐步判断,看哪个条件符合。
    • 最后的 else ,根据情况,可以省略。
    	if(判断条件){执行语句体			} else if(判断条件){执行语句体} else if (判断条件){执行语句体} ...else{执行语句体} 
    
  2. 思考一下,else if 的顺序可以调换么?

1.4.2 案例:成绩区间使用

  1. 如果判断成绩区间使用,就需要使用多分支情况。

    • 输入一个成绩: 判断分数段,所给出评级。
      • 90 ~100 评级 A
      • 80 ~ 89 评级 B
      • 70 ~ 79 评级 C
      • 60 ~ 69 评级 D
      • 0 ~ 59 评级 E
    • 思考使用 单分支if , 或者 if-else 结构 能否解决上述问题 ?
    #include <iostream>
    using namespace std;int main(){
    //		- 90 ~100 之间  评级 A
    //		- 80 ~ 89  之间  评级 B
    //		- 70 ~ 79  之间  评级 C
    //		- 60 ~ 69  之间  评级 D
    //		- 0 ~  59  评级 E//使用if方式进行操作 cout<<"请输入考试成绩:"<<endl;int num; //定义num的值 cin >> num;//使用逻辑运算符控制范围 if(num>=90 && num<=100){cout<< "评级为: A"<<endl;}else if (num>=80 && num<=89){cout<< "评级为: B" <<endl;}else if (num>=70 && num <=79){cout<< "评级为: C" <<endl;}else if (num>=60 && num <=69){cout<< "评级为: D" <<endl;}else{cout<< "评级为: E" <<endl; }return 0;
    } 
    
  2. 还有更简洁的代码实现么?

    • 边界值考虑。
    • 其中思考一个很重要的问题,下列else if顺序能调换么?
    #include <iostream>
    using namespace std;int  main(){/**- 90 ~100 之间  评级 A- 80 ~ 89  之间  评级 B- 70 ~ 79  之间  评级 C- 60 ~ 69  之间  评级 D- 0 ~  59        评级 E*///对于边界值的思考.cout << "请输入考试成绩: ";int num;cin >> num; if(num>=90){cout << "评级为A" << endl;}else if (num>=80){cout << "评级为B" << endl;}else if (num>=70) {cout << "评级为C" << endl;}else if (num>=60){cout << "评级为D" << endl;}else {cout << "评级为E" << endl;} return 0;
    }
    

1.5. 嵌套选择结构

1.5.1 如何嵌套

  1. 回想今日课堂所学内容, 选择结构的几种方式,都能根据不同的场景解决问题, 现在如果有以下场景怎么解决?

    • 游泳馆游泳,买票的人才能进入, 进入之后会根据男女分别今不同的更衣室,请设计该程序。
  2. 上述分析,结果就需要再判断中,在一次进行判断,这样就是嵌套结构。

    • 语法格式如下:
    if (){//满足条件执行里面的分支结构if (){}else if (){...}} 
    
  3. 案例分析,使用嵌套结构设计程序。

    #include <iostream>
    using namespace std;int main(){/**游泳馆游泳,买票的人才能进入, 进入之后会根据男女分别今不同的更衣室。*///先分析结构string ticket; string sex;cout << "请问是否有票: "; cin>> ticket; if (ticket == "yes"){cout<< "请根据性别选择浴室: ";cin >>sex; if (sex=="男"){cout<<"进男生"; }else if (sex =="女") {cout<<"进女生";}//可以省略elseelse{cout<<"填写有误,请重新填写" ;} } else{cout<< "请先买票!"<<endl; } return 0;
    } 
    

1.5.2 案例 :上车找座位程序设计

  1. 日常做公交车,上车需要先买票,买票需要金额大于2元,然后根据是否有空座位进行,找到了就输出,有座位,没有找到,就输出没有座位。

    • 请分析上述需求,使用分支结构设程序。
    #include <iostream>
    using namespace std;int main(){//1.上车买票需要金额大于2元int money;cout<< "请刷卡: ";cin >>money;if (money>=2){cout<<"欢迎上车,寻找座位中...有坐么?"<<endl;int seat; cin>> seat;if (seat>=1){cout<<"有"<<seat<<"座位."<<endl; }else{cout<<"没有座位,只能站着"<<endl; } }else{cout<<"金额不够,请充值在乘坐"<<endl; } return 0; 
    } 
    

1.6. if 阶段编程测试

1.6.1 判断奇数和偶数

  1. 输入一个正整数,判断他是奇数还是偶数,并输出信息。

    • 什么是奇数?什么是偶数 ?
    #include <iostream>
    using namespace std;int main(){//判断奇数还是偶数cout<<"请数一个正整数:";int num; cin>> num;//逻辑分析,什么是奇数?什么是偶数? if (num%2==0){cout<<"偶数"<<endl; }else{cout<<"奇数"<<endl; } return 0; 
    } 
    

1.6.2 输入三个数,判断哪个数最大

  1. 输入三个数,输出其中最大的数。

    • 要求设置变量,使用max存放最大值。
    #include <iostream>
    using namespace std;int main(){//输入三个数,使用max存放最大值.int a,b,c,max;cout<<"输入三个数: "<<endl;cin>>a;cin>>b;cin>>c;if (a>=b&&a>=c){max = a; } else if (b>=c&&b>=a){max = b; } else if (c>=a&&c>=b){max = c; } //else 可以省略 cout <<"最大值为"<<max<<endl; return 0; 
    } 
    

1.6.3 商场购物哪家划算

  1. 商场购物,口渴想买可乐,可乐正常价格3元,家乐福打折88折,沃尔玛优惠政策“买8送一个”。

    • 从控制台输入数量,到底买哪家合适 ?
    #include <iostream>
    using namespace std;int main(){
    	 同样买num个可乐,哪个合适 ? 
    	1.家乐福实际花钱, a_money  =  num * 0.88 * 3          //每一个价格 
    	2.沃尔玛实际花钱, b_money  =  num * 3 - num*1/9 *3   //买8送一,用8个钱买9个 int num;cout<<"请输入买的个数"<<endl;cin >> num;//3. 在逻辑核心代码 int a_money  =  num * 0.88 * 3;int b_money  =  num * 3 - num*1/9 *3;  if (b_money < a_money){cout<<"沃尔玛好"<<endl; } else {cout<<"家乐福好"<<endl; } return 0; 
    } 
    

1.6.4 快递业务计费

  1. 某快递业务 收费标准, 1kg以内收费13元, 之后超过1kg部分每400g加收3元, 请根据收费标准,设计出相应程序。

    • 输入重量计算金额。
    • 提示主要在于额外费用计算, 例如, 1200即使每超过
    #include <iostream> 
    using namespace std;int main(){//1.创建重量变量int weight; //单位是克. int money=13; //基础费用13元 cout<<"请输入重量"<< endl; cin >> weight;//2.逻辑计算1000g以内13元,每超出400g的部分加收3元 if (weight<=1000 && weight>=0) {cout<<"快递的费用"<<money<<endl; }else if(weight>1000){//处理费用逻辑,超出的部分钱数 int extraWeight = weight - 1000;//核心代码,根据重量计算,不足400的按照3元收费 int extraMoney = (extraWeight + 400) / 400 * 3; int cash = money + extraMoney;cout << "总价格" << cash << "元" << endl;} return 0;
    }

1.7. 扩展: 三元运算符

1.7.1 语法结构

  1. 为了简化选择结构的判断。
    • 语法格式如下:<表达式1> ? <表达式2> : <表达式3 >
    • 注意事项就是,返回表达式的类型与接受类型一致。
	// <表达式1> ? <表达式2> : <表达式3 >//表达式结果为true 即正确, 就执行表达式2的结果,反之就执行表3的结果.#include <iostream>using namespace std;int main(){int a = 5;int b =10;//逻辑计算结果,返回类型与接受类型一致。string res =  a>b  ? "a值大" : "b值大"; cout << res <<endl; 	return 0; 
} 

1.7.2 案例: 判断奇偶数

  1. 三元运算符的目的,就是简化使用分支结构的语法形式,但是只能在简单的情况下进行减少代码的优化。
    • 使用if esle
    #include <iostream>
    using namespace std;int main(){//1. 三元运算符测试奇偶数int a;cout<< "请输入一个数: "<<endl;cin >> a; // 表达式1?表达式2:表达式3;string res = a%2==0 ?"偶数":"奇数";cout<< "结果: " << res << endl; return 0;
    } 
    

2. switch 选择结构

2.1 概述

  1. 既然有if 选择结构了为什么还需要switch结构?
    • 使用switch语句的主要目的是提供一种结构清晰、执行效率高的多分支选择方案。
    • 当条件表达式的取值是有限且确定的时候,使用switch语句能够更简洁地编写代码,也更易于阅读和维护。
    • 同时,由于switch语句的实现原理是使用跳转表来查找执行位置,所以在某些情况下执行效率会比if语句高。
  2. 但是不适合switch的情况,如果条件表达式的取值范围较广或者需要进行复杂的条件判断时,if语句通常会更加灵活和合适。

2.2 语法结构

  1. switch语法结构,基本格式如下:

    • switch(expression) 中的类型只能是 整型 或者 字符型
    • 注意,每一个表达式结束都要接一个冒号。
    • expression和 表达式必须同一种类型。
    switch(expression){case 表达式1://语法表达式break; case 表达式2://语法表达式break; ...default://执行语句 } 
    • 流程图如下:
      在这里插入图片描述
  2. 案例使用

    • 手机拨打快捷键设置。
#include <iostream>
using namespace std;int main(){//switch语法结构int num;cout<<"请输入快捷键: "<< endl; cin >> num; switch(num){case 1:cout<<"给警察打电话"<<endl;break;case 2:cout<<"给医生打电话"<<endl;break;case 3:cout<<"给救火员打电话"<<endl; break;default:cout<<"重新输入快捷键"<<endl; break; } return 0;
} 

2.3 switch 常见问题

  1. 思考几个问题?
    • case 的顺序可以变换么?
    • default可以省略么?或者位置可以发生变化么?
    • break可以不加么?
  2. 思考过后上述情况会产生一个现象叫做 “穿透现象”

2.4 练习案例:设计计算器

  1. 使用 switch结构, 设计,计算器功能, 任意输入两个数,根据输入的选择计算的符号,计算结果。
    • 思考一下使用 if 结构能 解决这样的问题么?
    • 如果是字符型,不能使用双引号" ",需要使用单引号 ' '
#include <iostream>
using namespace std;int main(){/**1. 输入任意的两个数.2. 输入符号, +  - * /  % 3. 考虑分母不能为0的时候.*///定义变量 char n;int num_1;int num_2;//定义计算结果int total_num; //2.使用键盘输入 cout<<"请输入第一个数 "; cin >> num_1; cout<<"请输入第二个数 "; cin >> num_2; cout <<"请输入符号 + - * / %:  ";cin >> n ;//定义一个标志符号int flag; switch(n){// 只接收整型,或者字符型 ,字符型 // 字符型 一定要使用 单引号 '' 双引号会被误认为字符串"" case '+':total_num=num_1+num_2;break;case '-':if(num_1>=num_2){total_num=num_1-num_2;}else{total_num=num_2-num_1;}break;case '*':total_num=num_1*num_2;break;case '/':if(num_2!=0){total_num=num_1/num_2;}else{flag=2; //标志符号 }break;case '%':if(num_2!=0){total_num=num_1 % num_2;}else{//cout<<"分母不能为0"<<endl; flag=2; //标志符号 }break;default:cout<<"请重新输入正确的符号"<<endl; break; } //根据情况输出结果if(flag==1) {cout<<"计算结果是: "<< total_num <<endl; }else{cout<<"分母不能为0"<<endl; } return 0;
} 

http://www.ppmy.cn/news/1058983.html

相关文章

智信SMS客户端包

自己做的&#xff0c;短信发送平台。不懂技术也能用。 智信SMS1.0.0.exe 第一版客户端百度网盘分享地址 链接: https://pan.baidu.com/s/11LeoacZ0uavzvLaFryY6qA?pwd1234 提取码: 1234 电话&#xff1a;18211030918

python21天打卡合集

python21天打卡day3-python数据类型 https://blog.csdn.net/seanyang_/article/details/107249402 python21天打卡day4-字符串操作 https://blog.csdn.net/seanyang_/article/details/107247413 python21天打卡Day5–list操作 https://blog.csdn.net/seanyang_/article/de…

聊聊开关和CPU之间故事

我们本篇文章来看看计算机在硬件层面究竟是怎么表示二进制的&#xff0c;CPU究竟是怎么实现的&#xff1f;通过本文的学习&#xff0c;我们也可以反过来明白为什么计算机会采用二进制了。 开关 我们在生活中&#xff0c;处处都是开关&#xff0c;比如控制灯的开关 我们可以发…

硬盘中病毒是什么原因?硬盘格式化能清除病毒吗

“我的电脑中了一个非常顽固的病毒&#xff0c;朋友建议我进行硬盘格式化来彻底清除病毒。不知道是不是真的有用&#xff0c;半信半疑下进行了硬盘格式化。当我完成操作后&#xff0c;我发现有些工作文件没有备份到。这可怎么办&#xff1f;想问下大家有没有什么方法去恢复数据…

Mybatis (3)-----分页的运用

目录 一、分页查询 二&#xff0c;特殊的字符处理 三、总结 前言&#xff1a;在我们上篇已经学的动态sql的基础上&#xff0c;今天继续讲解关于maybatis的分页&#xff0c;特殊的字符处理。希望这篇博客可以帮助到大家哦&#xff01; 一、分页查询 为什么要重写mybatis的分…

2023 CCPC 华为云计算挑战赛 D-塔

首先先来看第一轮的 假如有n个,每轮那k个 他们的高度的可能性分别为 n 1/C(n,k) n1 C(n-(k-11),1)/C(n,k) n2 C(n-(k-21),2)/C(n,k) ni C(n-(k-i1,i)/C(n,k) 通过概率和高度算出第一轮增加的期望 然后乘上m轮增加的高度加上初始高度&#xff0c;就是总共增加的高度 下面是…

【从零学习python 】69. 网络通信及IP地址分类解析

文章目录 网络通信的概念IP地址IP地址的分类A类地址B类地址C类地址D类地址E类地址私有地址 进阶案例 网络通信的概念 简单来说&#xff0c;网络是用物理链路将各个孤立的工作站或主机相连在一起&#xff0c;组成数据链路&#xff0c;从而达到资源共享和通信的目的。 使用网络…

CVE-2016-3088漏洞复现

1.背景介绍。 ActiveMQ的web控制台分三个应用&#xff0c;admin、api和fileserver&#xff0c;其中admin是管理员页面&#xff0c;api是接口&#xff0c;fileserver是储存文件的接口&#xff1b;admin和api都需要登录后才能使用&#xff0c;fileserver无需登录。 fileserver是…