深耕专业教研,探索前沿技术
信息技术来源:2026年6月浙江省普通高校招生选考科目考试

第 14 题

答案与解析

第(1)小题

参考答案

D3

缓冲区按数据获取顺序上传,上传成功后才删除数据,因此相当于先进先出的队列;断网时上传失败,数据仍留在缓冲区中。

时刻或事件 数据处理情况 缓冲区(队首→队尾)
8:00 获取 D1,网络正常,D1 上传成功后删除 空
9:00 获取 D2,网络已断开,上传失败 D2
10:00 获取 D3,D2 重试失败仍保留,D3 排在其后 D2,D3
11:00 获取 D4,网络仍断开,D4 排在队尾 D2,D3,D4
11:30 网络恢复后的首次成功上传 队首 D2 上传成功并删除 D3,D4
随后第二次成功上传 队首 D3 上传成功并删除 D4

随机延时会影响网络恢复后实际重试的时刻,但不会改变数据的上传顺序,所以 11:00 以后上传成功的第 2 个数据是 D3。

第(2)小题

参考答案
  1. len(buf) > 0

  2. state == 1

  3. stime -= delay

程序分析

buf = []
while True:
    # 获取传感器数据,存入变量data中,代码略
    buf.append(data)  # 将传感器数据存入缓冲区
    stime = 60
    while stime > 0 and ①:
        ...
    sleep(stime * 60 * 1000)

buf 在外层循环之前初始化为空列表,因此每轮循环不会重新清空缓冲区,上一轮尚未删除的数据能够保留到下一轮。while True 使终端持续重复采集和上传。

每轮先获取一份传感器数据,buf.append(data) 把新数据追加到已有数据之后,不覆盖此前未上传成功的数据。随后将 stime 设为 60,与题干规定的两次采集间隔 60 分钟相对应。

内层循环结束后,sleep(stime * 60 * 1000) 按 stime 延时,再进入下一轮采集。题干要求重试不能改变 60 分钟的采集间隔,因此重试中的等待与循环结束后的等待合计应为 60 分钟,stime 需要表示距下一次采集剩余的分钟数。

while stime > 0 and ①:
    data = buf[0]
    state = trans(data)
    if ②:
        buf.pop(0)  # 将上传成功的数据从缓冲区中删除
    else:
        delay = randint(1, 10)  # 随机生成1到10之间的整数
        if delay > stime:
            delay = stime
        sleep(delay * 60 * 1000)  # 延时delay分钟
        ③

内层循环先检查 stime > 0,进入后取出 buf[0] 并调用 trans(data)。按函数说明,上传成功返回 1,失败返回 0,结果保存在 state 中,供后面的分支判断使用。

成功分支中的 buf.pop(0) 删除列表首项;结合新数据从尾部追加、上传时读取首项,缓冲区按“队首→队尾”保存由早到晚获取的数据,成功时队首出队,后面的数据依次前移。失败分支没有删除数据,因此下一次仍会重试这份队首数据。

失败时,randint(1, 10) 产生 1 至 10 分钟的随机等待时长。如果它大于 stime,就改为 stime,使本次等待不超过距下一次采集的剩余时间。随后 sleep(delay * 60 * 1000) 延时 delay 分钟,其中 60 * 1000 将分钟换算为毫秒。

填空分析

①

循环体要访问队首 buf[0],只有缓冲区非空时才能继续上传。空①与 stime > 0 用 and 连接,应填写判断缓冲区还有数据的表达式:len(buf) > 0。这样,时间用尽或缓冲区已空都会结束内层循环。

②

题干要求只删除上传成功的数据,trans(data) 成功时返回 1,返回值已保存到 state。因此进入删除分支的条件应为 state == 1;返回 0 时进入失败分支,保留队首数据等待重试。

③

此处位于失败分支中,已经实际等待了 delay 分钟,距下一次采集的剩余时间应相应减少。空③填写更新语句 stime -= delay。例如还剩 3 分钟、随机得到 8 分钟时,前面的判断先将 delay 截为 3,等待后 stime 变为 0,内层循环结束,下一轮采集不会被这次重试等待推迟。