【真题回顾•第十二期】2021年06月浙江省信息技术选考真题Python改编

四季读书网 2 0
【真题回顾•第十二期】2021年06月浙江省信息技术选考真题Python改编

     本公众号推出真题回顾系列,将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分。现要求统计当天馆内人数超过指定人数的总时长。

【真题回顾•第十二期】2021年06月浙江省信息技术选考真题Python改编 第1张

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

【真题回顾•第十二期】2021年06月浙江省信息技术选考真题Python改编 第2张

(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 的得分。现要求按下列规则计算每个小组的成绩,并找出成绩最高的小组。

【真题回顾•第十二期】2021年06月浙江省信息技术选考真题Python改编 第3张

【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。程序运行如下图所示:

【真题回顾•第十二期】2021年06月浙江省信息技术选考真题Python改编 第4张

(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,用于记录当前成绩最高的小组编号。

七、其他有价值的题目

抱歉,评论功能暂时关闭!