1 开关语句
1 回顾
之前的课程中,我们讲到分支结构有两大语句,分别是:
判断语句:if系列开关语句:switch-case语句
今天我们学习了第二个语句,开关语句switch-case语句,switch-case是经典的多分支结构语句,根据判断表达式的不同结果,执行对应的语句。
2 基本形式与用法示例
switch语句基本形式如下:
含义如下:
条件表达式 的结果为 结果i ,就会执行对应的 语句i ,当执行结果不为任何一个 结果i 时就会执行 default 后的 语句n+1 ,然后每一个结果都使用 break 结束。
要注意的是,case后面只能是判断结果的条件表达式的值,与if系列不同,if的不同情况,可以写不同的判断语句,可以写大于小于,但是在switch-case语句中,只能在switch语句中写表达式。
举个例子,我们输入一个整型变量,如果输入1,那就输出星期一,如果输入2,那就输出星期二,……,如果输入7,那就输出星期日,其他情况,输出你输入的值有误:
#include<iostream>
using namespace std;
int main(){
int day;
cin>>day;
switch(day){
case 1: cout<<"星期一"<<endl; break;
case 2: cout<<"星期二"<<endl; break;
case 3: cout<<"星期三"<<endl; break;
case 4: cout<<"星期四"<<endl; break;
case 5: cout<<"星期五"<<endl; break;
case 6: cout<<"星期六"<<endl; break;
case 7: cout<<"星期日"<<endl; break;
default: cout<<"你输入的数字有误"<<endl; break;
}
return 0;
}
上面我们发现,在每个case中,都需要写一个break;
在这里,break的功能是跳出switch语句,不执行switch后面的内容。
要注意:
如果我们不写break,程序就会接着刚才的内容执行下去,直到找到break或者switch语句结束。
例如:
#include<iostream>
using namespace std;
int main(){
int day;
cin>>day;
switch(day){
case 1: cout<<"星期一"<<endl;
case 2: cout<<"星期二"<<endl;
case 3: cout<<"星期三"<<endl;
case 4: cout<<"星期四"<<endl;
case 5: cout<<"星期五"<<endl;
case 6: cout<<"星期六"<<endl;
case 7: cout<<"星期日"<<endl;
default: cout<<"404 no found"<<endl;
}
return 0;
}
执行结果如下:
所以我们在写的时候,如果需要break,就一定要记得写。
4 不写break的用法
上面我们说到,需要break,就一定要记得写,那如果是不需要呢?是不是必须写break呢?
当然不是,break省略了依然可以执行,所以这并不是语法错误,只不过达不到我们想要的结果。
不写break,可以让我们实现更加丰富的功能。
第一种用法是,当表达式的不同的值执行的语句一样时,我们只在最后一个case后面写执行的语句和break。
举个例子:
#include<iostream>
using namespace std;
int main(){
int score;
cin>>score;
switch(score/10){
case 5: cout<<"优"<<endl; break;
case 4: cout<<"优"<<endl; break;
case 3: cout<<"及格"<<endl; break;
case 2: cout<<"不及格"<<endl; break;
case 1: cout<<"不及格"<<endl; break;
case 0: cout<<"不及格"<<endl; break;
default: cout<<"404 no found"<<endl;
}
// 上面可以简写为:
switch(score/10){
case 5:
case 4: cout<<"优"<<endl; break;
case 3: cout<<"及格"<<endl; break;
case 2:
case 1:
case 0: cout<<"不及格"<<endl; break;
default: cout<<"404 no found"<<endl;
}
return 0;
}
第二种用法是:当我们执行一个case,也需要执行后续case的一些操作,就把这些操作在后续case中写出,前面的不重复写。
举个例子:
//计算前n个数的和
#include<iostream>
using namespace std;
int main(){
int a = 0,b = 1,c = 2,d = 3,e = 4;
int n,sum = 0;
cin>>n;
switch(n){
case 5: sum = sum + e;
case 4: sum = sum + d;
case 3: sum = sum + c;
case 2: sum = sum + b;
case 1: sum = sum + a; cout<<sum<<endl; break;
default: cout<<"404 no found"<<endl;
}
return 0;
}
1 开关语句与判断语句对比
1 总述经过讲解,我想大家也对switch-case语句有了更加深刻的认识,也能够了解switch-case语句和if系列语句的一些关系和他们之间的区别。
要说明的是:
开关语句和判断语句,没有谁更好,各有各的使用类型。
2 联系
开关语句和判断语句都是分支结构,很多情况下,判断语句和开关语句是可以相互转化的。
比如上面我们判断星期的代码,可以这么写:
#include<iostream>
using namespace std;
int main(){
int day;
cin>>day;
if(day == 1) cout<<"星期一"<<endl;
else if(day == 2) cout<<"星期二"<<endl;
else if(day == 3) cout<<"星期三"<<endl;
else if(day == 4) cout<<"星期四"<<endl;
else if(day == 5) cout<<"星期五"<<endl;
else if(day == 6) cout<<"星期六"<<endl;
else if(day == 7) cout<<"星期日"<<endl;
else cout<<"你输入的数字有误"<<endl;
return 0;
}
3 相同点
开关语句和判断语句都需要条件表达式,根据表达式不同的值,执行不同的代码。
4 不同点1-条件表达式的值
判断语句中,条件表达式的值只有两种情况,分别是:true和false。
开关语句,条件表达式的值可以有无数种情况。值的类型最常用的是int和char。
5 不同点2-条件表达式的个数判断语句可以可以有无数个条件表达式,一个if对应一个条件表达式。
开关语句只有一个条件表达式。
6 不同点3-分情况的依据
判断语句根据不同条件表达式表达的含义、表达的数据范围分情况。
开关语句根据条件表达式不同的值分情况。
7 不同点4-是否需要辅助
判断语句对于每个条件,如果下属的执行语句多于一条,要加大括号做辅助。
开关语句对于条件表达式的不同值的情况,大部分需要加break表示结束。
3 习题
根据今天讲的内容,完成下面的两道习题。
1 输出星座很多孩子都喜欢星座,喜欢分析星座对应的性格特征。一般来说,每个星座基本都从某个月份的下旬开始,到下个月份的中旬结束,具体对应关系如下:
我们将星座的开始月份定义为星座的幸运月份。现在我们要求输入幸运月份,输出对应的星座。
示例:【输入】8【输出】处女座
很多学生参加一个比赛,第一名获得特等奖,奖金为1000元;第二名和第三名获得一等奖,奖金为600元;第四名到第六名获得二等奖,奖金为300元;第七名到第十名获得三等奖,奖金为100元。其他名词没有奖金。
由于有赞助商提供更多的赞助,组委会决定,高级奖项,可以同时获得所有低级奖项的奖金,例如特等奖获得的奖金为:
1000+600+300+100=2000
一等奖获得的奖金为:
600+300+100=1000
现要求,编写一个程序,帮助组委会计算不同名次的学生能获得的奖金是多少。
示例:
【输入】8
【输出】100
示例:
【输入】1
【输出】2000
示例:
【输入】5
【输出】400