任务描述
将分别介绍if 语句和switch 语句来实现选择结构。选择结构有3 种形式:单分支结构、双分支结构、多分支结构。
知识学习
选择结构是根据条件判断的结果,从两种或多种路径中选择一条执行,流程图如图3.10(a)所示,N-S 图如图3.10(b)所示。
图3.10 简单选择结构
在C语言程序设计中,分支语句包括if 语句和switch 语句。if 语句可以提供一种二路选择,用来判定给定的条件是否成立,若成立执行分支1,否则执行分支2。switch 是一种专门进行多路选择的语句,首先看if 语句,根据执行的分支的多少,可分为单分支结构,双分支结构和多分支结构。
(1)单分支选择结构——if 语句
If 语句的基本形式:
含义:先计算表达式的值,如果表达式为真,则执行括号内的语句;如果表达式为假,则不执行任何语句。其中表达式可以是关系表达式或逻辑表达式,语句可以为简单语句也可为复合语句,其流程如图3.11所示。
对于if 来说,它的控制能力是有限,只能控制一条语句,包括复合语句(用{}括起来的),可以把这种现象比作“独生子女规则”,一个家庭只能生一胎,如果是多胞胎就相当于用{}括起来。对于初学者如果不理解,建议在不管if 控制几条语句,在if()后面首先加上{},然后往{}中再去填写语句。
这里还有一个问题,不少初学者在if()的后面打上“;”分号。如果是这种语法,if 其实控制了一条空语句,那if 就起不到应有的作用了。
首先看一个求两数最大值的例子:
图3.11 单分支选择结构
程序运行结果如图3.12所示。
图3.12 比较大小程序
本程序是先输入两个数a,b。把a 赋值给max,再用if 语句判别max 与b 的大小,如果max 小于b,则把b 赋给max,由此发现max 中始终是最大值。
在本例的基础上,如果要实现3 个数的最大值的求解,该如何实现呢? 根据前面的分析知道max 此时拿到的是两个数中的最大值,此时只需要在原来代码的基础上再加一个max 与变量c 的比较就能实现了。
程序结果如图3.13所示。
图3.13 3 个数求最大值
读者可以继续思考,当更多的数参与进来寻找最大值时,可以继续在源代码的基础上增加相同的单分支if 语句结构,但是这让代码显得很冗余。这个问题可以用循环结构或者数组的知识比较方便地解决。
再看这样一个例子,输入3 个不同的整数,按照从大到小的顺序输出:
首先来分析一下可以使用的算法。
假设3 个数分别是a,b,c。要得到最终的结果,可以经过以下3 个步骤:
步骤一:先将a 和b 比较,把两者中的大者放进a,较小者放进b;
步骤二:再将a 和c 比较,把两者中的大者放进a,较小者放进c;
此时,a 中是三者中的最大值。
步骤三:接着将b 和c 进行比较,把两者中的大者放进b,较小者放进c。
那么此时就实现了a,b,c 正好是从大到小排列。
这里还有一个问题,如何实现两数的交换? 在生活中,一个杯子A 中有可乐,一个杯子B中有雪碧,要想实现两个杯子的内容交换,可以借助一个空杯子C,先把杯子A 中的可乐倒入杯子C 中,然后把杯子B 中雪碧倒入杯子A 中,最后把杯子C 中的可乐倒入杯子B 中,这样就完成了。在程序中,也是这样一个原理,要实现两个变量中的数据交换,也需要找一个中间变量来中转。
代码如下:
程序结果如图3.14所示。
图3.14 3 个数降序排列
(2)双分支选择结构——if-else 语句
if-else 这种结构才是if 语句的标准形式,当给定的条件成立时,执行if 和else 中间的一条语句(包括加了{}的复合语句),若条件不成立,则执行else 后控制的一条语句(包括复合语句)。其语法格式为:
该语句的流程结构如图3.11所示。需要注意一点,因为else 表达的是表达式不成立的情况,所以else 的后面是不能加括号“()”,更不能在里面写其他表达式。
把之前用单分支求两个数中最大值的程序修改为双分支结构,程序如下:
程序结果如图3.15所示。
图3.15 双分支求两数最大值
采用if-else 语句进行判别,若a 大输出a;若b 大输出b,相比单分支的更好理解。(www.xing528.com)
这里需要说明一下,这里的表达式都是比较简单的,但是在实际的程序编写中,表达式要比这复杂得多,比如前面提到的判断某年是否是闰年,这里就来实现一下:
程序结果如图3.16所示。
图3.16 判断闰年
(3)多分支选择结构——if-else if-else 语句
前面两种形式一般用于两个分支的情况,当有多个分支选择时,可以采用if-else if-else 语句,一般形式为:
该结构的执行过程:依次判断表达式的值,当出现某个值为真时,执行对应的语句,然后结束整个结构,继续执行程序中的其他内容,当所有表达式都为假时,执行else 后面的语句,其流程如图3.17所示。
图3.17 多分支结构(if…else…if)
在现实生活中,使用多重选择的结构比较多,比如转换学生成绩的案例。教师有时需要将百分制成绩转换成五级制成绩,成绩在90 以上的为优,80 到90 的为良好,70 到80 为中等,60到70 为及格,60 以下为不及格。
程序结果如图3.18所示。
图3.18 五级制转换
(4)if 语句的嵌套
有些时候,在if 语句中可以包含一个或者多个if 语句,把这种形式称为if 语句的嵌套,它与多重循环的道理是一致的。其一般形式为:
该结构的流程图如图3.19所示。
图3.19 if 嵌套结构图
在这种结构下,一个程序中可能会出现多个if 和else,一定要弄清楚哪些是能够配对的。当阅读程序时,可以从else 出发往程序的前面查找,一直找到离自己最近的且未配对的if 组合在一起。
再来看成绩的例子,现在只需要判断学生及格与否,如果及格再看是否优秀。
程序结果如图3.20所示。
图3.20 if 嵌套实现五级制
(5)多分支选择结构——switch 语句
switch 语句专门用于多分支结构,比利用if 语句可更好地实现多分支结构,具有结构清晰,方便阅读、编写的优点。其一般形式为:
其语义是:计算表达式的值,并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case 后的语句。如表达式的值与所有case 后的常量表达式均不相同时,则执行default 后的语句。举这样一个例子,编程实现输入一个1 ~7 范围内的证书,在屏幕上输出星期几。
在执行程序时,当输入一个数字6 时,并未只显示Today is Saturday,还把后面的两句显示出来了,如图3.20所示,这跟前面的描述是一致的,但是并达不到想要的效果。为了避免上述情况,C语言还提供了一种break 语句,专用于跳出switch 语句,break 语句只有关键字break,没有参数。在后面还将详细介绍。修改例题的程序,在每个case 语句之后增加break 语句,使每一次执行之后均可跳出switch 语句,从而避免输出不应有的结果,如图3.21所示。
图3.21 switch 无break
此时再去执行程序,输入数字6,只有Today is Saturday 显示在屏幕上,如图3.22所示。
图3.22 switch 带break
在使用switch 语句时还应注意以下几点:
②在case 后的各常量表达式的值不能相同,否则会出现错误。
③在case 后,允许有多个语句,可以不用{}括起来,不满足独生子女规则。
⑤各case 和default 子句的先后顺序可以变动,不会影响程序执行结果。
⑥default 子句可以省略不用。
任务总结
在选择结构中,如果要使用else 必须配合if 语句使用,不能单独出现else 的书写方法。如果else 后面还需要接条件,必须使用else if 结构来实现,也就是else 后不能直接接条件。
在选择结构中,swtich 语句的使用要注意:每个case 后必须是常量表达式,一般使用整型常量和字符型常量,不要使用浮点型常量,因为该类型的数据大多不能精确表示;另外注意每个case 操作语句后是否要加break 的情况。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。