本文主要是介绍选择排序-第15届蓝桥第4次STEMA测评Scratch真题精选,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第172讲。
第15届蓝桥杯第4次STEMA测评已于2024年1月28日落下帷幕,编程题一共有6题,分别如下:
-
青蛙过河
-
巡逻的直升机
-
栽花
-
绘制风车
-
专注力游戏训练
-
选择排序
选择排序,本题是2024年1月28日举行的第15届蓝桥STEMA测评Scratch编程中级组编程第6题。题目要求编程实现扑克牌排序,在舞台上随机出现4张点数不同的扑克牌,依次将最小的牌移到第1、第2、第3和第4个位置。
先来看看题目的要求吧。
一.题目说明
编程实现:
排序。
具体要求:
1). 点击绿旗,在舞台上出现4张点数不同的扑克牌,牌上的点数是随机的(4-9点),如图所示;
2). 最左侧第1张扑克牌与四张扑克牌中最小的牌交换位置(如果第1张牌是最小的则不需要交换位置),如图所示;
1秒后,最左侧第1张扑克牌与四张扑克牌中最小的牌交换位置(如果第1张牌是最小的则不需要交换位置),如图所示;
3). 1秒后,第2张扑克牌与第2、3、4三张牌中最小的牌交换位置(如果当前第2张牌是三张牌中最小的则不需要交换位置),如图所示;
4). 1秒后,第3张扑克牌与第3、4两张牌中较小的牌交换位置(如果当前第3张牌是较小的则不需要交换位置),之后排序完成,四张扑克牌从左到右按从小到大的顺序排列,而后程序结束,如图所示。
评判标准:
-
16分:满足"具体要求"中的1);
-
28分:满足"具体要求"中的2);
-
28分:满足"具体要求"中的3);
-
28分:满足"具体要求"中的4)。
二.思路分析
本题只有1个扑克牌角色,如图所示:
扑克牌有6个造型,牌面分别为4、5、6、7、8、9,如图:
这是一道算法题,考查的知识点包括克隆、运动、列表和排序算法。
这里的重难点是排序算法,又是排序算法,是不是感觉很熟悉。没错,就是排序,在历届蓝桥真题中,排序已经出现了不下10次,可以说是老朋友了。
但是这一次对排序的方式有具体的要求,同时通过扑克牌展示具体的排序过程。
排序是编程中最常见的基础算法,关于排序的算法也挺多的,一共有10来种,包括选择排序、插入排序、冒泡排序、快速排序、希尔排序、归并排序、计数排序、基数排序、桶排序和堆排序等。
本题所描述的排序是选择排序,其核心思想是这样的:
-
首先在未排序的数列中找到最小(或者最大)元素,然后将其存放到数列的起始位置;
-
接着再从剩余未排序的元素中继续寻找最小(或者最大)元素,然后放到已排序序列的末尾;
-
以此类推,直到所有元素均排序完毕。
其排序方式可以参考下图:
选择排序很像我们打扑克牌时,把牌从左到右扫描,找到最小的一张牌,放到最左边,然后从第二张牌继续扫描第二小的牌,放到第二的位置,以此类推,直至所有的牌都排列好。
需要注意的是,在编程中,每次找到最小的牌时,需要交换两张牌的位置。由于每一轮只能处理一张牌,并且最后一张牌无需处理,所以对于n张扑克牌,需要进行n-1轮排序。
为了更好地理解选择排序,下面介绍如何使用扑克牌来演示详细的排序过程。
准备扑克牌一副,红蓝色棋子各一枚,为便于演示,取牌面为2、5、6、7、9的5张纸牌进行排序操作。将5张纸牌打乱顺序,假定牌面从左到右依次为7、9、5、2、6。
由于每次都需要挨个比较找到最小的纸牌,因此5张牌需要进行4轮排序。
第1轮排序:
将红色和蓝色棋子放在左边第1张纸牌上方,标记为j,然后从红色棋子所在位置的下一张纸牌(j+1)开始,从左至右依次把每一张纸牌与蓝色棋子所在位置的纸牌进行比较,并将蓝色棋子放置在较小的纸牌上方。直到将红色棋子右边的纸牌全部比较一遍,此时蓝色棋子就停留在最小的纸牌上方。
然后将红色棋子和蓝色棋子所在位置的两张纸牌交换位置,至此完成第一轮排序,最小的一张纸牌2被移到正确位置,如图:
第2轮排序:
将红色棋子和蓝色棋子放置于左边第2张纸牌上方(j=2),按照上述步骤进行比较,然后交换位置,在第二轮排序完成之后,纸牌5就移到了正确位置,如图:
第3轮排序:
再将红色和蓝色两枚棋子置于左边第3张纸牌上方(j=3),重复上述过程,对纸牌进行比较和交换,完成第三轮排序后,纸牌6就移到了正确位置,如图:
第4轮排序:
继续移动棋子,将它们放到左边第4张纸牌上方(j=4),继续前面的步骤,在第四轮排序完成之后,纸牌7就处于正确的位置,而剩下的纸牌9自然而然也就处于正确位置了,如图:
至此,整个排序过程结束,5张扑克牌已经按照从小到大排好序了,依次为2,5,6,7,9。
排序过程中,这里的红色棋子和蓝色棋子是用来进行标记的,在编程时可以使用变量来表示。
思路有了,接下来,我们就进入具体的编程实现环节。
三.编程实现
根据上面的思路分析,我们分4步来编写程序:
-
构造随机列表
-
克隆纸牌
-
实现选择排序
-
交换纸牌
1. 构造随机列表
由于扑克牌是随机排列的,一共有6张扑克牌,要随机选4张,因此需要创建一个列表,将随机出来的4张扑克牌的点数存入列表。
为了方便,我们可以定义一个自制积木,用于构造随机列表,代码如下:
代码不多,强调3点:
1). 每次都需要先清空列表;
2). 为了确保没有重复的数字,因此需要对随机出来的数字进行判断;
3). 列表中保存的扑克牌的牌面数字,不是造型编号。
2. 克隆纸牌
有了随机列表,就可以根据列表中的数字来依次克隆扑克牌了。
克隆本身比较简单,由于后续需要交换扑克牌的位置,因此还需要使用列表保存4张扑克牌的位置,同时使用私有变量对扑克牌进行编号,编号依次为1、2、3、4。
在绿旗下编写代码如下:
简单说明两点:
1). 4张牌的y坐标是固定,只有x坐标不同,因此只需要保存x坐标;
2). 这里的变量”_ID“是私有变量,为了和全局变量进行区分,专门添加了下划线,这是一个好的编程习惯。
对应的,需要设置克隆体的造型,代码如下:
代码比较简单,但需要注意,通过ID获取列表中的数字后,需要减去3。这是因为在”换成造型“指令中使用变量或运算时,优选匹配的是造型编号,而第一个造型对应的牌面是4,牌面数字和造型编号之间相差3。
执行代码,就可以实现4张扑克牌的随机排列。
3. 实现选择排序
接下来就是选择排序了,根据前面的思路分析,需要使用嵌套循环来实现。为了更好地组织代码,我们使用自制积木来实现排序,代码如下:
代码比较多,说明5点:
1). 这是一个典型的两层循环结构,外层循环表示轮次,这里有4张牌,所以需要进行3轮排序;内层循环表示每一轮的比较过程;
2). 每一轮比较,都需要记录最小值和最小值的下标(在列表中的编号),并且需要进行初始化。为了简单起见,这里直接将下标初始化为0,最小值则设为100,当然也可以设为其它值,只要比所有的牌面数字大就行;
3). 每一轮比较,都是从未排序的第一张牌开始,因此重复次数和轮数有关系,它等于5-轮数;
4). 每一轮比较完成,都会得到最小下标值,如果等于轮数,则说明不需要交换,否则需要交换,交换时,需要借助一个临时变量;
5 ). 每一次交换之前需要等待1秒,一旦列表中的数据交换完毕,就需要交换扑克牌了,所以发送了一个”交换“的广播,等待扑克牌交换位置后继续下一轮排序。
然后在绿旗指令的末尾使用这个自制积木,如图:
4.交换纸牌
在接收到”交换“广播后,对应的两张牌需要交换位置,这里的难点是如何知道是哪两张牌呢,又是怎么交换位置的呢?
如果你做过洗牌发牌这道题,你会发现其实挺简单的,具体的分析可以参考《洗牌发牌-第14届蓝桥杯STEMA测评Scratch真题精选》这篇教程。
这里有两个列表,一个是四张牌的x坐标,另一个是四张扑克牌的数字,如图:
两个列表的编号都是1、2、3、4,对于每张扑克牌而言,可以通过造型名称找到在”点数“列表中的编号,再通过这个编号到”x坐标“列表中找到其坐标,如此就可以确定每张扑克牌的x坐标了。
比如,第一次排序后,”点数“列表中的6和8进行交换,列表就变成了:
对于扑克牌8来说,它在“点数”列表中的编号是4,对于扑克牌6来说,它的编号则是1,有了这两个编号,就可以确定其x坐标分别为180和-180,两种牌分别移到自己的位置即可。
交换之后,如图所示:
这一下应该彻底理解了吧,代码其实就只有一行,如下:
实际上,4张牌都会执行上述代码,只是另外两张扑克牌的x坐标没有发生变化而已。
至此,整个作品就创作好了,你可以运行程序来测试效果啦。
四.总结与思考
本题是中级组编程部分第6题,分数为100分,积木块数量75个左右,涉及到的知识点主要包括:
-
列表运算;
-
循环编程,尤其是嵌套循环;
-
克隆编程;
-
变量的使用,包括全局变量和私有变量;
-
选择排序算法;
这是中级组最后一题,难度较大,完成时间30分钟左右,难点有两个,一是选择排序的算法思想和实现过程,二是如何交换扑克牌。
对于排序,已经无需再强调了,是100%要掌握的基础算法。对于初级组的考生来说,只需要掌握简单的排序即可,但是对中级组的考生而言,必须要掌握冒泡排序、选择排序和插入排序等经典算法。
同时还要强调一点,一些经典的场景在蓝桥比赛中会反复出现,比如这里的排序,这里的扑克牌交换位置,因此,我们一定要重视对历届真题的学习。
超平老师给你留一个思考题,选择排序和冒泡排序有何区别,哪种排序算法更好呢?
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要素材和源码的,可以移步至“超平的编程课”gzh。
这篇关于选择排序-第15届蓝桥第4次STEMA测评Scratch真题精选的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!