[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第153讲。
第15届蓝桥杯第1次STEMA测评已于2023年8月20日落下帷幕,编程题一共有6题,分别如下:
-
行走的螃蟹
-
飞驰的高铁
-
旋转的正方体
-
弹跳小球
-
比较身高
-
数据计算
比较身高,本题是2023年8月20日举行的第15届蓝桥杯STEMA测评Scratch编程中级组编程第5题,题目要求编程实现比较身高。游戏开始后,先向列表中插入5个随机的身高数据,1秒后计算他们的平均身高,再等1秒,将小于平均身高的数据填充到另一个列表中,并排序。
先来看看题目的要求吧。
一.题目说明
编程实现:
比较身高。
具体要求:
1). 运行程序,角色、背景如图所示(列表1和列表2为空);
2). 等待1秒后,在列表1中随机生成5个不重复的整数(170 ≤ 整数 ≤ 190),表示5名同学的身高;
3). 等待1秒后,小男孩说出5名同学的平均身高2秒(平均身高四舍五入取整);
4). 在列表2中自动填入列表1中小于平均身高的数据(按照由小到大的顺序排列)。
评判标准:
-
10分:满足"具体要求"中的1);
-
15分:满足"具体要求"中的2);
-
15分:满足"具体要求"中的3);
-
40分:满足"具体要求"中的4)。
二.思路分析
本题只有1个角色,就是卡通小人,如图所示:
本题考查的知识点包括列表操作、数学运算和排序算法。
根据题目的描述,我们使用计算思维中的拆分思想,可以将作品的功能分为4个模块:
-
随机身高数据
-
计算平均身高
-
筛选数据
-
排序
对于模块1,要求在列表1中随机生成5个不重复的整数。这里的关键是不重复,这就要求每随机一个身高,都需要判断列表1中是否包含该数据,如果包含,则重新生成,直到不包含为止,这通常需要使用”重复执行直到“指令。
模块2则比较简单,可以有两种方式:
1). 在生成身高数据的时候,进行累加,然后将总和除以5;
2). 单独计算,使用循环遍历列表,进行累加,然后将总和除以5;
两种方式各有优劣,方式1比较简单,方式2的代码结构更优,为了让代码结构更加清晰,超平老师选择方式2。
模块3,筛选数据也比较简单,只需要对列表1进行遍历,挨个比较,将小于平均身高的数据插入到列表2中即可。
模块4是排序,也是本作品的难点。关于排序,在之前的真题中出现过多次,比如:
-
《考试成绩系统-第12届蓝桥杯Scratch省赛2真题第5题》
-
《列表排序-第14届蓝桥杯STEMA测评Scratch真题精选》
排序是编程中最常见的基础算法,关于排序的算法也挺多的,常见的经典排序算法有选择排序、插入排序、冒泡排序和快速排序等。
实际上,针对此题中的数据,还有更简单的方式,就是比较法。
本题中的身高在170~190之间,而列表2中的数据在170 ~ 平均身高之间,我们可以让数字从平均身高开始,将其和列表2中的数据挨个比较,如果相等,则说明该数字是最大值,将其移到列表的最前面,否则就不做任何操作。
然后将数字减1,再重复上面的操作,直到所有小于平均身高的数据都处理完,这样就可以将列表2中的数据按照从小到大进行排列了。
思路有了,接下来,我们就进入具体的编程实现环节。
三.编程实现
根据上面的思路分析,我们分5步来编写程序:
-
初始化
-
随机身高数据
-
计算平均身高
-
筛选数据
-
排序
1. 初始化
本题的初始化比较简单,包括列表的清空、角色的位置,在角色中编写代码如下:
注意:需要先创建好列表1和列表2。
由于代码较多,为了简化代码结构,也为了方便讲解,超平老师定义了4个自制积木,分别用于实现随机身高数据、计算平均身高、筛选数据和排序,如图:
2. 随机身高数据
根据思路分析,需要创建变量,将其命名为”随机数“,然后随机一个身高,重复判断列表1中是否包含该随机数,代码如下:
这段代码非常经典,专门用于实现向列表中插入不重复数据,其关键点是”重复执行直到“指令的使用。
每次生成的随机数有两种可能性,要么不在列表中,要么在列表中。如果不在列表中,条件不成立,循环结束,直接将随机数插入列表中;如果在列表中,则需要执行循环,重新生成随机数,直到生成的随机数不在列表中,然后再将随机数插入到列表中。
3. 计算平均身高
这一模块相对比较简单,使用循环将列表中的每一项取出来,累加求和,再除以5即可,为了实现这一功能,需要创建3个变量:
-
i,用作计数器
-
身高和
-
平均身高
其实现代码如下:
需要注意,这里的平均身高是需要进行四舍五入的。
4. 筛选数据
筛选数据比较简单,仍然是循环遍历列表,将小于平均身高的列表项插入到列表2中,其代码如下:
需要注意,这里的变量”i“和自制积木”计算平均身高“中的”i“是同一个变量。它是计数器,可以反复使用,但是必须要重新初始化,确保每次都是从第1项开始遍历。
5. 排序
最后一步就是排序了,根据前面的思路分析,我们要使用两次循环来实现,其代码如下:
简单说明如下:
1). 内层循环的作用是对于给定的数字,判断其是否存在于列表2中,如果存在,则将其移到到列表的最前面(先删除,再插入);
2). 外层循环的作用则是将数字从平均身高开始,每比较一轮,就将数字减1,直到列表2中所有小于平均身高的数据都处理一遍;
4个自制积木都已经全部实现了,将其连接起来,完整的代码如下:
至此,整个作品就创作好了,你可以运行程序多测试几遍,看看效果如何吧。
四.总结与思考
本题是中级组编程部分第5题,分数为80分,积木块数量70个左右,涉及到的知识点主要包括:
-
列表的基本操作,包括插入和删除;
-
遍历列表;
-
循环编程,尤其是两层循环;
-
运算符,包括随机数、四舍五入、连接字符串、不成立等;
-
排序算法;
这是中级组的第5题,题目有一定的难度,完成时间20分钟左右,难点是如何实现列表的排序。
在实际编写程序的时候,很多同学习惯性地将所有代码都写在一起,从效果上来看,当然是没什么问题的。但是在编程的过程中,比较容易出错,一会儿在这里加点代码,一会儿在那儿删除代码,操作起来很不方便。
所以,超平老师强烈建议你使用模块化的思想,将其拆分成4个不同的模块,并使用自制积木分别实现。如此一来,代码的结构更加清晰,编程的时候也不容易出错,操作起来也非常方便,一举三得,何乐而不为呢,你说是吧。
超平老师给你留一个思考题,除了上面介绍的排序算法之外,你还知道哪种排序方法呢,可以编程实现吗?
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要素材和源码的,可以移步至“超平的编程课”gzh。