[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第164讲。
第15届蓝桥杯第3次STEMA测评已于2023年12月17日落下帷幕,编程题一共有6题,分别如下:
多变的太阳
转动的风车
六花阵图
变色游戏
筛选数据
消失的水母
筛选数据,本题是2023年12月17日举行的第15届蓝桥STEMA测评Scratch编程初/中级组编程第3题,题目要求编程对数据的一串数据按要求进行筛选。将用户输入的8个正整数中的偶数加入列表1并求和,再将列表1中各位数字和为偶数的数字加入列表2,并获取最大值。
先来看看题目的要求吧。
背景信息:
偶数:能被2整除的数。
各位上的数字之和:一个整数各个数位上的数字相加的结果。
例如:2314,各位上的数字分别为2、3、1、4,各位上的数字之和为2 + 3 + 1 + 4 = 10。
编程实现:
筛选数据。
具体要求:
1). 每次点击绿旗,熊猫说“输入8个正整数”,同时在舞台下方显示输入框,输入的正整数之间用一个空格隔开,列表1和2为空,如图所示;
例如:输入10 26 17 18 24 31 48 52
2). 输入完成后,如果输入的数中没有偶数,程序结束,如果有,就把偶数保存到列表1中,如图所示;
3). 熊猫说出列表1中所有数的和,如图所示;
4). 然后,在列表2中呈现列表1中所有各位上的数字之和为偶数的数(按照列表1的顺序),如图所示,如果没有满足要求的数,程序结束;
5). 最后,熊猫说出列表2中最大的数,如图所示。
评判标准:
8分:满足"具体要求"中的1);
20分:满足"具体要求"中的2);
12分:满足"具体要求"中的3);
30分:满足"具体要求"中的4);
10分:满足"具体要求"中的5)。
本题只有1个熊猫角色,如图所示:
而且熊猫只负责说出结果,没有其它的效果,因此本题是一个典型的算法题,考查的是列表处理和数学运算。
根据题目的描述,我们可以将整个过程分成如下5个核心功能:
字符串拆分
奇偶数判断
列表求和
统计数字各位数字和
求最大数
这里的关键是第一步,后面所有的程序都是在这个基础上进行的。通过询问框,获取用户输入的数字串,然后将每个数字提取出来并存入列表,这是一个常见的需求场景,在历届蓝桥比赛中出现过多次,比如:
《魔法师盖城墙-第11届蓝桥杯Scratch国赛真题第4题
《数字与图形-第13届蓝桥杯Scratch国赛真题第5题》
字符串拆分的核心思想就是遍历整个字符串,依次取出每一个字符并进行连接,当遇到空格时,得到一个数字,加入列表,然后再进行下一个数字的连接,直到取出所有的数字,具体的细节这里就不再展开了。
一旦解决了第一步,后面的相对就容易一些了,主要就是对列表的操作和处理了,基本上就是结合循环和变量对列表进行遍历,然后对每个数字进行判断和处理。
由于代码比较多,超平老师强烈建议采用函数的编程思想,使用自制积木来组织代码,从而简化代码的逻辑和结构。
思路有了,接下来,我们就进入具体的编程实现环节。
根据上面的思路分析,我们分7步来编写程序:
准备工作
字符串拆分
构造列表1
列表1求和
构造列表2
计算列表2最大值
主程序
1. 准备工作
准备工作比较简单,先创建好两个列表,分别命名为“1”和“2”,然后在绿旗下,清空两个列表,在熊猫角色中编写代码如下:
2. 字符串拆分
接下来是熊猫询问并等待用户输入,用户输入的数字会保存到“回答”指令中,如图:
这是一个字符串,我们要逐个取出每个字符,通常需要结合循环和变量,其基本框架如下:
这段代码的作用是依次取出回答中的数字串,逐个进行连接,并保存到数字中,其中变量”数字“表示要获取的单个数字,变量"i"是计数器。
这当然是不够的,在循环的过程中,如果字符是空格,就应该将其加入列表中,同时将”数字“变量设置为空,增加判断代码如下:
强调两点:
1). 将“数字”变量设置为空,直接删除默认的数字0即可;
2). 在判断字符等于空的时候,需要打一个空格。
执行代码,结果如下:
已经将各个数字拆分开了,但是最后一个数字52并没有加入列表,原因很简单,52后面没有空格,针对这种情况,需要在循环结束后再单独”数字“变量的值加入列表,如图:
这样一来,就可以确保,所有的数字都可以加入列表。
但是,需要注意的是,这段代码只适用于标准输入,即数字之间只有一个空格,结尾也不能有空格,不过题目没有特别要求,可以不用考虑非标准输入。
本着严谨的态度,我们还是对非标准输入进行探讨和处理,如果输入的是如下内容:
其中,10和26、17和18、24和31之间各有两个空格,52后面还有一个额外的空格,列表中的数据就是这个样子的:
这显然是不对的,所以在向列表中插入数字的时候,还需要判断数字不为空,这又该如何判断呢?
“数字”变量的值,可能是一个空格,也可能是多个空格,其实有一个巧妙的办法,就是使用大于指令,如果变量的值都是空格,无论空格的数量是多少,它都是不大于0的。
所以只需要在插入列表之前增加如下代码:
再次查看列表,效果如下:
有了这个判断,就相当于增加了一层保险,再也不用担心多个空格的问题了。
3. 构造列表1
字符串拆分已经完美实现了,现在只剩下最后一步了,上面的代码是将所有的数字加入列表1。根据题目的要求,还需要过滤一下,只有偶数才加入列表1,因此在插入之前,再增加一个条件就可以了。
为了方便,我们将上面这部分代码使用自制积木来实现,代码如下:
代码中标红的部分就是用来判断偶数的,如此一来,关键的第一步就彻底处理好了。
4. 列表1求和
这一步相对比较简单,一般来说有两种处理方式:
在构造列表时同步进行,每插入一个偶数就累加一次;
构造列表后单独处理,使用循环累加;
相对来说,前者代码更少,为了方便讲解,我这里采取第二种方法,同时将其定义成一个自制积木,代码如下:
简单说明两点:
1). 这里的变量"和",用来表示总和,需要将初始值设为0;
2). 这里再次使用了"i"变量,这是可以的,不过要重新初始化为1。
5. 构造列表2
在构造列表2时,需要对列表中1中的每个数字进行各位数字求和,因此,我们可以分两步来实现:
对给定数字进行各位求和;
对列表1中的数字逐个判断;
为了简化代码,我们使用自制积木来组织代码,先来实现第一步,定义自制积木如下:
代码不多,说明两点:
1). 在Scratch中,数字可以直接作为字符串来处理,结合循环可以取出数字中的每一位数字;
2). 由于Scratch中的自制积木没有返回值,所以这里将各位上数字的和保存到变量”各位数字和“中。
有了这个自制积木,接下来就可以对列表1进行循环处理了,其代码如下:
强调一点,由于在循环的过程中,又调用了自制积木,相当于是循环中嵌套循环,因此需要使用两个计数器变量,一个是"i",一个是"j"。
执行完这段代码,就可以将列表1中满足条件的数字加入到列表2了。
6. 计算列表2最大值
这和前面求和的情况类似,有同步和分开处理两种方式,为了方便,这里仍然分开处理,将其定义成一个自制积木,代码如下:
简单说明两点:
1). 获取最大值就是一个逐步比较的过程,如果当前项比最大值,则更新最大值,直到循环结束。
2). 由于所有的数字都是正整数,所以可以将最大值设置为0;
7. 主程序
所有的自制积木都定义好了,只需要按照题目的要求进行组装即可,代码如下:
代码比较简单,强调一点,就是如果列表1和列表2为空时,要提前终止代码。
至此,整个作品就创作好了,是时候来测试程序的功能了,测试时需要多来几组数据,确保程序的正确性。
本题是初/中级组编程部分第5题,分数为80分,积木块数量100个左右,涉及到的知识点主要包括:
Scratch问答指令;
循环编程;
条件编程,包括单分支和双分支;
变量的使用;
列表的运算;
字符串的运算及处理;
这是初级组最后一题,难度较大,完成时间25分钟左右,难点在于如何将数字串进行拆分,获取其中的每一个数字。
从最近几次STEMA测评真题的题目来看,对字符串和列表的考查越来越多了,也越来越难了,这需要引起我们的重视。
对于本题而言,有三个核心知识必须要熟练掌握:
如何对字符串进行拆分和遍历;
列表的运算和遍历;
使用自制积木来组织代码,简化程序结构;
实际上,字符串和列表的处理也是代码编程的基础和重点,一旦熟练掌握这些数据结构的常见处理和算法,对后续代码编程的学习非常有帮助。
超平老师给你留一道思考题,对于字符串为空的判断,你还有其它方法吗?
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香
需要素材和源码的,可以移步至“超平的编程课”gzh。