93 第5章 if判断 5.1 if 语句 老师,我有一个问题。 同学,有什么问题? 在前面的关卡中,有些关卡中部分开关已经打开了。 是的。 我看到图片中开关是亮的,所以我没有再次打开, 如果我无法判断开关是否是打开状态,那怎么办呢?如 果已经是打开状态,再执行打开,就会关闭。 能够提出这个问题,说明同学认真学习和思考了, 在编程中经常会遇到类似的问题,要先判断,然后才能 决定是否执行。 是的,老师。我就不知道如何判断选择。 好的,现在就给大家介绍一个新知识:if 判断。 if 判断就像在衣柜中选衣服。衣柜中有很多漂亮的衣服,有短袖T 恤、长袖 T 恤、外套,也有羽绒服,大家怎么选择呢?首先,大家要根据天气环境来选择, 如果现在是春天,那就选择长袖T 恤;如果现在是夏天,那就选择短袖;如果现 Ddnzw1.indd 93 2021.9.13 10:23:12 AM 呆呆鸟儿童编程在游戏中学习 在是秋天,那就选择穿上外套;如果现在是冬天,就要选择穿上羽绒服,这就是 选择判断。 下面用一个例子讲解如何使用if 判断,如图5.1 所示。 图5.1 if 判断场景 这个场景中主角前方有1 个开关,开关可能是“关闭”状态,也可能是“打开” 状态。也就是说,只能在程序运行过程中才能确定开关的状态。 如果不对开关状态进行判定就执行开关切换命令toggle() ,就可能将已经打 开的开关关上。因此,决定是否执行toggle() 命令,就需要先使用if 判断语句来 判定开关的状态。 if 判断语法: if(布尔条件表达式){ 执行的命令 } if 是判断语句的标识,后面的小括号中是表示判定条件的布尔条件表达式, 满足条件执行的代码放在大括号中。 94 Ddnzw1.indd 94 2021.9.13 10:23:13 AM 第5章 if判断 如果小括号中的布尔表达式成立,就会执行大括号中的代码;反之,如果小 括号中的布尔表达式不成立,则不会运行大括号中的代码。这样,if 判断就可以 根据具体情况来确定需要执行的代码。 在介绍完if 判断语句的语法后,这里给出判断开关状态并执行toggle() 命令 的代码。 代码 if (isOnCloseSwitch) { toggle(); } isOnCloseSwitch 是布尔表达式。布尔表达式只有两个结果:真(true )和假 (false)。当结果是“真”则说明条件成立,当结果是“假”则说明条件不成立。 以isOnCloseSwitch 为例,这是一个系统提供的布尔变量,表示主角是否站 在一个处于关闭状态的开关上。如果isOnCloseSwitch 的值是true (真),表示主 角站在关闭状态的开关上;如果值是false (假),表示主角没有站在处于关闭状 态的开关上。 5.2 else if 语句 if 判断语句是对一种条件的判断,如果要判断第二种条件,就要使用else if 语句。这里先给出一个else if 语句的适用场景,如图5.2 所示。 在这个场景中,主角前方的砖块上有1 个物品,可能是开关,也可能是南瓜。 如果是这样,不仅要检测开关状态,还要检测是否是南瓜。因此单一的if 判断无 法满足此场景,增加else if 语句则可以满足场景物品判断的要求。 95 Ddnzw1.indd 95 2021.9.13 10:23:13 AM 呆呆鸟儿童编程在游戏中学习 图5.2 else if 语句场景 if-else if 语法: if(布尔条件表达式1){ 执行命令1 }else if(布尔条件表达式2){ 执行命令2 } else if 语句不能单独使用,需要先使用if 语句进行第一个条件的判断,再使 用else if 语句对另一个条件进行判断。else if 的语法格式与if 相似,在小括号中 的是布尔条件表达式,需要执行的特定代码放在大括号中。 “伪代码”就是用熟悉的语言编写类似代码的内容,用来快速 描述编程的思路。伪代码并不能运行,需要转化成计算机能够执行 的代码程序。 知识小课堂 96 Ddnzw1.indd 96 2021.9.13 10:23:14 AM 第5章 if判断 if ( 是关闭的开关){ 打开开关 }else if ( 是南瓜) { 收集南瓜 } 伪代码 这里的“伪代码”描述场景中南瓜和开关的条件判断过程。首先判断是否是 关闭状态的开关,如果是就打开开关;如果不是,再判断是否是南瓜,如果是南瓜, 就收集南瓜。 有了伪代码,如何将伪代码转换为可以运行的代码, 这 个需要大家动脑筋思考一下 。 将伪代码转换为可以运行代码的过程,一般是保持代码的基本结构不变,将 自然语言描述的部分替换成程序命令就可以了。 代码 if (isOnCloseSwitch) { toggle(); }else if (isOnReward){ take(); } 这就是将示例场景的伪代码转换为可以运行的代码。 其中,isOnCloseSwitch 在5.1 节已经介绍过,表示主角是否站在一个处于关 闭状态的开关上。 isOnReward 表示主角是否站在一个有南瓜的砖块上。单词Reward 意思是奖 励,这里用来指代关卡中需要收集的南瓜。 97 Ddnzw1.indd 97 2021.9.13 10:23:14 AM 呆呆鸟儿童编程在游戏中学习 5.3 else 语句 if 和else if 语句可以对多种条件进行判断,对于其余没有指定的条件判断, 就要使用else 语句。这里先给出一个else 语句的适用场景,如图5.3 所示。 图5.3 else 语句场景 主角前方可能有一个南瓜,也可能什么都没有。主角向前移动1 格,如果站 在有南瓜的砖块上,就收集南瓜,否则就再前进1 格。 根据前面学过的if 语句,可以很容易地写出第一个条件的判断,但如果不 符合第一个条件,剩下的所有情况都要前进1 格。这样的情况适合使用else 语句, 表示在if 语句描述条件都不符合的情况下,运行else 中的代码。 98 if-else 语法: if(布尔条件表达式1){ 执行命令1 }else if(布尔条件表达式2){ 执行命令2 }else{ 执行命令3 } Ddnzw1.indd 98 2021.9.13 10:23:15 AM 第5章 if判断 else 语句也不能单独使用,需要与if 语句一起使用。else 语句放在if 语句和 else if 语句的最后,表示所有不符合之前条件判断的情况。 在if-else 语法中,如果不满足“布尔条件表达式1”,也不满足“布尔条件 表达式2”,此时则会执行else 大括号中的“执行命令3”。 在示例场景中,前进1 格后判断是否有南瓜,有则收集南瓜,没有则再前进 一格。使用if 语句和else 语句写出的代码如下: 代码 给大家看一段更加复杂的代码,里面包含了if 语句、 else if 语句和else 语句,大家能不能读懂其中的内容? 代码 move(); if (isOnReward){ take(); }else{ move(); } if (isOnReward){ take(); }else if (isOnCloseSwitch){ toggle(); }else{ move(); } 上面这段代码的意思是:如果有南瓜就收集南瓜;如果有关闭的开关,就打 开开关;条件都不符合,就向前前进一步。 99 Ddnzw1.indd 99 2021.9.13 10:23:16 AM 呆呆鸟儿童编程在游戏中学习 if 、else if 和else 在实际编程中需要组合 使用,主要的组合模式有如下4 种。 模式1: 模式2: if ( 条件A) { if ( 条件A) { 代码1 代码1 } }else if( 条件B){ 代码2 }else if ( 条件C){ 代码3 } 模式3: 模式4: if ( 条件A) { if ( 条件A) { 代码1 代码1 }else if ( 条件B){ }else{ 代码 2 代码2 }else{ } 代码3 } 模式1:适用于判断如果满足条件A,就执行特定代码1。 模式2:适用于判断分别满足条件A、B、C 时,分别执行代码1、代码2、 代码3。 模式3:适用于判断分别满足条件A、B 时执行特定代码1 和代码2,其余 情况执行代码3。 模式4:适用于判断如果满足条件A 则执行特定代码1,其余情况执行代 码2。 在条件判断中,if 和else 只能出现一次,else 表示所有之前没有描述过的情 况;而else if 则可以出现多次,每出现一次表示判断一种条件。 100 Ddnzw1.indd 100 2021.9.13 10:23:16 AM 第5章 if判断 5.4 流程图 流程图是一种图形化的描述方法,是为了获得问题的解决方案而需执行的命 令组合和操作顺序。由于流程图的直观性,可以很方便地表达复杂的算法和过程, 这有利于快速理解算法和命令流程。 图5.4 所示是一个修理电灯的流程图。流程图有“开始”和“结束”,中间 包括很多步骤和描述,例如“电灯不工作了”“维修电灯”“插电源”“换灯泡” ; 还包括一些判断的内容,例如“灯泡坏了吗?”和“电源插好了吗?”。 图5.4 修理电灯的流程图 流程图是有规范的,常用的符号如图5.5 所示。 101 Ddnzw1.indd 101 2021.9.13 10:23:21 AM 呆呆鸟儿童编程在游戏中学习 图5.5 流程图常用符号 5.5 关卡案例 老师,if 判断的4 种模式我已经了解。 很好,这4 种模式是最基本的模式。 我对这些if 判断模式的使用还不熟练。 没关系,大家可以通过关卡练习,更好地掌握if 判 断。 哦,那我还要多加练习。 102 Ddnzw1.indd 102 2021.9.13 10:23:26 AM