一、概述:
switch语句是多分支选择语句;多分支选择可以用if…else if,甚至用多层嵌套if实现,但是分支较多时,会使if语句嵌套层数增加,程序可读性变差;此时使用switch语句可以直接解决。
switch语法基本形式:
switch(表达式)
{case 常量表达式1:语句序列1;
case 常量表达式2:语句序列2;
……
case 常量表达式n:语句序列n;
default: 语句n+1;
}
switch关键字后面的表达式可以是字符变量、整型变量、枚举变量。switch中的变量先去和各个case的值进行匹配,匹配成功后,执行该case后面的语句;如果没有一个case与之匹配成功,则执行default后面的语句。注意:每个case后面的语句中,最后都有一个break语句,其作用是使程序转到switch语句的末尾(即“}”处),而default分支后面不需要break,可以忽略掉。
二、使用switch语句的实际例子
问题:要求给出一百分制成绩,要求输出成绩等级'A'、'B'、'C'、'D'、'E'。90以上为‘A’,80~89为‘B’,70~79为‘C’,60~69为‘D’,60以下为‘E’。
解决思路:
#include <stdio.h>
int main()
{
float score;
printf("Please input your score:\n");
scanf("%f", &score);
switch((int)(score / 10)){
case 10:
case 9:printf("A\n");
break;
case 8:printf("B\n");
break;
case 7:printf("C\n");
break;
case 6:printf("D\n");
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:printf("E\n");
break;
default:printf("invalid\n");
}
return 0;
}
运行结果:
从程序中,可以发现:多个case可以执行同一个语句(case5、case4、case3、case2、case1、case0都是执行printf("E\n");语句,也就是说只有输入的分数小于60就输出字符“E”)。
三、switch语句的执行过程
首先:计算switch语句后面的表达式的值,然后跳转到case标签值与表达式相等的地方开始往下执行,如果没有跳转指令的话,会一直执行到switch语句的最后。执行过程如下图所示:
这种情况正是case语句后面不加break(跳转指令)的运行过程。
四、switch语句的练习
1.给一个不多于5位的正整数,要求:
①求出它是几位数;
②分别输出每一位数字;
③按逆序输出各位数字,例如原数为123,应输出321。
解决思路:
解决第一个需求:求出它是几位数,先定义一个变量表示位数,方便第三个需求的switch语句作为分支选择,用if语句判断输入数字位数即可;
解决第二个需求:分别输出每一位数字,定义个十百千万的变量,用运算符去求各个位的值;
解决第三个需求:按逆序输出各位数字,对于这种情况,需要分清楚输入数字的位数了,即用switch语句去进行分支选择:输入5位数,则按照万,千,百,十,个的顺序输出;输入4位数,则按照千,百,十,个的顺序输出……
大致思路已经明确,开干!
#include <stdio.h>
int main()
{
int num, place , individual, ten, hundred, thousand,ten_thousand;
printf("Please input a int with five place:\n");
scanf("%d", &num);
if(num > 99999){
printf("invalid\n");
return 0;
}
if(num > 9999)
place = 5;
else if(num > 999)
place = 4;
else if(num > 99)
place = 3;
else if(num > 9)
place = 2;
else
place = 1;
printf("place = %d\n", place);
individual = num % 10;
ten = num % 100 / 10;
hundred = num % 1000 / 100;
thousand = num % 10000 /1000;
ten_thousand = num / 10000;
switch(place){
case 5:
printf("输入的五位数:%d,%d,%d,%d,%d\n", ten_thousand, thousand, hundred, ten, individual);
printf("反序数字:%d,%d,%d,%d,%d\n", individual, ten, hundred, thousand, ten_thousand);
break;
case 4:
printf("输入的四位数:%d,%d,%d,%d\n", thousand, hundred, ten, individual);
printf("反序数字:%d,%d,%d,%d\n", individual, ten, hundred, thousand);
break;
case 3:
printf("输入的三位数:%d,%d,%d\n", hundred, ten, individual);
printf("%d,%d,%d\n", individual, ten, hundred);
break;
case 2:
printf("输入的二位数:%d,%d\n", ten, individual);
printf("%d,%d\n", individual, ten);
break;
case 1:
printf("输入的一位数:%d\n", individual);
}
return 0;
}
tips:对于用if语句去划分数字区间的思维导图可以用数学的区间进行划分,如下图所示
运行结果: