switch语句

时间:2023-01-20 05:09:15
应用条件语句可以很方便地使程序实现分支,但是出现分支比较多的时候,虽然可以用嵌套的if语句来解决,但是程序结构会显得复杂,甚至凌乱。为方便实现多情况选择,C++提供了一种switch开关语句。
 
一、语句格式
switch (表达式) {
  case 常量表达式1:
    语句序列1;
    break;
  case 常量表达式2:
    语句序列2;
    break;
  …
  case 常量表达式n:
    语句序列n;
    break;
  default:
    语句序列n+1;
}
 
语句的执行过程:
1、计算出switch后面圆括号内表达式的值,假定为 M,若它不是整型,系统将自动舍去其小数部分,只取其整数部分作为结果值;
2、依次计算出每个case后常量表达式的值,假定它们为M1,M2…,同样,若它们的值不是整型,则自动转换为整型;
3、让 M 依次同 M1,M2…进行比较,一旦遇到 M 与某个值相等,则就从对应标号的语句开始执行;在碰不到相等的情况下,若存在default子句,则就执行其冒号后面的语句序列,否则不执行任何操作;当执行到复合语句最后的右花括号时就结束整个switch语句的执行。
 
注意:
1、语句中可以使用一次或多次case标号,但只能使用一次default标号;default后面的语句末尾可以不必写break,或者省略整个default部分。
2、每个case或default后,可以包含多条语句,不需要使用“{”和“}”括起来。
3、多个case标号也允许使用在同一个语句序列的前面。
 
二、格式举例
1、
switch (a) {
  case 1: x++;break;
  case 2: y++;break;
  case 3: z++;break;
  default: cout<<"error";
}
2、
switch (ch) {
  case 'a':
  case 'A':
    d1=(x+y)/2;
    d2=x*y-2;
    break;
  case 'b':
  case 'B':
    d1=(a+b)/2;
    d2=a*b-2;
    break;
  default:
    cout<<"input error!";
}
 
例1:根据从键盘上输入的表示星期几的数字,对应输出它的英文名称。
#include<iostream>
using namespace std;
int main()
{
  int d;
  cin>>d;
  switch(d)
  {
    case 1: cout<<"Mon"<<endl;break;
    case 2: cout<<"Tue"<<endl;break;
    case 3: cout<<"Wed"<<endl;break;
    case 4: cout<<"Thu"<<endl;break;
    case 5: cout<<"Fri"<<endl;break;
    case 6: cout<<"Sat"<<endl;break;
    case 7: cout<<"Sun"<<endl;break;
    default: cout<<"input error!"<<endl;
  }
  return 0;
}
 
例2:判断2016年每个月份的天数。
#include<iostream>
using namespace std;
int main()
{
  int m,d;
  cin>>m;
  switch(m)
  {
    case 2: d=29;break;
    case 4:
    case 6:
    case 9:
    case 11:d=30;break;
    default: d=31;
  }
  cout<<d<<endl;
  return 0;
}
 
例3:期末来临了,班长小Q决定将剩余班费x元钱(x>7)用于购买若干支钢笔奖励给一些学习好、表现好的同学。已知商店里有三种钢笔,它们的单价分别为6元、5元和4元。小Q想买尽量多的笔(鼓励尽量多的同学),同时他又不想有剩余钱。请你编一程序,帮小Q制订出一种买笔的方案。
 
分析:要买尽量多的笔,即都买4元的笔肯定可以买最多支笔,因此最多可以买的笔为x/4支。由于要把钱用完,帮我们可以按以下方法将钱用完:若买完x/4支4元钱的笔,还剩1元,则4元钱的笔少买1支,换成1支5元的笔即可;若买完x/4支4元钱的笔,还剩2元,则4元钱的笔少买1支,换成1支6元的笔即可;若买完x/4支4元钱的笔,还剩3元,则4元钱的笔少买2支,换成1支5元钱的笔和1支6元钱的笔即可。
#include<iostream>
using namespace std;
int main()
{
  int a,b,c,x,y;
  cin>>x;
  c=x/4;
  y=x%4;
  switch(y)
  {
    case 0: a=0;b=0;break;
    case 1: a=0;b=1;c--;break;
    case 2: a=1;b=0;c--;break;
    case 3: a=1;b=1;c-=2;
  }
  cout<<a<<' '<<b<<' '<<c<<endl;
  return 0;
}
 
 
作业:
1、zerojudge:a053、d460、a244
 
2、输入年、月,输出该月的天数。(使用switch语句)
3、某商店打折促销,原价200元以下(含200元)的商品打九五折;200元以上到2000元(含2000元)的商品打九折;2000元以上的商品打八八折。输出商品原价,输出打折后的价格。
4、某旅游景点门票价格为每人5元,但团体可以优惠。人数超过20则优惠10%;人数超过40则优惠15%;人数超过80则优惠20%;人数超过120则优惠30%。输入团体人数,输出总的门票价格。