if语句处理多个分支时需要用if-else if结构,分支越多,嵌套的if语句层就越多,程序不但庞大、复杂,理解起来也比较困难。在C++编程中,针对有些问题除了使用if-else if结构之外,还有switch语句也可以实现,并且switch语句更加简洁易懂。
switch语句的格式:
switch语句是适用于实现多分支选择的语句。swith语句在执行时,先计算表达式的值,然后按顺序与case子句中所列出的各个常量进行比较,若表达式的值与常量中的值相等,则由此进入相应的case语句执行程序,并在执行完相应的语句加上break语句,如果不加break程序不会立即跳出switch语句,而是继续依次执行后面的case语句和default中的代码,直到遇到break语句或switch语句结束。具体格式如下:
switch(表达式){
case 常量表达式1:
语句1;
……
break;
case 常量表达式2:
语句2;
……
break;
……
case 常量表达式n:
语句n;
……
break;
default:
语句n+1;
……
}
注意:case语句后的各常量表达式的值不能相同,否则会出现相互矛盾的现象造成逻辑混乱;每个语句标号由保留字case和后面的常量表达式及冒号组成,每个常量表达式通常为常量,如常数或字符;每个case和default的出现次序不影响执行结果;该语句中可以使用一次或多次case标号,但只能使用一次default标号,或者省略整个default部分;多个case标号也允许使用在同一个语句序列的前面,break表示语句到此结束,跳出整个switch;default:可选的default块,当表达式的值与所有case都不匹配时,执行default块的代码。
实战训练1—将某一门课程的成绩转换为等级输出
问题描述:
一个学生的成绩如果大于等于90,程序会输出“优秀”,如果成绩大于等于80小于90,程序输出“良好”,如果大于等于70小于80,程序输出“中等”,如果大于等于60小于70,程序输出“及格”,如果小于60,程序输出“不及格”。
输入格式:
一行一个整数score,0<=score<=100
输出格式:
输出成绩对应的等级。
输入输出样例:
输入样例1 | 输出样例1 |
95 | 优秀 |
输入样例2 | 输出样例2 |
89 | 良好 |
输入样例3 | 输出样例3 |
73 | 中等 |
输入样例4 | 输出样例4 |
60 | 及格 |
输入样例5 | 输出样例5 |
56 | 不及格 |
问题分析:
在前面的内容中,使用多分支结构if-else if来处理的,根据score的取值,如果使用switch直接来处理,那么case里面的常量会有100、99、98……、0,共101个case,通过分析90到99十位上的数为9,80到89十位上的数为8……,所以根据成绩十位数一样的等级也是一样的(其中100除以10之后为10,所以9和10 都为优秀),这样就可以先对score除以10之后再使用switch去处理,具体程序如下:
#include<bits/stdc++.h>
using namespace std;
int main() {
int score;//定义成绩变量score
cin>>score;//输入成绩变量score
int sw=score/10; //成绩除以10
switch(sw){
//90以上(包括90)都是优秀 ,所以变量的值为9和10都输出优秀,因此10和9可以使用同一语句块
case 10:
case 9:
cout<<"优秀"<<endl;
break;
case 8://大于等于80 —良好
cout<<"良好"<<endl;
break;
case 7://大于等于70 —中等
cout<<"中等"<<endl;
break;
case 6://大于等于60 -及格
cout<<"及格"<<endl;
break;
//小于60都是不及格,所以共用同一语句块
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
cout<<"不及格"<<endl;
break;
default:
break;
}
return 0;
}
对于上述代码可以进行相应的改进(把不及格都放到default中):
#include<bits/stdc++.h>
using namespace std;
int main() {
int score;//定义成绩变量score
cin>>score;//输入成绩变量score
int sw=score/10; //成绩除以10
switch(sw){
//90以上(包括90)都是优秀 ,所以变量的值为9和10都输出优秀,因此10和9可以使用同一语句块
case 10:
case 9:
cout<<"优秀"<<endl;
break;
case 8://大于等于80 —良好
cout<<"良好"<<endl;
break;
case 7://大于等于70 —中等
cout<<"中等"<<endl;
break;
case 6://大于等于60 -及格
cout<<"及格"<<endl;
break;
default://和前面内容都不匹配,说明小于等于60,所以可以将5到0进行合并写到default中
cout<<"不及格"<<endl;
break;
}
return 0;
}
实战训练2—计算月份天数
问题描述:
输入年份与月份,让计算机输出该月份的天数。题目涉及年、月、天这几个量,分别用year、month、days来表示;前面内容介绍过闰年,对于闰年来讲,2月份是29天,平年是28天;月份1、3、5、7、8、10、12月份是31天,剩余的月份4、6、9、11是30天,最后对于2月份,首先需要判断是否为闰年,闰年为days赋值为29,否则赋值为28。
输入描述:
两个整数 year和month
输出描述:
一个整数(天数)days
输入输出样例:
输入样例1 | 输出样例1 |
2000 2 | 29 |
输入样例2 | 输出样例2 |
2006 3 | 31 |
问题分析:
根据题意,首先输入year和month这两个变量,根据month的取值,取月份1、3、5、7、8、10、12时,都为31天,使用相同的赋值语句,同理对于
#include<bits/stdc++.h>
using namespace std;
int main() {
int year,month,days;//定义年份、月份和天数变量
cin>>year>>month;//输入年份和月份
switch(month){
//月份1 3 5 7 8 10 12,天数为31天,共用同一代码块
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
//月份4 6 9 11,天数为30天,共用同一代码块
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 2:
if(((year%4==0 )&& (year%100 !=0)) || (year%400==0)) {//判断是否为闰年,该条件
days = 29;
}else{
days = 28;
}
}
cout<<days<<endl;
return 0;
}