第 18 章 程序中的决策:条件块

上传人:野鹰 文档编号:2654188 上传时间:2017-07-26 格式:PDF 页数:9 大小:773.81KB
返回 下载 相关 举报
第 18 章 程序中的决策:条件块_第1页
第1页 / 共9页
第 18 章 程序中的决策:条件块_第2页
第2页 / 共9页
第 18 章 程序中的决策:条件块_第3页
第3页 / 共9页
第 18 章 程序中的决策:条件块_第4页
第4页 / 共9页
第 18 章 程序中的决策:条件块_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《第 18 章 程序中的决策:条件块》由会员分享,可在线阅读,更多相关《第 18 章 程序中的决策:条件块(9页珍藏版)》请在金锄头文库上搜索。

1、第 18 章程序中的决策:条件块即使是像袋的机这样型的电脑,也可以在短短秒钟内完成超过数千次的操作。更令惊奇的是,它们可以基于内存中的数据以及程序员编写的逻辑进决策。这种决策能在们所思考的智能问题中是极为关键的要素,当然也是创建有趣的智能应的重要组成部分。本章将探索如何在应中编写判断选择逻辑。正如我们在第14章所讨论的,应的为由系列的事件处理程序所定义。每个事件处理程序针对某个特定事件进响应,并实现特定的功能。然,这种响应的过程未必是按线性顺序来实现各项功能,有些功能只能在定条件下才能执。像游戏类的应可能就会判断分数是否已经达到了100,位置感知类的应可能会问“某个机是否在某个建筑物的范围之内

2、”。你的应也可以询问类似的问题,然后根据答案,继续执不同的程序分。如图18-1,当事件(Event1)发时,论如何A功能都会被执;然后进个检测判断:如果检测结果为真,则执B1分;如果结果为假,则执B2分;论执哪个分,该事件处理程序的其余部分(C)都将被执。由于像图18-1这样的决策图看起来像棵树,因此通常会将这种根据判断结果选择执的段程序称为“分”。在这种情况下,你会说, “如果测试结果为真,则执包含B1的分。”图 18-1事件处理程序中,根据条件测试的结果执不同分if及ifelse进条件测试App Inventor提供了两类条件块(如图18-2):if块和ifelse块。可以从Control

3、抽屉拖出个if块,然后点击上的蓝图标,弹出可扩充的块,可以根据需要添加任意多个“else”分。图 18-2条件块if及ifelse可以将任何逻辑表达式(Boolean)插到if右侧的测试插槽中。逻辑表达式是个数学等式,它的返回值要么是真(true),要么是假(false)。如图18-3,逻辑表达式使关系运算符(蓝)以及逻辑运算符(绿),对属性值或变量值进检测。图 18-3于条件判断的关系及逻辑运算符论是if块还是ifelse块,只有“if”后的测试结果为真时,将执“then”右侧插槽中的块。对于if块,如果测试结果为假,程序将跳出if块,继续执if后的块;对于ifelse块,如果测试结果为假,

4、将执“else”右侧插槽中的块。因此,对于个游戏来说,可能会插个与成绩有关的逻辑表达式,如图18-4所。图 18-4于测试成绩值的逻辑表达式在本例中,如果成绩到达100,则播放个声件。注意,如果测试结果为假,不执任何块。如果需要在测试结果为假时执某些操作,可以使ifelse块。编写段选的决策程序考虑这样个应,聊的时候也许会到它:在机上点击个按钮,就可以随机地拨打个朋友的电话。如图18-5,使个random integer(随机整数)块来成个数字,然后ifelse对成的数字进判断,来决定即将拨打的电话号码。图 18-5ifelse块判断随机成的整数来选择要拨打的号码在这个例中,random in

5、teger的参数为1和2,意味着将以相等的率产1或2,所产的随机数保存在变量randomNum中。旦取得了变量randomNum的值,在ifelse块中将变量值与1进较:如果randomNum的值为1,程序将执第个分(then),将电话号码设置为“111-1111”;如果变量值不为1,测试结果为假,程序执第个分(else),电话号码被设置为“222-2222”。论测试结果如何,程序都将拔打电话,因为是在整个ifelse块的下调了MakePhoneCall过程。多重条件判断许多情况下不只是双重选择,即,可选择的结果不仅仅是两个。例如,也许你希望可以给更多的朋友随机拨打电话,因此就需要在原来的el

6、se分中,再加个ifelse,如图18-6所。图 18-6外层条件判断的else分中加另个ifelse条件判断在这些块中,如果第个检测条件结果为真,程序将执第个“then”分并拨打号码“111-1111”;如果第个测试结果为假,则执外层的else分,此时将即进另个测试。因此,如果第个测试结果(randomNum=1)为假,第个测试结果(randomNum=2)为真,则执第个(内层的)“then”分,并拨打号码“222-2222”;如果前两个测试的结果都为假,则执最下的内层的else分,并拨打第三个号码333-3333。注意,在修改过的程序中,随机整数成器(random integer)中的参数

7、2变成了3,因此,将以相等的率成结果1、2或3。这种在个条件判断中加另个判断的式称为“嵌套”,在本例中,可以称为“嵌套的if-else块”,使这种嵌套的逻辑,可以为随机拨打电话的程序提供更多的选择。般来说,任何程序中都可以使任意多层的嵌套。复杂条件判断除了嵌套,还可以设定更为复杂的检测条件,即,多于个等式的检测条件。例如这样个应,当你(或你的机)离开某栋建筑或某个边界时,机会发出震动。这样的应适于那些受控员,警告他们不要远离法定的边界;也可以于家长监视孩们的踪;教师可以它来做动点名(条件是学们都配有Android机!)。例如,我们提出这样的问题:机是否在“旧学哈尼科学中”范围内?这样的应要对4

8、个不同的问题进个复杂的检测:机所在的纬度低于边界纬度的最值(37.78034)吗?机所在的经度低于边界经度的最值(-122.45027)吗?机所在的纬度于边界纬度的最值(37.78016)吗?机所在的经度于边界经度的最值(-133.45059)吗?本例中使了位置传感器(LocatinSensor)组件,即便你没过这个组件,也能够理解这些程序,在第23章中将有更多讲解。使逻辑运算符and、or及not可以构造出更为复杂的测试条件,可以从Logic抽屉中找到它们。在本例中,先拖出个if块以及三个and块,并将and块放在if块的测试插槽中,如图18-7所。图 18-7放在if块测试插槽中的“and

9、”块(选择“External Input/外展式输”以免块的排列过宽)然后拖出个块来组成第个测试问题,并将其放在and块的第个测试插槽中,如图18-8所。图 18-8and块中放了第个测试问题块如法炮制出其他个测试条件,填其他个and的测试插槽中,并将整个if块放事件处理程序LocationSensor.LocationChanged中,这样就写成了个检测边界的程序,如图18-9所。图 18-9每次位置更新时,触发该事件处理程序,来检测是否在边界之内这些块的功能是,在每次位置传感器读数更新时做出判断,如果机的位置在边界之内,则发出震动。OK,到前为,应已经相当酷了,但现在我们来尝试更为复杂的功

10、能,以便你能充分地了解程序中决策的威。如何才能让机仅在越出边界时才发出震动呢?继续学习之前,先想想如何来写这样的程序。我们的法是定义个变量withinBoundary,的是记住传感器上次的读数是否在边界内,并根据每次后续读数的测试结果对变量值进修改。withinBoundary是个布尔(Boolean)类型的变量,与保存数字或本的变量相,它保存的值为true(真)或false(假)。举例来说,如果将变量初始值设为false,如图18-10所,这意味着设备不在旧学的哈尼科学中范围内。图 18-10变量withinBoundary为初始化为false对块做出修改,以便在每次位置信息变化时,对变量w

11、ithinBoundary进设置,并且只有当机越出边界时,才会发出震动。说的更明确些,机产震动的必备条件是(1)变量withinBoundary的值为真,即意味着上次读数还在边界内;(2)新的传感器读数超出了边界。图18-11中是修改后的块。图 18-11这些块的功能是:只有当机从界内移动到界外时,机才会震动我们来仔细地分析下。当位置传感器(LocationSensor)获得读数时,先判断读数是否在边界内,如果是,将withinBoundary设置为true。由于我们希望只有在机越出边界时才震动,因此在第个分中不发震动。如果执的是else分,我们知道新的读数已经超出了边界。此时,我们需要检查上

12、次的读数:尽管这次读数超出了边界,但我们希望仅当上次读数在边界内时,才让机发出震动。withinBoundary变量会告诉我们上次的读数,因此我们会检查这个变量,如果检查结果为真,则让机震动。旦确认机从界内移动到了界外,还有件事必须要做,你能猜到是什么吗?对,需要重新设置withinBoundary为false,这样,在下次收到传感器读数时,机才不会再次震动。关于布尔型变量,还有点需要提:检查下这两个if测试,如图18-12,它们的效果样吗?图 18-12你能说出这两个if测试的结果样吗?答案是“样”!唯的差别在于下边的提问式实际上更加练,上边的测试还要将个布尔型的变量(其值只能是true或f

13、alse)与true进较。如果withinBoundary的值为true,将true与true较,结果定是true;如果变量值为false,将false与true较,结果为false。因此,只需要对withinBoundary的值进检测,像右边那样,其结果相同,且编码更加简洁。结头晕了吗?尤其是最后的部分相当复杂!但这类决策法是级应中必须具备的。如果你能步步(或者说个分个分)地实现这些为,并做到边做边测试,我们敢断,你会发现,即便是智能也不是不可能的。它让你头疼,也让你的脑获得了些许逻辑思维的锻炼,但疑也是充满乐趣的。W3Cschool()最的技术知识分享与学习平台此篇内容来于站户上传并发布。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号