分享

C 之switch语句

 长沙7喜 2018-04-16

应用条件语句可以很方便地使程序实现分支,但是出现分支比较多的时候,虽然可以用嵌套的if语句来解决,但是程序结构会显得复杂,其至凌乱。为方便实现多情况选择,C++提供了一种switch开关语句。

1.语句格式:

 switch(表达式)

 {

case 常量表达式1

   语句序列1

   break;

case 常量表达式2

         语句序列2

         break;

……

case 常量表达式n

         语句序列n

         break;

default:

        语句序列n+1

 }

该语句中可以使用一次或多次case标号,但只能使用一次default标号,或者省略整个default部分;多个case标号也允许使用在同一个语句序列的前面;每个语句标号有保留字case和后面的常量表达式及冒号组成,每个常量表达式通常为字面常量,如常数或字符。

2.语句执行过程

  switch语句执行过程分为以下3步描述。

  (1)计算出switch后面圆括号内表达式的值,假定为M,若它不是整型,系统将自动舍去其小数部分,只取其整数部分作为结果值。

  (2)依次计算出每个case后常量表达式的值,假定它们为M1M2,同样若它们的值不是整型,则自动转换为整型。

  (3)M依次同M1M2进行比较,一旦遇到M与某个值相等,则就从对应标号的语句开始执行;在碰不到相等的情况下,若存在default子句,则就执行其冒号后面的语句序列,否则不执行任何操作;当执行到复合语句最后的右花括号时就结束整个switch语句的执行。

在实际使用switch语句时,通常要求当执行完某个case后的一组语句序列后,就结束整个语句的执行,而不让它继续执行下一个case语句后面的语句序列,为此,可通过使用break语句来实现。该语句只有保留字break,而没有其它任何成分。它是一条跳转语句,在switch中执行到它时,将结束该switch语句,系统接着向下执行其它语句。

在使用switch语句时,还应注意以下几点:

1.case语句后的各常量表达式的值不能相同,否则会出现错误码。

2.每个casedefault后,可以包含多条语句,不需要使用“{”和“}”括起来。

3.casedefault子句的先后顺序可以变动,这不会影响程序执行结果。

4. default子句可以省略,default后面的语句末尾可以不必写break

程序设计风格提示:写switch语句时,switch(表达式)单独一行,各case分支和default分支要缩进两格并对齐,分支处理语句要相对再缩进两格,以体现不同层次的结构。

3.语句格式举例

(1)下面两种的书写格式是等价

switch(a)

{

    case 1:x++;break;

    case 2:y++;break;

    case 3:z++;break;

    default:cout<<'error';

  }

switch(a)

    { 

       case 1:

 x++;

 break;

       case 2:

  y++;

 break;

       case 3:

 z++;

 break;

       default:

                 cout<<'error';

     }

2switch(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<<'inputerror!';

         }

 说明:1.每个case后面的语句可以写在冒号后的同一行或换到新行写。

      2.<语句序列1>…<语句序列n+1>都是一组语句,有时可为空,如(2)。

3.8 根据从键盘上输入的表示星期几的数字,对应输出它的英文名称。

#include

using namespace std;

int main()

{

     int weekday;

     cin>>weekday;

     switch(weekday)

     {

          case 1:cout<<'Monday'<

          case 2: cout<<'Tuesday'<

          case 3: cout<<'Wednesday'<

          case 4: cout<<'Thursday'<

          case 5: cout<<'Friday'<

          case 6: cout<<'Saturday'<

          case 7: cout<<'Sunday'<

          default:cout<<'input error!';

     }

    return 0;

}

3.9  判断2006年每个月份的天数。

【分析】程序分为:输入月份,计算该月的天数,输出天数。

 程序如下:

#include

using namespace std;

int main()

{

   int month,day;

   cin>>month;

   switch(month)

    {

      case 2:day=28;break;

      case 4:day=30;break;

      case 6:day=30;break;

      case 9:day=30;break;

      case 11:day=30;break;

      default:day=31;break;

    }

   cout<

   return 0;

}

3.10  期末来临了,班长小Q决定将剩余班费X元钱,用于购买若干支钢笔奖励给一些学习好、表现好的同学。已知商店里有三种钢笔,它们的单价为6元、5元和4元。小Q想买尽量多的笔(鼓励尽量多的同学),同时他又不想有剩余钱。请您编一程序,帮小Q制订出一种买笔的方案。

【分析】对于以上的实际问题,要买尽量多的笔,易知都买4元的笔肯定可以买最多支笔。因此最多可买的笔为x div 4支。由于小q要把钱用完,故我们可以按以下方法将钱用完:

         若买完x div 44元钱的笔,还剩1元,则4元钱的笔少买1支,换成一支5元笔即可;若买完x div 44元钱的笔,还剩2元,则4元钱的笔少买1支,换成一支6元笔即可;若买完x div 44元钱的笔,还剩3元,则4元钱的笔少买2支,换成一支5元笔和一支6元笔即可。

         从以上对买笔方案的调整,可以看出笔的数目都是x div 4,因此该方案的确为最优方案。

w  程序如下:

w  #include

w  using namespace std;

w  int main()

w  {

w      int a,b,c,x,y;           

w                       //a,b,c分别表示在买笔方案中,6元、5元和4元钱笔的数目

w                             //xy分别表示剩余班费和买完最多的4元笔后剩的钱

w      cin>>x;           //输入x

w      c=x/4;             //4元笔最多买的数目

w      y=x%4;           //求买完c4元笔后剩余的钱数y

w      switch (y)       //判断购买方案

w      {

w        case 0: a=0; b=0;       break;

w        case 1: a=0; b=1; c--;  break;

w        case 2: a=1; b=0;c--;  break;

w        case 3: a=1; b=1; c-=2;break;

w      }

w      cout<三个数间以空格隔开

w      return 0;

w  }

w  【上机练习3.2

w  1、输入三个数abc,打印出最大者。

w  2、输入三角形的三边,判断它是否是直角三角形。

w  3、输入三角形的三个边,判断它是何类型的三角形(等边DB?等腰DY?一般YB?)。

w  4、输入三个数,按由大到小顺序打印出来。

w  5、对一批货物征收税金。价格在1万元以上的货物征税5%,在5000元以上,1万元以下的货物征税3%,在1000元以上,5000元以下的货物征税2%1000元以下的货物免税。编写一程序,读入货物价格,计算并输出税金。

w  6、输入某学生成绩,根据成绩的好坏输出相应评语。如果成绩在90分以上,输出评语:优秀(outstanding)。如果成绩在60分到90分之间,输出评语:良好(satisfactory)。如果成绩不足60分,输出评语:不及格(unsatisfactory)。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多