文章目录
- 前言介绍
- 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 练习案例:设计计算器
前言介绍
- C++中支持的三种基本的运行流程:顺序结构,选择结构,循环结构(后面再讲)。
- 什么是 顺序结构?
- 程序按照顺序执行,不发生跳转,写代码的解决思路也是如此 。
- 程序按照顺序执行,不发生跳转,写代码的解决思路也是如此 。
1. if 选择结构
1.1 概述
- 怎么理解选择结构 ? 如日常生活中,出现了 需要判断选择 的时候,需要参考某些特定的条件,根据这些条件的结果,作为依据来选择 是否执行 自己的选择。
- 当我们走出家门时,通常会看下外面的天气,如果下雨就带上雨伞。
- 过马路时,会根据红绿灯的信息选择是否过马路。
- 在计算机的语言中,同样需要引入 选择结构(分支结构) 来 描述事件 的解决过程。
- 判断结构要求,指定一个或多个要测试的条件,以及条件为真时要执行的语句 (必需的) 和 条件为假时要执行的语句 (可选的)。
1.2. 单 if 语句执行
-
就是根据某个条件进行判断,符合条件就执行条件里面的代码,不符合条件。
- 执行流程如下所示:
- 执行流程如下所示:
-
使用案例,注意语法格式 中
{}
括号 的使用。- 从控制台输入考试成绩, 考试成绩小于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: 切勿在
if();
后面加分号,这样会导致不会根据判断条件执行,不管条件是否符合,都会执行{}
中的语句体。- 下列代码为 上述代码片段。
//判断语法结构 if(score<60);{//满足条件执行语句 cout<<"考试成绩不合格"<<endl; }
-
注意事项2:关于{}的约束范围(如果if 选择结构没有使用{}),只有最近的一个会被约束,第二行就不会被约束。
- 下列代码为 上述代码片段。
//判断语法结构 if(score<60)//满足条件执行语句 cout<<"考试成绩不合格"<<endl; cout<<"我被约束了么?"<<endl;
1.2.2 案例:判断天气
- 上述知道如何使用了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 语句结构
- 一个 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:考试成绩
- 通过上述案例,使用
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:判断闰年
- 什么是闰年 ? 需要搞清楚这样的一个事情 。
- 涉及到一个普通闰年,是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:判断三角形
-
三角形的三条边,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 语法结构
-
多分支语法结构,如下:
- 逐步判断,看哪个条件符合。
- 最后的
else
,根据情况,可以省略。
if(判断条件){执行语句体 } else if(判断条件){执行语句体} else if (判断条件){执行语句体} ...else{执行语句体}
-
思考一下,
else if
的顺序可以调换么?
1.4.2 案例:成绩区间使用
-
如果判断成绩区间使用,就需要使用多分支情况。
- 输入一个成绩: 判断分数段,所给出评级。
- 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; }
- 输入一个成绩: 判断分数段,所给出评级。
-
还有更简洁的代码实现么?
- 边界值考虑。
- 其中思考一个很重要的问题,下列
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 如何嵌套
-
回想今日课堂所学内容, 选择结构的几种方式,都能根据不同的场景解决问题, 现在如果有以下场景怎么解决?
- 游泳馆游泳,买票的人才能进入, 进入之后会根据男女分别今不同的更衣室,请设计该程序。
-
上述分析,结果就需要再判断中,在一次进行判断,这样就是嵌套结构。
- 语法格式如下:
if (){//满足条件执行里面的分支结构if (){}else if (){...}}
-
案例分析,使用嵌套结构设计程序。
#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 案例 :上车找座位程序设计
-
日常做公交车,上车需要先买票,买票需要金额大于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 判断奇数和偶数
-
输入一个正整数,判断他是奇数还是偶数,并输出信息。
- 什么是奇数?什么是偶数 ?
#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 输入三个数,判断哪个数最大
-
输入三个数,输出其中最大的数。
- 要求设置变量,使用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 商场购物哪家划算
-
商场购物,口渴想买可乐,可乐正常价格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 快递业务计费
-
某快递业务 收费标准, 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> ? <表达式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 案例: 判断奇偶数
- 三元运算符的目的,就是简化使用分支结构的语法形式,但是只能在简单的情况下进行减少代码的优化。
- 使用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 概述
- 既然有
if
选择结构了为什么还需要switch
结构?- 使用switch语句的主要目的是提供一种结构清晰、执行效率高的多分支选择方案。
- 当条件表达式的取值是有限且确定的时候,使用switch语句能够更简洁地编写代码,也更易于阅读和维护。
- 同时,由于switch语句的实现原理是使用跳转表来查找执行位置,所以在某些情况下执行效率会比if语句高。
- 但是不适合switch的情况,如果条件表达式的取值范围较广或者需要进行复杂的条件判断时,if语句通常会更加灵活和合适。
2.2 语法结构
-
switch语法结构,基本格式如下:
switch(expression)
中的类型只能是 整型 或者 字符型。- 注意,每一个表达式结束都要接一个冒号。
- expression和 表达式必须同一种类型。
switch(expression){case 表达式1://语法表达式break; case 表达式2://语法表达式break; ...default://执行语句 }
- 流程图如下:
-
案例使用
- 手机拨打快捷键设置。
#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 常见问题
- 思考几个问题?
- case 的顺序可以变换么?
- default可以省略么?或者位置可以发生变化么?
- break可以不加么?
- 思考过后上述情况会产生一个现象叫做
“穿透现象”
。
2.4 练习案例:设计计算器
- 使用 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;
}