零基础学C++程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.4 选择结构

在银行办理业务时,如果人少,并且没有人排队,就可以直接选择柜台办理业务;如果排队的人很多,我们会选择自助取款机办理。在这里,选择办理业务的方式就是一种选择结构的体现。本节将详细讲解多种选择结构的语句形式。

4.4.1 单分支条件语句

单分支条件语句也称为if选择语句,适用于处理简单的选择执行。

if选择语句简称if语句,由一个if条件和执行语句块部分组成,只有一个分支。当条件为真时运行执行语句块,条件为假时,不运行执行语句块。其语法如图4.3所示。

当执行语句块部分只有一行语句时,花括号可以省略,其语法如图4.4所示。

注意:为了程序的可读性,一般不建议省略花括号。

if语句的执行流程如图4.5所示。

img

图4.3 if语句(1)

img

图4.4 if语句(2)

img

图4.5 if语句的执行流程

从图中可以看出,if语句的运行顺序由条件表达式的值决定。当条件表达式为真时,运行执行语句;当条件表达式为假时,则不运行执行语句。

示例4-3】下面使用if语句,判断变量的值是否大于10。

img
img

程序运行结果如下。

img

从运行结果中可以看出,表达式a〈10的值为真,所以输出“变量a的值小于10”;表达式b〈10的值为假,所以不会输出“变量b的值小于10”。

4.4.2 双分支条件语句

双分支条件语句即if-else选择语句,该语句拥有一个条件和两个分支语句块,其语法形式如下。

img

if-else语句可以根据条件的值选择执行的分支语句。如果条件的值为真,执行语句块1;如果条件的值为假,执行语句块2。两个分支语句一次只能执行其中一个语句块。其执行流程如图4.6所示。

img

图4.6 if-else语句的执行流程

if-else语句适合处理有两个选项的数据。例如,判断小朋友是否符合上小学的年龄,如果年龄达到,告知家长可以上学;如果年龄过小,告知家长年龄不够。

示例4-4】输入孩子年龄判断是否达到入学年龄。

img
img

程序运行结果如下。

img

从运行结果中可以看出,输入的年龄为8,表达式age 〉= 6的值为真,所以输出“恭喜您,您的孩子已经达到了入学年龄!”。

再次运行程序,运行结果如下。

img

从运行结果中可以看出,输入的年龄为5,表达式age 〉= 6的值为假,所以输出“很抱歉,您的孩子还未达到入学年龄!”。

4.4.3 if-else语句嵌套使用

if-else语句嵌套使用可以用于处理需要多重筛选的数据。嵌套时,需要将子级if-else语句嵌套至父级if-else语句的执行语句块中,并且可以根据需求无限嵌套使用,其语法形式如下。

img
img

if-else嵌套使用时,如果表达式1的值为真,则执行语句1并判断表达式2的值;如果表达式1的值为假,则执行语句4并判断表达式3的值。依次类推,层层进行判断选择,直到程序结束。

在录取新生时就需要进行多重条件筛选,简单筛选过程如图4.7所示。

img

图4.7 录取新生筛选过程

【示例4-5】下面实现录取新生筛选的小程序。

img

程序运行结果如下。

img
img

从运行结果中可以看出,输入者分数不达标,只能判断是否有特长。特长达标,继续判断是否身体健康。身体健康达标,最终输出“恭喜您,您被录取了”的提示。整个过程经过了三层if-else语句的筛选。

4.4.4 switch选择语句

switch选择语句也称为开关语句,它适合处理有三个及三个以上选项的数据,它的每一个分支都相当于一个开关。例如,根据分数可以划分为A、B、C、D四个等级,不同分数对应不同等级。

switch选择语句可以分为三种形式,分别为基础形式、默认分支形式及跳出语句形式,接下来进行详细讲解。

1.基础形式

switch选择语句的基础形式由switch条件、case子句、常量表达式、执行语句组成,其语法形式如下。

img

switch语句会使用条件表达式的值,依次与case子句的常量表达式的值进行比较。如果相等,则从当前case子句的执行语句开始,顺序执行后面所有的case子句的执行语句;如果不相等,则与下一个case子句进行比较,依次类推进行执行。

switch语句的执行方式就像一个人有一把钥匙,然后有很多门,门里有任务。他不确定这把钥匙能打开哪一扇门,但是如果能打开一扇门,则后续的所有门都会自动打开。他只需要依次执行打开的门里的任务即可。

示例4-6】使用密码尝试打开对应的门。

img
img

程序运行结果如下。

img

从运行结果中可以看出,key的值303与第3个case子句的常量303相同,所以会从该case子句的执行语句开始,依次执行后续所有case子句的执行语句,并且不用对后续的case子句的常量表达式的值进行比较。

注意:这种运行顺序是switch语句最基础的运行顺序,一定不要套用到后续的形式。

2.默认分支形式

在开门时,有时会遇到一个问题。如果拿着的钥匙打不开所有的门,就不会有内容输出,这样对用户显得不友好。此时就需要向switch语句中添加一个默认分支语句default。增加后的语法形式如下。

img
img

default分支不受switch条件表达式的值影响,默认为执行。default分支通常放在switch语句的最后。增加默认分支default的switch语句执行流程如图4.8所示。

img

图4.8 增加默认分支default的switch语句执行流程

示例4-7】下面演示当钥匙无法打开所有门时,输出提示语句。

img
img

程序运行结果如下。

img

从运行结果中可以看出,key的值203不符合所有的case子句的常量表达式的值,所以在最后输出了默认分支语句中的“已经尝试过所有的房间”,表示该程序已经运行过,只是没有打开任何房间。

3.跳出语句形式

如果规定钥匙只能打开一扇门,然后将门里的任务做完就行了,则使用带默认分支的switch语句显然是不够的,此时就需要引入跳出语句break。加入跳出语句break的switch语法形式如下。

img

当运行到break语句时,程序就会跳到switch语句块之外,不会再执行其他case语句和default语句。也就是使用钥匙打开一扇门后,会执行门里的任务,执行完该任务后会直接跳出该大楼之外,不会再去尝试开启其他的门。

增加跳出语句break的switch语句执行流程如图4.9所示。

img

图4.9 增加跳出语句break的switch语句执行流程

示例4-8】下面演示使用303钥匙打开3号房间。

img
img

程序运行结果如下。

img

从运行结果中可以看出,当key的值为303时进入case 303分支语句,输出“恭喜你进入了房间3”;当执行到break之后会跳出switch语句的范围之外,输出“已经跳出switch语句范围”。

4.switch语句使用总结

对于switch语句一定要注意以下几点。

❑ switch语句的条件表达式必须是int、short、long、char类型。

❑ switch语句后面可以跟多个case分支语句,但要合理地组合顺序。

❑ switch语句所有分支的执行语句都可以省略,但是最后一个分支的执行语句不可以省略。

❑ case子句由case关键字、常量表达式与冒号组成,case关键字与常量表达式之间有一个空格,而且常量表达式中不能有变量存在。

❑ 不同case子句的常量表达式的值不能相同。

❑ case语句的执行语句可以包含多条语句,可以不使用大括号分隔。

❑ 在一个switch语句中只可以有一个default分支,否则程序就会出错。