03
Blockly选择结构
● 学习目标
理解选择结构的概念。
理解、运用单分支选择结构。
理解、运用双分支选择结构。
理解、运用多分支选择结构。
理解选择结构的嵌套。
● 知识图谱
在前面的学习中,我们熟悉了Blockly中各种基本模块的功能,并尝试了在顺序结构中进行设计。顺序结构在程序流程图中的体现就是用流程线将程序框自上而下地连接起来,按顺序执行算法步骤。但是,我们会发现当遇到判断变量是否满足某一条件才可以执行下面的步骤时,很难只用顺序结构表达出来,这时就需要运用选择结构来对选择条件进行判断。本章首先带领大家认识选择结构,然后根据选择结构的构成分别介绍单分支选择结构、双分支选择结构以及多分支选择结构,最后介绍选择结构的嵌套。在学习完本章内容后,通过Blocky Game中的Bird游戏对选择结构的使用进行练习。
3.1 基本概念
例如,我们要判断一个数是否为正数,并输出文字结果。流程图如图3-1所示,通过判断输入的数值是否大于0,输出结果。当x>0时,输出“正数”;否则输出结果为“非正数”。这种通过判断是否满足选择条件来决定下一个步骤的过程就是选择结构。在Blockly中运用if和else语句完成选择条件,表达if语句的模块如图3-2所示。如果满足条件,则执行某一步骤。在if的左侧有一个设置按钮,单击后可以添加else if和else语句到右侧,从而进行多重判断。
选择结构用于判断给定的条件,根据判断的结果判断某些条件,根据对条件的判断结果控制程序的流程。
3.2 单分支选择结构
单分支选择结构是最简单的选择结构,用if语句表示。若满足条件则执行某一步骤,其流程图如图3-3所示。在Blockly中则使用图3-4所示的模块来执行。在“如果”后面输入判断语句,当逻辑判断结果为真时,则执行放在“执行”部分的语句块。
【例3-1】 运用Blockly判断加法运算结果是否正确,若正确则提示“正确”,不正确则无反馈。
【解答】 这一过程只需要运用单分支选择结构就可以完成,即只需要运用if语句,在Blockly中,运用“如果—执行”模块即可。假设要判断1+1的运算结果,当在“=”后输入的是2时,可以弹出显示“正确”的提示框;当把“=”后的值改为0后,运行程序则无反应,如图3-5所示。
3.3 双分支选择结构
双分支结构一般用if else语句表示,当满足某一条件时,执行A步骤;否则执行B步骤。其流程图如图3-6所示。在Blockly中需要在“如果—执行”模块的基础上添加“否则”部分,最终显示如图3-7所示。和单分支选择结构一样,在“如果”后面输入判断语句,当逻辑判断结果为真时,执行放在“执行”部分后面的语句块;当逻辑判断结果为假时,执行放在“否则”部分后面的语句块。
【例3-2】 运用Blockly判断加法运算结果是否正确,若正确则提示“正确”,不正确则提示“错误”,使用双分支选择结构。
【解答】 我们只需要在单分支选择结构示例的基础上,为逻辑判断错误的情况添加“否则”模块,后面加上输出“错误”即可。同样以判断1+1的运算结果为例,当我们输入的是2时,可以弹出显示“正确”的提示框;当把“=”后的值改为0后,则弹出显示“错误”的提示框,如图3-8所示。
练一练
输入一个变量,判断该变量是否可以被3整除,并输出结果“可被3整除”或“不可被3整除”。
3.4 多分支选择结构
多分支选择结构由if和else if语句构成,其中可以有多个else if结构,其流程图如图3-9所示。在Blockly中使用多分支选择结构时,需要在单分支选择结构中添加“?否则如果?”模块,该模块可以不限数量。在“?否则如果?”模块后面可以添加“?否则?”模块,也可以不添加,最终形式如图3-10所示,这些都是多分支选择结构。
小提示
多分支选择结构中可以有多个选择判断部分,但是除第一个选择判断部分外,其他部分都是在上一个判断的False分支上。
【例3-3】 班里面需要做一个成绩统计,成绩在90分以上输出A,在80~90分之间输出B,80分以下输出C。
【解答】 这里需要将分数做3个分段,一个分段是大于90分的,输出A;剩余的分数中,大于80分的输出B;否则输出C。根据判断条件,最终在Blockly中制作出语句模块,如图3-11所示。
练一练
统计班级的分数段,一共有“90~100”“80~90”“70~80”“60~70”和“60以下”5个分数段。要求输入成绩,显示出属于哪个分数段。
3.5 选择结构的嵌套
选择结构的嵌套实际上就是在选择结构中再放置一个或多个选择结构,实现选择结构的嵌套。在Blockly中实现选择结构的嵌套,需要将多个“如果—执行”模块套用。可以将嵌套的“如果—执行”模块放置在“执行”模块的后面,如图3-12a所示;也可以放置在“否则”模块的后面,如图3-12b所示。但是将一个新的“如果—执行”模块放置在“否则”模块后面时,这种形式等同于在“如果—执行”模块的基础上添加“否则如果”部分。比如图3-12b中搭建的模块的意义与图3-12c中的模块相同,也就是当选择结构嵌套部分放在“否则”模块中时,可以简化为多分支结构。
小提示
选择结构的嵌套没有固定的模式,也没有规定嵌套部分需要放置在哪一部分,只要选择结构内有一个或多个选择结构,就是实现了选择结构的嵌套。
【例3-4】 我们知道在平年中2月有28天,闰年中2月有29天,那么怎样利用Blockly编写一个判断年份是否为闰年的程序呢?
【解答】 要判断某个年份是否为闰年,首先需要判断该年份是否可以被4整除,如果不可以被4整除,那么这个年份肯定不是闰年。在可以被4整除后,还需要进一步判断这个年份的后两位是否为0,即是否可以被100整除。如果不可以被100整除,则这个年份一定为闰年;如果可以被100整除,还需要判断这一年份是否可以被400整除。如果可以被400整除,那么这个年份是闰年;如果不可以被400整除,则是平年。整个判断过程如图3-13所示,在Blockly中实现这一判断过程,需要将3个选择结构进行嵌套来完成。最终选择结构的嵌套部分在Blockly中的实现形式如图3-14所示。
练一练
创建3个变量,在Blockly中使用选择结构的嵌套形式,比较3个变量的大小,并将这3个数由大到小排列。
3.6 小试牛刀—游戏:鸟
学习完如何在Blockly中使用选择结构后,我们通过一个游戏来熟练掌握这种程序结构,游戏的地址如下:http://cooc-china.github.io/pages/blockly-games/zh-hans/bird.html?lang=zh-hans 。
游戏规则:
① 我们需要通过控制代码来让鸟捉完虫子后回到鸟巢,并保证不会撞到墙。
② 代码主要由选择结构和逻辑判断组成。
③ 单击“运行程序”按钮后程序就会执行右侧的代码。回到鸟巢后,游戏结束,顺利通关。
通关详解:
第1关:让鸟沿着45°方向向前飞行,捉完虫子后回到鸟巢,如图3-15所示。
第2关:让鸟在捉到虫子前沿0°向前飞行,捉到虫子后沿90°飞行,回到鸟巢,如图3-16所示。
第3关:让鸟在捉到虫子之前沿右下方飞行,捉到虫子之后再沿右上方飞行,如图3-17所示。
第4关:让鸟在飞行横坐标小于80时,向右飞行;横坐标不小于80时,向下飞行到达鸟巢,如图3-18所示。
第5关:让鸟在飞行纵坐标大20时,向下飞行;纵坐标不大于20时,向左飞行到达鸟巢,如图3-19所示。
第6关:当鸟捉到虫子前沿右斜下方飞行,捉到虫子后判断鸟所处位置的纵坐标是否小于80,当小于80时,向上方飞行;当不小于80时,向左方飞行,如图3-20所示。
第7关:先让鸟沿左下方飞行,越过下面的阻拦物至纵坐标40处,然后令其在横坐标不超过80时,沿右斜下方飞行,捉到虫子;随后在纵坐标不超过20时,沿左方飞行回到鸟巢,如图3-21所示。
第8关:当同时满足鸟没有捉到虫子和飞行横坐标小于50时,沿右上方飞行;然后设定没有捉到虫子和飞行横坐标大于49时,沿右下方飞行,令鸟捉到虫子。捉到虫子后判断鸟所处位置的纵坐标是否小于50,当小于50时,令鸟沿着左上方飞行至界面中点;随后改为沿右上方飞行,回到鸟巢,如图3-22所示。
第9关:当同时满足鸟没有捉到虫子和飞行横坐标大于50时,沿正左方飞行;然后设定没有捉到虫子和飞行纵坐标大于20时,沿正下方飞行,令鸟捉到虫子。捉到虫子后判断鸟的横坐标是否大于40,当小于40时,令鸟沿着右斜上方飞行,随后改为沿右斜下方飞行,回到鸟巢,如图3-23所示。
第10关:当没有捉到虫子时,若鸟的飞行横坐标小于40,则沿右斜上方飞行;若大于40,沿右斜下方飞行。捉到虫子后,当鸟的横坐标大于40时,沿左斜上方飞行,小于40时,沿左斜下方飞行,回到鸟巢,如图3-24所示。
3.7 本章练习
1.给出一个不多于5位的正整数,请在Blocky中实现以下要求:
1)求出它是几位数;
2)分别打印出每一位数字;
3)按照逆序打印出各位数字,例如原数为321,应输出123。
2.函数y=f(x)表示如下,编程实现输入一个x值,输出y值。请在Blockly中实现这一函数。
3.自己上网查资料,搜集有关气象风级表的信息,比如0级表示无风,12级表示飓风等,试在Blockly中编写程序,输入一个风级,输出相应的概况,如名称、速度等。
3.8 课外拓展
开源软件的由来
开源软件,全称为开放源码软件(Open Source Software),顾名思义,它是指源码可以被公众使用的软件,而且开源软件的修改和使用一般不会受到许可证的限制。关于开源软件的起源,可以追溯到20世纪60年代的UNIX的诞生。
1969年,贝尔实验室的工程师开始开发UNIX。在此后的10年里,UNIX在学术及商业机构中得到了广泛的应用。许多机构在使用UNIX的过程中,对其功能进行了扩展和改进,并衍生出许多新的产品,如BSD(Berkeley Software Distribution)、Linux等。但是好景不长,贝尔实验室逐渐意识到了UNIX的商业价值,于是不再将UNIX的源代码免费授权给学术和商业机构了,甚至开始对之前UNIX的衍生版本声明版权权利,也因为这一举动,引发了许多版权纠纷。从某种程度上看,UNIX在开源方面起了很小的作用。
1984年,理查德·斯托曼发起了GNU项目,与此同时,自由软件的概念也已诞生,GNU项目的贡献者旨在开发一个让每个人可以自由、免费使用的软件。后面为了协助GNU计划的开展,理查德·斯托曼推动并建立了自由软件基金会。1991年,Linux内核诞生,并且伴随着Linux热度逐步升高,它也成了GNU计划的最终产物。也正是基于这些原因,时至今日,只要一提到开源,大家首先想到的就是Linux。
其实开源软件不仅有Linux,还有很多比较知名的,比如集成开发环境Eclipse、Linux下的文本编辑器VIM、Android操作系统、Python编程语言,Apache网页服务器,Arduino单片机等。其实还有一个在开源发展历史中具有里程碑意义的软件—Github,由于它所提供的软件源代码托管服务,使得更多的开发者参与到开源项目中来,任何人都可以将自己的项目托管到Github上,他人能非常方便地查找到感兴趣的项目及源代码,而且可以与项目所有者以协作的方式开发。
“开源软件”既代表一种哲学思想,也代表一种软件发展模式。在像Linux这样的开源项目中,软件是免费共享的,其“源代码”(经验丰富的程序员能够阅读并理解的编码指令)是公开发布的,以便其他程序员学习、分享和修改,众人拾柴火焰高,开源会越来越流行,越来越强大。