NOIP学习小站
西安交通大学附属中学航天学校

switch...case多分支结构

C++中除了if语句可以实现选择结构(分支结构),还有switch…case结构,可以实现多分支结构。

先来看一个例子,输入数字(0~6),输出数字对应的星期名称(0表示星期日)。先来看使用if...else if...语句的参考代码:

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    if(n==0) cout<<"Sunday"<<endl;
    else if(n==1) cout<<"Monday"<<endl;
    else if(n==2) cout<<"Tuesday"<<endl;
    else if(n==3) cout<<"Wednesday"<<endl;
    else if(n==4) cout<<"Thursday"<<endl;
    else if(n==5) cout<<"Friday"<<endl;
    else if(n==6) cout<<"Saturday"<<endl;
    else cout<<"Error"<<endl;
    return 0;
} 

再来看使用switch...case语句的参考代码:

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    switch(n){
    	case 0:cout<<"Sunday"<<endl;break;
    	case 1:cout<<"Monday"<<endl;break;
    	case 2:cout<<"Tuesday"<<endl;break;
    	case 3:cout<<"Wednesday"<<endl;break;
    	case 4:cout<<"Thursday"<<endl;break;
    	case 5:cout<<"Friday"<<endl;break;
    	case 6:cout<<"Saturday"<<endl;break;
    	default:cout<<"Error"<<endl;
	}
    return 0;
} 

switch 语句用来测试一个变量(或表达式)值的情况,判断值是否匹配{}中的某个case,如果匹配到某个case则执行该case冒号后的语句。以上面的程序为例,将输入的变量n的值去匹配{}中case的值,假如我们输入3,那么会匹配到case 3,执行case 3:后面的语句cout<<"Wednesday"<<endl;输出Wednesday

假如我们这里输入0~6范围外的整数,例如输入7,那么没有任何一个case会被匹配到,这个时候会自动执行default:中的语句。switch语句可以没有default部分,此时如果没有任何case匹配到,那么会自动退出switch语句。

我们注意到case语句中有break;表示本次case语句执行后不再继续执行后面的case语句直接退出switch语句。假如我们去掉case 3:cout<<"Wednesday"<<endl;break;这里的break;语句,使用case 3:cout<<"Wednesday"<<endl;,此时输入3,那么执行case 3中的输出语句输出Wednesday后,还会继续执行后面case 4中的输出语句(由于case 4有break;,输出Thursday后就会退出switch语句不再继续执行后面的case)。

注意:switch括号中的变量或者表达式的结果必须是整数(包括char),否则会出现编译错误。case后必须是整型常量(或者结果是整型的常量表达式,包括char),否则也会出现编译错误。case后的执行语句可以写成一行,也可以写成多行(此时注意代码缩进)。

再来看一个例子,学业水平考试等级成绩为A、B、C、D、E,其中A、B、C、D均通过考试,E未通过考试。输入等级成绩,判断是否通过考试:

#include<iostream>
using namespace std;
int main()
{
    char degree;
    cin>>degree;
    switch(degree){
    	case 'A':
    		cout<<"Passed";
			break;
    	case 'B':
    		cout<<"Passed";
			break;
    	case 'C':
			cout<<"Passed";
			break;
    	case 'D':
			cout<<"Passed";
			break;
    	case 'E':
			cout<<"Not Passed";
			break;
        default:
            cout<<"Input Error"<<endl;
	}
    return 0;
} 

利用case后没有break会自动执行后面case语句的特点,可以将左边的代码精简:

#include<iostream>
using namespace std;
int main()
{
    char degree;
    cin>>degree;
    switch(degree){
    	case 'A':
    	case 'B':
    	case 'C':
    	case 'D':
			cout<<"Passed";
			break;
    	case 'E':
			cout<<"Not Passed";
			break;
        default:
            cout<<"Input Error"<<endl;
	}
    return 0;
} 

这里再次强调代码缩进对于确保程序可读性的重要性,我们对比下面两段代码的可读性就能体会到:

#include<iostream>
using namespace std;
int main()
{
    char degree;
    cin>>degree;
    switch(degree){
    	case 'A':
    	case 'B':
    	case 'C':
    	case 'D':
			cout<<"Passed";
			break;
    	case 'E':
			cout<<"Not Passed";
			break;
        default:
            cout<<"Input Error"<<endl;
	}
    return 0;
} 
#include<iostream>
using namespace std;
int main()
{
char degree;
cin>>degree;
switch(degree){
case 'A':
case 'B':
case 'C':
case 'D':
cout<<"Passed";
break;
case 'E':
cout<<"Not Passed";
break;
default:
cout<<"Input Error"<<endl;
}
return 0;
} 

再来看一个问题,输入年份和月份,输出该月天数。

分析:只有2月份需要特殊处理(闰年29天,平年28天),1、3、5、7、8、10、12月均为31天,4、6、9、11月均为30天。

#include<iostream>
using namespace std;
int main()
{
    int y,m,d;
    cin>>y>>m;
    switch(m){
    	case 1:
    	case 3:
    	case 5:
    	case 7:
    	case 8:
    	case 10:
    	case 12:d = 31;break;
    	case 4:
    	case 6:
    	case 9:
    	case 11:d = 30;break;
		case 2:
			if(y%4==0 && y%100!=0 || y%400==0) d = 29;
			else d = 28;
			break; 
	}
	cout<<d<<endl;
    return 0;
} 

其实switch...case语句完全可以使用if...else if...结构实现,只是有时候使用switch...case语句可以让结构更加清晰(前提是充分了解switch...case语句的执行流程),如果感觉switch...case语句不容易理解,在实际编程时可以直接使用if...else if...。

switch...case语句还可以指定case的区间范围:

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    switch (n) {
        case 1 ... 5:
            cout<<"Weekday"<<endl;
            break;
        case 6 ... 7:
            cout<<"Weekend"<<endl;
            break;
        default:
            cout<<"Input Error"<<endl;
    }
    return 0;
} 
#include<iostream>
using namespace std;
int main()
{
    char degree;
    cin>>degree;
    switch(degree){
        case 'A' ... 'D':
            cout<<"Passed"<<endl;
            break;
        case 'E':
            cout<<"Not Passed"<<endl;
            break;
        default:
            cout<<"Input Error"<<endl;
    }
    return 0;
}