5.6 嵌套switch语句

嵌套的switch语句是指在一个switch语句中,某个case下会再嵌入一个或多个switch语句,用于进一步作分支选择。嵌套的switch遵循所有简单switch语句的规则。

5.6.1 嵌套switch语句的定义

与嵌套if语句类似,嵌套的switch语句应用更加复杂,也更加接近实际问题。其一般表达形式为:

      switch(表达式1)
      {
          case常量表达式1:
              switch(表达式2)
              {
              case常量表达式 11:
                语句段11
              case常量表达式12:
                语句段12
            ……
            case常量表达式1m:
                语句段1m
            default:
                语句段1m+1
            }
        case常量表达式2:
            语句段2;
            ……
        case常量表达式n:
            语句段n;
        default:
            语句段n+1;
      }

嵌套switch语句的执行规则为:首先计算表达式1,将外围常量表达式与表达式1的值作比较,若常量表达式1与表达式1相同,则进入嵌套switch执行,此时仍然首先计算表达式2,然后判断嵌套的各case中常量表达式与表达式2的值是否相等,若相等,则执行相应的语句段。

5.6.2 嵌套switch语句的执行与应用

嵌套的switch语句执行与简单switch语句执行类似,两者并无明显差别。需要注意的是,嵌套switch语句中的break语句仅对当前的switch语句起作用,并不会跳出整个switch语句。

范例5.10 SwitchAarlineSearch.c

SwitchAarlineSearch.c查询一周七天的航班情况。例如,要查周五上午的航班,则输入5和m(morning),然后输出星期五上午的航班时间表。星期可使用整型数字,可输入m(代表上午)、a(代表下午)和e(代表晚上)来查看不同时间段的航班信息。(光盘\chat5\ SwitchAarlineSearch.c)

          01   #include<stdio.h>
          02   main()
          03   {
          04       unsigned int weekday=0;
          05       char c;
          06       printf("请输入星期数 和m(上午), a(下午)or e(晚上): \n");
          07       scanf("%d%c", &weekday, &c);                   //输入参数
          08       switch(weekday)                             //外层switch结构
          09       {
          10           case 1:                                //相同属性
          11           case 2:                                //相同属性
          12           case 3:                                //相同属性
          13           case 4:                                //相同属性
          14           case 5:                                //相同属性
          15           {
          16               switch(c)                          //嵌套switch
          17               {
          18                   case' m' :                       //morning
          19                   {
          20                       printf("To Beijing:06:20,07:30,10:15,11:50\n");
          21                       printf("To Shanghai:06:10,07:40,10:05,11:00\n");
          22                       printf("To NewYork:08:15,10:20,11:35\n");
          23                       break;
          24                   }
          25                   case' a' :                       //afternoon
          26                   {
          27                       printf("To Beijing:  12:20,14:30,15:15,17:50\n");
          28                       printf("To Xian   :  12:10,14:40,15:05,17:00\n");
          29                       printf("To NewYork:  12:15,13:20,16:35\n");
          30                       break;
          31                   }
          32                   case' e' :                       //evening
          33                   {
          34                       printf("To Beijing:  18:20,20:30,21:15,22:50\n");
          35                       printf("To Shanghai:  20:10,20:40,21:05,22:00\n");
          36                       printf("To Chengdu:  21:15,22:20,23:35\n");
          37                       break;
          38                   }
          39                   default: printf("错误:您输入的参数不正确\n");
          40               }
          41               break;
          42           }
          43           case 6:                                //相同属性
          44           case 7:                                //相同属性
          45           {
          46               switch(c)
          47               {
          48                   case' m' :                       //morning
          49                   {
          50                       printf("To Beijing:06:20,07:30,10:15,11:50\n");
          51                       printf("To Shanghai:06:10,07:40,10:05,11:00\n");
          52                       printf("To NewYork:08:15,10:20,11:35\n");
          53                       printf("To HongKong:08:35,10:10,11:25\n");
          54                       break;
          55                   }
          56                   case' a' :                       //afternoon
          57                   {
          58                       printf("To Beijing:  12:20,14:30,15:15,17:50\n");
          59                       printf("To Xian   :  12:10,14:40,15:05,17:00\n");
          60                       printf("To NewYork:  12:15,13:20,16:35\n");
          61                       printf("To Sydney:  12:30,14:60,15:55,17:30\n");
          62                       break;
          63                   }
          64                   case' e' :                       //evening
          65                   {
          66                       printf("To Beijing:  18:20,20:30,21:15,22:50\n");
          67                       printf("To Shanghai:  20:10,20:40,21:05,22:00\n");
          68                       printf("To Chengdu:  21:15,22:20,23:35\n");
          69                       printf("To QingDao:  18:50,20:10,20:20,20:55,23:10,23:55\n");
          70                       break;
          71                   }
          72                   default:printf("错误:您输入的参数不正确\n");
          73               }
          74               break;
          75           }
          76           default: printf("错误:您输入的参数不正确\n");
          77       }
          78   }

程序第10到14行界定,对星期一、星期二、星期三、星期四和星期五具有相同的航班信息,第43和44行界定星期六和星期天具有相同航班信息。对每天的航班信息,又分为上午、中午和晚上三个时间段的航班。对输入的时间段作分支,根据不同时段输出不同的航班信息。

程序执行时输入5e,按回车键。

请输入星期数 和m(上午), a(下午) or e(晚上): 5e

输出结果为:

      To Beijing:      18:20,   20:30,   21:15,   22:50
      To Shanghai:     20:10,   20:40,   21:05,   22:00
      To Chengdu:    21:15,   22:20,   23:35

作者心得:

程序中多次出现多个case共用一段语句段的情况,这样的目的是体现多条case具有相同的属性,读者在编写程序时应尽量注意,这样的设计应以注释表达出来,以便于程序阅读。