23.10月STEMA真题解析
10月STEMA真题解析
一、选择题(每题10分)
参考答案:D
解析:
本题考察角色的方向,我们知道scratch的方向机制是:0°(正上)、90°(向右)、180°/-180°(向下)、-90°(向左)。
题目要求详细移动,所以应该面向180°或-180°方向,选D。
参考答案:B
解析:
本题是比较考验学生逻辑性的,程序中能在背景上留下“痕迹”或能被看到的河豚一共有三种:①河豚本体;②河豚克隆体;③河豚本体或克隆体改下的图章(简称为“河豚图章”)。
那么首先分析河豚本体,河豚本体在程序刚开始的时候就隐藏了,直到最后也没有显示,所以此处本体不用考虑。
接着分析河豚克隆体和图章,河豚在程序中循环三次产生了克隆体,并且克隆体产生后会立即向左移动80个单位(移动-80步),我们可以通过画表法模拟循环过程:
通过表格中“克隆体移动后的坐标”一列,我们可以得到三个克隆体的坐标。那么同样的方法,继续通过画表法模拟,这次我们把图章坐标也加上:
我们发现在三个图章和三个克隆体中,有两组坐标是相同的,也就是说有靓仔图章和克隆体完全重叠了,这种情况下,我们是只能看到一只河豚的。
所以扣除重叠之后,最终会看到4只河豚。
参考答案:C
解析:
本题考察逻辑运算符与比较运算符。
A选项,“50<50”结果为假,再不成立一下,结果变成真,即“True”。
B选项,左侧“45<70”结果为真,右侧“78>69”结果为真,两者用“或”连接,结果依然为真,即“True”。
C选项,左侧“36<61”结果为真,右侧“75>67”结果为真,两者用“与”连接,结果依然为真,但最外层有一个“不成立”,结果翻转,变成“假”,即“False”。所以选C。
D选项,左侧“18<25”结果为真,右侧“58>43”结果为真,两者用“与”连接,结果依然为真,即“True”。
参考答案:D
解析:
本题考察对自定义函数中参数的理解。
题目中的自定义函数有两个参数:a、b。
在主程序中,可以看到赋予a参数的值是45,赋予b参数的值是90。我们用45和90代替两个参数,就可以得到以下程序:
不难看出,三段折线中,第一、第三段的长度是90,第二段的长度是45,所以选D。
参考答案:B
解析:
变量n通过20个循环,每个循环增加1,从13递增至33,其中参与“如果……那么”判断的数据有13-32(含头含尾)。
判断内容是“n除以4的余数<2”。也就是说这个程序的功能是:将13-32中,除以4余数为0或1的数,加入列表中。
这样的数有:13、16、17、20、21、24、25、28、29、32。共10个数,和为225。选B。
二、编程题
解析:
简单的软件操作题,按照题目要求一步步做就行。值得注意的是需要设置一个“背景编号”变量用来记录当前的背景编号。
参考程序
背景设置:
舞台程序:
企鹅程序:
右箭头程序:
左箭头程序:
需要源程序的同学可以在文末下载。
解析:
本题会用到一种外观特效“虚像”。
“虚像”是个很有意思的特效,简单来说,虚像就是“透明度”,虚像为0代表完全不透明,虚像为100代表完全透明。
但是值得注意的是,虚像的“完全透明”虽然看起来和“隐藏”的效果一样,但是在程序运行中还是有差异的:当角色隐藏时,这个角色无法侦测到“碰到其他角色”;但是当角色虚像100时,它依然可以侦测“碰到其他角色”。巧用这个特性我们可以做出很多有意识的程序。
参考程序:
程序开始时,将虚像特效设置为0,然后重复若干次,让小鸟一边飞行,一边增加虚像特效,需要算好数值,使得小鸟完成飞行的同时,虚像特效恰好增加至100。
需要源程序的同学可以在文末下载。
解析:
先讲思路,的彩色圆圈、辐索、座舱一定是由画笔进行绘制的。
摩天轮旋转效果则来自于不断得刷新画布和绘制新图案,每次的新图案都比上一次的图案转过一个角度。
那我们这里会反复用到“画圆圈”和“刷新画布、画转轮”这两个功能,为了方便,也为了主程序的简洁,我建议大家可以把这两个功能做成自定义函数。
画圆圈有两个难点:①如何实现彩虹效果;②如何控制圆圈半径。
彩虹效果比较好办,在循环过程中不断增加颜色特效即可。
相比起来控制圆圈半径则需要一些数学功底。
我们画圆的思路是,画360段短线段,每画完一条短线段,转过1°。因为我们知道当边数足够多时,正多边形会无限趋向于圆形。
所以我们可以假定我们绘制的这个正360边形的周长与圆的周长一致(无限趋近)。那么假设圆的半径是130(当然这个半径是叶老师自己估计的,你也可以假设半径为120或140或其他任何你觉得合适的数值),圆的周长=130×2×圆周率(假定取3.1415)。
正360边形的周长也是这个值,所以每条边的长度就是:
130×2×3.1415÷360
所以有以下程序:
接着我们做“刷新画布、画转轮”函数。
这里我们还有一个量需要运算:辐索长度。
辐索长度取决于圆圈半径与座舱半径,叶老师刚刚画的圆圈半径为130,假设座舱半径为30(同样,可以按照合理的猜想去假设),那么辐索长度就等于130+30÷2=145。
所以有以下程序:
当然以上数学推导都是基于同学们已经有一定数学基础的前提上,如果确实数学基础达不到的同学怎么办呢?
很简单,猜。
随便填个数字,比如1,看看大小,如果太小了就调成2,如果2又有点大就调回1.5再试试,通过几轮调试之后得到一个肉眼看来能满足的值即可。
最终,我们把两个函数放到主程序中,并且通过循环+旋转来实现转动效果:
需要源程序的同学可以在文末下载。
解析:
本题的难点主要是如何生成【6 行 8 列的随机文字矩阵(矩阵中随机一个位置的文字为“大”,其余均为“太”】。
肯定是用克隆体实现,先用一个随机数变量a来生成1-48的随机数,然后利用两层循环,分别控制克隆体的行和列,生成至第a个克隆体时,将克隆体切换为“大”造型。
为了能知道当前生成的克隆体是第几个,我们用一个id变量来作为克隆体的编号,一开始id为0,每循环一次id增加1。
这部分的程序如下:
其他的功能相对来说比较简单,通过变量来倒计时:
通过克隆体id和随机变量a的比较来确认答案是否正确:
参考程序
角色程序:
背景程序:
需要源程序的同学可以在文末下载。
解析:
本题考察双指针查找,关于查找部分的核心思路是大家需要先想明白的。
首先我们定义i、j两个变量,作为查找的指针,j指针指向子串的第一个字符,i指针指向子串的最后一个字符。
外层循环对j进行从1到原字符串长度的遍历(j指针从原字符串的第一个字符遍历到最后一个字符)。
内层循环对i进行从j到原字符串长度的遍历(i指针从原字符串的第j个字符遍历到最后一个字符)。
每次循环进行两次判断:①这个子串是否不在列表中;②子串中是否没有重复的字母。如果两个都满足就把这个子串加入列表中。
全部循环完后,所有子串都被存进了列表中,这时候我们只要对列表中的子串长度进行“打擂台”就可以得到最长子串的长度了。
主程序如下:
主程序中用到了两个自定义函数:“判断有无相同字母”和“查找最长子串”。
判断有无相同字母同样也是通过双指针查找,方法与前面的子串查找相同,两层循环控制两个指针针对当前的子串进行遍历。如果最终查找的结果是没有相同的字母,则将这个子串加入列表中:
查找最长子串会用到一个方法,叫“打擂台”,这是我们在一组数据中找极值(最大或最小)时常用的方法。
简单来说,打擂台就是先设置一个“最不可能成为擂主的数”来做擂主。比如找最大值,就用最小值来做第一个擂主;找最小值就用最大值来做第一个擂主。
然后依次让数组中的数据与擂主作比较,如果这次的子串长度比擂主更大,那么我们就将这个长度设为新的擂主,然后再继续比较。
从头到尾比完一轮之后,留在擂台上的擂主,就是最长子串的长度。
程序如下:
需要源程序的同学可以在文末下载。
解析:
本题的复杂度非常高,从考点来说,只是简单的排序题,甚至没限制一定要使用哪种排序,冒泡、选择、插入或是别的什么排序方式都可以,选大家擅长的就行。
但除了排序以外还有诸多其他要求,这反而是本题很难拿满分的重要原因。
首先升序和降序,这里不展开讲排序算法了,懂的都懂,不懂的可以去翻我以前发的排序精讲,我后面的课程中也有讲排序的计划,这里直接上程序了:
题目要求从1-9中随机抽出5个数组成原始数组,为了防止重复抽数,我们可以先建立一个1-9的数组,再从数组中抽数字,每抽一个数就删除一个数。
接着我们每抽出一个数,就要根据这个数值生成相应造型编号的克隆体,并将本体向右移动到下一个位置。
然后询问用户,并根据用户的回答,选择升序或降序排序。
最后我们将克隆体依据排序的结果移动位置,完成最终的排序: