【blockly教程】第五章 循环结构

在这里,我们将介绍一个新游戏--Pond Tutor

在Pond Tutor(https://blockly-games.appspot.com/pond-tutor)这个游戏中,我们将扮演黄色的鸭子,通过不断的发炮弹去攻击红色的鸭子,当红色的鸭子血条减为0时则玩家获胜。
在这个游戏中为我们提供了四个功能模块:
Swim模块:向给定方向游动;
Scan模块:向给定方向扫描,扫描到敌方时返回二者相距的距离;
Cannon模块:向给定方向和距离发射炮弹;
Stop模块:配合swim模块,使我方停止。
通过结合这几个模块,我们可以想到:首先我们需要朝敌方游动,同时不断的进行扫描;当扫描到敌方时,我们应该停止,同时用扫描到的距离设定炮口的攻击距离。
这里唯一的问题是如何重复不断的进行扫描,所以也就牵出了我们接下来要讲的问题--循环。

 循环是一种基本的程序结构,凡是需要通过不断重复执行才能得到答案的许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。因此熟练掌握选择结构和循环结构的概念及使用是程序设计的最基本的要求。本章将介绍四种形式的循环,都是程序中基本的用于表示重复动作的结构。在本章学习结束后,学生应当具备的能力有:分析一个循环的重复执行次数和终止条件,并能在自己的程序中应用到重复次数,重复,步长,列表循环循环。

5.1 基本概念

迭代:通过包括重复序列允许通过一个简短的程序来代替一系列的重复的步骤程序中重复执行的一段指令叫做循环。
每一个循环由两部分组成:
条件: 控制循环重复次数  循环体: 循环执行时始终运行的代码段。  我们称一个无休止运行的程序为死循环,下图所示的就是一个典型的死循环块。死循环将会阻止一个程序完成其执行,所以含有死循环的程序通常是不可取的。 在浏览器内,一个死循环甚至可以导致程序对鼠标点击失去响应或无限输出对话框,因此要避免出现死循环,控制循环执行次数的程序必须编写正确。

5.2 重复次数模块

 重复次数模块用来实现计数循环,通过在模块中修改次数来规定重复执行的次数。

例如我们要循环三次输出“Hello World”,则只要在重复次数模块的数字块中写入“3”即可。

5.3 重复模块

重复模块中包含了两种不同类型的循环模式:重复-当和重复-直到。

重复-当模块用来实现“当型”循环结构,只要程序的执行条件为真,就会重复执行语句的一系列程序。在未运行前,实际的重复次数是未知的。

 它需要与逻辑语句组合使用,当条件满足时它将重复不断的执行直到条件不满足,所以可能出现的情况是:由于一个逻辑错误,循环将相应代码段重复运行无数次,这对初学者来说是很常见的。
当检查一个循环条件时循环将会执行。如果循环条件为真,将执行循环体中的代码并重复执行这些步骤,在每次循环前将额外检查循环条件。条件为假时退出循环。
循环程序都包涵了三个内容:
一个清晰的起始条件
一个循环条件,指示程序是否应该继续执行循环部分
*一个条件改变最终导致循环条件变为假。
例如,我们使用重复-当模块来实现一个非常常见的问题:从1一直加到100。对于这问题同学们一定不陌生,甚至能有多种不同的技巧去解这个问题。但在这里,我们使用循环就可以用最笨的方法:从1一个一个的加起来,一直加到100。

 而对于重复-直到这个模块来说则与重复-当模块刚好相反:它是当条件满足时就结束循环。

 所以同样针对上面从1加到100的例子,我们只需要将条件i<=100改为i>100即可。

5.4 步长循环模块

 步长循环模块使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以替代重复模块。

 在固定增量下有着固定循环次数的一段程序使用步长循环模块为宜。下面的循环将输出三次单词“Hello”。

 如果你已经接触过一些高级程序设计语言如:C/C++/Java等,你会发现步长循环模块其实就是其中的For循环语句。
 步长循环模块中“使用”后的k为循环的控制变量,这个k可以自己命名并且可以在循环块内充当变量使用;“从范围”后的数字代表循环控制变量k的初始值;“到”后的数值表示循环的结束条件:当k大于这个值时退出循环;“每隔”后的数字为k的步长,表示每循环一次,k增加多少。以上所有的数值都是可以根据自己的实际需要进行修改的。
 下面我们大家都很熟悉的一道应用题来使用步长模块:一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过多少米?第10次反弹多高?

 在这里我们并没有从第一次下落开始就使用循环,而是以落点-上升-落点为过程进行的,由于落点-上升这一过程与上升-落点的过程所经过的距离相同,所以总路程直接加二倍的反弹距离;而反弹距离直接除2即可直接变为原来的一半。

5.5 列表循环模块

 列表循环模块是对列表(list)中每一个元素进行循环迭代的模块,也可以称为是对列表元素的遍历。所谓列表,是相同数据类型的元素按一定顺序排列的集合。使用列表循环模块的循环在达到列表的最后一个值后将自动结束。所以使用列表循环模块是不太可能错误地写成死循环的,或许唯一可以的方式是为循环使用一个含有无限元素的列表!

如下图所示,通过使用列表循环模块可以输出列表numList中的每一个元素。

 虽然使用重复、步长模块也能实现循环输出每一个元素,但用这种方法不但需要知道列表的长度,而且无法像列表循环模块一样直接就定义好了变量去代表列表的元素。
例如求一个列表中的最大元素,我们可以用列表循环模块来实现:

在这里我们定义了一个变量tmp去保存最大的值,将tmp初始化为0保证tmp刚开始为最小,之后用列表循环模块循环拿出列表中的元素不断的与tmp相比较,一旦当前值大于tmp则修改tmp为这个值。最终在tmp中的值将是最大的值。

5.6 中断/继续模块

 中断模块可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。

 中断模块适用于当我们不知道循环次数,只有在程序执行过程中满足一定条件的情况下要结束循环的时候。
我们现在尝试使用循环和中断模块来写一个程序:输入一个数,判断这个数是否为素数。

 在这里我们让m被2到根号m除,如果m能被2到根号m之中的任何一个整数整除,则提前结束循环,此时i必然小于或等于k(即根号m);如果m不能被2到k(即根号m)之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=k+1,然后才终止循环。在循环之后判别i的值是否大于或等于k+1,若是,则表明未曾被2到k之间任一整数整除过,因此输出“是素数”。
 继续模块其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。

 继续模块与中断模块的区别是:继续模块只结束本次循环,而不是终止整个循环的执行。而中断模块则是结束整个循环过程,不再判断执行循环的条件是否成立。
如把100-200之间的不能被3整除的数输出来:

当n能被3整除时,执行继续模块,结束本次循环(即跳过print模块),只有n不能被3整除时才执行print模块输出数字。

5.7 嵌套循环

一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。各种语言中关于循环的嵌套的概念都是一样的。
四种循环(重复次数,重复,步长,列表循环)可以互相嵌套,当循环嵌套在循环中,一个程序可以创建一个重复的重复。

5.7.1 内循环和外循环

当使用嵌套循环时,内外循环扮演着不同的角色:
外循环是先开始后结束的运行顺序。它在程序运行中开始一次结束一次。内循环是比外循环后开始先结束的运行。它可以反复地重复运行。
内循环快速运行,每一次外循环,都会完成一个完整的内循环。外循环循环的偏慢。
内部和外部的循环类似时钟指针的运转。例如,一个时钟的秒针就像内部循环同时分针就像外循环.对于每一次分针的转动,秒针都需要转一圈,转动60整秒.当分针转动一整个小时时,秒针将转动60*60 = 3600秒。里程表和日历的都是用这样相似的工作方式。

5.7.2 非独立的内循环

 有时,内部循环的工作方式取决于外部循环的哪一步运行。例如,创建一个程序打印在一年中所有的日期,您可以使用嵌套循环去打印月份的每天,但内部循环的次数取决于外部循环,这是因为每个月有不同的天数。

 在这里,内部循环重复的是不同的次数,这取决于它在哪个月份上,因为它的结束条件是 j<days[i].
对于月份,我们绘制了一个依赖于存放每一月的天数的数组的内循环,但是对于给一个非独立内循环构思一个规则需要更加的泛化:这样一个程序员需要考虑使用的特殊情况,同时要尝试泛化这个规则。
由于内部循环和外部循环的关系,嵌套循环可以使具有挑战性的程序正确。设计嵌套循环的一个很好的策略是在一个例子中仔细地找出你想要的运行效果,然后找到一个方法来归纳它。

课后练习

 1. 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数。
2. 设计定义一个自己的工具块。
3. 编写函数,给出年、月、日,计算该日是该年的第n天,并尝试将其导出的代码在其他语言环境中调试运行。

知识梳理

转载于:https://www.cnblogs.com/scratch8/p/9637243.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

360董事长周鸿祎跨足手机市场是福还是祸?

编者按&#xff1a;奇虎360董事长周鸿祎做的这个“思考了半年”的决定&#xff1a;进军智能手机&#xff0c;是于5月4日夜10时45分。他所发布新浪微博称&#xff1a;“现在每个人都想拥有高性能的智能手机&#xff0c;高富帅白富美人手一iPhone&#xff0c;难道吊丝只能买便宜低…

3 .6 .5 优化Ad-Hoc工作负载

执行计划生成后会存储在plan cache中&#xff0c;以便重用&#xff0c;如果计划缓存从来都没有被重用 过&#xff0c;将会造成内存资源的浪费&#xff0c;这有可能是由于非参数化的Ad-hoc (即席查询&#xff09;引起的。 当执行代码时&#xff0c;会产生一个hash值&#xff0c;…

表单隐藏域与display:none

有时候前端进行表单填写是分步骤的&#xff0c;每一步的时候其他步骤相关的表单视图不可见&#xff1b; 针对"不可见"&#xff0c;以下有两种处理方式&#xff1a; ①display&#xff1a;none 这种方式呢&#xff0c;比较简单&#xff0c;就是将三个步骤分3个div&…

视频领域的Instagram:Viddy用户突破2600万

北京时间5月9日消息&#xff0c;据TheNextWeb报道&#xff0c;视频分享应用Viddy的注册用户数量已经达到2600万&#xff0c;而上个月的用户数量还是650万。日均增长用户超过50万&#xff0c;成绩斐然&#xff0c;投资者对Viddy目前的增长表示很满意。 Viddy是如何达到这样的成…

2018年7月份,python上传自己的包库到pypi官网的方法

最近pypi官网进行了更新&#xff0c;老的上传网址作废了。记录下上传到pypi的方法 0、去pypi官网注册账号&#xff0c;没账号是不可能上传的&#xff0c;想想也是那不乱套了吗&#xff0c;注册后会收到一个邮件需要点击然后重新登录 1、目录就是这样 &#xff0c;我要上传muli…

写给大数据开发初学者的话2

见 : http://lxw1234.com/archives/2016/11/782.htm 如果你已经按照《写给大数据开发初学者的话》中第一章和第二章的流程认真完整的走了一遍&#xff0c;那么你应该已经具备以下技能和知识点&#xff1a; 0和Hadoop2.0的区别&#xff1b;MapReduce的原理&#xff08;还是那个…

Pandas的结构和应用

Pandas处理以下三个数据结构 - 系列(Series)----一维ndarray   特点&#xff1a;带有标签&#xff0c;可以使用标签作为索引&#xff0c;大小不能改变&#xff0c;内部数据可以改变。 属性&#xff1a;与NumPy类似&#xff0c;多了一个轴标签axis lables 数据…

时间即财富:创业者浪费精力的八个错误

导读&#xff1a;本文作者Jeff Miller是美食网页应用Punchfork的创始人&#xff0c;同时也是DuckDuckGo、Ginzametrics、Art.sy、DataMinr以及Forkly的投资人。作者通过对自己创业初期一些错误选择进行盘点&#xff0c;告诉读者在创业初期应该学会选择&#xff0c;因为在创业初…

写给大数据开发初学者的话3

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 如果你已经按照《写给大数据开发初学者的话2》中第三章和第四章的流程认真完整的走了一遍&#xff0c;那么你应该已经具备以下技能和知识…

十五周二次课

18.6 负载均衡集群介绍 主流开源软件LVS、keepalived、haproxy、nginx等其中LVS属于4层&#xff08;网络OSI 7层模型&#xff09;&#xff0c;nginx属于7层&#xff0c;haproxy既可以认为是4层&#xff0c;也可以当做7层使用keepalived的负载均衡功能其实就是lvslvs这种4层的负…

写给大数据开发初学者的话4

见&#xff1a;http://lxw1234.com/archives/2016/11/795.htm 如果你已经按照《写给大数据开发初学者的话3》中第五章和第六章的流程认真完整的走了一遍&#xff0c;那么你应该已经具备以下技能和知识点&#xff1a; 为什么Spark比MapReduce快。使用SparkSQL代替Hive&#xff…

域名解析服务之DNS查询类型

在实际应用中DNS查询主要分为两种方式查询&#xff1a;1.递归查询&#xff1b;2.迭代查询 一般情况下&#xff1a;为了减少资源的消耗&#xff0c;网络中客户端与所属的本地DNS服务器查询方式通常为递归查询&#xff0c;本地DNS服务器与外部的公共DNS服务器间的查询方式为迭代查…

MFC Ribbon界面设计

Ribbon是类似于office2007样式的界面&#xff0c;它替代了传统的MFC程序里的菜单和工具栏 MFC默认生成的Ribbon功能少&#xff0c;需要我们自己添加一些控件和图片等元素使界面好看 看下面的一个界面&#xff0c;是VC2010示例里的 看到它与默认Ribbon样式的区别&#xff1a; 工…

获取泛型T的ClassT clazz

在我们搭建框架中往往会用到泛型,我们知道泛型的好处是在编译的时候检查类型安全&#xff0c;并且所有的强制转换都是自动和隐式的&#xff0c;代码的重用率高 然而有时候<method>的入参并不能直接强制转换成泛型的类型,比如说下面这段代码&#xff1a; 很明显String 类…

写给大数据开发初学者的话5

见&#xff1a;http://lxw1234.com/archives/2017/01/832.htm 至此&#xff0c;你的大数据平台底层架构已经成型了&#xff0c;其中包括了数据采集、数据存储与计算&#xff08;离线和实时&#xff09;、数据同步、任务调度与监控这几大模块。接下来是时候考虑如何更好的对外提…

3.spring boot Controller获取请求参数的值

2019独角兽企业重金招聘Python工程师标准>>> 1.获取连接中的参数,使用倒的关键词PathVariable RestController public class HelloController {RequestMapping(value "/hello/{id}",method RequestMethod.GET)public String index(PathVariable("i…

登录与注册

代码如下 private void btn_login_Click(object sender, EventArgs e){SqlConnection sqlconnection new SqlConnection();sqlconnection.ConnectionString ConfigurationManager.ConnectionStrings["SQL"].ConnectionString;SqlCommand sqlcommand new SqlComman…

三分钟明白 Activiti工作流 -- java运用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、 什么是工作流 以请假为例&#xff0c;现在大多数公司的请假流程是这样的 员工打电话&#xff08;或网聊&#xff09;向上级提出请…

vue-i18n使用及踩坑记录

使用步骤 1. 安装 npm i vue-i18n 2. vue-cli下使用 //1. 引入 vue-i18n import Vue from vue import VueI18n from vue-i18n Vue.use(VueI18n)//2. 定义messages const messages {en: {text: {hello: hello world}},zh: {text: {hello: 你好、世界}} }//如果messages字段很多…

idea搭建web项目及tomcat部署总结

该文章为引用文章&#xff0c;原地址为&#xff1a;https://www.cnblogs.com/shindo/p/7272646.html 后面有我自己搭建过程中遇到的问题及解决方案&#xff0c;请参考。 一、创建简单web项目 1、创建一个web project File -> new Project ->选择project sdk 为1.6&#x…