购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第4章
条件判断语句

条件判断语句又称为选择语句、分支语句。C++中有3种形式的if选择语句,同时提供了switch语句,简化多分支决策的处理过程。条件判断语句是非常重要的流程控制语句,读者要认真掌握。

本章知识架构及重难点如下:

4.1 语句、程序结构和流程图

4.1.1 语句

C++程序中,语句是最小的可执行单元,以分号结束。下面就来认识下常见的语句形式。

1.表达式语句

表达式语句就是在表达式后面加上一个分号。我们学习过很多表达式,如算术表达式、关系表达式、逻辑表达式、赋值表达式等。其中,赋值语句最常见,其作用是将“=”右侧表达式的结果赋给左边的变量。一个赋值语句中可以包含多个赋值表达式。例如:

iArea=iLength*iWidth;

2.空语句

空语句只有一个分号,表示什么也不做,其最大的作用是进行占位。空语句经常出现在选择或循环语句中,表示某个分支或循环体暂时不执行任何操作,先用空语句占位,后续再逐步细化和补充。

例如,下面是一个循环语句,表示当变量a小于变量b时,在括号中的循环体中要进行某个操作。这里先用空语句进行占位。空语句在语法上是正确的。

3.复合语句

复合语句是由一对大括号“{}”括起来的若干条语句的集合,又称为语句块。它在语法上是一个整体,相当于一个语句。复合语句经常出现在选择或循环结构中,将分支代码段或循环代码段用大括号括起来,起到层次划分的作用。一个大括号形成一个范围,这个范围也是变量的作用范围。例如:

注意,复合语句的大括号外面不能再添加分号。

4.函数调用语句

函数由函数名、圆括号和参数列表组成,函数调用语句就是在函数后加上一个分号。所谓调用,主要指程序执行到函数调用语句时,会跳转到相应的函数体中去执行其中的内容,执行完所有内容后返回到函数调用语句处,接着执行下面的语句。可以调用的函数有系统库函数和用户自定义函数。例如:

add(3,4);  //调用用户自定义函数add(),实现两个数相加
说明

C++语句按其功能可以划分为两类:一类用于描述计算机执行操作及相关运算,称为操作运算语句;另一类用于控制操作运算的执行顺序,称为流程控制语句。

4.1.2 程序结构

我们前面接触到的代码都是顺序执行的,也就是先执行第一条语句,然后是第二条、第三条,一直到最后一条语句,这称为顺序结构。

但在很多情况下,只靠顺序结构不能很好地解决问题。例如,十字路口红灯停、绿灯行的问题,就需要程序做出判断,看当前是红灯还是绿灯,才能做出接下来要“停”还是要“行”的决策。再例如,操场跑圈问题,跑10圈相当于把绕操场跑一圈的动作重复10次,难道程序中要把同一段代码重复写10遍吗?显然这样的代码“很傻”。

为了让程序具有处理复杂问题的决策能力,C++中把程序结构分为顺序、选择、循环3类。

(1)顺序结构,指的是按照语句在程序中的先后次序,从头到尾依次执行每一条C++代码,不重复执行任何代码,也不跳过任何代码。顺序结构是自然形成的,不需要控制,按默认的顺序执行即可。

(2)选择结构又称为分支结构,即根据条件,让程序在多个代码段(即多条分支)中有选择地执行某些代码。

(3)循环结构,指的是程序重复地执行同一段代码,直到条件不再满足,或者遇到强行跳出语句。

顺序、选择、循环这3种程序结构可以相互包含,换句话说,任何程序都是由这3类结构组成的。

4.1.3 流程图

C++中,使用流程图来描述程序的结构,其主要符号如图4.1所示。例如,描述十字路口转向的决策,利用方位做决定,判断是否是南方,如果是南方则向前行,如果不是南方则寻找南方,流程图如图4.2所示。

图4.1 主要的流程图符号

图4.2 十字路口转向流程图

4.2 if语句

if语句用于对多分支情况进行判断,包括简单if语句、if…else语句和else if语句。

4.2.1 简单if语句

简单if语句的语法形式如下:

if(表达式)
     语句块;

其中,“表达式”一般为关系表达式,表示判断条件,其运算结果为真(true)或假(false)。如果条件成立,则表达式结果为真,执行下方的语句块;如果条件不成立,则表达式结果为假,直接跳过下方的语句块。

简单if语句相当于汉语中的“如果……”。用流程图来表示简单if语句,如图4.3所示。

图4.3 简单if语句流程图

【实例4.1】 判断输入的数是否为奇数。 (实例位置:资源包\TM\sl\4\1)

本实例中,定义一个变量,用来输入一个数值。判断该数奇偶性的方法为:将该数与2求余,余数为0表示能被2整除,为偶数;余数不为0则说明为奇数。如果取余不为0,就输出“The value is odd number”。代码如下:

用流程图描述实例4.1的执行过程,如图4.4所示。

程序分以下两步执行。

(1)定义一个整型变量iInput,然后使用cin获得用户输入的整型数据。

(2)变量iInput的值与2进行求余(%)运算,如果运算结果为1,表示用户输入的是奇数,输出“The value is odd number”;如果运算结果为0,则不进行任何输出,程序执行完毕。

图4.4 实例4.1流程图

使用简单if语句的注意事项如下:

(1)当if后的执行语句仅有一句时,可以将if条件判断和执行语句写在一行中。例如:

if(iInput%2!=0)  cout << "The value is odd number" << endl;

但不建议这么写,因为不便于阅读。

(2)当执行语句有多条,为复合语句时,需使用大括号括起来,形成执行语句块。

注意

if语句后不能添加英文分号(;),否则编译器会报错。例如:

4.2.2 if…else语句

if…else语句使用if和else两个关键字,对不满足条件时的操作也做了说明。其语法形式如下:

if(表达式)
     语句块1;
else
     语句块2;

其中,“表达式”一般为关系表达式,表示判断条件,其运算结果为真或假(true或false)。表达式的值为真,则条件成立,执行语句块1;表达式的值为假,则条件不成立,执行语句块2。

if…else语句相当于汉语里的“如果……否则……”。用流程图来表示if…else语句,如图4.5所示。

【实例4.2】 根据分数判断成绩等级是否为A。 (实例位置:资源包\TM\sl\4\2)

图4.5 if…else语句流程图

本实例中,定义一个变量,用来输入分数。如果分数大于或等于90,输出“It is A”,否则输出“It is not A”。具体代码如下:

用流程图描述实例4.2的执行过程,如图4.6所示。用户输入一个数值,将该数值赋值给iInput变量,判断用户输入的数据是否大于或等于90,如果条件成立,输出“It is A”,否则输出“It is not A”。

【实例4.3】 判断输入的数为奇数还是偶数。 (实例位置:资源包\TM\sl\4\3)

图4.6 实例4.2的流程图

本实例将对例4.1进行改进,当if条件表达式为假,即输入的数能被2整除时,输出“The value is even number”。具体代码如下:

程序分以下两步执行:

(1)定义一个整型变量iInput,然后使用cin获得用户输入的整型数据。

(2)变量iInput的值与2进行求余(%)运算,如果运算结果为1,表示用户输入的是奇数,输出“The value is odd number”;如果运算结果为0,表示用户输入的是偶数,输出“The value is even number”。

注意,else不能单独使用,必须和关键字if一起出现。

4.2.3 else if语句

else if语句可以对多个分支进行多次判断,每判断一次就缩小一定的检查范围。其语法形式如下:

其中,“表达式1”“表达式2”…“表达式m”均为关系表达式,表示判断条件,其运算结果为真或假(true或false)。如果表达式1为真,执行语句块1;否则判断表达式2,如果表达式2为真,就执行语句块2;否则判断表达式3……以此类推,如果表达式m也为假,就执行最后的语句块n。

用流程图来表示else if判断语句,如图4.7所示。

图4.7 else if语句流程图

【实例4.4】 根据成绩划分等级。 (实例位置:资源包\TM\sl\4\4)

某学校参照如下方式划分学生的成绩等级:

① very good:大于或等于90分;

② good:大于或等于70分,小于90分;

③ normal:大于或等于60分,小于70分;

④ failure:小于60分。

根据用户输入的成绩,输出与该成绩对应的等级。使用else if语句实现,具体代码如下:

程序中,首先要求用户输入一个整数,然后开始多分支判断。如果分数大于或等于90分,就输出“very good”;否则继续判断分数是否小于90分但大于或等于70分,如果条件成立,就输出“good”;以此类推,最后判断是否小于60分,如果条件成立,就输出“failure”。

注意,本例最后没有再使用else关键字进行判断。

编程训练(答案位置:资源包\TM\sl\4\编程训练\)

【训练1】模拟员工打卡场景 一位职工早上上班打卡,她的工位号是13,密码是111,输入正确的工号和密码,会出现“谢谢,已签到”的提示。请在控制台模拟此场景。

【训练2】游戏关卡 设计一个过关类的小游戏,根据输入的数字,直接进入对应的关卡。如输入的是数字3,控制台输出“当前进入第三关”。

4.3 if语句的嵌套

前面介绍的3种if语句可以相互嵌套。例如,在简单if语句中嵌套if…else语句,形式如下:

在if…else语句中嵌套其他if…else语句,形式如下:

条件判断语句有多种嵌套方式,可以根据具体需要进行设计,但一定要注意逻辑关系的正确处理。

注意

当分支情况复杂,需要进行多重嵌套时,要格外小心,必须确保大括号成对出现,即代码中不能出现无法配对的“{”或“}”。书写上,要注意代码层级,做好缩进,即同一层级的代码要保持同样的缩进。这样编写的代码才会结构清晰,阅读方便,逻辑上也更不容易出错。

【实例4.5】 判断是否是闰年。 (实例位置:资源包\TM\sl\4\5)

本实例中,用if嵌套语句判断输入的年份是否为闰年。闰年的判断条件为:能被4整除但不能被100整除,或者能被400整除的年份都为闰年。具体代码如下:

本例先判断年份能否被4整除(iYear%4==0),如果不能整除,输出“It is not a leap year”;如果能整除,继续判断能否被100整除(iYear%100==0),如果不能整除,输出“It is a leap year”;如果能整除,继续判断能否被400整除(iYear%400==0),如果能整除,输出“It is a leap year”,不能整除,输出“It is not a leap year”。上述逻辑稍微有点复杂,读者可多读几遍。

使用逻辑运算符,可以简化判断是否是闰年的实例代码,用一条判断语句来完成。

【实例4.6】 判断是否是闰年(改进版)。 (实例位置:资源包\TM\sl\4\6)

实例4.5使用if嵌套语句判断闰年,本实例进行改进,使用逻辑表达式作判断条件,搭配if…else语句,实现闰年判断。具体代码如下:

实例4.6将判断是否是闰年的条件用一个表达式来完成,逻辑清晰,语法简洁。表达式是一个复合表达式,进行了3次算术运算和两次逻辑运算。算术运算判断能否被整除,逻辑运算判断是否满足条件。

注意

else和if关键字必须成对出现,且遵守临近原则,即else关键字和距离最近的if语句构成一对。初学者极易在多重if嵌套结构中弄混哪个else和哪个if是一对,从而导致错误。为了避免出错,一定要多用复合语句和“{}”,同时做好层级对应和缩进。

编程训练(答案位置:资源包\TM\sl\4\编程训练\)

【训练3】不同口味的粽子 粽子有甜的和咸的,甜粽子价格有5元的和10元的,咸粽子价格有4元的和12元的。编写程序,根据输入的钱数和口味判断用户能购买哪种粽子。如输入“9”和“甜”,则输出“5元的甜粽子”。

【训练4】打印用户订单 公司有饮料区和食品区,饮料区有牛奶、咖啡、果汁,食品区有面包、饼干。利用嵌套if语句输出用户的选择。(用户有输入功能。)

4.4 条件运算符

条件运算符“?:”是一个三目运算符,由其构成的条件表达式能像if…else判断语句一样完成判断。例如:

max=(iA > iB) ? iA : iB;

上述语句首先比较iA和iB的大小,如果iA大于iB,max就取iA的值,否则取iB的值。

可以将上述条件运算语句改为if…else判断语句,代码如下:

if(iA > iB)
     max= iA;
else
     max= iB;

【实例4.7】 使用条件运算符判断数的奇偶性。 (实例位置:资源包\TM\sl\4\7)

实例4.3中用if…else语句判断数的奇偶性,本实例用条件运算符完成同样的判断,代码如下:

实例4.7使用条件运算符判断数的奇偶性,比使用判断语句时的代码要简洁。程序同样完成由用户输入整型数,然后和2进行求余(%)运算,如果运算结果不为0,说明是奇数,否则是偶数。

【实例4.8】 判断某数是否为3和5的整倍数。 (实例位置:资源包\TM\sl\4\8)

本实例要求用条件表达式判断一个数是否是3和5的整倍数,具体代码如下:

程序需要用户输入一个整型数,然后用“%”运算判断能否被3和5整除,如果能同时被3和5整除,说明输入的整型数是3和5的整倍数。

条件运算符可以嵌套,例如:

表达式1?(表达式a?表达式b:表达式c):表达式d;

由于条件运算符嵌套后的代码不容易阅读,一般不建议使用。

编程训练(答案位置:资源包\TM\sl\4\编程训练\)

【训练5】校园网计费 某学校的校园网收费标准是一天一元,购买时间超过30天,按每天(包括30天)0.75元收费。编写程序,模拟校园网的计费情况。

【训练6】是否是小红的生日 小红的生日为11月29日,根据输入的日期(为一个数字),使用条件表达式判断这个数字是否是合法的日期,并判断输入的日期是否是小红的生日。

4.5 switch语句

当分支情况较多时,if判断语句的可读性较差,使用不当还会产生表达式错误。为解决多分支问题,C++中提供了switch语句。其一般形式如下:

其中,“表达式”是一个算术表达式,值是一个整型数或字符。用该值逐一和case后常量表达式的值进行比较,如果一致,就执行其后的语句块,并通过break关键字跳出整个switch语句;如果无法匹配成功,就执行default后的语句块。default分句可以省略,这时case语句即便全部匹配不成功,也不再进行任何操作。

注意

switch括号内的表达式不能是浮点数,否则会因为精度不准确而产生错误。

【实例4.9】 成绩等级划分(switch版)。 (实例位置:资源包\TM\sl\4\9)

某校成绩等级划分如下:A为very good,B为good,C为normal,D为failure。根据控制台输入的字符A、B、C、D,输出对应的成绩等级。如果输入的是其他字符,输出“input error”。本例使用switch语句实现,具体代码如下:

程序需要用户输入一个字符,用户输入字符A,输出“very good”;输入字符B,输出“good”;输入字符C,输出“normal”;输入字符D,输出“failure”;输入其他字符,输出“input error”。

注意,switch语句中,每个case分支都使用了break语句,作用是匹配成功后跳出整个switch判断。如果不使用break语句会出现什么问题呢?事实上,由于无法跳出,自匹配成功的case语句起,后面的每条case语句都会被执行一次,且不再进行判断。

【实例4.10】 今天是星期几。 (实例位置:资源包\TM\sl\4\10)

根据输入的1~7中的任意整型数,输出对应的英文星期名称。例如,输入数字1,输出“Monday”;输入数字2,输出“Tuesday”……如果输入的是其他字符,就输出“input error”。使用switch语句实现,但各case分支中不使用break语句。具体代码如下:

输入7时,程序运行结果如图4.8所示,此时显示是正常的。但输入1时,程序运行结果如图4.9所示,很显然后面的分支语句依次执行了一遍,这并不是我们想要的结果。

图4.8 输入7时的运行结果

图4.9 输入1时的运行结果

因此,实际开发中,一定要在switch语句的各case分支下使用break语句及时跳出。

switch语句和if语句之间可以相互转换,下面试着将实例4.10改为else if格式。

【实例4.11】 成绩等级划分(else if版)。 (实例位置:资源包\TM\sl\4\11)

本实例要求使用else if语句修改实例4.9的代码。具体代码如下:

本例中,每个else if分支中都使用了return语句,以跳出主函数并结束程序。

编程训练(答案位置:资源包\TM\sl\4\编程训练\)

【训练7】消费不同,折扣不同 某大型商超推出如下促销活动。

①购物不满500元,本次消费金额不打折扣;

②购物满500元但不足1000元,本次消费金额可享9折优惠;

③购物满1000元但不足2000元,本次消费金额可享8折优惠;

④购物满2000元,本次消费金额可享7折优惠。

根据顾客购物小票上的金额,输出该顾客能享受的折扣与打折后应支付的金额。

【训练8】串联和并联灯泡 已知一个灯泡并联3个开关,分别为开关1、开关2和开关3;另一串彩灯,串联开关4;开关5和开关6并联一个白炽灯和节能灯,如图4.10所示。输入一个数字,代表按下某个开关,输出哪个灯能亮。

图4.10 猜猜哪个灯能亮

4.6 实践与练习

答案位置:(资源包\TM\sl\4\实践与练习\)

综合练习 1:选择微信小游戏 编写程序,利用if语句判断输入的数值,输出对应的微信游戏。运行结果如下:

1代表跳一跳,2代表好友画我,3代表头脑王者,请选择:
3
您现在选择的是数值3
所以您要玩“头脑王者”游戏

综合练习 2:模拟自动售货机 某自动售货机,按键1选择巧克力,按键2选择小面包,按键3选择可口可乐,利用switch语句模拟此场景。运行结果如下:

************************
*    可选择的按键:    *
*     1.巧克力         *
*     2.小面包         *
*     3.可口可乐       *
************************
从1~3中选择按键:
3
您选择了可口可乐

综合练习 3:输出玫瑰花语 不同玫瑰花有着不同的含义。红玫瑰代表“我爱你,热恋,希望与你泛起激情的爱”;白玫瑰代表“纯洁、谦卑、尊敬,我们的爱情是纯洁的”;粉玫瑰代表“初恋,喜欢你那灿烂的笑容,年轻漂亮”;蓝玫瑰代表“憨厚、善良”。编写程序,选择一种玫瑰花,输出对应的花语。运行结果如下:

输入1:代表选择红玫瑰
输入2:代表选择白玫瑰
输入3:代表选择粉玫瑰
输入4:代表选择蓝玫瑰
请输入您的选择:
1
您选择的是红玫瑰
它代表“我爱你,热恋,希望与你泛起激情的爱”

综合练习4:寻找最大值 设计一个程序,要求通过键盘输入3个任意的整数,并输出其中最大的数。运行结果如下:

请输入3个数字:
87
9
65
最大值是 a: 87

综合练习 5:自助服务 某商店支持3种支付方式:1代表网络支付,2代表银行卡支付,3代表现金支付。编写程序,输出顾客选择的支付方式。运行结果如下: rQ1Xz2ZN7xsfzZ/B/CmW7KdCcIJWjryA1X4lTopyK9BI9gyF6g7ruVrvrgDXE9mM

本店支持以下自助支付方式:
1. 网络支付
2. 银行卡支付
3. 现金支付
请输入数字选择支付方式
^-^ ^-^ ^-^ ^-^ ^-^ ^-^ ^-^
1
您选择的是网络支付
请用微信或支付宝扫描对应的二维码以完成支付
点击中间区域
呼出菜单
上一章
目录
下一章
×