统计字符串-第13届蓝桥杯Scratch省赛真题第5题

[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第31讲。

第13届蓝桥杯青少年组省赛分两次进行,这是2022年4月23日举行的第二次省赛考试,形式为在线考试。Scratch分为初级组和中级组,其中初级组面向7~10岁孩子,中级组面向11~14岁孩子。

统计字符串,本题是第13届蓝桥杯Scratch第二次省赛真题编程第5题,是初级组最后一题,中级组也有此题,题目要求考生编程对《三国演义》第一回原文进行数据处理,统计出现次数最多的5个汉字。

先来看看题目的要求吧。

一.题目说明

背景信息:

《三国演义》是元末明初小说家罗贯中创作的长篇章回体历史演义小说,与《西游记》、《水浒传》、《红楼梦》并称为中国古典四大名著。

编程实现:

对《三国演义》第一回原文进行数据处理,统计出现次数最多的5个汉字。

提示:

编程环境中已经预制一个列表名为“三国演义原文”,如下图所示,其中第一项存储着三国演义第一回文字。请注意务必不要删除这个列表。

具体要求:

1). 点击绿旗,小猫说“我要开始处理了!”2秒;

2). 出现字符列表和次数列表,开始对三国原文进行处理,同时小猫一直说:“处理中......”(处理中不需要对文字使用数量进行排序);

3). 等数据处理完毕后,小猫说:“现在开始排序”2秒;

4). 次数列表中的数据按照从大到小的顺序进行排序(同时保证汉字与次数的数据一一对应),同时小猫说:“正在处理中”;

5). 将出现最多的五个汉字与次数保存在列表中,同时将剩余的汉字与次数从列表中删除;

6). 等待1秒后,小猫说:“处理完毕”2秒,程序终止。

评分标准:

  • 5分:满足“具体要求”中的1);

  • 20分:满足“具体要求”中的2);

  • 5分:满足“具体要求”中的3);

  • 20分:满足“具体要求”中的4);

  • 25分:满足“具体要求”中的5);

  • 5分:满足“具体要求”中的6)。

二.思路分析

这是一道和字符串处理相关的题目,主要包括如下4个功能:

1). 循环读取字符串中的汉字

2). 统计每个汉字的个数,并存入列表

3). 对列表进行排序

4). 保留列表的前5项

其中,统计汉字个数和列表排序是难点,由于Scratch列表的局限性,在统计汉字个数时,需要使用两个列表,一个用于保存汉字,一个则用于保存汉字对应的个数,二者一一对应,具有相同的编号,如图所示:

其基本思路是这样的,每读取一个汉字,需要判断一下是否已经在在列表中了,如果是,则找到该汉字对应的编号,然后在次数列表中,将对应编号的次数增加1;如果为否,则将汉字追加到字符列表中,同时在次数列表中追加次数1。

当所有的汉字统计完成后,需要进行列表排序,主要是对次数列表按照从大到小的顺序进行排序,并对字符列表进行同步操作。关于排序,是编程中最基础的算法,常见的排序有冒泡排序、选择排序、插入排序和快速排序等。

其中,选择排序相对要简单一些,可以作为我们的首选,其基本思想是:首先在未排序的数列中找到最小(或者最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(或者最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

其排序过程可以参考下图:

为了简化代码的结构,我们可以使用函数的编程思想,将独立的功能定义为自制积木,比如统计字符、排序及删除列表数据项。然后可以采取模块化的编程思想,即先整体后局部的策略来编写程序,即先实现作品的完整流程,再逐个实现具体的细节。

三.编程实现

根据上面的思路分析,我们分4步来进行编程:

  • 准备工作

  • 实现字符统计功能

  • 列表排序

  • 删除列表数据

1). 准备工作

第一步的准备工作,我们先完成整个作品的完整流程。首先,创建两个列表,分别命名为“字符”和“数字”,接着再创建3个自制积木,分别命名为“统计字符”、“排序”和“删除列表数据”。

绿旗被点击时,将两个列表都清空,并隐藏起来,在小猫说完“我要开始处理了”后,显示列表,接着是统计字符、统计字符、删除列表数据,直到处理完毕。在小猫角色中,编写代码如下:

注意,这里的三个自制积木目前都是空的,接下来,我们就需要分别来编写三个自制积木的具体代码了。

2). 实现字符统计功能

实现统计字符的逻辑比较简单,针对每次读取的字符,如果在列表中,则更新次数,否则插入到列表中,并在次数列表中增加次数,其次数为1。其代码如下:

代码不难,简要说明一点,这里的变量“原文”保存了所有的汉字,原文一共有3843个汉字,没有标点符号。因此,这里循环了3843次,结合重复执行和变量“i”,逐个取出每个字符,进行判断。

3). 列表排序

我们需要针对“次数”列表进行选择排序,所谓的选择排序,就像我们打扑克牌时,把牌从左到右扫描,找到最小的一张牌,放到最左边,然后从第二张牌继续扫描第二小的牌,放到第二的位置,以此类推,直至所有的牌都排列好。

只不过,我们这里是将次数按照从大到小的顺序排列,排序过程中,需要注意两点:

①. 针对一个长度为n的列表,需要重复比较n -1次,才能将最大的数字找出来,所以,要完成整个列表排序,需要使用两层循环(嵌套循环);

②. 找到最大数字后,需要交换位置,在交换时,需要借助一个中间变量(也叫临时变量)。

对应的代码如下:

这里的变量“max”用于保存最大的那个数字,在排序之前,为了确保它比列表中的任何一项都小,这里将它的初始值设为0,因为次数列表中的数字都要比0大,当然,你也可以设置为一个负数。

一旦找到最大数,就将最大数及其在列表中的编号记录下来,便于后续来交换位置。

4). 删除列表数据

根据题目的描述,对于已经排好序的两个列表,我们只需要保留前5项,其代码如下:

注意,这里使用了一个小技巧,就是每次都删除列表的最后一项,每删除一项,列表的项目就减少一个,这样就可以重复删除列表项,直到剩下前5项。

四.总结与思考

本题的总代码量为为100个积木块左右,难度系数为5,分值为80,涉及到的知识点主要包括:

  • 列表应用,包括列表的删除、添加、获取列表项和更新等操作;

  • 字符串运算,包括遍历字符串、判断字符;

  • 函数的编程思想,自制积木的使用;

  • 选择排序的基本思想及实现;

  • 循环和条件的嵌套使用及嵌套循环的使用;

  • 模块化的编程思想。

本题的难点在于列表的排序,这里我使用的是选择排序,对于初学者来说,这是最容易理解的一种排序。你能否使用其它的排序算法来实现列表的排序呢,赶紧来挑战一下吧。

如果你觉得文章对你有所帮助,别忘了点赞,你的鼓励是我坚持继续写下去的最大动力,Thanks♪(・ω・)ノ。

有需要素材和源码的,可以联系本人。 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值