[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第159讲。
第15届蓝桥杯第2次STEMA测评已于2023年10月29日落下帷幕,编程题一共有6题,分别如下:
-
旅游相册
-
隐身的小鸟
-
摩天轮
-
找不同游戏
-
字母不重复的子串
-
卡片排列
卡片排列,本题是2023年10月29日举行的第15届蓝桥STEMA测评Scratch编程初/中级组编程第6题,题目要求编程实现卡片排列的效果。
先来看看题目的要求吧。
一.题目说明
编程实现:
卡片排列。
具体要求:
1). 点击绿旗,角色、背景如图所示(随机显示5张不同卡片,显示在同一行,卡片间距相同);
2). 舞台显示询问框,提示“请输入1或2”;
3). 如果输入1,1秒内,按照卡片上的数从小到大排序(从左到右),如图所示;
4). 如果输入2,1秒内,按照卡片上的数从大到小排序(从左到右),如图所示。
评判标准:
-
15分:满足"具体要求"中的1);
-
5分:满足"具体要求"中的2);
-
40分:满足"具体要求"中的3);
-
40分:满足"具体要求"中的4)。
二.思路分析
本题只有1个卡片角色,如图所示:
但是卡片有12个造型,对应数字1~12,如图所示:
需要注意的是,造型编号和卡片数字是一一对应的。
本题考查的知识点包括克隆、列表运算和排序算法。关于列表排序,在往届蓝桥杯真题中出现过多次,比如:
-
《列表排序-第10届蓝桥杯Scratch省赛真题第6题》
-
《对对碰-第11届蓝桥杯Scratch省赛真题第6题》
-
《考试成绩系统-第12届蓝桥杯Scratch省赛2真题第5题》
-
《统计字符串-第13届蓝桥杯Scratch省赛真题第5题》
-
《列表排序-第14届蓝桥杯STEMA测评Scratch真题精选》
-
《比较身高-第15届蓝桥杯第一次STEMA测评Scratch真题精选》
由此可见,排序算法有多么的重要,是必须要熟练掌握的知识点。
关于排序,有10来种不同的算法,比如选择排序、插入排序、冒泡排序、快速排序等。
之前已经介绍过一些排序算法,包括简单排序和选择排序,这一次超平老师准备使用冒泡排序算法。
除了排序之外,本题还需要使用卡片来显示排序效果,这是本题的难点。
不过,我们可以分两步来解决,先实现数据排序,然后再根据列表中的数据来显示卡片效果。
1. 数据排序
这里一共有5张卡片,卡片的数字分别是1~12,所以先要从1~12之间随机选择5个数字,保存到列表中,在输入1或2之后,需要对列表进行排序。
冒泡排序是一种典型的交换排序算法,持续比较相邻元素,将大(小)的移到后面,因此大的会逐步往后挪,故称之为冒泡。
具体过程如下:
1). 比较相邻的元素,如果第一个比第二个大(小),就交换它们两个;
2). 对每一对相邻元素作同样的工作,这样在最后的元素应该会是最大(小)的数;
3). 针对所有的元素重复以上的步骤,除了最后一个;
4). 重复步骤1~3,直到排序完成。
其动画效果如下:
2. 卡片显示
卡片显示分两种情形:
1). 排序之前
2). 排序之后
其中,排序之前的比较容易,直接按照列表中的数据,选择对应造型逐个克隆并显示即可。
这里的难点是排序后的显示效果,题目要求1秒完成排序,我们可以使用“在1秒内滑行到x,y”指令,关键是需要知道每张卡片的x坐标。
我们可以使用一个列表,将5张卡片的x坐标保存起来,如图所示:
当列表完成排序后,只需要根据卡片的造型编号,移到对应的位置即可。此处不是很好理解,需要多思考一下。
思路有了,接下来,我们就进入具体的编程实现环节。
三.编程实现
根据上面的思路分析,我们分4步来编写程序:
-
随机列表数据
-
克隆卡片并显示
-
列表排序
-
卡片排序
1. 随机列表数据
先创建列表“卡片”,然后往列表中插入5个随机数字,数字的范围是1~12,为了方便讲解,可以使用自制积木来组织代码。
在卡片角色中编写自制积木如下:
代码比较简单,关键点是要确保没有重复的数据,所以每一次都需要判断随机出来的数字是否包含在列表中,如果包含,则重新生成随机数。
2. 克隆卡片并显示
有了列表数据,就可以根据列表中的数字,选择对应造型克隆卡片了。为方便组织代码,继续使用自制积木,代码如下:
这是一个典型的克隆场景,先将本体移到舞台左边,然后根据列表中的数据来选择对应造型,克隆卡片,每克隆一个,就右移80步,确保5张卡片自左至右依次排列。
注意,这里使用了列表”x坐标“,将卡片的坐标保存起来。
在绿旗下使用自制积木,实现随机卡片的排列效果,代码如下:
对应的,将克隆体显示出来,如下:
执行代码,效果如下:
3. 列表排序
接下来是询问”请输入1或2“,然后根据输入数字对卡片进行排序。输入1时,按从小到大的顺序排列,我们称其为正序,输入2时,按从大到小的顺序排列,我们称其为逆序。
有的同学会想,我们要分别进行正序排序和逆序排序。实际上,我们只需要一次排序,只要确保列表中的数据是排好序的就行。
在循环遍历列表的时候,可以从第一项开始,也可以从最后一项开始,这样就可以得到正序和逆序的数据了。
根据前面的思路分析,我们使用自制积木来实现冒泡排序,代码如下:
代码有些难度,简单说明3点:
1). 对于长度为5的列表,我们需要进行4轮排序,一轮排序完毕,就把未排序中最大的数据移到最后了;
2). 每一轮排序,都是从第一个数据开始比较,已排序的数据无需比较,所以比较次数为5 - i;
3). 在交换列表数据的时候,需要使用一个中间变量,就是这里的”临时编号“,注意其写法。
有了自制积木,就可以在绿旗代码段中,继续编写代码如下:
4. 卡片排序
当接收到”正序“广播后,卡片按照正序排序,代码如下:
同理,当接收到”逆序“广播后,卡片按照逆序排序,代码如下:
至此,整个作品就创作好了,是时候来测试程序的效果了。
四.总结与思考
本题是中级组编程部分第6题,分数为100分,积木块数量140个左右,涉及到的知识点主要包括:
-
Scratch问答指令;
-
循环编程,尤其是嵌套循环
-
条件编程,包括单分支和双分支;
-
变量的使用;
-
列表的运算;
-
克隆编程;
-
排序算法;
这是中级组最后一题,难度较大,完成时间30分钟左右,难点有两个,一是列表排序,二是卡片的排列效果。
排序是编程中最基础的一种算法,其应用也非常的广泛。在众多的排序算法中,选择排序最简单,冒泡排序则是最经典的,所以,这是每一位学习编程的同学必须要熟练掌握的算法。
超平老师给你留一个思考题,本题中分享的冒泡排序,每次将较大的数字往后挪,其实也可以将较小的数字往前挪,如图:
你知道如何编程实现吗,赶紧动手试试吧。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要素材和源码的,可以移步至“超平的编程课”gzh。