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; }