1 开关语句

1 回顾

 之前的课程中,我们讲到分支结构有两大语句,分别是:


判断语句:if系列开关语句:switch-case语句


今天我们学习了第二个语句,开关语句switch-case语句,switch-case是经典的多分支结构语句,根据判断表达式的不同结果,执行对应的语句

2 基本形式与用法示例

switch语句基本形式如下:


C++总结 | 11 开关语句switch-case_c++

含义如下:


条件表达式 的结果为 结果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 1cout<<"星期一"<<endlbreak;
    case 2cout<<"星期二"<<endlbreak;
    case 3cout<<"星期三"<<endlbreak;
    case 4cout<<"星期四"<<endlbreak;
    case 5cout<<"星期五"<<endlbreak;
    case 6cout<<"星期六"<<endlbreak;
    case 7cout<<"星期日"<<endlbreak;
    defaultcout<<"你输入的数字有误"<<endlbreak;
  }
  
  return 0;
}


3 漏写break的结果

上面我们发现,在每个case中,都需要写一个break


在这里,break的功能是跳出switch语句,不执行switch后面的内容


要注意:

如果我们不写break,程序就会接着刚才的内容执行下去,直到找到break或者switch语句结束


例如:


#include<iostream>
using namespace std;
int main(){
  int day;
  cin>>day;
  switch(day){
    case 1cout<<"星期一"<<endl;
    case 2cout<<"星期二"<<endl;
    case 3cout<<"星期三"<<endl;
    case 4cout<<"星期四"<<endl;
    case 5cout<<"星期五"<<endl;
    case 6cout<<"星期六"<<endl;
    case 7cout<<"星期日"<<endl;
    defaultcout<<"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 5cout<<"优"<<endlbreak;
    case 4cout<<"优"<<endlbreak;
    case 3cout<<"及格"<<endlbreak;
    case 2cout<<"不及格"<<endlbreak;
    case 1cout<<"不及格"<<endlbreak;
    case 0cout<<"不及格"<<endlbreak;
    defaultcout<<"404 no found"<<endl;
  }
   
  // 上面可以简写为:
  switch(score/10){
    case 5:
    case 4cout<<"优"<<endlbreak;
    case 3cout<<"及格"<<endlbreak;
    case 2:
    case 1:
    case 0cout<<"不及格"<<endlbreak;
    defaultcout<<"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<<endlbreak;
    defaultcout<<"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 == 1cout<<"星期一"<<endl;
  else if(day == 2cout<<"星期二"<<endl;
  else if(day == 3cout<<"星期三"<<endl;
  else if(day == 4cout<<"星期四"<<endl;
  else if(day == 5cout<<"星期五"<<endl;
  else if(day == 6cout<<"星期六"<<endl;
  else if(day == 7cout<<"星期日"<<endl;
  else cout<<"你输入的数字有误"<<endl;
  return 0;
}


3 相同点

开关语句和判断语句都需要条件表达式,根据表达式不同的值,执行不同的代码

4 不同点1-条件表达式的值

判断语句中,条件表达式的值只有两种情况,分别是:truefalse


开关语句,条件表达式的值可以有无数种情况。值的类型最常用的是int和char。

5 不同点2-条件表达式的个数

判断语句可以可以有无数个条件表达式,一个if对应一个条件表达式。


开关语句只有一个条件表达式。

6 不同点3-分情况的依据

判断语句根据不同条件表达式表达的含义、表达的数据范围分情况


开关语句根据条件表达式不同的值分情况

7 不同点4-是否需要辅助

判断语句对于每个条件,如果下属的执行语句多于一条,要加大括号做辅助。


开关语句对于条件表达式的不同值的情况,大部分需要加break表示结束。

3 习题

根据今天讲的内容,完成下面的两道习题。

1 输出星座

很多孩子都喜欢星座,喜欢分析星座对应的性格特征。一般来说,每个星座基本都从某个月份的下旬开始,到下个月份的中旬结束,具体对应关系如下:


C++总结 | 11 开关语句switch-case_c++_02


我们将星座的开始月份定义为星座的幸运月份。现在我们要求输入幸运月份,输出对应的星座


示例:【输入】8【输出】处女座


2 获得奖励

很多学生参加一个比赛,第一名获得特等奖,奖金为1000元;第二名和第三名获得一等奖,奖金为600元;第四名到第六名获得二等奖,奖金为300元;第七名到第十名获得三等奖,奖金为100元。其他名词没有奖金。


由于有赞助商提供更多的赞助,组委会决定,高级奖项,可以同时获得所有低级奖项的奖金,例如特等奖获得的奖金为:

1000+600+300+100=2000


一等奖获得的奖金为:

600+300+100=1000


现要求,编写一个程序,帮助组委会计算不同名次的学生能获得的奖金是多少。


示例:【输入】8 【输出】100
示例:【输入】1【输出】2000
示例:【输入】5【输出】400