文章目录
前言介绍
- 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<<"进女生"; } //可以省略else else{ 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 快递业务计费I
-
某快递业务 收费标准, 1kg以内收费13元, 之后超过1kg部分每400g加收3元, 请根据收费标准,设计出相应程序。
- 输入重量计算金额 (重量声明类型为int类型)。
- 提示主要在于额外费用计算, 例如, 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.6.5 快递业务计费II
-
假设邮局规定寄邮件时,若每件重量在1公斤以内(含1公斤),按15元计算邮费,如何超过1公斤时,其超出部分每公斤加收8元,不足1公斤按1公斤计算。 请编写计算邮费。
- 输入:邮件的重量。
- 输出:应付的邮费。
#include <iostream> using namespace std; int main(){ /** 思路分析本题考核: 1.需要两个变量 重量和费用 2.返回使用分支结构进行判断 */ //1.声明变量 double weight;//声明重量 double money;//声明金钱 cin >> weight; //2.做条件判断,当重量小于1kg的情况下 if(weight<=1){ money = 15; } else { //否则就是大于1公斤,大于1公斤有两种情况 //1.重量正好为整数, 2.就是大于1公斤,不满足1公斤小数. //提示:怎么判断条件是很重要的? if(weight>int(weight)) { //重量有小数,取整计算小数 money = int(weight)*8 +15; }else{ //就是整数的重量,就需要去除1公斤的基本, money =(weight-1)*8+15; } } cout << money; return 0; }
1.6.6 平面直角坐标系
- 平面直角坐标系,输入平面直角坐标系中的一点的坐标值,判断该点是在哪一个象限中,原点或坐标轴上。
- 输入 4 2 输出 第一象限 输入 4 0 输出 x轴。
- 输入 4 2 输出 第一象限 输入 4 0 输出 x轴。
#include <iostream>
using namespace std;
int main(){
int x,y;
cin >>x>>y;
//根据平面直角坐标系判断
//1~4象限
if (x>0&&y>0){
cout <<"第一象限";
}else if(x<0&&y>0){
cout<<"第二象限";
}else if(x<0&&y<0){
cout<<"第三象限";
}else if(x>0&&y<0){
cout<<"第四象限";
}else if(x==0&&y!=0){
cout<<"x轴";
}else if(y==0&&x!=0){
cout<<"y轴";
}else if(x==0&&y==0){
cout<<"原点";
}
return 0;
}
- 注意: 如果输入的是字符的话,会发生无法转换问题,导致异常,最后会无法赋值,变量值默认为0。
1.6.7 输入三个数由小到大排序
- 输入三个数字, 按照由小到大的顺序输出。
- 思路分析, 只需要比较位置即可。 输入样例 2 4 3 输出 2 3 4 。
#include <iostream> using namespace std; int main(){ //请你输出3个数字,按照由小到大的顺序输出. int a,b,c; cin>> a >>b>>c; //进行逻辑判断,通过位置上的比较获取 //a b c 三个位置进行比较 if (a>b){ //swap(a,b); //std中自带的标准库.交换 int temp = a; a = b; b = temp; } if(a>c){ //另一种方式,求和法. int temp=a+c; a = temp-a; c = temp-c; } if(b>c){ //C++中的交换方法 swap(b,c); } cout<< a <<" "<<b<<" "<<c; return 0; }
1.6.8 路费计算
-
如下所示:
- 结果保留 4位小数。
- 结果保留 4位小数。
-
注意上述, 无折扣,如何定义。
- 注意保留4位小数, 头文件
#include <iomanip>
#include <iostream> #include <iomanip> //保留小数 using namespace std; int main(){ //根据计算公式,定义变量p是运费, 货物重量w 距离s 总运费 f // f = p*w*s(1-d) 其中p和w是实数 ,注意实数的概念 double p,w; // 运费, 重量 cin >> p>>w; //根据题目分析,明确定义的变量 // 路程, 折扣 连个变量 int s;//路程 double d; //折扣 discount //区间判断需要使用if-else if-else if--结构 //判断区间 cin >> s; if(s<250){ //原价 d = 0; //无折扣 }else if(s>=250 && s<500){ d = 0.02;// 2% }else if(s>=500 && s<1000) { d=0.05; }else if(s>=1000&&s<2000){ d=0.08; }else if(s>=2000&&s<3000){ d= 0.1; }else if(s>=3000){ d = 0.15; } //注意导入头文件, 保留4位小数 cout<< fixed<<setprecision(4); //计算公式,注意折扣是折扣, 打折是打折 cout << p*w*s*(1-d); return 0; }
- 注意保留4位小数, 头文件
1.6.9 今天是第几天
- 输入两个数字 m和d,代表今天是2020你年的m月和d日,问题来了隔壁老王想知道今天是2020年的第几天?
- 问题分析1: 需要知道每个月有几天, 然后累加即可.
- 问题分析2: 需要知道2月多少天?
- 输入样例 1 31 输出31 输入样例 2 27 输出样例 58
#include <iostream>
using namespace std;
int main(){
//2020年是平年还是闰年决定2月有多少天 29天
//并且知道每个月有多少天
//定义变量月和日
int m,d,days;
cin>>m>>d;
//简单的思路就是逐月递加
if(m==1){
days=d; //没有累加
}else if(m==2){
days = 31+d; //累加 1月
}else if(m==3){
days = 31+29+d;
}else if (m == 4) {
days = 31 + 29 + 31 + d;
} else if (m == 5) {
days = 31 + 29 + 31 + 30 + d;
} else if (m == 6) {
days = 31 + 29 + 31 + 30 + 31 + d;
} else if (m == 7) {
days = 31 + 29 + 31 + 30 + 31 + 30 + d;
} else if (m == 8) {
days = 31 + 29 + 31 + 30 + 31 + 30 + 31 + d;
} else if (m == 9) {
days = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + d;
} else if (m == 10) {
days = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + d;
} else if (m == 11) {
days = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + d;
} else if (m == 12) {
days = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + d;
}
cout <<days;
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 程序设计
2.4.1 练习案例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;
}
2.4.2 练习案例2:计算折扣
- 超市做活动,消费满50元,加5元,送可口可乐,加10元,送大桶水,加30元,送平底锅一个,同时如果是会员打7折,不是会员满50打9折,然后给出相应的提示信息。
- 请设计此程序。
在这里插入代码片