第四部分:图形化编程四级中国电子学会全国青少年软件编程等级考试图形化编程四级的要求为:■ 能够新建链表。■ 能够完成对链表中数据的插入、删除。■ 能够完成字符串处理。■ 能够自己创建一个有返回值的函数。■ 理解函数的作用范围。■ 理解多线程的概念。■ 循环的复杂运用。■ 逻辑、算法过渡。图形化编程四级要用到的指令模块为与函数和列表相关的指令模块。



----------------------------------------------------------------------------

本章我们通过画笔工具来绘制一个雪花图形,绘制完成后效果如图23-1所示。


图23-1 绘制雪花图形虽然这个雪花图形看起来有点复杂,不过它其实是从一个基本的三角形一步一步演变而来的,如图23-2所示。


图23-2 由三角形演变成雪花图形下面就来介绍如何完成这个雪花图形。首先当然是要绘制一个三角形了,注意这里是绘制一个等边三角形。等边三角形的3条边长度相等,且3个内角都相等,即180°÷3 = 60°。在设置好画笔颜色、起始点之后只需要用一个3次的循环就可以完成,程序如图23-3所示。


图23-3 画三角形的程序这里为了只显示图形,我们要将角色隐藏起来。另外,因为角色在转弯时是从外向内转,所以角度是180°60°= 120°。至于“移动243步”这个指令模块中的值243,它是3的5次方,我是为了之后好计算移动的步数,所以设定为这个值,在之后的介绍中,大家会了解这个数字的意义的,现在只需要直接将这个数字输入指令模块就好了。绘制了三角形之后,我们来分析一下最后的雪花图形和这个三角形的差别。总体来说,雪花先是在每条边都突出一个三角形,然后形成一个六角星,如图23-4所示。


图23-4 由三角形演变为六角星因为突出的这个三角形也是等边三角形,所以突出的两条边和两侧的边是一样长的。如果原来绘制一条边的指令模块是:移动243步;则要在这条边上突出一个三角形的指令模块就是:移动81步(243÷3 = 81),右转60°,移动81步,左转120°,移动81步,右转60°,移动81步。将上面的步骤实现在程序中就如图23-5所示。


图23-5 绘制六角星的程序为了方便程序的讲解,我们介绍一下在Scratch中定义函数的方法。函数就是将一些固定指令模块放在一起,方便我们使用。在模块区中选择“自制积木”,里面有一个叫作“制作新的积木”的按钮,单击后会弹出一个对话框。这个对话框中会要求我们输入新积木(即函数)的名称。这里我给它起名为“Draw”,如图23-6所示。


图23-6 制作新的积木然后单击“完成”按钮,就会在模块区中出现一个叫作“Draw”的指令模块,同时在右侧的程序区出现一个叫作“定义Draw”的起始指令模块,如图23-7所示。


图23-7 起始指令模块“定义Draw”“定义Draw”指令模块用于设定这个函数具体执行的功能,这里我们就让它实现绘制带有突出三角形的边的功能,程序如图23-8所示。


图23-8 使用“定义Draw”指令模块的程序而模块区的“Draw”指令模块用于在程序中将“Draw”函数的程序代入,效果如图23-9所示。



图23-9 将“Draw”函数的程序代入我们能够看到这里直接使用“Draw”指令模块代替了右侧的一段程序,这样看起来程序显得非常直观。接着我们再来查看这个六角星和雪花图形的差别,大家能够发现雪花图形是在六角星的每条边上都产生了一个凸起。有了上面的经验,这里直接创建一个函数,名字就叫“Draw2”吧,“Draw2”函数的程序如图23-10所示。



图23-10 “Draw2”函数的程序因为Draw2函数在六角星的每条边上绘制,六角星每条边的边长是81步,现在再绘制凸起的三角形,每次移动的长度就是81 ÷ 3 = 27(步)了。完成了这个函数之后,将其代入“Draw”函数的程序中,如图23-11所示。


图23-11 将“Draw2”函数的程序代入“Draw”函数的程序中这里将“移动81步”指令模块全部替换为“Draw2”指令模块,显示效果如图23-12所示。此时,大家会发现我们绘制的形状离雪花的形状又近了一步,同时可能还发现再下一步就是要将移动27步再分解为移动9步,再之后是移动3步,再之后是移动1步。


图23-12 替换程序按照这个思路,我们分别创建了“Draw3”“Draw4”和“Draw5”函数,如图23-13所示。


图23-13 创建3个新函数“Draw”“Draw4”和“Draw5”然后再分别用“Draw3”指令模块代替“Draw2”函数中的“移动27步”指令模块,用“Draw4”指令模块代替“Draw3”函数中的“移动9步”指令模块,用“Draw5”指令模块代替“Draw4”函数中的“移动3步”指令模块。完成后运行效果如图23-14所示。


图23-14 程序运行效果此时大家就会发现,这就是我最开始展示的那个雪花图形。是不是觉得其实也不难,很容易就画出来了?本章画完这个雪花图形还不算完。我们要来分析一下这些函数。大家是不是觉得图23-14中的这几个函数都差不多,只是每次移动的步数不一样而已?那么是不是能够将这几个函数结合成一个通用的函数呢?这就涉及函数的参数问题,我们先来调整一下“Draw5”函数。在“Draw5”成“定义Draw5”指令模块上单击鼠标右键,选择“编辑”,重新编辑这个函数,在对话框的下方都是与参数相关的内容。参数是一个变量,将值传递到函数中,我们以前使用的很多指令模块中都有参数。这里我们选择添加一个数字参数,单击左下方的“添加输入项 数字或文本”,如图23-15所示。


图23-15 添加数字参数你会看到在函数名(指令模块名称)之后多了一个输入框,输入框中的内容是“number or text”,这表示参数的名字可以是数字或文本,这里我们将名字修改为number1,然后单击“完成”,如图23-16所示。


图23-16 定义参数名字之后,“定义Draw5”指令模块以及模块区中“Draw5”的指令模块都发生了变化,甚至是“Draw4”函数中的程序也发生了变化,这里“定义Draw5number1”后面的参数“number1”是可以直接用的,将其拖曳到“Draw5”函数中的“移动1步”指令模块中,程序如图23-17所示。


图23-17 修改“Draw5”函数中的“移动1步”指令模块这样对于“Draw5”函数来说,它绘制的图形就是和参数“number1”有关的,在“Draw4”函数中因为本身就是移动1步,所以这里程序可以不动。我们在主程序中用“Draw5”指令模块代替“Draw”指令模块,这里参数可以写成81,程序运行效果如图23-18所示。


图23-18 在主程序中用“Draw5”指令模块代替“Draw”指令模块的程序运行效果此时绘制的图形又变成了六角星。参考前面的4个函数,我们可以这样设想,“Draw5(81)”中的“移动xx步”可以换成“Draw5(27)”,而“Draw(27)”中的“移动xx步”可以换成“Draw5 (9)”,依次类推。而27是81的1/3,9是27的1/3,所以我们可以将“Draw5”的函数再做一个调整,调整后的程序如图23-19所示。



图23-19 调整“Draw5”函数的程序我们在“Draw5”函数中调用“Draw5”函数,而其中的参数是“number1/3”。运行程序之后,我们发现舞台区没有任何显示,这是因为每次进入函数之后,函数会将参数除以3又代入函数中,这样一直运算下去。为了解决这个问题,我们要设定一个条件,只有满足条件才能往下分解,不满足条件则停止分解。我们设定当“number-1>0”时才能往下分解,修改后的程序如图23-20所示。用一个“如果…那么…否则…”指令模块代替之前单一的“Draw5”指令模块,此时再运行程序就又可以绘制雪花图形了,如图23-21所示。因为 我 们在“Draw5”函 数 中 调 用的 也 是“Draw5”函 数,所 以 之 前 写 的“Draw”“Draw2”“Draw3”以及“Draw4”函数就都可以删掉了。


图23-20 继续分解的程序


图23-21 程序最终运行效果在编程时,这种自己调用自己的情况称为函数的递归。利用递归策略,只需少量的程序就可描述出解题过程中所需要的多次重复计算,大大减少了程序的数量。关于递归的内容,大家可以通过这个例子再细细地体会一下。一般来说,递归需要有边界条件、递归前进段和递归返回段。当不满足边界条件时,递归前进;当满足边界条件时,递归返回。




点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部