1
C/C ++程序设计
1.2.4.2 4.2 选择结构

4.2 选择结构

4.2.1 选择结构的描述

选择结构也称分支结构,执行时根据条件判断的结果来决定进行的操作,适用于解决具有选择判断的问题。例如,现在遇到一个问题需要作出判断,判断的结果有两种,即成立(真)或不成立(假)。成立时有一种解决办法,反之有另一种解决办法。用流程图来描述如图4-9所示。

img83

图4-9 选择结构

生活中有很多例子都涉及选择判断,例如你准备前往北京旅游,现遇到一个公路岔道口,左边通往北京,右边通往上海,目的地决定了你所做的选择———往左边前行。又假如去银行取钱,交给工作人员银行卡或存折后需要输入密码,如果密码正确则取款成功,否则不允许取款。密码正确与否就是一个条件判断,工作人员根据这个判断的结果决定是否为你办理取款业务。

在使用选择结构时,首先需要用正确的C表达式来描述实际问题中的条件判断,一般使用关系表达式或逻辑表达式,前面的章节中已经介绍过不再赘述。有了这个条件判断还需要相应的分支语句来描述这种选择结构,下面来具体学习语句。

4.2.2 i f语句和i f-el se语句

(1)if语句

if语句也称单分支语句,语法规则:

if(表达式)

语句S

说明:执行该语句时,首先计算括号中的表达式的值,如果为真则执行括号后面的语句S,否则不执行语句S直接执行该if语句后面的语句,执行过程如图4-10所示。

img84

图4-10 if语句

注意:在表达式后面没有分号,语句S也可以是复合语句,即符合条件时执行的语句有多条,此时必须用{}括起来构成复合语句。

【例4.6】已知密码为123,如果输入正确则系统提示:“恭喜你,登录成功!”

img85

运行结果如图4-11所示。

img86

图4-11

分析:

题目中使用了单分支if语句,判断输入的密码是否正确,如上图输入的密码是“123456”与原密码不同,故无任何输出。显然这个程序可以完善,在输入不正确时可以提示密码错误,这就可以借助下面将要讲述的if-else语句来实现。

(2)if-else语句

if-else语句也称双分支语句,语法规则:

if(表达式)

语句S1

else

语句S2

说明:执行该语句时,首先计算括号中的表达式的值,如果为真则执行括号后面的语句S1,否则执行else后面的语句S2,执行过程如图4-12所示。

img87

图4-12 if-else语句

注意:语法规则中表达式后面没有分号,else的后面也没有表达式,即只有if后面有表达式;另外语句S1和S2也可以是复合语句,此时必须用{}括起来。

【例4.7】由用户输入一个字符,判断该字符是否为大写字母,若为大写字母则输出Uppercase letter,否则输出Not uppercase letter。

img88

img89

运行结果如图4-13所示。

img90

图4-13

分析:

用户输入的变量ch的值为ˊSˊ,if后面的表达式ch>=ˊAˊ&&ch<=ˊZˊ计算的结果值为真,因此执行第8行语句,如果表达式的值为假则会执行第10行语句。特别注意,if后面的表达式不能写为ˊAˊ<=ch<=ˊZˊ。

4.2.3 i f-el se i f语句

if-else if语句也称if-else链,语法规则为:

if(表达式1)

语句S1

else if(表达式2)

语句S2

else if(表达式3)

语句S3

else if(表达式n)

语句Sn

else

语句LS

说明:执行该语句时,首先计算括号中的表达式1的值,如果为真则执行后面的语句S1,否则计算表达式2的值,如果为真则执行后面的语句S2,如此进行下去,直到找到一个表达式为真的条件然后执行后面的语句,如果所有的表达式都为假则执行最后一个else后面的语句LS。以n等于2为例,具体流程图如图4-14所示。

img91

图4-14 if-else if语句

注意:在每个表达式后面都不加分号,else和if之间用空格隔开。

【例4.8】某公司为了提高员工的工作积极性,制定了相关的奖励措施,即根据员工的销售业绩发放奖金,销售量越多奖金越高,具体标准见表4-3。现要求输入销售数量,输出奖金所占工资的比例。

表4-3 奖金发放标准

img92

img93

img94

运行结果如图4-15所示。

img95

图4-15

分析:

如表4-3所示,销售数量分5个档次,可以用关系表达式来描述,程序中使用了if-else if结构正好可以对应这种多选择情况,最后一种奖金比例不用再使用if描述只需用else即可,见第16、17行。运行结果中输入的是600,符合第3个档次即第12行代码所描述的条件,因此执行第13行语句,输出“奖金占工资的10.00%”。为了使输出结果中含有“%”,根据格式化输出相关要求,必须使用“%%”形式,如第9、11、13、15、17行中语句所示。

4.2.4 sw i tch语句

switch语句也称开关语句,适用于存在多分支选择的情况。其基本语法结构为:

switch(表达式)

{

case常量表达式1:

语句序列1

break;

case常量表达式2:

语句序列2

break;

case常量表达式n:

语句序列n

break;

default:

语句序列n+1

}

说明:switch后面的表达式一般为整型或字符型。执行时首先计算switch后面表达式的值,然后从case子句中找到与表达式的值匹配的常量表达式n,执行对应的语句n,如果都不匹配则执行default后面的语句n+1。显然,上节中的if-else if语句也可以用switch语句来替换。关于switch语句的具体执行流程如图4-16所示。

img96

图4-16 switch语句

注意:case与常量表达式n之间用空格分隔,每个case后面的常量表达式应该和switch后面的表达式的值类型一致,如果某个case后面的语句省略,则表示与其后面的case执行相同的语句序列。

【例4.9】现要求输入学生百分制成绩,输出对应的等级提示。

90~100 →优秀

80~89→良好

70~79→一般

60~69→及格

0~59→不及格

img97

img98

运行结果如图4-17所示。

img99

图4-17

分析:

此题也是涉及多分支选择情况,用前面的if-else if也能实现,读者可以自己试一试。由于case后面是常量表达式,如果一一列举出从0~100的分数实在麻烦,题目中应用了一个小技巧,将grade整除10(见第7行代码),这样就可将某一段的分数映射到唯一的一个常量。第9行的case后面没有语句表示与下一个case执行相同的语句,同样第14至第18行也是这种用法。细心的读者应该产生疑问,如果输入的分数越界怎么办呢,能产生正确的输出吗?这就需要下节的嵌套结构来实现。

【例4.10】实现简易计算器的功能。

img100

img101

img102

运行结果如图4-18所示。

img103

图4-18

分析:

程序第11~31行读者也可试着用switch语句实现。该简易计算器提供了四种简单的运算功能,即加减乘除,用户输入的功能代码用变量s存放,s作为switch后面的表达式使用(第34行代码),每个case对应一项功能,各自完成自己的运算。

4.2.5 选择结构的嵌套

所谓选择结构的嵌套指的是在一个选择结构中又包含一个或多个选择结构。

(1)if语句的嵌套

if语句的嵌套一般是在单分支语句或双分支语句的基础上进行嵌套,主要有以下几种嵌套形式:

①if(表达式1)

if(表达式2)

语句S

说明:首先判断表达式1的值,为假直接执行该嵌套语句后面的语句;为真则继续判断表达式2的值,为假直接执行该嵌套语句后面的语句,为真则执行语句S。显然,只有当表达式1和表达式2的值都为真时才会执行语句S。故这种形式的嵌套结构可以用如下结构替换:

if(表达式1&&表达式2)

语句S

②if(表达式1)

if(表达式2)

语句1

else

语句2

说明:首先判断表达式1的值,为假直接执行该嵌套语句后面的语句;为真则继续判断表达式2的值,为真则执行语句1,为假执行语句2。

③if(表达式1)

{

if(表达式2)

语句1

}

else

语句2

说明:首先判断表达式1的值,为假执行语句2;为真则继续判断表达式2的值,表达式2的值为真则执行语句1,为假直接执行该嵌套语句后面的语句。注意此处的一对“{}”不能省略,否则将按照第②种嵌套形式执行。

④if(表达式1)

if(表达式2)

语句1

else

语句2

else

语句3

说明:首先判断表达式1的值,为假执行语句3;为真则继续判断表达式2的值,表达式2的值为真则执行语句1,为假执行语句2。

⑤if(表达式1)

语句1

else

if(表达式2)

语句2

说明:首先判断表达式1的值,为真执行语句1;为假则继续判断表达式2的值,为真则执行语句2,为假执行该嵌套语句后面的语句。

⑥if(表达式1)

语句1

else

if(表达式2)

语句2

else

语句3

说明:首先判断表达式1的值,为真执行语句1;为假则继续判断表达式2的值,为真则执行语句2,为假执行语句3。

提示:if-else嵌套结构中当遇到多个if和else关键字时,if和else的配对原则是这样的,即else总是与前面的离它最近的未配对的if配对。这也是第③种嵌套形式中的一对“{}”不能省略的原因所在。

(2)switch语句的嵌套

switch语句的嵌套形式即在switch语句中又包含一个或多个switch语句。

【例4.11】switch语句的嵌套。

img104

运行结果如图4-19所示。

img105

图4-19

分析:

首先判断第5行中switch中的表达式的值,第7行中的case的常量与a的值匹配故执行后面的语句,又是一个switch语句,继续计算b==1的值为1,第9行中的case的常量与之匹配,故执行后面的语句输出3个星号,程序转到第12行代码处,执行break之后程序结束。

(3)if语句和switch语句的嵌套

前面例题4.9中留有一个问题,如何检验用户输入的分数是否合法呢?这类问题在程序设计中经常出现,称之为校验机制或用户输入验证。下面对例题4.9进行完善,加入if语句判断用户输入的成绩是否有效。

【例4.12】if语句和switch语句的嵌套。

img106

运行结果如图4-20所示。

img107

图4-20

分析:

本例题在例题4.9基础上加入了if-else语句,首先判断grade是否有效即第7行代码,在分数有效的前提下进入else分支,再执行整个switch语句。