目录
一、编程题
第11届蓝桥杯Scratch选拔赛真题集锦
一、编程题
第 1 题 问答题
马克思的手稿
题目说明
背景信息:
马克思手稿中有一道趣味数学问题: 有30个人,其中有男人、女人和小孩。在一家饭馆吃饭共花了50先令;每个男人花了3先令,每个女人花了2先令,每个小孩花了1先令;问男人、女人和小孩各有几人?
编程实现:
1当绿旗被点击,舞台右侧添加一个空列表,并且小猫说“点击一次空格键,列表中添加一组男人、女人、小孩人数的答案”,如下图;
2).接下来每点击一次空格,列表中就添加一组符合要求的数据,如下图;
3).当所有符合要求的数据都添加到列表之后,小猫说“全部找到了”2秒,程序结束;
4).再次点击绿旗,程序可以重复执行
解析
评判标准:
20分: 完成右上图;
20分:列表中能显示2组及以上符合要求的数据;
40分:列表中能显示所有符合要求的数据;
20分:点击绿旗能重复执行,且完全符合要求
思路分析
本题只有1个角色,就是默认的小猫,如图所示:
这是一道典型的枚举算法题,所谓枚举算法就是将所有问题的可能性一一列举出来,并判断是否符合给定条件。
根据题目描述,我们可以得出如下两个条件:
男人+女人+小孩=30
男人*3+ 女人*2+小孩=50
因此,我们可以将所有可能的组合都列出来,看看是否满足上述两个条件。典型的做法就是使用嵌套循环对每一种组合进行判断,将满
足条件的组合存入到列表中。
对于本题而言,每按一次空格键就获取一种组合,我们可以先将男人的数量设置为1,每按一次空格键就将数量增加1,这就相当于是外层循环。
针对每一个确定的男人数量,我们需要对女人的数量进行循环判断,初始值也是1,有了男人数量和女人数量,就可以利用上面的第个条件,计算出小孩的数量,然后根据第二个条件,将对应的组合存入列表。需要注意的是,男人和女人数量的范围,题目明确说明在30人中有男人、女人和小孩,所以男人和女人的最小值必定为1,最大值呢?般我们都会这么思考,每个男人花了3先令,总共是50先令,假定都是男人,那么男人的数量要小于 50 /3,也就是男人数量的最大值是15,同理我们可以计算出女人数量的最大值是25
实际上,我们还可以缩小男人数量的范围,将上面的两个条件等式相减可得:男人*2+女人=20
从这个等式中,我们很容易得出男人的数量不超过10,女人的数量不超过18,范围缩小了,程序的效率就提高了。
第 2 题 问答题
123数字黑洞
题目说明
背景信息
"123数学黑洞”,指的是对于任意一串数字串,按照一定规则经有限次重复后必得到“123”的结果,即任何数的最终结果都无法逃脱123黑洞。其中的规则如下:
1).对任何一串数字串统计出其中的偶数个数、奇数个数、总个数;
2).按照“偶一奇一总”的方式进行排列,得到新的数字串;
再不断循环这个算法,其最终结果一定会变成123。例如: 12345,偶数个数2,奇数个数3,总个数5,我们得到235; 235,偶数个数1,奇数个数2.总个数3,我们得到123;
编程实现:
1).当绿旗被点击,请用户输入任意长度数字串,如图例1;
2).输入数字串之后,说出这个数字串第一次计算的结果,第二次计算的结果,第三次.....直到计算结果为123,如图例2。
简要说明如下:
1).在代码块的最后,又使用用了自制积木,这就是递归的体现,即在函数中调用自己(在Scratch中,自制积木就是函数);2).在Scratch中,对于数字,可以作为字符串来使用,所以这里获取数字和连接数字,使用的都是字符串指令。
2.使用自制积木
有了自制积木,接下来就容易了,当绿旗被点击时,使用问答指令,然后调用自制积木即可,对应的代码如下:
3.完善代码
运行程序,当输入888888时,第一次显示的效果如下
这和题目的要求有些不相符,我们可以增加一个变量“次数”,表示当前是第几次,在绿旗下面,将其初始化为0,增加代码如下:
对应的,在自制积木中,改动两个小地方,如下:
在说话指令中,使用了4个连接运算符,编写代码的时候,一定要细心一点,避免出错。
再次运行程序,这一次和题目要求就完全一致了,你可以输入任何长度的数字串来看看黑洞效果吧。
解析
评判标准:
20分: 能够正常输入数字串;
30分:小猫的第一次计算结果是正确的;
30分:小猫每次计算结果正确并最后得到123;
20分:小猫每次对次数的表述也完全正确,且完全符合题意思路分析
本题只有1个角色,就是默认的小猫,如图所示:
这是一道经典的递归算法题,那什么是递归呢?所谓递归,是指在函数的定义中使用函数自身的方法。通俗理解就是:我调用我自己。这是一种常用的解决问题的方法,它可以把”大事化小,小事化了“,从而轻松的解决问题。
看看下面这张图,你立刻就能理解什么是递归了:
构成递归需具备两个条件:
1).子问题须与原始问题为同样的事,且更为简单;
2).不能无限制地调用本身,须有个出口。
对于本题而言,对于任何一个给定的数字串,先分别计算出偶数个数、奇数个数和总个数,然后组合得到一个新的数字,再重复这个操作,这就是一个典型的递归过程,递归的出口就是数字等于123。
在Scratch中,实现递归的方式就是定义一个自制积木,然后在自制积木中调用自己,自制积木必须带有参数,同时要有结束条件。算法的流程图如下:
至于统计偶数和奇数就比较简单了,使用循环逐个取出每个数字,再结合”a除以b的余数”指令,就可以很轻松的判断是偶数还是奇数
第 3 题 问答题
般子游戏
题目说明
准备工作:
创建背景room3,并删除小猫角色。
编程实现
1).绘制两个骰子角色,每个骰子角色都有6个造型,分别是1-6点;
2).按下空格,两个般子均可以随机产生点数;
3).获胜那一方,会说“我赢了”1秒。平局的话,两个角色同时说“平局”1秒;
4).每个散子角色的下面显示累计获胜次数,点击绿旗后可以清零;
5).游戏为三局两胜制,即有一方先得到2分,比赛结束。胜利的一方要说出“太好了,我是最终胜利者!",此时按下空格健毁子不再有反应。
2.般子1角色
和”点数2“设置为1-6之间的随机数,然后就可以发送广播消息了,相应的代码如下:
我们把段子1作为主角色,先将变量"赢局1“和"赢局2"初始化为0,然后检测用户是否按下空格键。一旦按下空格键,就将变量“点数1
简要说明三点:
1.对于按下空格镜的处理,这里使用的是“重复执行”+“等待按下空格镜",这可以确保游戏结束后,按空格键不再有任何反应,如果直接使用“当按下空格键”指令,就不符合题目要求;
2).对于骰子1角色来说,它只需要判断两种情况,一是赢了,二是平局,如果是平局,则发送一个“平局”的广播消息;3).每赢一局,都需要判断自己是否胜利,游戏是三局两胜值,所以直接使用“家局1=2”进行判断即可。
3.骰子2角色
对于般子2角色来说,代码就比较简单了,如下所示
毅子2和骰子1的判断逐辑基本相似,它只需要判断自己是否赢了,平局的情况在散子1角色中已经判断过,只需要在接收广摇消息后说
平局即可。
解析
评判标准:
10分:实现步骤1;
30分:实现步骤2;
50分:实现步骤3;
80分:实现步骤4;
100分:实现步骤5。
思路分析
本题包含两个角色,一个是白色的骰子,一个是绿色的骰子,如图所示:
需要注意的是,这里的两个毅子角色都是需要自己绘制的,很多同学绘制的造型不够整齐美观,超平老师在这里透露两个小技巧:1).借助shift键绘制正方形和正圆,选中矩形工具或图形工具,按下shift键不松开,在画板上拖拽,就可以画出正方形和正圆;2.使用复制功能提高效率,当画好一个小圆点后,可以使用复制技巧快速得到完全一样的小圆点,既能保证效果,又能提升效率,两全其美。复制的时候,可以直接使用画板上提供的“复制“和"粘贴“按钮,也可以直接使用快捷键,复制的快捷键是Cti+C,粘贴的快捷键是Ctrl+V。
以绿色骰子为例,绘制造型如下:
掷毅子是典型的随机数算法,可以通过"在1到10之间取随机数“指令来实现,这里有两颗段子,需要使用两个变量保存各自的点数,然
后比较双方点数,判断输赢。游戏是三局两胜制,所以还需要两个变量记录双分的比分。作品的逻辑并不复杂,关键是要控制好程序的执行顺序,比如当按下空格键时,两个毅子均随机产生点数,两个角色都需要进行判断,怎么确保每个角色在判断的时候可以及时获取对方的点数呢?点数相同的时候,双方都要说平局,如何保证程序的同步呢?针对这两个问题,我们可以使用事件广播机制,在Scratch中,发送广播有两种方式,如图:
第一种方式,在发送广播消息后,立刻继续执行后续指令,其它角色在接收到消息后也立即执行代码,这样就可以实现两个角色的同步执行,上面提到的双方都要说平局的效果就属于这种情况第二种方式,在发送广播消息后,并不能立刻执行后续指令,而是要等待其它角色接收到广播消息并执行完程序,才开始执行后续代码,它有一个等待的过程,这可以让我们精确地控制两个角色执行代码的顺序,也是解决本题的关键。如何确保每个角色在判断的时候可以及时获取对方的点数呢?答案就是使用"广播消息并等待“指令。具体思路是这样的:当按下空格键时,在毅子1角色中,设置好两个骰子的点数,然后使用"广 播消息并等待“指令发送一个广播消息,骰子2在接收到消息之后,就可以判断自己是否赢了,等骰子2角色的代码执行完成,骰子1角色再执行后续代码,判断自己是否赢了。
第 4 题 问答题
数字游戏ABCD*E-DCBA
题目说明
编程实现:
问题1: 已知A、B、C、D、E分别代表0-9之间的数字。由A、B、C、D组成四位数ABCD和DCBA,还要满足算式: ABCD'E=DCBA(提示:在程序设计语言中“”代表乘号) 。例如1991*1=1991,则在列表1中输出19911。请在列表1中按照从小到大的顺序输出所有可能的数字组合。
样例输出:
00000
00001
00002
00003
..........
问题2:在问题1的基础上,现在要求数字A、B、C、D、E均不相同,在列表2中输出这样的数字组合。
具体要求:
步骤1:如下图,列表放在博士汪的左右两侧,绿旗被点击,清空所有列表,博士汪面向左,说“我要开始计算了!”(2秒);
步骤2:列表1开始自动运算。自动运算结束后列表1中显示所有情况,博士汪要面向列表1的方向(向左即可)说出列表1中一共有多少种情况(2
秒)
步夏3:列表2开始自动运算,运算结束后列表2中显示所有情况,博士汪面向列表2的方向(向右即可)说出列表2中一共有多少种情况(2秒),程序
结束
将程序保存在桌面,命名为“5.sb2”
第5题问答题
听话的苹果
题目说明
编程实现
1).本程序只有一个苹果角色,并且舞台为空白背景。如图:
2).先用边长为60的正方形填满整个舞台 (用程序完成,不是使用舞台背景绘制)
3).画完后,苹果回到舞台中心,然后询问:“输入指令 (上下左右)”;
4).在输入框输入指令 (指令可以是1个或多个)移,每走完一次要等待1秒,如图所示:
输入完毕后按回车键提交,苹果会按照指令的方向依次移动,每次移动都要移到下
个交点上
5).苹果按指令走完整个路程后,会发出下一次询问,输入并提交后可再次移动;
6).需要注意的是:如果遇到“上下左右”以外的其它内容,苹果不移动,说“无效”(1秒);例如: 输入“下6左A",则苹果向下移动一格等待1秒,然后不移动同时说“无效”(1秒),然后向左移动一格等待1秒,然后说"无效”(1秒)原地静上
7).苹果不能超出屏幕边界,否则会说“超出范围,游戏停止!”,然后程序结束。例如:程序一开始就输入:“上上上上"则苹果会依次向上移动3格,在移动第4次的时候,苹果移到边界外,说“超出范围,游戏停止!”1秒,然后程序结束。
将程序保存在桌面,命名为“4.sb2”
第 6 题 问答题
猜数字
题目说明
编程实现:
1).小猫随机想了一个[0000,9999]之间的四位数,由玩家猜这个四位数是多少?
2).当玩家手动输入猜测的四位数字之后,程序将这四位数字中猜对的位数以真实的数字显示出来,没猜对的位数用 X表示;
3.一共可以猜10次,舞台左上角显示剩余次数,在10次内将四位数字全部猜对,小猫会说“恭喜你,答对了!",并停止程序。如果十次都没有猜对
小猫则会说“机会用尽,正确答案是 XXXX”, 然后停止程序。