应用条件语句可以很方便地使程序实现分支,但是出现分支比较多的时候,虽然可以用嵌套的if语句来解决,但是程序结构会显得复杂,其至凌乱。为方便实现多情况选择,C++提供了一种switch开关语句。 1.语句格式: switch(表达式) { case 常量表达式1: 语句序列1; break; case 常量表达式2: 语句序列2; break; …… case 常量表达式n: 语句序列n; break; default: 语句序列n+1; } 该语句中可以使用一次或多次case标号,但只能使用一次default标号,或者省略整个default部分;多个case标号也允许使用在同一个语句序列的前面;每个语句标号有保留字case和后面的常量表达式及冒号组成,每个常量表达式通常为字面常量,如常数或字符。 2.语句执行过程 switch语句执行过程分为以下3步描述。 (1)计算出switch后面圆括号内表达式的值,假定为M,若它不是整型,系统将自动舍去其小数部分,只取其整数部分作为结果值。 (2)依次计算出每个case后常量表达式的值,假定它们为M1、M2、…,同样若它们的值不是整型,则自动转换为整型。 (3)让M依次同M1、M2、…进行比较,一旦遇到M与某个值相等,则就从对应标号的语句开始执行;在碰不到相等的情况下,若存在default子句,则就执行其冒号后面的语句序列,否则不执行任何操作;当执行到复合语句最后的右花括号时就结束整个switch语句的执行。 在实际使用switch语句时,通常要求当执行完某个case后的一组语句序列后,就结束整个语句的执行,而不让它继续执行下一个case语句后面的语句序列,为此,可通过使用break语句来实现。该语句只有保留字break,而没有其它任何成分。它是一条跳转语句,在switch中执行到它时,将结束该switch语句,系统接着向下执行其它语句。 在使用switch语句时,还应注意以下几点: 1.case语句后的各常量表达式的值不能相同,否则会出现错误码。 2.每个case或default后,可以包含多条语句,不需要使用“{”和“}”括起来。 3.各case和default子句的先后顺序可以变动,这不会影响程序执行结果。 4. default子句可以省略,default后面的语句末尾可以不必写break。 程序设计风格提示:写switch语句时,switch(表达式)单独一行,各case分支和default分支要缩进两格并对齐,分支处理语句要相对再缩进两格,以体现不同层次的结构。 3.语句格式举例 (1)下面两种的书写格式是等价的 switch(a) { case 1:x++;break; case 2:y++;break; case 3:z++;break; default:cout<<'error'; } switch(a) { case 1: x++; break; case 2: y++; break; case 3: z++; break; default: cout<<'error'; } (2)switch(ch) { case ‘a‘: case ‘A‘: d1=(x+y)/2; d2=x*y-2; break; case ‘b‘: case ‘B‘: d1=(a+b)/2; d2=a*b-2; break; default: cout<<'inputerror!'; } 说明:1.每个case后面的语句可以写在冒号后的同一行或换到新行写。 2.<语句序列1>…<语句序列n+1>都是一组语句,有时可为空,如(2)。 例3.8 根据从键盘上输入的表示星期几的数字,对应输出它的英文名称。 #include using namespace std; int main() { int weekday; cin>>weekday; switch(weekday) { case 1:cout<<'Monday'< case 2: cout<<'Tuesday'< case 3: cout<<'Wednesday'< case 4: cout<<'Thursday'< case 5: cout<<'Friday'< case 6: cout<<'Saturday'< case 7: cout<<'Sunday'< default:cout<<'input error!'; } return 0; } 例3.9 判断2006年每个月份的天数。 【分析】程序分为:输入月份,计算该月的天数,输出天数。 程序如下: #include using namespace std; int main() { int month,day; cin>>month; switch(month) { case 2:day=28;break; case 4:day=30;break; case 6:day=30;break; case 9:day=30;break; case 11:day=30;break; default:day=31;break; } cout< return 0; } 例3.10 期末来临了,班长小Q决定将剩余班费X元钱,用于购买若干支钢笔奖励给一些学习好、表现好的同学。已知商店里有三种钢笔,它们的单价为6元、5元和4元。小Q想买尽量多的笔(鼓励尽量多的同学),同时他又不想有剩余钱。请您编一程序,帮小Q制订出一种买笔的方案。 【分析】对于以上的实际问题,要买尽量多的笔,易知都买4元的笔肯定可以买最多支笔。因此最多可买的笔为x div 4支。由于小q要把钱用完,故我们可以按以下方法将钱用完: 若买完x div 4支4元钱的笔,还剩1元,则4元钱的笔少买1支,换成一支5元笔即可;若买完x div 4支4元钱的笔,还剩2元,则4元钱的笔少买1支,换成一支6元笔即可;若买完x div 4支4元钱的笔,还剩3元,则4元钱的笔少买2支,换成一支5元笔和一支6元笔即可。 从以上对买笔方案的调整,可以看出笔的数目都是x div 4,因此该方案的确为最优方案。 w 程序如下: w #include w using namespace std; w int main() w { w int a,b,c,x,y; w //a,b,c分别表示在买笔方案中,6元、5元和4元钱笔的数目 w //x,y分别表示剩余班费和买完最多的4元笔后剩的钱 w cin>>x; //输入x w c=x/4; //4元笔最多买的数目 w y=x%4; //求买完c支4元笔后剩余的钱数y w switch (y) //判断购买方案 w { w case 0: a=0; b=0; break; w case 1: a=0; b=1; c--; break; w case 2: a=1; b=0;c--; break; w case 3: a=1; b=1; c-=2;break; w } w cout<三个数间以空格隔开 w return 0; w } w 【上机练习3.2】 w 1、输入三个数a,b,c,打印出最大者。 w 2、输入三角形的三边,判断它是否是直角三角形。 w 3、输入三角形的三个边,判断它是何类型的三角形(等边DB?等腰DY?一般YB?)。 w 4、输入三个数,按由大到小顺序打印出来。 w 5、对一批货物征收税金。价格在1万元以上的货物征税5%,在5000元以上,1万元以下的货物征税3%,在1000元以上,5000元以下的货物征税2%,1000元以下的货物免税。编写一程序,读入货物价格,计算并输出税金。 w 6、输入某学生成绩,根据成绩的好坏输出相应评语。如果成绩在90分以上,输出评语:优秀(outstanding)。如果成绩在60分到90分之间,输出评语:良好(satisfactory)。如果成绩不足60分,输出评语:不及格(unsatisfactory)。 |
|