[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第31讲。
第13届蓝桥杯青少年组省赛分两次进行,这是2022年4月23日举行的第二次省赛考试,形式为在线考试。Scratch分为初级组和中级组,其中初级组面向7~10岁孩子,中级组面向11~14岁孩子。
统计字符串,本题是第13届蓝桥杯Scratch第二次省赛真题编程第5题,是初级组最后一题,中级组也有此题,题目要求考生编程对《三国演义》第一回原文进行数据处理,统计出现次数最多的5个汉字。
先来看看题目的要求吧。
一.题目说明
背景信息:
《三国演义》是元末明初小说家罗贯中创作的长篇章回体历史演义小说,与《西游记》、《水浒传》、《红楼梦》并称为中国古典四大名著。
编程实现:
对《三国演义》第一回原文进行数据处理,统计出现次数最多的5个汉字。
提示:
编程环境中已经预制一个列表名为“三国演义原文”,如下图所示,其中第一项存储着三国演义第一回文字。请注意务必不要删除这个列表。
![图片[1]-scratch统计字符串_第13届蓝桥杯省赛教程-超平的编程课](https://www.wangchaoping.com/wp-content/uploads/2025/02/image-281.png)
具体要求:
1). 点击绿旗,小猫说“我要开始处理了!”2秒;
![图片[2]-scratch统计字符串_第13届蓝桥杯省赛教程-超平的编程课](https://www.wangchaoping.com/wp-content/uploads/2025/02/image-282.png)
2). 出现字符列表和次数列表,开始对三国原文进行处理,同时小猫一直说:“处理中……”(处理中不需要对文字使用数量进行排序);
![图片[3]-scratch统计字符串_第13届蓝桥杯省赛教程-超平的编程课](https://www.wangchaoping.com/wp-content/uploads/2025/02/image-283.png)
3). 等数据处理完毕后,小猫说:“现在开始排序”2秒;
![图片[4]-scratch统计字符串_第13届蓝桥杯省赛教程-超平的编程课](https://www.wangchaoping.com/wp-content/uploads/2025/02/image-284.png)
4). 次数列表中的数据按照从大到小的顺序进行排序(同时保证汉字与次数的数据一一对应),同时小猫说:“正在处理中”;
5). 将出现最多的五个汉字与次数保存在列表中,同时将剩余的汉字与次数从列表中删除;
6). 等待1秒后,小猫说:“处理完毕”2秒,程序终止。
评分标准:
- 5分:满足“具体要求”中的1);
- 20分:满足“具体要求”中的2);
- 5分:满足“具体要求”中的3);
- 20分:满足“具体要求”中的4);
- 25分:满足“具体要求”中的5);
- 5分:满足“具体要求”中的6)。
二.效果预览
在编程之前,先来看看作品的完整效果吧:
三.思路分析
这是一道和字符串处理相关的题目,主要包括如下4个功能:
1). 循环读取字符串中的汉字
2). 统计每个汉字的个数,并存入列表
3). 对列表进行排序
4). 保留列表的前5项
其中,统计汉字个数和列表排序是难点,由于Scratch列表的局限性,在统计汉字个数时,需要使用两个列表,一个用于保存汉字,一个则用于保存汉字对应的个数,二者一一对应,具有相同的编号,如图所示:
![图片[5]-scratch统计字符串_第13届蓝桥杯省赛教程-超平的编程课](https://www.wangchaoping.com/wp-content/uploads/2025/02/image-285.png)
其基本思路是这样的,每读取一个汉字,需要判断一下是否已经在在列表中了,如果是,则找到该汉字对应的编号,然后在次数列表中,将对应编号的次数增加1;如果为否,则将汉字追加到字符列表中,同时在次数列表中追加次数1。
当所有的汉字统计完成后,需要进行列表排序,主要是对次数列表按照从大到小的顺序进行排序,并对字符列表进行同步操作。关于排序,是编程中最基础的算法,常见的排序有冒泡排序、选择排序、插入排序和快速排序等。
其中,选择排序相对要简单一些,可以作为我们的首选,其基本思想是:首先在未排序的数列中找到最小(或者最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(或者最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
其排序过程可以参考下图:
![图片[6]-scratch统计字符串_第13届蓝桥杯省赛教程-超平的编程课](https://www.wangchaoping.com/wp-content/uploads/2025/02/640.gif)
为了简化代码的结构,我们可以使用函数的编程思想,将独立的功能定义为自制积木,比如统计字符、排序及删除列表数据项。然后可以采取模块化的编程思想,即先整体后局部的策略来编写程序,即先实现作品的完整流程,再逐个实现具体的细节。
四.编程实现
根据上面的思路分析,我们分4步来进行编程:
- 准备工作
- 实现字符统计功能
- 列表排序
- 删除列表数据
1). 准备工作
第一步的准备工作,我们先完成整个作品的完整流程。首先,创建两个列表,分别命名为“字符”和“数字”,接着再创建3个自制积木,分别命名为“统计字符”、“排序”和“删除列表数据”。
绿旗被点击时,将两个列表都清空,并隐藏起来,在小猫说完“我要开始处理了”后,显示列表,接着是统计字符、统计字符、删除列表数据,直到处理完毕。在小猫角色中,编写代码如下:
![图片[7]-scratch统计字符串_第13届蓝桥杯省赛教程-超平的编程课](https://www.wangchaoping.com/wp-content/uploads/2025/02/image-287-356x1024.png)
注意,这里的三个自制积木目前都是空的,接下来,我们就需要分别来编写三个自制积木的具体代码了。
2). 实现字符统计功能
实现统计字符的逻辑比较简单,针对每次读取的字符,如果在列表中,则更新次数,否则插入到列表中,并在次数列表中增加次数,其次数为1。其代码如下:
![图片[8]-scratch统计字符串_第13届蓝桥杯省赛教程-超平的编程课](https://www.wangchaoping.com/wp-content/uploads/2025/02/image-288.png)
代码不难,简要说明一点,这里的变量“原文”保存了所有的汉字,原文一共有3843个汉字,没有标点符号。因此,这里循环了3843次,结合重复执行和变量“i”,逐个取出每个字符,进行判断。
3). 列表排序
我们需要针对“次数”列表进行选择排序,所谓的选择排序,就像我们打扑克牌时,把牌从左到右扫描,找到最小的一张牌,放到最左边,然后从第二张牌继续扫描第二小的牌,放到第二的位置,以此类推,直至所有的牌都排列好。
只不过,我们这里是将次数按照从大到小的顺序排列,排序过程中,需要注意两点:
①. 针对一个长度为n的列表,需要重复比较n -1次,才能将最大的数字找出来,所以,要完成整个列表排序,需要使用两层循环(嵌套循环);
②. 找到最大数字后,需要交换位置,在交换时,需要借助一个中间变量(也叫临时变量)。
对应的代码如下:
![图片[9]-scratch统计字符串_第13届蓝桥杯省赛教程-超平的编程课](https://www.wangchaoping.com/wp-content/uploads/2025/02/image-289-554x1024.png)
这里的变量“max”用于保存最大的那个数字,在排序之前,为了确保它比列表中的任何一项都小,这里将它的初始值设为0,因为次数列表中的数字都要比0大,当然,你也可以设置为一个负数。
一旦找到最大数,就将最大数及其在列表中的编号记录下来,便于后续来交换位置。
4). 删除列表数据
根据题目的描述,对于已经排好序的两个列表,我们只需要保留前5项,其代码如下:
![图片[10]-scratch统计字符串_第13届蓝桥杯省赛教程-超平的编程课](https://www.wangchaoping.com/wp-content/uploads/2025/02/image-290.png)
注意,这里使用了一个小技巧,就是每次都删除列表的最后一项,每删除一项,列表的项目就减少一个,这样就可以重复删除列表项,直到剩下前5项。
五.总结与思考
本题的总代码量为为100个积木块左右,难度系数为5,分值为80,涉及到的知识点主要包括:
- 列表应用,包括列表的删除、添加、获取列表项和更新等操作;
- 字符串运算,包括遍历字符串、判断字符;
- 函数的编程思想,自制积木的使用;
- 选择排序的基本思想及实现;
- 循环和条件的嵌套使用及嵌套循环的使用;
- 模块化的编程思想。
本题的难点在于列表的排序,这里我使用的是选择排序,对于初学者来说,这是最容易理解的一种排序。你能否使用其它的排序算法来实现列表的排序呢,赶紧来挑战一下吧。
需要素材和源代码的,可以转到这里,统计字符串-2022.4.23蓝桥杯省赛第5题。
暂无评论内容