第11届蓝桥杯青少年组省赛原定于2020年3月7日举行,因疫情延期到2020年6月21日进行,形式为在线考试。Scratch分为初级组和中级组,其中初级组面向7~10岁孩子,中级组面向11~14岁孩子。
苹果摆一摆,本题是第11届蓝桥杯Scratch省赛真题编程第5题,是初级组最后一题,中级组也有此题,题目要求考生编程实现苹果摆一摆效果,接下来的两行(第2-3行)每行2个,接下来的三行(第4-6行)每行3个…… 输入行数n,输出对应的苹果效果。
先来看看题目的要求吧。
一.题目说明
编程实现:
苹果摆一摆
有一堆大小为50、间隔为30的苹果是这样摆放的:第一行1个,接下来的两行(第2-3行)每行2个,接下来的三行(第4-6行)每行3个…… 输入行数n,输出对应的苹果效果。
具体要求:
1). 当绿旗被点击,舞台上只出现询问框;
2). 根据提示输入行数n,如果,如果n满足条件(0 < n ≤ 10),就要在舞台上画出n行苹果所呈现的效果;
3). 如果n满足条件n > 10,由于苹果太多装不小,此时不再呈现苹果效果,但是小猫要出现在舞台上,并正确说出最后一行苹果的个数;
4). 如果输入的行数n ≤ 0,应该重新询问,直到满足n > 0,然后呈现出与之对应的效果。
二.作品效果
在编程之前,先来看看作品的完整效果吧:
三.思路分析
本作品包含两个角色,分别是小猫和苹果,如图所示:
本题是一个典型的IPO模型,即输入-处理-输出模型,用户输入整数n,对应的在舞台上显示n行苹果,或者说出最后一行的苹果数量,如图所示:
获取玩家的输入可以使用Scratch中的问答模块,在舞台上显示n行苹果则可以使用克隆或者图章来实现,难点在于处理部分,即如何计算出每一行的苹果数。
常规的思路是找到行数与苹果数之间的规律,通过行数计算出对应的苹果数量,对应关系如下:
聪明的你也许已经发现了,想通过行数来计算苹果数量似乎有点难度,但是反过来,通过苹果数来计算行数就要容易多了,这就是逆向思维。
再进一步,上面表格的数据结构和Scratch中的列表是不是完全一样,可以把行数看作是编号,苹果数是对应的列表项数据,如图:
是不是有点豁然开朗了,你猜对了,我们可以使用列表来保存每一行的苹果数量。然后就可以根据列表数据来显示苹果了。
四.编程实现
根据上面的思路分析,我们分3步来编写程序。
- 完成程序主逻辑
- 计算苹果数量,构造列表
- 绘制苹果
1). 完成程序主逻辑
我们先来完成IPO模式的基本逻辑,当绿旗点击时,将小猫角色隐藏起来,然后开始询问输入行数,并根据用户输入的数字进行相应的处理以及输出。
在小猫角色中编写代码如下:
简要说明如下:
①. 玩家输入的数字有可能小于0,因此这里使用了条件循环,如果回答≤0,则重复询问,直到回答>0;
②. 如果输入的数字>0,则使用变量n将回答保存起来,然后计算苹果数量并构造列表,这里使用了自制积木,具体的代码实现,将在第2步讲解;
③. 由于舞台大小有限,所以需要对n的值进行判断,如果n>10,就直接说出最后一行的苹果数,否则就需要绘制苹果,这里使用了”如果…那么…否则“指令来处理两个不同的分支,并给苹果角色发送了”绘制苹果“的广播消息。
2). 计算苹果数量,构造列表
根据前面的思路分析,我们采用逆向思维来计算每一行对应的苹果数量。先将创建好的”苹果“列表清空,然后创建一个计数器变量”i“,让i从1开始,并重复i次向列表中插入i的操作。
这就意味着,当i为1时,向列表中插入1个1,当i为2时,向列表中插入两个2,当i为3时,向列表中插入3个3,依此类推…,然后将这个过程重复执行n次即可, 代码如图所示:
输入数字8,测试一下,效果如下:
发现问题了吗,每一行对应的苹果数量是对的,但是列表一共有36项,这是怎么回事呢?
原因很简单,因为这里使用了双重循环,当n=8的时候,外层循环执行了8次,而内层循环,分别执行了1次、2次、3次……、8次,所以总的循环次数是 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36。
实际上,我们只需要构造8项数据即可,那什么时候结束循环呢?很简单,当列表的项目数=8时,结束循环即可,不过要注意,判断需要放在内层循环中才对,代码如下所示:
再次测试,效果完美。
3). 绘制苹果
如果n≤10,则需要在舞台上绘制苹果,苹果接收到”绘制苹果“广播消息时,就需要开始绘制了。
绘制苹果通常有两种解决方案,一是使用克隆,二是使用画笔模块中的图章。由于本作品中只需要展示苹果效果,所以使用图章更为简单。
具体的实现也非常简单,就是一个嵌套循环,逐行复制苹果,在苹果角色中编写代码如下:
需要注意的是,每处理完一行,需要将角色移到左边,这就是指令”将x坐标设为-200“的作用,同时要往下移动一定距离,指令”将y坐标增加-30“确保了这一点。
五.总结与思考
本题有一定难度,积木块数量在55个左右,涉及到的知识点主要包括:
- 列表的操作,包括插入、获取和删除等操作;
- Scratch问答模块;
- 事件广播机制;
- 字符串连接操作,尤其是含有变量的多个字符串连接;
- 画笔模块中的图章功能;
- 自制积木;
- 嵌套循环的使用及其执行过程。
本题的难点在于计算每行对应的苹果数量并构造列表,为了解决这个问题,我们使用了逆向思维,通过苹果数量来确定行数,问题瞬间就变简单了。
人们习惯于沿着事物发展的正方向去思考问题并寻求解决办法。其实,对于某些问题,我们要敢于“反其道而思之”,从问题的反面进行探索,或许会使问题简单化。
其实,在编程中经常会出现这种情况,经典的逆推算法也是基于逆向思维的,这也是为什么说少儿编程可以全方位培养孩子思维的原因了。