第 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)小题
len(buf) > 0
state == 1
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,内层循环结束,下一轮采集不会被这次重试等待推迟。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_06_G3_gaokao_q014
