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;
}
NOIP学习小站