[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第141讲。
消除字母,本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组真题第6题,也是最后一题,题目要求编程创作消除字母游戏 。当玩家输入一个字母后,阿拉蕾将此字母和它的前两项与后两项字母说出,然后从字母表中删除这五个字母。
先来看看题目的要求吧。
一.题目说明
编程实现:
消除字母。
具体要求:
1). 点击绿旗,角色、背景如图所示(创建1个字母表,并存入26个字母);
2). 等待1秒,阿拉蕾说:"请输入一个字母",舞台下方出现询问框;
3). 当在询问框中输入一个字母表中存在的字母,等待1秒,阿拉蕾将此字母和它的前两项与后两项字母说出,然后从字母表中删除这五个字母;(列表第一项的前一项是列表的最后一项,列表最后一项的后一项是列表的第一项);
例如:输入C,阿拉蕾说:"删除ABCDE 后",列表中的这五个字母删除
例如:再输入F,阿拉蕾说:"删除YZFGH" 后,列表中的这五个字母删除
4). 当在询问框中输入一个字母表中不存在的字母后,阿拉蕾说:“输入错误”;
5). 重复执行2)、3)、4)步骤,当字母表中的字母不足5个时,程序结束。
评判标准:
-
7分:满足"具体要求"中的1);
-
10分:满足"具体要求"中的2);
-
45分:满足"具体要求"中的3);
-
15分:满足"具体要求"中的4);
-
23分:满足"具体要求"中的5)。
二.思路分析
本题只有一个角色,就是阿拉蕾,如图所示:
本题中的角色本身并没有太多的功能,重点考察的是列表和算法,尤其是列表的增加、查找和删除等操作。
首先是往列表中插入26个大写字母,这个比较简单,通常有两种实现方法。
第一种方法是直接使用”将东西加入列表“指令,依次将A到Z的26个字母插入到列表中。
第二种方法是定义一个字符串,将值设为”ABCDEFGHIJKLMNOPQRSTUVWXYZ“,然后使用循环和字符串操作依次取出每个字符,再插入到列表中。
其次是删除相连的5个字母,这里的难点是如何处理临界点的字母,为了方便,我使用序号来表当前字母在列表中的编号,具体可以分成如下5种情况:
-
2 < 序号 < 列表长度- 1:直接删除相连的5项,包括当前项、前两项和后两项;
-
序号 = 1,删除列表的最后两项和列表的前3项;
-
序号 = 2,删除列表的最后一项和列表的前4项;
-
序号 = 列表长度,删除列表的最后3项和列表的前2项;
-
序号 = 列表长度 - 1,删除列表的最后4项和列表的第一项;
常规思路,就是使用条件指令,判断当前序号,分别处理上述5种情形,这种做法相对比较好理解,只是代码繁琐,编写代码的时候需要格外细心,否则就很容易出错。
同时,需要注意的是,在Scratch编程中,一旦删除列表中的某一项,后面的列表项都会前移,利用这个特性,可以让代码写起来更简单。比如可以直接重复5次删除第8项,实际上删除的是第8、9、10、11和12这5项。
超平老师再给大家介绍一个更加巧妙的思路,当用户输入一个字母后,我们先找到连续的5个字母,将其保存到另外一个列表中(可以称之为临时列表),然后在字母表中找到临时列表中的字母并删除。
使用这种方法有如下3个好处:
1). 在查找连续字母时,可以借鉴循环列表的算法思想,可以一次性处理上述5种不同情形,代码非常简洁;
2). 在删除之前,阿拉蕾需要说一句话,有了临时列表,处理起来就特别简单了;
3). 删除5个连续字母,只需要短短几行代码就可以搞定;
是不是有点小期待呢,接下来,我们进入具体的编程实现环节。
三.编程实现
根据题目描述和思路分析,我们可以分3步来编写程序:
-
初始化字母表
-
查找连续5个字母
-
删除字母
1. 初始化字母表
先创建一个列表,将其命名为字母表,再创建一个变量”字母“,将其初始值设置为”ABCDEFGHIJKLMNOPQRSTUVWXYZ“,然后使用循环,将每个字符依次取出并存到列表中。
为了方便,我们使用自制积木来实现列表的初始化,创建自制积木并编写代码如下:
执行代码,效果如图所示:
2. 查找连续5个字母
根据前面的思路分析,当输入一个字母表中的字母时,先搜索该字母的前两位,将其保存到临时列表中。
在向前查找的时候,有可能刚好是列表的第一项,此时需要将其设置为列表的最后一项,这部分的代码如下:
然后,我们将当前项对应的字母加入到临时列表中,代码如下:
同理,在查找下一项的时候,有可能是列表的最后一项,此时需要将其设置为列表的第一项,其代码如下:
如此一来,我们就可以找到要删除的5个字母了,不过需要注意它们的顺序,比如输入字母C,执行上述代码,临时列表中的字母为:
实际上,此时阿拉蕾说的是“删除ABCDE”,所以在说话的时候,需要将前面两个字符的顺序对调一下,代码如下:
代码比较简单,说明两点:
1). 此处使用了交换算法,需要借助一个临时变量;
2). 在Scratch中,列表作为整体使用的时候,是将列表中的每一项连接起来,因此我们也就不需要再循环逐个取出每个字母进行连接操作了;
将上述代码组合起来,并作为一个新的自制积木,代码如下:
如此一来,需要删除的5个字母就已经找到并存入到临时列表了。
3. 删除字母
有了临时列表,删除字母的逻辑就非常简单了,每次取出临时列表中的第一项,再到字母表中找到该字母的编号,将其删除即可,同时将临时列表中的第一项删除即可。
将这个操作重复5次即可,对应的代码如下:
根据题目的要求,使用上面的自制积木和核心代码,编写主程序如下:
就这些了,至此,一个完美的删除字母游戏就创作完成了,赶紧体验并测试一下自己程序吧。
四.总结与思考
本题是中级组编程部分第6题,分数为100分,积木块数量70个左右,涉及到的知识点主要包括:
-
列表操作,包括列表的插入、查找和删除;
-
Scratch问答指令;
-
字符串操作,包括字符串遍历和连接操作;
-
交换变量的编程技巧;
-
使用自制积木简化代码;
-
循环列表的算法思想及其实现;
这是中级组的第6题,作为压轴大题,题目难度不小,完成时间在35分钟左右。本作品的逻辑并不复杂,难点是如何处理5种不同的情形。
使用常规做法,分情况讨论,一步一步来处理,是大部分学生的解题思路,不过需要非常细心,代码会多一点,非常考验孩子的细心和耐心。
如果具备了算法思维,使用循环列表的思想,就可以极大地简化程序逻辑,代码量也大大减少。
这也是为什么很多人说编程的尽头是算法的原因了,的确如此,一旦具备了算法思维,你的代码也会变得更加简洁高效,这时你就能体会到所谓的算法之美了。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要素材和源码的,可以移步至“超平的编程课”gzh,或者私信本人。