本公众号推出真题回顾系列,将VB题目进行了Python改编,并在最后附上对于目前选考备考来说,还有价值的其它题目。
改编过程中:感慨万千。大概只有我们信息技术学科,在短短十年间,变化如此之大。
信息技术教师必须具备两种学习意识:对于底层知识,需要“慢思考”,沉下心去啃硬骨头,建立深刻的理解,这可能需要几年甚至十几年的积累。对于应用层知识,需要“快学习”,快速上手,快速迭代,甚至要有“用完即弃”的觉悟。这种精神上的分裂和持续的压力,是其他学科教师难以体会的。
也因此,浙江技术选考造就了一大批优秀的信息科技教师。
今天是第十二期,继续看看我们的来时路。
一、选择题第9题:五位数筛选
【2021年6月原题】9.有百位和十位未知的5位整数“22**6”,能被37或67整除。以下VB程序段的功能是:在满足条件的所有数中,将最大的1个5位数的百位和十位依次显示在文本框Text1中。
i = 100 : flag = False
Do While i > 0 And Not flag
______①______
Loop
Text1.Text = Str(i \ 10) + Str(i Mod 10)
方框中的代码由以下三部分组成:
① j = 22006 + i * 10② i = i - 1③ If (j Mod 37) * (j Mod 67) = 0 Then flag = True
下列选项中代码顺序正确的是
A. ①②③B. ①③②C. ②①③D. ②③①
【Python版】有百位和十位未知的5位整数“22**6”,能被37或67整除。下面的Python程序用于在满足条件的所有数中找出最大的一个,并输出它的百位和十位。
i = 100
flag = False
while i > 0 and not flag:
#方框中的代码由以下三部分组成
______①______
print(i)
方框中的代码由以下三部分组成:
① j = 22006 + i * 10② i -= 1③ if (j % 37) * (j % 67) == 0: flag = True
下列选项中代码顺序正确的是
A. ①②③B. ①③②C. ②①③D. ②③①
【解析】
先令 i 从 100 开始,每轮先减 1,这样第一次检测的就是 i=99,对应的数为 22996。
随后构造 j = 22006 + i * 10,再判断它能否被 37 或 67 整除;一旦满足条件,就把 flag 置为 True 并结束循环。
因此正确顺序是“先减 i,再算 j,最后判断”,故选 C。
二、选择题第10题:对分查找语句执行次数
【2021年6月原题】10.某对分查找算法的VB程序如下:
i = 1 : j = 30
m = (i + j) \ 2
Do While i <= j And key <> a(m)
Ifkey > a(m) Then i = m + 1 Else j = m - 1
m= (i + j) \ 2'①
Loop
数组元素 a(1) 到 a(30) 各不相同且按升序排列,若查找键 key 与 a(9) 相等,执行该程序段,①处语句的执行次数是
A. 2B. 3C. 4D. 5
【Python版】某对分查找算法的Python程序如下:
i = 0
j = 29
m = (i + j) // 2
while i <= j and key != a[m]:
ifkey > a[m]:
i= m + 1
else:
j= m - 1
m= (i + j) // 2# ①
数组元素 a[0] 到 a[29] 各不相同且按升序排列,若查找键 key 与 a[8] 相等,执行该程序段,①处语句的执行次数是
A. 2B. 3C. 4D. 5
【解析】
第一次 m=14,key
第二次 key>a[6],更新后得到 m=10,①执行 2 次。
第三次 key ,此时恰好找到key
故选 B。
三、选择题第11题:字符串按位提取
【2021年6月原题】11.有如下VB程序段:
a(1) = "ABC" : a(2) = "DEF" : a(3) = "GHI"
s1 = "31,12,23,33" : s2 = ""
For i = 1 To Len(s1)
ch= Mid(s1, i, 1)
Ifch <> "," Then
i= i + 1
p= Val(Mid(s1, i, 1))
s2= s2 + Mid(a(p), Val(ch), 1)
EndIf
Next i
执行该程序段后,变量 s2 的值是
A. "CDHI"B. "GBFI"C. "CDH"D. "GBF"
【Python版】有如下Python程序段:
a = ["ABC", "DEF", "GHI"]
s1 = "31,12,23,33"
s2 = ""
i = 0
while i < len(s1):
ch= s1[i]
ifch != ",":
i+= 1
p= int(s1[i])
s2+= a[p - 1][int(ch) - 1]
i+= 1
print(s2)
执行该程序段后,变量 s2 的值是
A. "CDHI"B. "GBFI"C. "CDH"D. "GBF"
【解析】
按照字符串中的两位数字依次取字符:31 表示取第 1 个字符串的第 3 个字符,得到 C;12 得到 D;23 得到 H;33 得到 I。
最终 s2 = "CDHI",故选 A。
四、选择题第12题:冒泡排序优化
【2021年6月原题】12.如下VB程序段实现对数组元素 a(1) 到 a(10) 从小到大排序。
i = 1
Do While i < 10
k= i : i = 10
Forj = 10 To k + 1 Step -1
Ifa(j) < a(j - 1) Then
t= a(j) : a(j) = a(j - 1) : a(j - 1) = t
______①______
EndIf
Nextj
Loop
则代码中①处的语句可为
A. i = i + 1B. i = j + 1C. i = k - 1D. i = j
【Python版】如下Python程序段实现对数组元素 a[0] 到 a[9] 从小到大排序。
i = 0
while i < 9:
k= i
i= 9
forj in range(9, k, -1):
ifa[j] < a[j - 1]:
a[j],a[j - 1] = a[j - 1], a[j]
______①______
则代码中①处的语句可为
A. i = i + 1B. i = j + 1C. i = k - 1D. i = j
【解析】
变量 i 在这里记录本趟扫描中最靠前的一次交换位置。
如果某次比较发生交换,就应把当前位置 j 记下来,下一趟只需继续处理从该位置开始的区间。
因此①处应写为 i = j,故选 D。
五、非选择题第15题:场馆人流量统计
【2021年6月原题】15.根据某场馆一天中每位参观者的进馆和出馆时间,可统计该场馆当天人流量的分布情况。每个人进、出馆的时间用一个长度为11的字符串表示,例如“08:05-08:45”表示进馆时间为8点5分,出馆时间为8点45分。现要求统计当天馆内人数超过指定人数的总时长。

【Python版】根据某场馆一天中每位参观者的进馆和出馆时间,可统计该场馆当天人流量的分布情况。每个人进、出馆的时间用一个长度为11的字符串表示,例如“08:05-08:45”表示进馆时间为8点5分,出馆时间为8点45分。现要求统计当天馆内人数超过指定人数的总时长。程序运行如图所示:

(1)加框处代码有误,请改正。
(2)请在划线处填上合适的代码。
# 读取 n 个“进馆-出馆”时间字符串,代码略
n = len(d)
a = [""] * (2 * n)
# 提取每个人的进、出馆时间,分别加上 IN、OUT 标记后存入数组 a
for i in range(n):
a[i]= d[i][0:5] + "IN"
a[i+ 1] = d[i][6:11] + "OUT" #(1)加框处:a[i + 1]
# 对数组元素 a[0] 到 a[2*n-1] 从小到大排序
for i in range(2 * n - 1):
______①______
forj in range(i, 2 * n):
ifa[j] < a[k]:
k= j
a[i],a[k] = a[k], a[i]
sp = int(input("输入指定人数:"))
t = -1
cnt = 0
total = 0
for i in range(2 * n):
mts= int(a[i][0:2]) * 60 + int(a[i][3:5])
ifa[i][5:7] == "IN":
cnt+= 1
else:
______②______
ifcnt > sp:
ift == -1:
t= mts
elift > -1:
______③______
t= -1
print(f"超过指定人数的总时长:{total}分钟")
【解析】
(1)加框处原代码会覆盖前面保存的出入馆信息,正确写法应为: a[i + n]
(2)填空①应为 k = i,用选择排序在每一轮先假设当前位置最小。
填空②应为 cnt -= 1,遇到 OUT 说明馆内人数减 1。
填空③应为 total += mts - t,表示当前一段“人数超过指定值”的时间结束后,把这一段时长累计到总时长中。
六、非选择题第16题:小组成绩计算
【2021年6月原题】16.有 n 个小组(编号 1 至 n),每个小组有 m 个成员,每个成员都有一个大于等于 0 的得分。现要求按下列规则计算每个小组的成绩,并找出成绩最高的小组。

【Python版】有 n 个小组(编号 1 至 n),每个小组有 m 个成员,每个成员都有一个大于等于 0 的得分。现要求按下列规则计算每个小组的成绩,并找出成绩最高的小组。
小组成绩的计算规则是:若小组成员中得分最高的前 k 人得分都不低于 k,且其他成员得分都不超过 k,则该小组成绩为 k。例如,第 1 小组共有 8 个成员,得分依次为“5,2,7,11,8,6,5,1”,由此可知最高的前 5 人得分为“11,8,7,6,5”,其他 3 人得分为“5,2,1”,因此该小组成绩为 5。程序运行如下图所示:

(1)若第 2 小组各成员得分依次为“0,4,12,1,5,9,3,9”,则该小组的成绩是______。
(2)请在划线处填入合适的代码。
n = 6
m = 8
a = []# 按组别顺序存放所有成员得分,代码略
ans = [0] * n
def group_score(w):
c= [0] * (m + 1)
fori in range(w * m, (w + 1) * m):
k= a[i]
ifk > m:
______①______
c[k]+= 1
k= m
whilec[k] < k and k > 0:
k-= 1
______②______
returnk
maxg = -1
p = -1
for i in range(n):
g= group_score(i)
ifg > maxg:
maxg= g
p= 0
______③______
elifg == maxg:
p+= 1
ans[p]= i + 1
for i in range(p + 1):
print(f"第{ans[i]}组,成绩:{maxg}")
【解析】
先把第 2 组成绩按从大到小看为 12,9,9,5,4,3,1,0。
当 k=5 时,前 5 人中有一个 4,小于 5,不成立;当 k=4 时,前 4 人 12、9、9、5 都不低于 4,其余成员 4、3、1、0 都不超过 4,因此该组成绩为 4。
填空①应为 k = m,把超过 m 的得分都压到 m 这一档统计。
填空②应为 c[k] += c[k + 1],把“得分至少为 k+1 的人数”累加到“得分至少为 k 的人数”中。
填空③应为 ans[p] = i + 1,用于记录当前成绩最高的小组编号。
七、其他有价值的题目
无