第5章 条件控制语句
(视频讲解:1小时3分钟)
做任何事情都要遵循一定的原则。例如,到图书馆去借书,就必须要有借书证,并且借书证不能过期,这两个条件缺一不可。程序设计也是如此,需要利用流程控制实现与用户的交流,并根据用户的需求决定程序“做什么”“怎么做”。
流程控制对于任何一门编程语言来说都是至关重要的,它提供了控制程序如何执行的方法。如果没有流程控制语句,整个程序将按照线性顺序来执行,而不能根据用户的需求决定程序执行的顺序。本章将对C#中的条件控制语句进行详细讲解。
通过学习本章,读者主要掌握以下内容:
了解程序的决策分支
if语句的使用
if…else语句的使用
if…else if…else语句的使用
if语句的嵌套使用
switch语句的使用
switch与if…else if…else的区别
5.1 决策分支
视频讲解
计算机的主要功能是提供用户计算功能,但在计算的过程中会遇到各种各样的情况,针对不同的情况会有不同的处理方法,这就要求程序开发语言要有处理决策的能力。汇编语言使用判断指令和跳转指令实现决策,高级语言使用选择判断语句实现决策。
一个决策系统就是一个分支结构,这种分支结构就像一个树形结构,每到一个节点都需要做决定,就像人走到十字路口,是向前走,还是向左走或是向右走都需要做决定,不同的分支代表不同的决定。例如,十字路口的分支结构如图5.1所示。
为描述决策系统的流通,设计人员开发了流程图。流程图使用图形方式描述系统不同状态的不同处理方法。开发人员使用流程图表现程序的结构,主要的流程图符号如图5.2所示。
使用流程图描述十字路口转向的决策,利用方位做决定,判断是否是南方,如果是南方向,则前行,如果不是南方,寻找南方,流程图如图5.3所示。
图5.1 十字路口分支结构
图5.2 主要的流程图符号
图5.3 十字路口转向流程图
程序中使用选择结构语句来做决策,选择结构是编程语言的基础语句,在C#语言中有两种选择结构语句,分别是if语句和switch语句,下面分别对这两种选择结构语句进行讲解。
说明
选择结构语句也称为条件判断语句或者分支语句。
5.2 if语句
视频讲解
在生活中,每个人都要做出各种各样的选择。例如,吃什么菜?走哪条路?找什么人?那么当程序遇到选择时,该怎么办呢?这时需要使用的就是选择结构语句。if语句是最基础的一种选择结构语句,它主要有3种形式,分别为if语句、if…else语句和if…else if…else多分支语句,本节将分别对它们进行详细讲解。
5.2.1 最简单的if语句
C#语言中使用if关键字来组成选择语句,其最简单的语法形式如下:
说明
使用if语句时,如果只有一条语句,省略{}是没有语法错误的,而且不影响程序的执行,但是为了程序代码的可读性,建议不要省略。
其中,表达式部分必须用()括起来,它可以是一个单纯的布尔变量或常量,也可以是关系表达式或逻辑表达式,如果表达式为真,则执行“语句块”,之后继续执行“下一条语句”;如果表达式的值为假,就跳过“语句块”,执行“下一条语句”,这种形式的if语句相当于汉语里的“如果……那么……”,其流程图如图5.4所示。
图5.4 if语句流程图
【例5.01】使用if语句判断用户输入的数字是不是奇数,代码如下:(实例位置:资源包\源码\05\5.01)
运行程序,当输入5时,效果如图5.5所示;当输入6时,效果如图5.6所示。
图5.5 奇数运行结果
图5.6 不是奇数的运行结果
说明
if语句后面如果只有一条语句时,可以不使用大括号{},例如下面的代码:
但是,不建议开发人员使用这种形式,不管if语句后面有多少要执行的语句,都建议使用大括号{}括起来,这样方便代码的阅读。
5.2.2 if…else语句
如果遇到只能二选一的条件,比如某个公司在发展过程中遇到了“扩张”和“求稳”的抉择,C#中提供了if…else语句解决类似问题,其语法如下:
使用if…else语句时,表达式可以是一个单纯的布尔变量或常量,也可以是关系表达式或逻辑表达式,如果满足条件,则执行if后面的语句块,否则,执行else后面的语句块,这种形式的选择语句相当于汉语里的“如果……否则……”,其流程图如图5.7所示。
图5.7 if…else语句流程图
【例5.02】用if…else语句判断用户输入的分数是不是足够优秀,如果大于90,则表示优秀,否则,输出“希望你继续努力!”,代码如下:(实例位置:资源包\源码\05\5.02)
运行程序,当输入一个大于90的数时(如93),效果如图5.8所示;当输入一个小于90的数时(如87),效果如图5.9所示。
图5.8 输入大于90的运行结果
图5.9 输入小于90的运行结果
注意
在使用else语句时,else一定不可以单独使用,它必须和关键字if一起使用,例如下面的代码是错误的:
程序中使用if…else语句时,如果出现if语句多于else语句的情况,将会出现悬垂else问题:究竟else和哪个if相匹配呢?例如下面的代码:
如果遇到上面的情况,记住:在没有特殊处理的情况下,else永远都与最后出现的if语句相匹配,即:上面代码中的else是与if(y>x)语句相匹配的。如果要改变else语句的匹配对象,可以使用大括号,例如将上面代码修改如下:
如果修改成这样,else将与if(x>1)语句相匹配。
技巧
建议总是在if后面使用大括号{}将要执行的语句括起来,这样可以避免程序代码混乱。
5.2.3 if…else if…else语句
大家平时在网上购物付款时通常都有多种选择,如图5.10所示。
图5.10 购物时的付款页面
图5.10中提供了5种付款方式,这时用户就需要从多个选项中选择一个。在开发程序时,如果遇到多选一的情况,则可以使用if…else if…else语句,该语句是一个多分支选择语句,通常表现为“如果满足某种条件,进行某种处理,否则,如果满足另一种条件,则执行另一种处理……”。if…else if…else语句的语法格式如下:
使用if…else if…else语句时,表达式部分必须用()括起来,它可以是一个单纯的布尔变量或常量,也可以是关系表达式或逻辑表达式,如果表达式为真,执行语句;而如果表达式为假,则跳过该语句,进行下一个else if的判断,只有在所有表达式都为假的情况下,才会执行else中的语句。if…else if…else语句的流程图如图5.11所示。
图5.11 if…else if…else语句的流程图
注意
if和else if都需要判断表达式的真假,而else则不需要判断;另外,else if和else都必须跟if一起使用,不能单独使用。
【例5.03】使用if…else if…else多分支语句实现根据用户输入的年龄输出相应信息提示的功能,代码如下:(实例位置:资源包\源码\05\5.03)
运行程序,输入一个年龄值,按回车键,即可输出相应的信息提示,效果如图5.12所示。
图5.12 if…else if…else多分支语句的使用
技巧
使用if选择语句时,尽量遵循以下原则。
(1)使用bool变量作为判断条件,假设bool变量flag,较为规范的书写:
不符合规范的书写:
(2)使用浮点类型变量与0值进行比较时,规范的书写格式如下:
不符合规范的书写格式如下:
(3)使用if(1==a)这样的书写格式可以防止错写成if(a=1)这种形式,以避免逻辑上的错误。
5.2.4 if语句的嵌套
前面讲过3种形式的if选择语句,这3种形式的选择语句之间都可以进行互相嵌套。例如,在最简单的if语句中嵌套if…else语句,形式如下:
例如,在if…else语句中嵌套if…else语句,形式如下:
说明
if选择语句可以有多种嵌套方式,开发程序时,可以根据自身需要选择合适的嵌套方式,但一定要注意逻辑关系的正确处理。
【例5.04】通过使用嵌套的if语句实现判断用户输入的年份是不是闰年的功能,代码如下:(实例位置:资源包\源码\05\5.04)
说明
判断闰年的方法是“四年一闰,百年不闰,四百年再闰”。程序使用嵌套的if语句对这3个条件逐一判断,第5行代码首先判断年份能否被4整除iYear%4==0,如果不能整除,输出字符串“这不是闰年”,如果能整除,第7行代码继续判断能否被100整除iYear%100==0,如果不能整除,输出字符串“这是闰年”,如果能整除,第9行代码继续判断能否被400整除iYear%400==0,如果能整除,输出字符串“这是闰年”,如果不能整除,输出字符串“这不是闰年”。
运行程序,当输入一个闰年年份时(如2000),效果如图5.13所示;当输入一个非闰年年份时(如2017),效果如图5.14所示。
图5.13 输入闰年年份的结果
图5.14 输入非闰年年份的结果
说明
(1)使用if语句嵌套时,要注意else关键字要和if关键字成对出现,并且遵守临近原则,即else关键字总是和自己最近的if语句相匹配。
(2)在进行条件判断时,应该尽量使用复合语句,以免产生二义性,导致运行结果和预想的不一致。
5.3 switch多分支语句
视频讲解
在开发中一个常见的问题就是检测一个变量是否符合某个条件,如果不符合,再用另一个值来检测它,依此类推,当然,这种问题可以使用if选择语句完成。
例如,使用if语句检测变量是否符合某个条件。
在执行上面代码时,每一条if语句都会进行判断,这样显得非常烦琐,为了简化这种编写代码的方式,C#中提供了switch语句,将判断动作组织了起来,以一个比较简单的方式实现“多选一”的逻辑。本节将对switch语句进行详细讲解。
5.3.1 switch语句
switch语句是多分支条件判断语句,它根据参数的值使程序从多个分支中选择一个用于执行的分支,其基本语法如下:
switch关键字后面的括号()中是要判断的参数,参数必须是sbyte,byte,short,ushort,int,uint,long,ulong,char,string,bool或者枚举类型中的一种,大括号{ }中的代码是由多个case子句组成的,每个case关键字后面都有相应的语句块,这些语句块都是switch语句可能执行的语句块。如果符合常量值,则case下的语句块就会被执行,语句块执行完毕后,执行break语句,使程序跳出switch语句;如果条件都不满足,则执行default中的语句块。
注意
(1)case后的各常量值不可以相同,否则会出现错误。
(2)case后面的语句块可以多条语句,不必使用大括号{}括起来。
(3)case语句和default语句的顺序可以改变,但不会影响程序执行结果。
(4)一个switch语句中只能有一个default语句,而且default语句可以省略。
switch语句的执行流程图如图5.15所示。
图5.15 switch语句的执行过程
【例5.05】使用switch多分支语句实现查询高考录取分数线的功能,其中,民办本科:350分,艺术类本科:290分,体育类本科:280分,二本:445分,一本:555分。代码如下:(实例位置:资源包\源码\05\5.05)
程序运行效果如图5.16所示。
图5.16 查询高考录取分数线
常见错误
(1)使用switch语句时,常量表达式的值绝不可以是浮点类型。例如下面的代码就是不合法的:
在Visual Studio 2017开发环境中运行上面代码时,将会出现如图5.17所示的错误提示。
图5.17 判断参数为浮点类型时出现的错误提示
(2)使用switch语句时,每一个case语句或者default后面必须有一个break关键字,否则,将会出现如图5.18所示的错误提示。
图5.18 缺少break关键字时的错误提示
5.3.2 switch与if…else if…else的区别
5.2.3节中讲到的if…else if…else语句也可以实现多分支选择的情况,但它主要是对布尔表达式、关系表达式或者逻辑表达式进行判断,而switch多分支语句主要对常量值进行判断。因此,在程序开发中,如果遇到多分支选择的情况,并且判断的条件不是关系表达式、逻辑表达式或者浮点类型,就可以将使用switch语句代替if…else if…else语句,这样执行效率会更高。
5.4 小结
本章详细介绍了条件语句的概念及用法。在程序中,语句是程序完成一次操作的基本单位,而流程语句控制语句执行的顺序,在讲解流程控制语句过程中,通过实例演示每种语句的用法。在学习本章内容时,读者要重点掌握if语句、switch语句的用法,因为这两种语句在程序开发中会经常用到,希望通过对本章的学习,读者能够熟练掌握C#中条件控制语句的使用,并能够应用于实际的开发中。
5.5 实战
5.5.1 实战一:模拟到银行取钱场景
模拟到银行取钱场景:已知银行卡密码是404328,密码正确才可以取钱。使用if语句判断取钱密码是否正确。如果输入的密码是404328,则说明密码正确,运行效果如图5.19所示。(实例位置:资源包\源码\05\实战\01)
图5.19 模拟到银行取钱场景
5.5.2 实战二:模拟设计游戏关卡
模拟设计游戏关卡,要求根据输入的数字,直接进入对应的关卡。如,输入的是数字3,控制台输出“当前进入第3关”,游戏设置只有3关,因此,当输入不是1,2,3的数字时,提示“请输入正确的关数,当前游戏只有3关”。输入正确关数的效果如图5.20所示,输入不正确关数的效果如图5.21所示。(实例位置:资源包\源码\05\实战\02)
图5.20 输入正确关数
图5.21 输入不正确关数