第三章程序的控制结构w第一节概述w第二节if选择结构w第三节switch语句第三节switch语句应用条件语句可以很方便地使程序实现分支,但是出现分支比较多的时候,虽然可以用嵌套的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语句,系统接着向下执行其它语句。循环:break:退出当前的所在的循环层cointue:退出当前的循环在使用switch语句时,还应注意以下几点:1.case语句后的各常量表达式的值不能相同,否则会出现错误码。2.每个case或default后,可以包含多条语句,不需要使用“{”和“}”括起来。3.各case和default子句的先后顺序可以变动,这不会影响程序执行结果。4.default子句可以省略,default后面的语句末尾可以不必写break。程序设计风格提示:写switch语句时,switch(表达式)单独一行,各case分支和default分支要缩进两格并对齐,分支处理语句要相对再缩进两格,以体现不同层次的结构。3.语句格式举例(1)左右两边的书写格式是等价的switch(a){case1:x++;break;case2:y++;break;case3:z++;break;default:couterror;}switch(a){case1:x++;break;case2:y++;break;case3:z++;break;default:couterror;}(2)switch(ch)//charch;{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:coutinputerror!;}说明:1.每个case后面的语句可以写在冒号后的同一行或换到新行写。2.语句序列1…语句序列n+1都是一组语句,有时可为空,如(2)。例3.9根据从键盘上输入的表示星期几的数字,对应输出它的英文名称。#includeiostreamusingnamespacestd;intmain(){intweekday;cinweekday;switch(weekday){case1:coutMondayendl;break;case2:coutTuesdayendl;break;case3:coutWednesdayendl;break;case4:coutThursdayendl;break;case5:coutFridayendl;break;case6:coutSaturdayendl;break;case7:coutSundayendl;break;default:coutinputerror!endl;}return0;}例3.10一个最简单的计算器支持+,-,*,/四种运算。输入只有一行:两个参加运算的数和一个操作符(+,-,*,/)。输出运算表达式的结果。考虑下面两种情况:(1)如果出现除数为0的情况,则输出:Dividedbyzero!(2)如果出现无效的操作符(即不为+,-,*,/之一),则输出:Invalidoperator!输入样例:3456+输出样例:90【分析】设num1、num2存放两个参加运算的操作数,op存放操作符。①当op为“+”号时,实现加法操作。②当op为“-”号时,实现减法操作。③当op为“*”号时,实现乘法操作。④当op为“/”号时,判断b值,如果不为0,则实现除法操作,如果为0,则输出:Dividedbyzero!。⑤当op不是上面四种操作符时,输出:“Invalidoperator!”。程序如下:#includeiostreamusingnamespacestd;intmain(){floatnum1,num2;charop;cinnum1num2op;switch(op){case′+′:coutnum1+num2endl;break;case′-′:coutnum1-num2endl;break;case′*′:coutnum1*num2endl;break;case′/′:if(num2!=0){coutnum1/num2endl;break;}elsecoutDividedbyzero!endl;break;default:coutInvalidoperrator!endl;}return0;}例3.11期末来临了,班长小Q决定将剩余班费X元钱,用于购买若干支钢笔奖励给一些学习好、表现好的同学。已知商店里有三种钢笔,它们的单价为6元、5元和4元。小Q想买尽量多的笔(鼓励尽量多的同学),同时他又不想有剩余钱。请您编一程序,帮小Q制订出一种买笔的方案。【分析】对于以上的实际问题,要买尽量多的笔,易知都买4元的笔肯定可以买最多支笔。因此最多可买的笔为xdiv4支。由于小q要把钱用完,故我们可以按以下方法将钱用完:若买完xdiv4支4元钱的笔,还剩1元,则4元钱的笔少买1支,换成一支5元笔即可;若买完xdiv4支4元钱的笔,还剩2元,则4元钱的笔少买1支,换成一支6元笔即可;若买完xdiv4支4元钱的笔,还剩3元,则4元钱的笔少买2支,换成一支5元笔和一支6元笔即可。从以上对买笔方案的调整,可以看出笔的数目都是xdiv4,因此该方案的确为最优方案。程序如下:#includeiostreamusingnamespacestd;intmain(){inta,b,c,x,y;//a,b,c分别表示在买笔方案中,6元、5元和4元钱笔的数目//x,y分别表示剩余班费和买完最多的4元笔后剩的钱cinx;//输入xc=x/4;//4元笔最多买的数目y=x%4;//求买完c支4元笔后剩余的钱数yswitch(y)//判断购买方案{case0:a=0;b=0;break;case1:a=0;b=1;c--;break;case2:a=1;b=0;c--;break;case3:a=1;b=1;c-=2;break;}couta''b''cendl;//三个数间以空格隔开return0;}【上机练习】1.晶晶赴约会【1.4编程基础之逻辑表达式与条件分支11】晶晶的朋友贝贝约晶晶下周一起去看展览,但晶晶每周的1、3、5有课必须上课,请帮晶晶判断她能否接受贝贝的邀请,如果能输出YES;如果不能则输出NO。注意YES和NO都是大写字母!输入:输入有一行,贝贝邀请晶晶去看展览的日期,用数字1到7表示从星期一到星期日。输出:输出有一行,如果晶晶可以接受贝贝的邀请,输出YES,否则,输出NO。注意YES和NO都是大写字母!样例输入:2样例输出:YES【上机练习】2.骑车与走路【1.4编程基础之逻辑表达式与条件分支12】在清华校园里,没有自行车,上课办事会很不方便。但实际上。并非去办任何事情都是骑车快,因为骑车总要找车、开锁、停车、锁车等,这要耽误一些时间。假设找到自行车,开锁并车上自行车的时间为27秒;停车锁车的时间为23秒;步行每秒行走1.2米,骑车每秒行走3.0米。请判断走不同的距离去办事,是骑车快还是走路快。如果骑车快,输出一行Bike;如果走路快,输出一行Walk;如果一样快,输出一行All。输入:输入一行,包含一个整数,表示一次办事要行走的距离,单位为米。输出:输出一行,如果骑车快,输出一行Bike;如果走路快,输出一行Walk;如果一样快,输出一行All。样例输入:120样例输出:Bike【上机练习】3.分段函数【1.4编程基础之逻辑表达式与条件分支13】编写程序,计算下列分段函数y=f(x)的值。结果保留到小数点后三位。y=-x+2.5;0=x5y=2-1.5(x-3)(x-3);5=x10y=x/2-1.5;10=x20输入:一个浮点数N,0=N20。输出:输出N对应的分段函数值:f(N)。结果保留到小数点后三位。样例输入:1.0样例输出:1.500【上机练习】4.计算邮资【1.4编程基础之逻辑表达式与条件分支14】根据邮件的重量和用户是否选择加急计算邮费。计算规则:重量在1000克以内(包括1000克),基本费8元。超过1000克的部分,每500克加收超重费4元,不足500克部分按500克计算;如果用户选择加急,多收5元。输入:输入一行,包含整数和一个字符,以一个空格分开,分别表示重量(单位为克)和是否加急。如果字符是y,说明选择加急;如果字符是n,说明不加急。输出:输出一行,包含一个整数,表示邮费。样例输入:1200y样例输出:17【上机练习】5.最大数输出【1.4编程基础之逻辑表达式与条件分支15】输入三个整数,数与数之间以一个空格分开。输出一个整数,即最大的整数。输入:输入为一行,包含三个整数,数与数之间以一个空格分开。输出:输出一行,包含一个整数,即最大的整数。样例输入:102056样例输出:56【上机练习】6.三角形判断【1.4编程基础之逻辑表达式与条件分支16】给定三个正整数,分别表示三条线段的长度,判断这三条线段能否构成一个三角形。如果能构成三角形,则输出“yes”,否则输出“no”。输入:输入共一行,包含三个正整数,分别表示三条线段的长度,数与数之间以一个空格分开。输出:如果能构成三角形,则输出“yes”,否则输出“no”。样例输入:345样例输出:yes【上机练习】7.判断闰年【1.4编程基础之逻辑表达式与条件分支17】判断某年是否是闰年。如果公元a年是闰年输出Y,否则输出N。输入:输入只有一行,包含一个整数a(0a3000)。输出:一行,如果公元a年是闰年输出Y,否则输出N。样例输入:2006样例输出:N【上机练习】8.点和正方形的关系【1.4编程基础之逻辑表达式与条件分支18】有一个正方形,四个角的坐标(x,y)分别是(1,-1),(1,1),(-1,-1),(-1,1),x是横轴,y是纵轴。写一个程序,判断一个给定的点是否在这个正方形内(包括正方形边界)。如果点在正方形内,则输出yes,否则输出no。输入:输入一行,包括两个整数x、y,以一个空格分开,表示坐标(x,y)。输出:输出一行,如果点在正方形内,则输出yes,否则输出no。样例输入:11样