# 第四章 Blockly之选择结构

今天，我们通过一个游戏来学习选择结构，游戏的地址如下：\
&#x20;<https://blockly-games.appspot.com/bird?lang=en>\
&#x20;本游戏分为10关：主要游戏规则如下：\
&#x20;①主界面是游戏的运行界面，我们需要通过控制代码来让鸟叼完虫子后回到鸟窝，并保证不撞到墙。\
&#x20;②代码主要由选择结构和逻辑判断组成。\
&#x20;③点击下方的Run Program按钮后程序就会执行右侧的代码。回到鸟窝后，游戏结束，顺利通关。\
&#x20;你可以先尝试着看看鸟应该怎样去运动，并如何调用代码块。稍后我们将会详细介绍关于选择结构的各种语法。<br>

| 1.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F8067d70b840c877c393c9240357b626ad9e45a77.png?generation=1633137066468668\&alt=media) | 2.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F2c56125037424bbd0995e8c2f53bcdd60db6b070.png?generation=1633137078102417\&alt=media)  |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 3.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F66a3e02cd935e7091c7c3f9cac75b7c0bd357e09.png?generation=1633137077552159\&alt=media) | 4.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F8a06e201bcba21c6696fdab46b2fd6ea1089ef34.png?generation=1633137069487520\&alt=media)  |
| 5.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F4a2aa6945ea722c6d78905c3ba2067425c4c3764.png?generation=1633137068494494\&alt=media) | 6.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F817e911f06617a27b10d61bffa1a45ae273b73e6.png?generation=1633137056518395\&alt=media)  |
| 7.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F93be4b25d7c0898413d1f85bcf252d944a30bc35.png?generation=1633137081767970\&alt=media) | 8.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2Fa73a2d42a987f3d296370a6ec1b64bb5772e6d77.png?generation=1633137052552870\&alt=media)  |
| 9.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F0066ce1c2a1e3d2a78d8b55c4aa90e445bf31418.png?generation=1633137065479584\&alt=media) | 10.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F8431fe559a2585fef05c2d27d884bea054b99788.png?generation=1633137053435273\&alt=media) |

## 4.1 关系运算符和关系表达式

 关系运算是逻辑运算中比较简单的一种，所谓的关系运算实际上就是比较运算，将两个值进行比较，从而判断比较的结果是否满足符合的条件，比如关系表达式a>5，如果a为6，那么表达式成立，结果就是真，反之，如果a的值为-1，那么表达式不成立，结果就是假。

### 4.1.1关系运算符及其优先顺序

我们有如下6种关系运算符：>，<，≥，≤，==，!=\
&#x20;优先级次序如下：\
&#x20; （1）前四种的优先级顺序高于后两种，前四种优先级相同，后两种优先级相同。\
&#x20; （2）关系运算符的优先级低于算术运算符。\
&#x20; （3）关系运算符的优先级高于赋值运算符。\
&#x20;举几个例子：

(1)c > a+b   c > (a+b)\
&#x20;(2)a > b == c   (a > b) == c<br>

### 4.1.2关系表达式

关系表达式的结果有两个，如下图所示，真和假（非真）。\
&#x20;我们需要注意“=”和“==”的区别：\
&#x20;“=”表示赋值语句，比如a = 5，是把5赋值给变量a\
&#x20;“==”是逻辑判断，比如a == 5，是表示变量a的值是否和5相等，如果相等就返回真，反之返回假，我们的blockly如下图所示，逻辑判断“==”写成了“=”，是为了方便大家去理解，但实际上你要知道这两者是有区别的，细心的读者打开blockly转换到代码就会发现代码中显示的都是“==”。<br>

## 4.2 逻辑运算符和逻辑表达式

### 4.2.1逻辑运算符及其优先级

 逻辑运算符包括与、或、非，在我们的blockly中，如下图所示去表示分别为和、或、非。

![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2Fdcc508d649b81d4e62fdefe8aabb3e71bdbf5aad.png?generation=1633137055437096\&alt=media) 逻辑和，a 和 b，当且仅当a，都为真时，结果为真。\
&#x20;逻辑或，a 或 b，只要a，b中有一个为真，结果就为真。\
&#x20;逻辑非，非 a，如果a为真，则结果为假，如果a为假，那么结果为真。\
&#x20;我们用图表的形式来表示如下：<br>

| a | b | a and b | a or b | not a |
| - | - | ------- | ------ | ----- |
| 真 | 真 | 真       | 真      | 假     |
| 真 | 假 | 假       | 真      | 假     |
| 假 | 真 | 假       | 真      | 真     |
| 假 | 假 | 假       | 假      | 真     |

（1）非逻辑，即非在三种运算符中优先级最高。\
&#x20;（2）逻辑“和”和“或”优先级相等，低于非逻辑

### 4.2.2逻辑表达式

 逻辑表达式的值应该是真或假，下面我们一起通过一个例子来了解下逻辑表达式在选择结构中的作用：\
&#x20; 我们知道在平年中2月份是28天，闰年中2月份是29天，那么怎样去区分平年和闰年呢？我们可以通过如下的流程图来进行判断：<br>

![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F34e6209edab9d68d6c143f301bfb7f4bf73f007a.png?generation=1633137073354253\&alt=media) 闰年的条件是符合下面二者之一：\
&#x20; ①能被4整除，但不能被100整除\
&#x20; ②能被4整除，又能被400整除\
&#x20; 在blockly中有两种除法，一种是普通的除法，一种是取余除法，如下图所示：\
&#x20; 普通除法直接进行计算，而取余除法将是将未整除的数保留下来，只取整数部分，并没有小数部分。\
![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F7f0b0327eadcafb9a9de783232e0bbcb9744ea5c.png?generation=1633137078529128\&alt=media)  我们用符号/来表示除法，用%来表示取余，&&表示“和”，||表示“或”，！表示“非”。\
&#x20; 那么闰年就可以这样来表示：\
&#x20; （year % 4 == 0 && year % 100 ！=0）|| year % 400 == 0\
&#x20; 那么非闰年就直接在前面加一个！符号就好了\
&#x20; ！（（year % 4 == 0 && year % 100 ！=0）|| year % 400 == 0）\
&#x20; 转化为代码就是这样：![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2Ff3ca8f14845d4df165d708a86b54b48163f5d6eb.png?generation=1633137075456878\&alt=media)

## 4.3 条件语句-if

### 4.3.1选择结构之if语句

 Blockly中的if语句表示选择条件，如果满足条件就执行“......”语句，在if的左侧有一个设置按钮，点开后可以添加else if和else语句，表示多重判断，你可以将左侧的模块儿拖到if下面就形成了其它三种语句。

![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F4c7349157505e8a493f8402228e1632afd1ab81d.png?generation=1633137060719041\&alt=media)  比如这个例子：  班里面要做一个成绩统计，成绩在90分以上就输出A，在80-90分之间就输出B，80分以下输出C：\
![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2Fbcc79719b73ef5930934745d1aa3529688ed300c.png?generation=1633137054551556\&alt=media)  我们进行到这里这个程序你大致就应该明白了上面的代码究竟写的是什么内容，第一句话就是从键盘获取一个分数赋值给score这个变量，如果90![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F0949c8921de9fa1d64ac631731114860faedd2b7.png?generation=1633137057435301\&alt=media)![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F9a9525e692fb95c2efe7a9907e51a49d59ad1ad4.png?generation=1633137061483773\&alt=media)

我们把刚才闰年的那个例子用编程来实现：

运行结果如下：

 是不是挺简单的呢？下面我们将前面学习的东西巩固下，并将训练的难度进行升级：\
&#x20; ①创建两个变量，并比较这两个数的大小。\
&#x20; ②创建三个变量，分别通过键盘复制，并将这三个数由小到大输出。\
&#x20;解析：\
&#x20; ①我们比较两个数的大小时，有三种情况，大于小于和等于，因此就要用到if条件语句进行两次判断，剩下的一种情况直接用else即可， “to result append text”这个语句是字符串追加的意思，就是我们不仅仅只输出一个数字，而是输出整个结果，比如2>1，2=2，2<3这样的结果。

输出结果如下所示：

 ②三个数比较大小时，情况就比较复杂了，还要从小到大进行输出，这就不仅仅需要进行比较了，而且还需要进行排序，这就需要了解在程序中怎样去交换两个变量，我们来举一个现实中的例子，现在我们有两杯水，我们怎样去交换这两杯水呢？

![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F9ddf036eb1d87405088542370e61cfad74047091.png?generation=1633137076641294\&alt=media) 答案是显然的，我们需要借助第三个空杯，我们把他们编号A，B，C。\
&#x20;那么交换A，B两杯水，需要以下步骤：\
&#x20; （1）把A中的水倒入C\
&#x20; （2）把B中的水倒入A\
&#x20; （3）把C中的水倒入B\
&#x20;我们的程序也是这样，交换两个变量也需要借助第三个变量，剩下的就简单了，只要两两比较就可以了，因为要从小到大输出，所以只要前者大于后者将两个数交换就可以了。![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2Fac2249e05f1315c74df6840cef1d4fec965ad69b.png?generation=1633137074470032\&alt=media)![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F4f36c2eb033d260b79668b350b90acce09cf64e9.png?generation=1633137063565367\&alt=media)

### 4.3.2选择结构的嵌套-if嵌套

 if嵌套语句实际上就是在if语句里面还有if语句，实现了嵌套，我们刚才讲的平年闰年的问题其实也可以用嵌套的方法来解决：\
&#x20; 首先判断year能否被4整除，如果能被4整除，再判断能否被100整除，这时可能还不是闰年，还要再进行判断，如果能被400整除那就是闰年，不能就是平年。<br>

## 4.4选择结构在生活中的应用

 其实我们在平时上网的时候网页中存在着很多的选择结构，比如说登陆注册界面，我们以qq的登陆界面为例子，如下图所示：

①qq中的昵称是可以随意的，你可以和别人的昵称是相同的，所以在昵称这栏我们在后台只需要判断是否存在非法字符就可以了，如果存在非法字符就在后面显示一个小“×”，如果昵称合法，就显示一个对号“√”。

②qq中密码的判断较为复杂，它分为三个等级，每输入一个字符后程序都会对其进行判断，如下图所示，每次判断后合格的项就会打勾，而且两次密码必须是一致的，判断是在第二次输入密码确定的。

③生日、所在地这些都是需要进行选择的，我们需要在后台将所有的信息输入到选择文本中去，这样用户只要直接进行选择就可以了。\
&#x20;④当所有的信息全部填写完成，还要进行一次大的判断，就是所有条件全部满足时，即所有条件全都为真时，就会显示注册成功，否则就会弹出必须还要填写什么必要信息。<br>

理解嵌套循环了么，现在我们再来回顾开篇的例子，看看你能否做出答案。参考答案如下：

| 1.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2Fb3046119ba2d136a3cc4f43d93e6c449c70c4bf3.png?generation=1633137062541770\&alt=media) | 2.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F3ca9a5ba3d5967f17b39e4df218482fcb9de5757.png?generation=1633137059533662\&alt=media)  |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 3.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F2cbf1a6f40b59c465310bd8b6b39fc7932e0ec31.png?generation=1633137077542082\&alt=media) | 4.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F77a7699b6a778b0da569acbc557913133ad34aed.png?generation=1633137073572461\&alt=media)  |
| 5.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2Ff60062e8654fdd8483ad710563c77f798ad929e6.png?generation=1633137079535583\&alt=media) | 6.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F3ba424fd7cc9506ee23de33db4a183c8a01fd71f.png?generation=1633137064609473\&alt=media)  |
| 7.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2Fa6d05b2adb57c18f61c2e37d716563c7ccd73848.png?generation=1633137080591865\&alt=media) | 8.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F3ba424fd7cc9506ee23de33db4a183c8a01fd71f.png?generation=1633137064609473\&alt=media)  |
| 9.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2Fc306e58a502adf6b09ad875287ab74a3cafa0fc9.png?generation=1633137067624751\&alt=media) | 10.![](https://2231434094-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAGigtuROPsQ2glV29e%2Fsync%2F8773382ccf418621e54a894cb56e623814365648.png?generation=1633137058583181\&alt=media) |

## 课后练习

1.写出下面各逻辑表达式的值。设a=3,b=4,c=5。\
&#x20; (1)a+b>c && b==c\
&#x20; (2)a || b+c && b-c\
&#x20; (3)!(a>b) && !c||1\
&#x20; (4)!(x=a) && (y==b) && 0\
&#x20; (5)!(a+b)+c-1 && b+c/2\
&#x20;2.给一个不多于五位的正整数，要求：\
&#x20; (1)求出它是几位数；\
&#x20; (2)分别阀引出每一位数字；\
&#x20; (3)按照逆序打印出各位数字，例如原数为321，应输出123。

## 知识梳理
