友情提示:380元/半年,儿童学编程,就上码丁实验室。
今天我们要探讨的核心问题是程序设计中的一个非常重要的内容——函数。函数的定义和示例已在本期的前导部分讲过,这里不再赘述。直接进入今天的任务:如何像下图中那样,一口气画20个边数各不相同的多边形?
画正多边形的程序前面的课程已经讲了(点此复习),我们得到了如下的代码:
仔细观察上述代码,我们发现,真正绘制正多边形的操作都是在循环部分完成的。那么我们能否把这个循环部分“抽取”出来,变成能独立完成任务的一块单独的“积木”呢?或者说,我们能否定义一个能绘制正多边形的“函数”呢?如果能,不就离我们要完成的任务更近一步了嘛!
答案当然是肯定的。但还有一个小问题需要解决。
回顾前导部分的函数定义和示例,我们发现定义函数时,一般需要给函数提供一些“数据”,告诉函数到底该计算“几”的平方根,或是在屏幕上显示“什么”字符。这个“几”和“什么”,就是我们提供给函数的“初始数据”,行话叫“参数”。函数只有获得了这些“参数”,才能按照我们的需要做好它的分内之事。
回到我们的“正多边形”函数。虽然绘制正多边形的操作涉及很多因素——边长、旋转角度、边数等,但实际上整个绘制多边形的循环部分都是由一个变量在“操纵”(见上图红框),那就是“边数”。只要给定边数,我们就能让程序自动绘制出一个尺寸合适的正多边形。其实想想也很容易理解,如果不告诉函数多边形的边数,函数怎么知道该画几边形呢?!
有了这些分析,下面来看具体操作:
Step1: 从积木区深紫色的“更多积木”部分,点击“制作新的积木”按钮,弹出“新建积木”对话框(如下图);
Step2: 在“新建积木”对话框点击“选项”前的小三角,弹出新建积木所需选项(如下图);
Step3: 在紫色积木的标签中输入“绘制正”(如上图1⃣️);
Step4: 在“选项”中点击“添加一个数字参数”按钮(如上图2⃣️);
Step5: 将“数字参数”的名字改为“N”(如上图3⃣️);
Step6: 在“选项”中点击“添加文本标签”按钮(如上图4⃣️);
Step7: 在数字参数后的文本标签中输入“边形”(如上图5⃣️);
Step8: 最后点击“确定”按钮(如上图6⃣️),就在积木区得到了一块“绘制正1边形”的积木,同时在代码区得到了一块小房子形状的、写着“定义‘绘制正N边形’”的积木(如下图)。
这个“小房子”,就是我们定义函数的开始(行话叫“函数头”,外国话叫“header”)。
鉴于我们之前已经搭建好了绘制正多边形的代码,直接把那些代码“拖”到小房子的下面即可,形成“函数体”,外国话叫“body”。
拖过来后,记得把函数体中的变量“边数”,替换为函数中的新变量“N”。(如上图)。如果觉得函数运行不够快,可以将“等待0.5秒”这块积木移除。
至此,函数(新的积木)已创建完毕,下面就来用一下试试吧!
把积木区我们新建的“绘制正1边形”积木拖至“主代码”的最下方,并把参数“1”替换为我们之前定义的变量“边数”。
点击“绿旗”运行。Wow!效果一样很好对不对?而且,看看我们现在的代码,变得多么简洁,只用一块积木就实现了“绘制正N边形”的功能!
现在我们拥有了一块功能如此强大的积木,再来完成本课的目标就会轻松许多了。
我们再来仔细观察一下我们要绘制的图形——从最上边开始,先是一个“三角形”,然后是一个“正方形”,然后又是一个“正五边形”,再接着是“正六边形”、“正七边形”、……
经过这么一分析,我们的脑海中大概应该已经有了思路——使用一个循环,边数从“3”开始,不断增加,一层层的绘制“正多边形”就行了。
说干就干!
我们先将开始时的边数设为“3”,使用一个计数循环(先来10次试试)来多次使用我们的“绘制正N边形”积木(行话叫“调用‘绘制正N边形’函数”),每次使用后,给边数“加1”。得到代码如下图:
这里,我们不得不再次感叹,使用函数后的代码“可读性”有了很大提高,因为我们把绘制正N边形的“细节”,全部“隐藏”在了定义积木的过程中。积木的使用者不用关心这个积木到底是怎么画出正多边形的,他们“只管用”就好了!
点击“绿旗”运行,得到了我们的最终结果……
哦不!这是什么?怎么会这样!我们的思路完全正确啊,程序的逻辑也无懈可击,为什么得到的结果却事与愿违?
对于产生这个结果的原因我今天不做过多分析,留给大家进行分析思考,看看您能不能找到问题的根源,并着手把问题解决掉呢?
提示:仔细对比错误图形与正确图形的差别。
项目小结:
在今天的项目中,我们:
-
学习了积木区深紫色的“更多积木”部分,使用“制作新的积木”按钮,“新建积木”的方法;
-
学习了如何把具有一定功能的一段代码抽取出来,形成一个独立函数的思维过程,这是本课的重点和难点,也是今后很大一部分课程的核心内容;
-
学习了如何使用代码对新建的积木进行定义的方法;
-
学习了如何使用“自己定义的积木”(简称“自定义积木”)的方法。