必修一 数据与计算 课时10 简单算法及其程序实现(课件 教案)2027届高中通用技术一轮复习

资源下载
  1. 二一教育资源

必修一 数据与计算 课时10 简单算法及其程序实现(课件 教案)2027届高中通用技术一轮复习

资源简介

课时10 简单算法及其程序实现
【学业要求】
知识点 学业水平等级
1.掌握程序调试与运行的方法,理解算法优化对解决问题的影响。 4
2.理解迭代算法的思想,应用迭代算法处理实际的问题。 4
  简单算法及其程序实现是考查的重点,能够体现很大的区分度。这部分内容可以分散到信息系统搭建过程的代码设计或者利用pandas进行数据统计的过程中,也可能是一个生活中具体的问题,需要编写代码来解决,主要体现枚举算法和迭代的算法思想。
某仓库有一排连续相邻的货位,编号依次为0~n-1,用于放置A、B两种类型的箱子,A型箱子占2个相邻货位,B型箱子占1个货位。编写程序,根据已完成的放置或搬离操作,输出空货位数及还可以放置A型箱子的最多数量(不移动已放置的箱子)。请回答下列问题:
箱子类型 操作类型 货位编号
B 放置 5
A 放置 2,3
B 放置 0
A 放置 7,8
A 搬离 2,3
(1)若n为10,开始时货位全空,经过如图所示的放置或搬离操作后,不移动已放置箱子的情况下,还可放置A型箱子的最多数量为    个。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#读取货位总数存入n,代码略。
cnt1=n
lst=[0]*n #货位状态,0表示对应的货位为空
while True:
  #读取本次已描述数据:箱子类型、操作类型、货位编号起始值存入t,d和s,代码略
  if t=="A":
   w=2
  ①    :
   w=1
  else: #不是"A"或"B"时退出循环
    break
  if d=="P": #d为P时表示放置,否则表示搬离
    ②   
  else:
    cnt1+=w
  lst[s]=1-lst[s]
  if t=="A":
    lst[s+1]=1-lst[s+1]
  i,cnt2=0,0
  while i   if lst[i]==0 and lst[i+1]==0:
     ③   
     cnt2+=1
   i+=1
  print("当前空货位数",cnt1,",还可放置A型箱子的最多数量:",cnt2)
答案 (1) 2或两 (2)①elif t=='B' 或elif t=="B"或elif t=='''B'''或elif (t=='B') ②cnt1-=w或cnt1=cnt1-w ③i +=1或i=i+1
解析 本题考查列表的遍历。(1)经过放置或搬离操作后,索引位置1-4是空的,6和9是空的,因此可以放置A型箱子2个。(2)①w是两种箱子所占货位,因此当输入是B时占位为1。②cnt1当前空货位数,d为P时表示放置,否则表示搬离,条件不成立时,空位增加,因此条件成立时,空位减少。③cnt2表示还可放置A型箱子的最多数量,当条件lst[i]==0 and lst[i+1]== 0成立时,表示可以放置A类型,因此下一个货位要跳过。
1.算法要有    的遍历思维。遍历某个数据集,在遍历过程中,对符合条件的数据作计数、求和、求最值等一系列操作。
2.算法要有    的过程思维。算法就是解决问题的方法和步骤,需要一系列操作过程来完成。通过自定义函数、选择结构或循环结构来实现模块划分。
3.算法要有    的定位思维。通过索引快速定位到需要的数据项,牺牲空间换取访问速度。通过桶快速定位到数据的类别数量或内容的信息。
4.算法要有        的更新思维。通过重复执行一系列操作或步骤来逼近目标解或达到某个特定状态的过程。进行某项操作后,必定带来相应数据的更改,并在下一轮迭代中起作用。
自我校对:1.枚举 2.模块 3.索引 4.迭代
【典例1】 某城市外环线公路限速80千米/小时,有若干个十字路口。现在有一辆车距离第1个路口1000米处匀速出发,且此时所有路口的红绿灯刚好从红灯跳到绿灯。编写程序,计算可以连续通过最多绿灯路口的最高车速。请回答下列问题:
(1)若共有3个路口,每两个路口之间的距离均为1000米,车子通过路口的时间忽略不计,每个路口的红绿灯持续周期时间均为60秒,其中第0-30秒为绿灯,可以通行。车子以下列速度能连续通过3个路口的是    (单选,填字母)。
A.15米/秒(54千米/小时)
B.20米/秒(72千米/小时)
C.25米/秒(90千米/小时)
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#读取车子距离第1个路口距离以及每两个路口之间的距离存入dis列表中,代码略。
#读取各路口红绿灯周期时间存入towtime列表中,代码略。
ansx,ansy=0,0
for speed in range(40,81):
 curtime,cout,imax=0,0,0
 tspeed= int(speed*1000/3600) #速度转换为米/秒
 for i in ①    :
   curtime+=int(dis[i]/tspeed)
   tmp=curtime % towtime[i]
   if ②    :
     cout+=1
     if cout>imax:
      imax=cout
   else:
     curtime+=towtime[i]-tmp
     cout=0  
 if ③    :
   ansx=imax;ansy=speed
print("车速为"+str(ansy)+"千米/小时,可最多连续通过"+str(ansx)+"个路口")
思维点拨
明考向 本题考查利用程序设计解决生活实际问题
精点拨 (1)A选项到达第1个路口时间为1000/15,约为67秒,绿灯第2次亮起。到达第2个路口时间为1000/15,约为133秒,除60的余数为13秒,绿灯亮起。到达第3个路口时间为3000/15,为200秒,除60的余数为20秒,绿灯亮起。B选项到达第1个路口时间为1000/20,值为50秒,红灯。C选项超过速度限制。(2)①遍历经过各个路口的距离。②curtime表示到达该路口的时间,curtime除以经过当前路口的红绿灯周期时间towtime[i]的余数在前一半,那么就可以绿灯通过。③计算可以连续通过最多绿灯路口的最高车速,若有多个最大值,当speed越大,就是所求的值
答案 (1)A
(2)①range(len(dis)) 或range(len(towtime))
②tmp<=towtime[i]∥2 ③imax>=ansx
【变式1】 (2025年1月浙江选考)根据机器的负载率对工厂的6台机器(编号0~5)进行监控和调度。调度规则是:每隔1小时采集1次各台机器的负载率(负载率用百分制表示,例如,负载率95%表示为95,机器休息时的负载率为0),负载率超过90的机器都调度休息;如果所有机器负载率都不超过90,则负载率最高的机器休息,若多台机器负载率同为最高,则编号最小的机器休息。休息的机器在休息1小时后再次工作。
请回答下列问题:
(1)若某次采集到0~5号机器的负载率依次为75、85、88、0、88、87,当前处于休息状态的机器编号是3,接下来休息的机器编号是    。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
n=6;a=[0]*n #列表a长度为n,各元素值均为0
#启动0~4号机器工作,5号机器休息,代码略
while True:
  #延时1小时,再采集各机器负载率存入a,a[i]存放i号机器的负载率,代码略
  t=0;cnt=0
  for i in range(n):
    if ①      :
      #调度i号机器休息,代码略
      cnt+=1
    if a[i]>a[t]:
      ②     
    elif a[i]==0:
      #调度i号机器工作,代码略
  if ③      :
    #调度t号机器休息,代码略
答案 (1)2 (2)①a[i]>90 ②t=i
③cnt==0 或 a[t]<=90
解析 本题考查循环结构和多分支选择结构以及算法的综合应用。(1)机器负载均不超过90,负载最大的是2号、4号,都是88。按题目要求此时编号小的机器休息,编号为2的机器休息。(2)①按要求,负载率只要超过90的机器都调度休息,所以这里的条件:a[i]>90;②根据后面的代码,这里是查找负载最大的机器,将编号保存在变量t中;③变量cnt用于统计当前有多少台机器的负载率超过了90,只有当cnt为0时,编号为t号的机器休息。所以这里的条件是cnt等于0。
【典例2】 挖金矿游戏。在一个8行8列的矩阵中,矿工位于第1行第1列的格子,n个金矿随机分布在第1行下面的各个格子中,每个金矿的横坐标依次保存x数组,纵坐标保存在y数组。矿工收集金矿方法:先确定每行最左边和最右边金矿的坐标,对于同一行的金矿,矿工先移动到最左边金矿正上方,再执行向下x步的指令进行挖矿,接着从该行左边第2个金矿开始一直挖到最右边。该行完成后,再依次挖下方各行的金矿。
如图所示的金矿(图中黑色方块)分布图,按右侧所示的指令,可以收集全部金矿。编写程序,按顺序输出指令,使矿工按照规则得到所有金矿,将空白处填写完整。
x=[2,5,5,5,5,8] #各金矿行号,从小到大升序排列
y=[1,4,5,6,8,6] #各金矿列号,同一行金矿,列号从小到大升序排列
n=len(x) #金矿数量
px=py=1 #矿工初始位置行号和列号
i=0
while i  beg=i
  while i    i+=1
  if y[beg]    print("左"+str(py-y[beg]))
  elif y[beg]>py:
    print("右"+str(①    ))
  print("下"+str(x[beg]-px))
  print("挖矿")
  for k in range(②    ):
    print("右"+str(y[k]-y[k-1]))
    print("挖矿")
  px=x[beg]
  ③   
  i+=1
思维点拨
明考向 本题考查利用程序设计解决生活实际问题
精点拨 beg表示每一行最左边金矿的索引,条件x[i]==x[i+1]成立表示两个处于同一行的金矿,因此循环结束后,索引i表示当前行最右边的金矿的列号。①py表示矿工的列号,条件y[beg]>py成立表示最左边矿位于矿工的右边,需向右移动y[beg]-py个位置。②当前行可能还有多个金矿,因此当前已经挖了最左边beg位置上金矿,还需从beg+1位置挖到第i列,由于range是一个左闭右开的区间,因此值为i+1。 ③更新矿工的位置,其列号为最右边金矿的列号
答案 ①y[beg]-py ②beg+1,i+1 ③py=y[i]
【变式2】 现有一个文档“压缩前.txt”中保存了大量的小写字母和数字,小明发现文档中有很多字母或数字是连续的,就想设计一个算法将字符串中连续的字母或数字进行压缩,如连续字符“abcd”可压缩为“a-d”,不连续的字符维持原状,例如,字符串“abcde1255hij”可压缩为“a-e1-255h-j”,并将压缩后的结果输出保存到“压缩后.txt”中。
该算法的部分Python代码如下:
def writedata(data):
 #将数据data输入到"压缩后.txt"中,代码略
fp=open("压缩前.txt")
lines=fp.readlines()
fp.close()
for line in lines:
  flag=False
  ans=""
 for i in range(len(line)-1):
   if ord(line[i+1])==ord(line[i])+1:
    ans+=line[i]+"-"
    flag=True
   elif ord(line[i+1])!=ord(line[i])+1:
    ①   
    flag=False
 ans+=line[i+1]
 ②   
(1)执行程序后,当输入字符串s的值为
"efg1234345hijk"时,压缩后的字符串为    。
(2)请在划线处填入合适的代码。
(3)程序中加框处代码有误,请改正。
答案 (1)e-g1-43-5h-k (2)①ans+=line[i]
②writedata(ans) (3)ord(line[i+1])==ord(line[i])+1 and not flag或ord(line[i+1])==ord(line[i])+1 and flag==False
解析 本题考查一个集合中两个元素的组合,或者是一段连续区间的开始位置和结束位置的遍历。(1)略。(2)①当条件ord(line[i+1])!=ord(line[i])+1成立时,表示连续段已经结束,终点位置是i,因此需将line[i]连接入ans中。②读取一行数据,处理完后调用writedata函数,将压缩后的结果输出保存到“压缩后.txt”中。(3)找到连续段开始位置。flag是一个是否是头部的标志,初值为False,找到连续字符串的第1个位置后,flag的值变更为True。
  遍历是按照一定的规则和次序访问数据元素中的所有节点,使得每个节点都被访问一次且仅被访问一次。相同类型的数据往往保存在数组中,数组的特点是按照索引位置依次存放数据,若只有一个数组,可以通过按值访问的方法,对所有数据进行求和、计数、求平均值和求最大值或最小值等操作。若有多个数组,他们拥有相同的索引,可以通过索引位置依次访问数据。在一个序列中遍历元素可以分为两种情况,一是对单个元素进行遍历,如对字符串进行加密、压缩算法。二是要找出序列中一个连续的子序列,如找一个依次相连的子串,找一个连续递增或递减的子序列。在第二种情况中,将涉及该元素与他前面或后面元素的关系,因此需与他们依次进行比较,比较总次数比元素的个数少1个。
1.某产品质量检测设备要对一批玩具机器人进行质量检测。玩具机器人可以在二维平面上行走,行走时的位置用横纵坐标表示,若横、纵坐标之和比前一个位置的横、纵坐标之和大,则表示机器人在前进。检测时,每隔1秒钟采集一次机器人的坐标。若在2分钟之内,机器人能连续前进100次(即连续100个增大的坐标之和)则表示产品合格。请回答以下问题:
(1)某次检测到有6个位置的坐标,按时间递增的顺序依次为(0,0),(1,0),(0,2),(0,3),(1,2),(3,1),则连续前进的次数(坐标个数)最多是    (填数字)。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
prex=prey=-1
n=t=maxn=0
while True:
 #接收一次采集到的机器人位置坐标,分别存入x和y,代码略
 t+=1
 if ①    :
   n+=1
 else:
   n=1
 if ②    :
   maxn=n
 if t>=120:
   if ③     :
     #产品合格,将之移入合格产品线,并将下一个产品放入检测,代码略
   else:
     #产品不合格,将之移入不合格流水线,并将下一个产品放入检测,代码略
   n=t=maxn=0 
   prex=prey=-1
 else:
   prex=x;prey=y
 #延时1秒钟,代码略
答案 (1)3 (2)①x+y>prex+prey
②n>maxn ③maxn>=100或maxn==100
解析 本题考查Python基础程序设计。(1)由题意知,(1,0),(0,2),(0,3)三个位置都是递增的,表示连续前进3次。(2)由if语句成立时n+=1的变化与不成立是n变成1可以断定,第①空位置需要填写表示机器人在前进的关系表达式,即当前位置的坐标之和大于前一次的坐标之和。当前的坐标是x和y,那么前一次的坐标在哪呢 往后分析,倒数第二行语句,当t>=120不成立时,prex和prey分别得到x和y的值,这里用迭代的方式将当前坐标变为上一次坐标,因此prex和prey就是上一次的坐标。于是第①空填写x+y>prex+prey。由此也可以判断t是时间,120是指2分钟以内收集坐标的次数。n是当前连续前进的次数,那么第②空要用“打擂法”保留前进次数最多的值,填写n>maxn。第③空是检测产品可以的关系表达式,显然是某个值要大于等于100。那么是n>=100,还是maxn>=100呢 因为题目要求只要有一段连续前进100次即可,因此填写maxn>=100。
2.老年机因其较大的按键,很适合老年人使用,但其中英文字母的输入方式比较麻烦,导致很多老年人不太会用。如图是一款老年机的键盘,其字母的输入方式如下:
(1)若要输入英文字母“A”,则2键按1下;若要输入“B”,则2键按两下;其他英文字母的输入方式同理。
(2)若连续输入的英文字母在同一数字键中,则在输入下一个英文字母前,需先按下1键以表示确定;若连续输入的英文字母不在同一数字键中,则不需要按1键,直接按所要输入英文字母对应的数字键即可。
(3)若要输入空格,则按0键。
王老师依据该手机的字母输入规则,设计了一个 Python 程序。实现输入按键被点击的顺序,显示手机中输入的英文内容的功能。程序运行界面如图所示:
>>> 输入按键编号顺序:7999844666166 输出的内容是:PYTHON >>>
实现该功能的程序代码如下:
keyboard={"0":"","2":"ABC","3":"DEF","4":"GHI","5":"JKL","6":"MNO","7":"PQRS","8":"TUV","9":"WXYZ"}
yw=input("输入按键编号顺序:")
①   
i=k=1
result=""
while i if yw[i]==key:
   k=k+1
 else:
   if yw[i]=="1":
     ②   
   result+=keyboard[key][k-1]
   key=yw[i]
   ③   
 i=i+1
result+=keyboard[key][k-1]
print("输出的内容是:",result)
请回答下列问题:
(1)若按键点击的顺序是“616661666166”,则手机中输入的英文是    。
(2)要实现程序的功能,请完善划线处的代码。
答案  (1)MOON (2)①key=yw[0] ②i=i+1 ③k=1
解析 (1)键6的第1个字母为M,同一数字键中,则在输入下一个英文字母前,需先按下 1 键,键6的第3个字母为O,第2个字母为N。(2)查找连续相同的键的个数。①变量i从1开始遍历,因此key的初值为yw[0]。若遍历到"1",说明是相同两个键的分隔符,i的位置加1。③若不相同,则这个键是下一组的第1个键。
3.在一条宽度为h的小河中,一只青蛙沿着直线从河的左侧跳到右侧。小河中有沿着直线分布的若干片位置互不相同的荷叶,青蛙必须跳到荷叶上过河,否则会掉入水中。开始时青蛙站在河的左侧(坐标为0),接着不停地向右侧跳跃,每次跳跃的距离不超过w,若两片荷叶之间的距离超过w,则在两片荷叶之间,青蛙能跳的最远处增加若干片荷叶,以确保青蛙能跳在荷叶上过河,求需要增加的荷叶数。编写程序代码如下,请将空白处填写完整。
#读取青蛙每次跳跃的最大长度,并存入变量w中
#读取各片荷叶的坐标位置,存入列表a中,代码略
p=0 #第1片荷叶的初始索引位置
d,tot=0,0 #d表示青蛙的位置
while d  if ①    :
   ②   
   p=p+1
  else:
    tot+=1
    ③   
print("至少需要增加的荷叶数为:"+str(tot))
答案 ①a[p]-d<=w ②d=a[p] ③d+=w
解析 ①变量d表示青蛙所处位置,他可能在荷叶上,也可能在新增加的荷叶上,变量p表示青蛙下一步要到过的荷叶或位置,因此只有满足条件a[p]-d<=w才可能到达下一荷叶,若条件为a[p]-a[p-1]>w,当青蛙无法一步到达下一张荷叶时,虽然在else增加了荷叶,但a[p-1]的值没有发生变化,因此还是无法达到下一张荷叶。②更新青蛙的位置。③增加了一张荷叶,更新青蛙可以到过的最大位置。
4.小华设计了一个自习室噪声提醒装置,每秒采集一次噪声数据,若1分钟内采集到超过50分贝的噪声大于30次,则发出提醒。部分Python程序如下,请在划处填入合适的代码。
d=[0]*60 #生成列表d,包含60个元素,每个元素的值都是0
count=0
①    
while True:
 #接收一次采集到的噪声数据并存入val,代码略
 if d[i]>50 and val<=50:
   ②    
 elif d[i]<=50 and val>50:
   count+=1
 ③    
 i=(i+1)%60
 if count>30:
   print("噪声过大")
 #延时1秒,代码略
答案 ①i=0 ②count-=1 ③d[i]=val
解析 ①变量i可以表示一个周期中第0至第59秒,需对变量i赋值初值0。②当前d[i]的值不属于下一周期,因此若当前噪声val大于50,而d[i]的值小于等于50,下一个周期的次数将增加,若d[i]的值大于50,则不增也不减。若当前噪声val小于50,而d[i]的值大于50,说明在下一周期中,count的值将减少。③将当前的val记录到d[i]中,以便和下一周期同时间段的进行比较。
5.某单位打印室有4台打印机(编号0~3),根据打印任务的紧急程度分为加急任务和普通任务,两种任务的分配规则如下:
△任务甲为加急任务,优先分配:
·先选择当前空闲的打印机(同空闲状态则编号小的优先)
·若无空闲打印机,则选当前任务剩余时间最短的打印机(同剩余时间则编号小的优先)
△任务乙为普通任务,按打印机累计打印份数分配,选择累计打印份数最少的打印机(同打印份数则打印机编号小的优先)
(1)某时刻各打印机状态:
打印机0:空闲(累计200份) 打印机1:忙碌,剩余8分钟(累计160份)
打印机2:忙碌,剩余6分钟(累计160份) 打印机3:忙碌,剩余8分钟(累计200份)
此时到达一个打印任务,下列选项中任务和分配的打印机相匹配的是    (单选,填字母)。
A.乙,打印机0 B.乙,打印机1
C.甲,打印机2 D.甲,打印机3
(2)以下Python代码段实现打印任务的分配,请在划线处填入合适代码。
(3)加框处代码有误,请改正。
#[False,0,200]表示打印机状态(空闲),当前任务剩余时间,累计打印份数
printer=[[True,6,200],[True,5,150],[True,8,150],[True,3,220]]
#获取task值,如[True,20]表示任务属性(甲)与需打印份数,代码略
def assignmen_task(printer,task):
 if task[0]:
   k=0
   for i in range(len(printer)):
    if ①     :
      #更新打印机状态与累计打印份数,代码略
      return printer,i
    elif ②      :
      k=i
 else:
   k=0
   for i in range(1,len(printer)):
    ifprinter[k][2]>=printer[i][2]:
      k=i
 #更新打印机状态与累计打印份数,代码略
 return printer,k
答案 (1)B (2)①not printer[i][0]
②printer[k][1]>printer[i][1]
(3)printer[k][2]>printer[i][2]
解析 (1)甲为加急任务,先选择当前空闲的打印机0,乙是普通任务,应选打印份数最少的打印机1。(2)task[0]表示任务属性甲,即加急任务,枚举各个打印机的打印任务,找到相应的打印机。①先选择当前空闲的打印机(同空闲状态则编号小的优先),因此找到第一个打印机状态printer[i][0]是空闲,其值为False,则返回打印任务和打印机编号。②若无空闲打印机,则当前打印任务的时间printer[i][1]与剩余时间最短的打印机时间printer[k][1]比较,找到相应的打印机编号。(3)任务乙为普通任务,按打印机累计打印份数分配,选择累计打印份数最少的打印机,当两个打印份数均为最小时,选择打印机编号小,因此不能包含等号。
1.(2026年1月浙江选考)服务器根据温度数据生成状态码,满足一定条件时发送给智能终端以控制风扇运行。生成和发送状态码的规则如下:
①温度≤15 ℃时,状态码为0;温度≥35 ℃时,状态码为2;其他温度范围,状态码为1。
②当状态码连续k(k>1)个相同,且与最近已发送状态码不同时,则发送该状态码。
请回答下列问题:
(1)若k为3,最近已发送状态码为1,随后生成的状态码序列为“0,0,0,2,0,0,1,1,1,0”,则由该序列触发的状态码发送次数为    次。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
sent=last=-1
#获取k值,代码略
while True:
  #获取温度数据保存到变量t中,代码略
  ①   
  if t>=35:
    code=2
  elif t>15:
    code=1
  if ②    :
    if code!=last:
      cnt=1
    else:
      ③   
      if cnt==k
        #发送状态码 code,代码略
        sent=code
  last=code
  #延时1分钟,代码略
答案 (1)2 (2)①code=0 ②code!=sent
③cnt+=1
解析 本题考查多分支选择结构和枚举算法思想。(1)当状态码连续k(k>1)个相同,且与最近已发送状态码不同时,则发送该状态码。状态码序列为“0,0,0”时发送“0”,状态码序列为“1,1,1”时发送“1”,共发送两次。(2)①温度≤15 ℃时,状态码为0;温度≥35 ℃时,状态码为2;其他温度范围,状态码为1。分支结构只判断了温度≥35 ℃和温度大于15 ℃且小于35 ℃的情况,因此code的初始值是温度≤15 ℃时的状态码0。②最近已发送状态码与当前状态码不同时,才发送该状态码。从语句sent=code可知,sent记录了上一次发送的状态码,code为当前的状态码,因此当code和sent不相等时才判断是否有k次连续相同的状态码。③last为前一次的状态码,需判断状态码连续相同,因此当code和last相同时,统计连续相同的次数cnt将增加1。
2.某小区停车场私家车车位不收费,收费车位计费规则如下:停车时长不到半小时按2元计费;半小时及以上则按每小时5元计费;超过整小时部分,不足半小时的时长不计费,半小时及以上则按一小时计费。编写Python程序,读取某日的停车记录所有数据,并计算该停车场当日的总收入。请完成下列问题:
#读取某日的停车记录并存储到data列表中,每个元素包含4个数据项,进(出)场时间、车牌号、进出场状态(0表示进场,1表示出场)、车位状态(0表示私家车位,1表示收费车位),代码略。
def calT(Tin,Tout):
 t1=int(Tin[11:13])*60+int(Tin[14:16])
 t2=int(Tout[11:13])*60+int(Tout[14:16])
 return t2-t1
dic={}
price=5;total=0
for car in data:
 if car[2]=='0' and car[3]=='1':
   dic[car[1]]=car[0]
 else:
   T=①     
   if T<30:
    fee=2
   else:
    fee=②    
 total+=fee
print("本日停车费总收入为:",total)
(1)请将划线处代码补充完整。
(2)加框处代码有错误,请改正:                        。
解析 (1)①calT(dic[car[1]],car[0])
②(T+30)∥60*price或int(T/60+0.5)*price
(2)elif car[3]=='1'
解析 (1)①调用函数计算停车费用。calT函数的第1个参数为入场时间,第2个参数为出场时间,入场时间在dic字典中获取,出场时间为当前记录的时间。②计算费用。超过整小时部分,不足半小时的时长不计费,半小时及以上则按一小时计费,四舍五入计算整小时数,并按每小时5元计费。(2)car[2]进出场状态,car[3]表示车位状态,当进场状态为0且为收费车牌时,在字典dic创建一个车牌号码为键,进场时间为值的键值对,只有收费车牌时才计算费用,而私家车是不用计费的,因此加框部分下面的代码是针对收费车牌的计费方法。
3.某信息系统在传输实验数据时偶发数据包传输错误。每个数据包都具有唯一编号,有效范围为1至接收到的总数据包数,接收端允许数据包乱序到达。经检测,接收到的数据包编号均为正整数,但可能存在以下三类错误情况:
·缺失:有效范围内的某个编号未被接收;
·重复:有效范围内的某个编号被多次接收;
·无效:接收到的编号超出有效范围。
现需检测本次传输中存在错误的数据包编号。请回答下列问题:
(1)若某次接收到的数据包编号分别为2、5、1、3、2,则其中缺失的编号是    。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#将接收到的数据包编号存储在列表pack,代码略。
n=①    
print("编号有效范围:1-",n)
#列表miss、dupl、inv分别用于存储缺失、重复、无效的错误编号
miss=[];dupl=[];inv=[]
for p in pack:
 if abs(p) > n:
   inv.append(abs(p))
   continue
 idx=abs(p)-1
 if pack[idx]<0:
   dupl.append(②     )
 else:
   pack[idx]*=-1 #将当前编号对应位置的数值取反
for i in range(n):
 if ③     :
   miss.append(i+1)
#重复数据集dupl和无效编号数据集inv按数值大小排序,代码略
print("缺失:",miss,",重复:",dupl,",无效编号:",inv)
答案 (1)4 (2)①len(pack) ②abs(p)或idx+1
③pack[i]>0或pack[i]>=0
解析 (1)总包数为5,编号范围为1-5,缺失4号。(2)以pack的值为[3,2,2,7,4]为例,共接收到5个包,正确编号为1-5。当p为3时,pack[2]的值为-2;当p为2时,pack[1]的值为-2;当p为2时,pack[1]的值为-2,2号重复;当p为7时,pack[3]的值为7,无效;当p为4时,pack[3]的值为-7。pack的值为[3,-2,-2,-7,4]。①有效范围为1至接收到的总数据包数len(pack)。②用循环变量p遍历pack中的编号,idx是位置p对应下标,若pack[idx]值为正,表示位置p第1次出现,将其乘以-1,成为负数;否则表示p位置不是第1次出现,将其加入dupl数组中。③数组元素pack[i]为正数,表示该位置本来应该存储的编号为i+1,但没有成为负数,说明是缺失。
4.小明为了研究生物实验室微生物培养皿中适宜的温度数据,通过从服务器数据库导出某培养皿中温度传感器采集到近24小时内全部的温度数据,查找当日温度连续不高于设定阈值(25 ℃)的最长时间段(若含有多段长度相同的最大值,输出最早的一个时间段)。
(1)若采集到的时间点和温度数据用数组a来表示,a[0][0]是第一个采集时间点,a[0][1]是第一个温度值,则[[1,21],[2,24],[3,25],[4,26],[5,22],[6,23]]中符合要求的最长时间段是    (单选,填字母:A.1至4/B.1至3/C.5至6)。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#获取采集到的温度数据,用数组a存放,代码略
s=25;maxlen=0;n=len(a)
start=end=0
i=0
while i  if a[i][1]<=s:
   ①    
   for j in range(i+l,n) :
     if ②     :
       break
     c=c+1
   if c>maxlen:
     maxlen=c;start=i
     end=③    
   i=i+c
 else:
   i=i+1
print("最长时间段为",a[start][0],"至",a[end][0])
答案 (1)B (2)①c=1 ②a[j][1]>s或a[j][1]>25 ③i+maxlen-1或i+c-1或start+c-1或start+maxlen-1
解析 (1)符合要求的最长时间段为21、24、25,即1至3。(2)①遍历数组a,若当前温度a[i][1]小于等于s,c记录连续的天数,因此c的值为1。②变量j从i+1开始不断地向后查找,若遍历到的温度a[j][1]大于s,则找到一段连续不大于s的温度的日期。③变量i的连续的开始位置,其长度为maxlen,因此结束位置为i+maxlen-1。
5.某系统可记录实验室中n台设备的开关机数据,数据格式记为[a,b],其中a由字母A与数字0~n-1组合表示设备名,如“A0”;b表示设备a开机或关机的时刻,为正整数。系统按开关机时刻依次记录。编写Python程序读取某天t时刻前系统记录的数据,计算实验室中当天截止到t时刻所有设备开机的总时长(每天开始时所有设备都是关机状态)。请回答下列问题:
(1)若系统某天t=50时刻前记录的数据为:["A1",10],["A2",20],["A1",30],["A3",30],["A1",40],则当天t时刻前实验室所有设备开机的总时长为    。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#读取设备的数量n及时刻t,并读取当天t时刻系统记录的数据存储到列表data中,data每个元素包含两个数据项,分别为设备名和开机或关机时刻。如[["A1",10],["A2",20]]
ans=[]
for i in range(n):
 ans.append([0,-1]) #为ans追加一个元素[0,-1]
for i in range(len(data)):
 cname=data[i][0]
 ①    
 if ans[num][1]==-1:
   ans[num][1]=data[i][1]
 else:
   ②    
   ans[num][1]=-1
sum=0
for i in range(n):
 if ③     :
   ans[i][0]+=t-ans[i][1]
 sum+=ans[i][0]
print("开机总时长:",sum)
答案 (1)80 (2)①num=int(cname[1:])
②ans[num][0]+=data[i][1]-ans[num][1]
③ans[i][1]!=-1
解析 (1)A1设备开机时长:10至30,40至50,共30分钟;A2设备:20至50共30分钟;A3设备:30至50共20分钟。总开机时长为80分钟。(2)①data[i][0]表示当前的设备名cname,设备名固定以“A”开头,编号为cname第2位及后面的数字。②ans数组每个元素的2个值分别是设备累计开机时长和设备上一次开机时间。ans[num][1]记录设备上一次开机时间,若ans[num][1]为-1,则说明设备处于关机状态,需统计本次开机的时长data[i][1]-ans[num][1]并累加到ans[num][0]中。③在t时刻,若设备ans[i]仍处于开机状态(满足条件ans[i][1]!=-1),则需要累加从开机到t时刻的开机时长。
6.编写程序,获取当前时刻温度,参照预警标准,进行启动预警;若温度达到更高一级标准或同等级则进行更新预警。各级预警标准如下:
Ⅰ级预警:24小时内当气温升至40 ℃及以上;
Ⅱ级预警:24小时内当气温升至37 ℃及以上;
Ⅲ级预警:24小时内当气温升至35 ℃及以上。
请回答下列问题:
(1)图中预警的各时刻数据如下:[2,35],[5,41],[5,x],[6,40],[3,29],[10,41],则x的值可能是    (单选,填字母)。
A.30 B.36
C.38 D.41
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
limit=[40,37,35]
pre=-1 #存储前一次预警的数据,初始化状态为-1
while True:
 #采集一次数据,存入列表d,d[0]存储时刻,d[1]存储温度,代码略
  if d[0]==0: #每日0时初始化
   ①    
  for i in range(3):
   if d[1]>=limit[i]:
     if ②     :
       if pre==-1:
         #启动预警信息,代码略
       else:
         #更新预警信息,代码略
       pre=d[1]
   elif i>0 and pre      #更新预警信息,代码略
      ③    
   break
  #延时1小时,代码略
答案 (1)B (2)①pre=-1 ②pre③pre=d[1]
解析 (1)每2个数据对应图中3条记录,数据[5,x]的预警信息为“Ⅲ级预警”,即根据题意x的取值范围为[35,36]。(2)变量pre存储前一次预警信息时的温度数值。①每日0时初始化pre为-1,表示每天的初识状态下的预警值。②d[1]表示当前的温度值,i表示预警等级,limit[i]为等级i+1时的温度阈值。该表达式为True时,表示温度值达到预警,考虑启动或更新预警。预警等级可能提高或降低,提高预警等级的条件为pre7.小明设计了一个蔬菜大棚自动浇水系统。该系统利用传感器每天早、中、晚三次进行土壤湿度检测,若连续三次湿度值均低于阈值s,则打开阀门浇水,否则将关闭阀门。浇水时间根据土壤平均湿度值ave决定:ave<100为重度干旱,浇水10分钟;100≤ave<200为中度干旱,浇水8分钟;200≤ave<300为轻度干旱,浇水5分钟。请回答下列问题。
(1)若s的值为300,土壤湿度传感器早上、中午和晚上采集的数据依次是190、180和160,则应浇水的时间是    。
(2)请完成下列划线处的代码。
cnt=ave=0
while True:
  hum=float(request.args.get("hum1")) #获取湿度传感器的数值
  #将土壤湿度值存入数据库,并从数据库中读取湿度阈值存入变量s中,代码略
  if hum    cnt+=1
    ①    
  else:
    cnt=0;ave=0
  if cnt==3:
    ave=ave/3
    if ave<100:
      t=10 #t为浇水时间,单位是分钟
    elif ②     :
      t=8
    elif 200<=ave<300:
      t=5
    cnt=0;sta=1
  else:
    ③    
  #根据sta状态打开浇水系统浇水t分钟或关闭浇水系统
  #延时8小时,代码略
答案 (1)8 (2)①ave+=hum ②ave<200
③sta=0
解析 (1)土壤平均湿度为176,因此需浇水8分钟。(2)①由语句ave=ave/3可以,先统计温度总和至ave,再计算平均湿度。②若满足条件100≤ave<200为中度干旱,浇水8分钟。③若开启浇水t分钟后,cnt的值为0,当cnt小于3时,将停止浇水。
8.某水库水位预警系统共设立10个监测点,每个监测点可统计水位情况并发送预警信息,信息分为三种状态值,0表示低水位预警,1表示正常水位(不发送预警信息),2表示高水位预警。当超过一半的监测点发送同一预警信息,即正式发布水库水位警报。现要编写程序,每隔1分钟获取各个监测点的水位预警信息,并发布水库水位状况。若出现水库水位警报,需统计警报的持续时间。
(1)某时刻水库未发布水位警报,则10个监测点的状态值之和可能是    (单选,填字母)。
A.0 B.5
C.16 D.20
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
flag=1  #flag 标记水库水位警报情况,0表示低水位警报,1表示正常水位,2表示高水位警报
ti=0   #ti存储警报持续时间
while True:
  t=[0,0,0]
  #t[0]、t[1]、t[2]分别记录低水位预警,正常水位,高水位预警的监测点数量
  #获取10个监测点水位预警信息的状态数据,存入d,代码略
  for i in range(10):
    t[d[i]]=①     
  if t[0]>5:
    if flag!=0:
      flag=0;ti=0
    else:
      ②     
    #发送低水位警报和持续时间,代码略
  elif t[2]>5:
    if flag!=2:
      flag=2;ti=0
    else:
      ti+=1
    #发送高水位警报和持续时间,代码略
  else:
    ③     
  #延时1分钟,代码略
答案 (1)B (2)①t[d[i]]+1 ②ti+=1
③flag=1
解析 (1)若状态之和为0,表示10个监测点状态均为0,将发出预警。若状态之和为5,则同一状态最多是5个1和5个0,则不会发出预警。若状态和为16,可能为8个状态为2,2个状态为0。若状态和为20,可能为10个状态为2。(2)①统计各个状态d[i]的数量。②flag等于0或2,表示会发送预警信息,第1个t[0]出现大于5时,修改预警状态,以后的预警将统计持续时间ti。③0表示低水位预警,2表示高水位预警,正常水位flag的值为1,不发送预警信息。
9.某活动招募志愿者,将所有报名学生排成一排,然后从中选出连续的若干个人,使得选出的人中男女生人数相等。若有9位学生报名,性别信息依次存储在a[0]至a[8]中,0代表女生,1代表男生。统计第i位学生之前,即a[0]至a[i-1]中男生和女生总人数之差,依次存储在b[1]至b[9]中,如下表所示。
男女生人数相等的连续序列中,总人数rs必定是偶数。从第1位学生开始枚举,排在第i位学生之前的男女生人数相差为b[i],与该学生后面第rs-1位学生比较,相差的人数若等于b[i],说明这个区间内的男女生人数是相等的。如rs值为6,由于b[2]等于b[8],因此第3人开始的6人就是选择的序列。请回答下列问题:
(1)若数组a的值为[1,0,0,1,0,1],则男女生人数相等序列的最多人数为    人。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#输入报名学生总人数n与性别序列a,代码略
b=[0]*(n+1) #存储第1至第n个人的男女生人数之差
for i in range(1,n+1):
  if a[i-1]==0:
    b[i]=b[i-1]-1
  else:
    ①     
rs=n-n%2
while rs>=2: #枚举男女生人数相等的总人数
  for i in range(0,n-rs+1): #枚举相等的人数起点
    if ②      :
      print("从第",i+1,"位开始的同学中,有相等的男女生人数",rs)
      rs=0
      break
      ③     
    else:
      print("报名的全为女生或全为男生。")
答案 (1)6 (2)①b[i]=b[i-1]+1
②b[rs+i]==b[i] ③rs-=2
解析 (1)经过统计后,前6人的相差人数为0,最长为6人。(2)①如果是男生,则相差的人数在前次相差人数的基础上再加上1个人。②rs表示男女生人数相等的总人数,该数肯定为偶数,表达式n-n%2含义为n若为奇数,最多人数为n-1,若n为偶数,最多人数是n,循环变量i从索引0开始遍历到n-n%2-rs,若b[rs+i]等于b[i],表示从第i+1开始的序列是男女生人数相等的序列。③总人数rs每次递减2人。
10.景区有n个散客团队和m辆空观光车(编号均从1开始),每个散客团队不超10人,每辆车核载10人。现按顺序为团队安排观光车,分配规则如下:每个团队必须整体乘坐同一辆车,优先在已有人的车辆中选择可容纳且剩余座位数最少的车辆;若存在多辆车符合条件,则选择编号小的车辆;若不存在符合条件的车辆,则安排该团队乘坐新的空车,直到团队或车辆分配完毕。编写程序实现上述分配功能,并输出车辆所载的团队编号。请回答下列问题:
(1)若散客团队人数列表s=[3,5,4,2,7,8,9],则4号团队乘坐    号车。
(2)实现模拟上述功能的部分Python程序如下,请在划线处填入合适的代码。
#获取散客团队人数列表,存储在s中
m,ed=5,0;bus=[10 for i in range(m)]
①     
for i in range(n):
  best,minx=-1,11
  for j in range(0,ed):
    if bus[j]>=s[i] and bus[j]      minx,best=bus[j],j
  if best==-1:
    if ②      :
      print("车辆已满");break
    else:
      best=ed;ed+=1
  ③     
#输出车辆编号和对应乘坐的散客团队编号
答案 (1)1 (2)①n=len(s)
②ed>=m 或 ed==m 或 s[i]>max(bus)
③bus[best]-=s[i] 或 bus[best]=bus[best]-s[i]
解析 (1)每一辆车不超过10人,优先在已有人的车辆中选择可容纳且剩余座位数最少的车辆;1号车坐团队1和2共8人,2号车坐团队3,团队4可以坐1号车。(2)①散客团队s的总数n。②从第0 辆遍历当前已分配的所有车辆ed-1,若当前已安排车辆数ed等于m,表示没有车辆可以再安排。③minx和best表示最少剩余座位数和辆索引,该车辆对应的剩余座位将减少s[i]个。
11.某港口安排摆渡车将旅客从码头送往停靠在附近的游轮。港口规定:摆渡车满载或最早到达的乘客等待超过120秒时安排摆渡车出发。摆渡车往返一次需要10分钟,港口会优先安排已经返回的摆渡车运送旅客,摆渡车荷载10人。
每批旅客的到达信息表示为[时刻,人数],其中第1项表示这批旅客到达的时刻(单位:秒),第2项表示旅客数。编写程序,计算在给定时间段内所需摆渡车总数。
(1)某时间段内旅客的到达数据为[[0,2],[120,8],[150,5],[200,22],[500,8]],港口需要安排的摆渡车数量是      (注:所有旅客需安排上车)。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#获取旅客的到达数据,按到达时刻升序存入列表d
goback,waitlim=600,120 #摆渡车往返时长goback,旅客最大等待时长waitlim
bus=[] #摆渡车返回时刻
①    
w=0;p=0
for i in range(len(d)):
  t=d[i][0] #让前面等待人员上车,以免超时
  if ②     :
   if len(bus)>0 and bus[0]<=d[p][0]+waitlim:#安排已返回的摆渡车运送
     bus.pop(0)
   else:
     s+=1
   bus.append(d[p][0]+waitlim+goback) #记录该摆渡车的返回时刻
   w=0;p=i
 w+=d[i][1] #满载发车
 if w>=10:
   for j in range(w∥10):
     bus.append(t+goback)
   while len(bus)>0 and bus[0]<=t and w>=10:#安排已经返回的摆渡车
     bus.pop(0)
     ③    
   s+=w∥10;w=w%10
   if w==0:
     p=i+1
   else:
     p=i
#剩余的乘客安排摆渡车,代码略
#输出所需的摆渡车数量,代码略
答案 (1)5 (2)①s=0 ②t-d[p][0]>waitlim ③w=w-10
解析 (1)第一、二批旅客乘坐第1辆车出发;第三批旅客5人和第四的5人需一辆车;第四批和第五批之间超过120,还需要2辆车;第五批旅客乘坐1辆车,则共需要5辆。(2)①对所需摆渡车数量s赋初值为0。②变量w记录当前共需要出发的旅客人数,变量p记录上一批旅客在列表d中的位置。变量t记录当前批次旅客达到时间。若上一批旅客需要上车人员到达时间t与当前批量旅客到达时间d[p][0]的差值大于waitlim,则需要发车。③先判断上批剩余人数w是否超时,如果超时,先安排车辆。再将当前批次人数d[p][1]累加到w,若w超过10人,优先安排车辆。while语句功能为安排已经返回的摆渡车出发,每次循环表示出发一辆车,则该车出发后,剩余人数w需要减掉满载人数10。
12.现要编写程序,每隔1分钟采集并检测CO浓度,若数值为0或超出传感器量程(最大量程为200ppm),则传感器失效,程序停止。若同一监测点连续3次浓度超过安全阈值(如低于20ppm或高于50ppm),则发送报警信息。请回答下列问题:
(1)监测点a、b、c超过安全阈值的次数分别存放在cnt[0]、cnt[1]、cnt[2]中。若前2分钟采集到的数据为[["c",16],["a",54],["b",27]]和[["b",28],["c",18],["a",30]],则cnt[2]的值为     (填数字)。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
n=3;L=20;H=50
cnt=[0]*n;flag=True
while flag:
 #将每分钟采集到的监测点数据存入cv中,代码略
 for i in ①     :
   k=ord(cv[i][0])-97
   if ②     :
    print("监测点",cv[i][0],"传感器失效")
    flag=False
   elif cv[i][1]H:
    cnt[k]+=1
    if cnt[k]>=3:
      print("监测点",cv[i][0],"异常")
   else:
     ③    
 sleep(60*1000) #延时1分钟
答案 (1)2 (2)①range(n)或range(len(cv))或range(len(cnt))或range(3)或range(0,n)或range(0,len(cv))或range(0,len(cnt))或range(0,3)
②cv[i][1]==0 or cv[i][1]>200 ③cnt[k]=0或cnt[ord(cv[i][0])-97]=0或cnt[ord(cv[i][0])-ord("a")]=0
解析 本题考查简单算法的程序实现。(1)c的值为2。分析两次监测点c(索引2)的浓度:第1次采集数据16低于安全阈值20,第2次采集数据18低于安全阈值20,cnt[2]值为2。(2)①每分钟采集的3个监测点数据。②判断当前监测点数据cv[i][1]是否超出传感器量程(最大量程为200ppm)。③若当前监测点浓度在安全阈值内,需重置该监测点cnt[k]的计数为0。
13.根据2012年出台的气象行业标准,滑动平均气温可以作为入春的划分指标。滑动平均气温值是以当天和前4天这5个日平均气温数据为一组求取的平均值,当滑动平均气温值连续5天大于等于10 ℃且小于22 ℃,才算入春。
从计算这5个滑动平均气温值所对应的9天日平均气温数据中,选取第一个大于等于10 ℃且小于22 ℃的日期,作为春季起始日。小明收集了3~4月份的部分气温数据。请回答下列问题。
(1)若3月8日起的天气数据如下表所示,根据滑动平均气温标准,春季起始日为3月    日。
日期 8 9 10 11 12 13 14 15 16 17 18 …
日平均 气温 6 9 12 9 12 11 13.5 10.5 10 17 7.5 …
滑动平 均气温 / / / / 9.6 10.6 11.5 11.2 11.4 12.4 11.7 …
(2)编写是否入春时间Python程序代码如下,将请空白处填写完整。
#读取日期并存储到day列表中,如day=["3月8日","3月9日",……]
#读取日平均气温并存储到temp列表中,代码略
t5=[0]*5 #存储5个滑动气温值
count=0
for i in range(len(temp)):
 ①    
 if i>=4:
   x=sum(t5)/5
   if 10<=x<22:
     ②    
    if count==5:
      break
   else:
     count=0
if count==5:
 for j in range(③     ,i+1,1):
   if 10<=temp[j]<22:
     print("春季起始日为:",day[j])
     break
else:
  print("还未入春")
答案 (1)10 (2)①t5[i%5]=temp[i]
②count+=1 ③i-8
解析 (1)3月17日有连续5个滑动平均气温符合条件,所对应的连续9天的第一天为3月9日,但这天不符合条件,因此3月10日作为春季起始日。(2)①依次遍历日平均气温temp,当i大于等于4时开始利用表达式sum(t5)/5计算滑动平均气温,因此需把当天平均气温temp[i]写入到滑动窗口t5[i%5]中,从而保证t5[0]至t5[4]是最近的5天的平均气温。②滑动平均气温x符合大于等于10且小于22时,连续的天数count增加1。③当count的值为5时,确认已经入春,结束遍历,春季起始日从第i天的前9天(i-9+1)开始,查找第1个符合气温条件的日期。(共90张PPT)
必修一 数据与计算
课时10 简单算法及其程序实现
知识点 学业水平等级
1.掌握程序调试与运行的方法,理解算法优化对解决问题的影响。 4
2.理解迭代算法的思想,应用迭代算法处理实际的问题。 4
目 录
CONTENTS
真题剖析
01
知识梳理
02
课堂突破
03
当堂检测
04
课后作业
05
真题剖析
1
  简单算法及其程序实现是考查的重点,能够体现很大的区分度。这部分内容可以分散到信息系统搭建过程的代码设计或者利用pandas进行数据统计的过程中,也可能是一个生活中具体的问题,需要编写代码来解决,主要体现枚举算法和迭代的算法思想。
某仓库有一排连续相邻的货位,编号依次为0~n-1,用于放置A、B两种类型的箱子,A型箱子占2个相邻货位,B型箱子占1个货位。编写程序,根据已完成的放置或搬离操作,输出空货位数及还可以放置A型箱子的最多数量(不移动已放置的箱子)。请回答下列问题:
箱子类型 操作类型 货位编号
B 放置 5
A 放置 2,3
B 放置 0
A 放置 7,8
A 搬离 2,3
(1)若n为10,开始时货位全空,经过如图所示的放置或搬离操作后,不移动已放置箱子的情况下,还可放置A型箱子的最多数量为________个。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#读取货位总数存入n,代码略。
cnt1=n
lst=[0]*n #货位状态,0表示对应的货位为空
while True:
  #读取本次已描述数据:箱子类型、操作类型、货位编号起始值存入t,d和s,代码略
  if t=="A":
   w=2
  ①________:
   w=1
  else: #不是"A"或"B"时退出循环
    break
  if d=="P": #d为P时表示放置,否则表示搬离
    ②______
  else:
    cnt1+=w
  lst[s]=1-lst[s]
  if t=="A":
    lst[s+1]=1-lst[s+1]
  i,cnt2=0,0
  while i   if lst[i]==0 and lst[i+1]==0:
     ③______
     cnt2+=1
   i+=1
  print("当前空货位数",cnt1,",还可放置A型箱子的最多数量:",cnt2)
答案 (1) 2或两 (2)①elif t=='B' 或elif t=="B"或elif t=='''B'''或elif (t=='B') 
②cnt1-=w或cnt1=cnt1-w ③i +=1或i=i+1
解析 本题考查列表的遍历。(1)经过放置或搬离操作后,索引位置1-4是空的,6和9是空的,因此可以放置A型箱子2个。(2)①w是两种箱子所占货位,因此当输入是B时占位为1。②cnt1当前空货位数,d为P时表示放置,否则表示搬离,条件不成立时,空位增加,因此条件成立时,空位减少。③cnt2表示还可放置A型箱子的最多数量,当条件lst[i]==0 and lst[i+1]== 0成立时,表示可以放置A类型,因此下一个货位要跳过。
知识梳理
2
1.算法要有________的遍历思维。遍历某个数据集,在遍历过程中,对符合条件的数据作计数、求和、求最值等一系列操作。
2.算法要有________的过程思维。算法就是解决问题的方法和步骤,需要一系列操作过程来完成。通过自定义函数、选择结构或循环结构来实现模块划分。
3.算法要有________的定位思维。通过索引快速定位到需要的数据项,牺牲空间换取访问速度。通过桶快速定位到数据的类别数量或内容的信息。
4.算法要有______的更新思维。通过重复执行一系列操作或步骤来逼近目标解或达到某个特定状态的过程。进行某项操作后,必定带来相应数据的更改,并在下一轮迭代中起作用。
枚举
模块
索引
迭代
课堂突破
3
【典例1】 某城市外环线公路限速80千米/小时,有若干个十字路口。现在有一辆车距离第1个路口1000米处匀速出发,且此时所有路口的红绿灯刚好从红灯跳到绿灯。编写程序,计算可以连续通过最多绿灯路口的最高车速。请回答下列问题:
(1)若共有3个路口,每两个路口之间的距离均为1000米,车子通过路口的时间忽略不计,每个路口的红绿灯持续周期时间均为60秒,其中第0-30秒为绿灯,可以通行。车子以下列速度能连续通过3个路口的是________(单选,填字母)。
A.15米/秒(54千米/小时)
B.20米/秒(72千米/小时)
C.25米/秒(90千米/小时)
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#读取车子距离第1个路口距离以及每两个路口之间的距离存入dis列表中,代码略。
#读取各路口红绿灯周期时间存入towtime列表中,代码略。
ansx,ansy=0,0
for speed in range(40,81):
 curtime,cout,imax=0,0,0
 tspeed= int(speed*1000/3600) #速度转换为米/秒
 for i in ①________:
   curtime+=int(dis[i]/tspeed)
   tmp=curtime % towtime[i]
   if ②________:
     cout+=1
     if cout>imax:
      imax=cout
   else:
     curtime+=towtime[i]-tmp
     cout=0  
 if ③________:
   ansx=imax;ansy=speed
print("车速为"+str(ansy)+"千米/小时,可最多连续通过"+str(ansx)+"个路口")
答案 (1)A (2)①range(len(dis)) 或range(len(towtime))
②tmp<=towtime[i]∥2 ③imax>=ansx
思维点拨
明考向 本题考查利用程序设计解决生活实际问题
精点拨 (1)A选项到达第1个路口时间为1000/15,约为67秒,绿灯第2次亮起。到达第2个路口时间为1000/15,约为133秒,除60的余数为13秒,绿灯亮起。到达第3个路口时间为3000/15,为200秒,除60的余数为20秒,绿灯亮起。B选项到达第1个路口时间为1000/20,值为50秒,红灯。C选项超过速度限制。(2)①遍历经过各个路口的距离。②curtime表示到达该路口的时间,curtime除以经过当前路口的红绿灯周期时间towtime[i]的余数在前一半,那么就可以绿灯通过。③计算可以连续通过最多绿灯路口的最高车速,若有多个最大值,当speed越大,就是所求的值
【变式1】 (2025年1月浙江选考)根据机器的负载率对工厂的6台机器(编号0~5)进行监控和调度。调度规则是:每隔1小时采集1次各台机器的负载率(负载率用百分制表示,例如,负载率95%表示为95,机器休息时的负载率为0),负载率超过90的机器都调度休息;如果所有机器负载率都不超过90,则负载率最高的机器休息,若多台机器负载率同为最高,则编号最小的机器休息。休息的机器在休息1小时后再次工作。
请回答下列问题:
(1)若某次采集到0~5号机器的负载率依次为75、85、88、0、88、87,当前处于休息状态的机器编号是3,接下来休息的机器编号是________。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
n=6;a=[0]*n #列表a长度为n,各元素值均为0
#启动0~4号机器工作,5号机器休息,代码略
while True:
  #延时1小时,再采集各机器负载率存入a,a[i]存放i号机器的负载率,代码略
  t=0;cnt=0
  for i in range(n):
    if ①____________:
      #调度i号机器休息,代码略
      cnt+=1
    if a[i]>a[t]:
      ②__________
    elif a[i]==0:
      #调度i号机器工作,代码略
  if ③____________:
    #调度t号机器休息,代码略
答案 (1)2 (2)①a[i]>90 ②t=i ③cnt==0 或 a[t]<=90
解析 本题考查循环结构和多分支选择结构以及算法的综合应用。(1)机器负载均不超过90,负载最大的是2号、4号,都是88。按题目要求此时编号小的机器休息,编号为2的机器休息。(2)①按要求,负载率只要超过90的机器都调度休息,所以这里的条件:a[i]>90;②根据后面的代码,这里是查找负载最大的机器,将编号保存在变量t中;③变量cnt用于统计当前有多少台机器的负载率超过了90,只有当cnt为0时,编号为t号的机器休息。所以这里的条件是cnt等于0。
【典例2】 挖金矿游戏。在一个8行8列的矩阵中,矿工位于第1行第1列的格子,n个金矿随机分布在第1行下面的各个格子中,每个金矿的横坐标依次保存x数组,纵坐标保存在y数组。矿工收集金矿方法:先确定每行最左边和最右边金矿的坐标,对于同一行的金矿,矿工先移动到最左边金矿正上方,再执行向下x步的指令进行挖矿,接着从该行左边第2个金矿开始一直挖到最右边。该行完成后,再依次挖下方各行的金矿。
如图所示的金矿(图中黑色方块)分布图,按右侧所示
的指令,可以收集全部金矿。编写程序,按顺序输出
指令,使矿工按照规则得到所有金矿,将空白处填写
完整。
x=[2,5,5,5,5,8] #各金矿行号,从小到大升序排列
y=[1,4,5,6,8,6] #各金矿列号,同一行金矿,列号从小到大升序排列
n=len(x) #金矿数量
px=py=1 #矿工初始位置行号和列号
i=0
while i  beg=i
  while i    i+=1
  if y[beg]    print("左"+str(py-y[beg]))
  elif y[beg]>py:
    print("右"+str(①________))
  print("下"+str(x[beg]-px))
  print("挖矿")
  for k in range(②________):
    print("右"+str(y[k]-y[k-1]))
    print("挖矿")
  px=x[beg]
  ③______
  i+=1
答案 ①y[beg]-py ②beg+1,i+1 ③py=y[i]
思维点拨
明考向 本题考查利用程序设计解决生活实际问题
精点拨 beg表示每一行最左边金矿的索引,条件x[i]==x[i+1]成立表示两个处于同一行的金矿,因此循环结束后,索引i表示当前行最右边的金矿的列号。①py表示矿工的列号,条件y[beg]>py成立表示最左边矿位于矿工的右边,需向右移动y[beg]-py个位置。②当前行可能还有多个金矿,因此当前已经挖了最左边beg位置上金矿,还需从beg+1位置挖到第i列,由于range是一个左闭右开的区间,因此值为i+1。③更新矿工的位置,其列号为最右边金矿的列号
【变式2】 现有一个文档“压缩前.txt”中保存了大量的小写字母和数字,小明发现文档中有很多字母或数字是连续的,就想设计一个算法将字符串中连续的字母或数字进行压缩,如连续字符“abcd”可压缩为“a-d”,不连续的字符维持原状,例如,字符串“abcde1255hij”可压缩为“a-e1-255h-j”,并将压缩后的结果输出保存到“压缩后.txt”中。
该算法的部分Python代码如下:
def writedata(data):
 #将数据data输入到"压缩后.txt"中,代码略
fp=open("压缩前.txt")
lines=fp.readlines()
fp.close()
for line in lines:
  flag=False
  ans=""
(1)执行程序后,当输入字符串s的值为"efg1234345hijk"时,压缩后的字符串为________。
(2)请在划线处填入合适的代码。
(3)程序中加框处代码有误,请改正。
答案 (1)e-g1-43-5h-k (2)①ans+=line[i]  ②writedata(ans) 
(3)ord(line[i+1])==ord(line[i])+1 and not flag或ord(line[i+1])==ord(line[i])+1 and flag==False
解析 本题考查一个集合中两个元素的组合,或者是一段连续区间的开始位置和结束位置的遍历。(1)略。(2)①当条件ord(line[i+1])!=ord(line[i])+1成立时,表示连续段已经结束,终点位置是i,因此需将line[i]连接入ans中。②读取一行数据,处理完后调用writedata函数,将压缩后的结果输出保存到“压缩后.txt”中。(3)找到连续段开始位置。flag是一个是否是头部的标志,初值为False,找到连续字符串的第1个位置后,flag的值变更为True。
  遍历是按照一定的规则和次序访问数据元素中的所有节点,使得每个节点都被访问一次且仅被访问一次。相同类型的数据往往保存在数组中,数组的特点是按照索引位置依次存放数据,若只有一个数组,可以通过按值访问的方法,对所有数据进行求和、计数、求平均值和求最大值或最小值等操作。若有多个数组,他们拥有相同的索引,可以通过索引位置依次访问数据。在一个序列中遍历元素可以分为两种情况,一是对单个元素进行遍历,如对字符串进行加密、压缩算法。二是要找出序列中一个连续的子序列,如找一个依次相连的子串,找一个连续递增或递减的子序列。在第二种情况中,将涉及该元素与他前面或后面元素的关系,因此需与他们依次进行比较,比较总次数比元素的个数少1个。
当堂检测
4
1.某产品质量检测设备要对一批玩具机器人进行质量检测。玩具机器人可以在二维平面上行走,行走时的位置用横纵坐标表示,若横、纵坐标之和比前一个位置的横、纵坐标之和大,则表示机器人在前进。检测时,每隔1秒钟采集一次机器人的坐标。若在2分钟之内,机器人能连续前进100次(即连续100个增大的坐标之和)则表示产品合格。请回答以下问题:
(1)某次检测到有6个位置的坐标,按时间递增的顺序依次为(0,0),(1,0),(0,2),(0,3),(1,2),(3,1),则连续前进的次数(坐标个数)最多是________(填数字)。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
prex=prey=-1
n=t=maxn=0
while True:
 #接收一次采集到的机器人位置坐标,分别存入x和y,代码略
 t+=1
 if ①________:
   n+=1
 else:
   n=1
 if ②________:
   maxn=n
 if t>=120:
   if ③________ :
     #产品合格,将之移入合格产品线,并将下一个产品放入检测,代码略
   else:
     #产品不合格,将之移入不合格流水线,并将下一个产品放入检测,代码略
   n=t=maxn=0 
   prex=prey=-1
 else:
   prex=x;prey=y
 #延时1秒钟,代码略
答案 (1)3 (2)①x+y>prex+prey ②n>maxn ③maxn>=100或maxn==100
解析 本题考查Python基础程序设计。(1)由题意知,(1,0),(0,2),(0,3)三个位置都是递增的,表示连续前进3次。(2)由if语句成立时n+=1的变化与不成立是n变成1可以断定,第①空位置需要填写表示机器人在前进的关系表达式,即当前位置的坐标之和大于前一次的坐标之和。当前的坐标是x和y,那么前一次的坐标在哪呢 往后分析,倒数第二行语句,当t>=120不成立时,prex和prey分别得到x和y的值,这里用迭代的方式将当前坐标变为上一次坐标,因此prex和prey就是上一次的坐标。于是第①空填写x+y>prex+prey。由此也可以判断t是时间,120是指2分钟以内收集坐标的次数。n是当前连续前进的次数,那么第②空要用“打擂法”保留前进次数最多的值,填写n>maxn。第③空是检测产品可以的关系表达式,显然是某个值要大于等于100。那么是n>=100,还是maxn>=100呢 因为题目要求只要有一段连续前进100次即可,因此填写maxn>=100。
2.老年机因其较大的按键,很适合老年人使用,但其中英文字母的输入方式比较麻烦,导致很多老年人不太会用。如图是一款老年机的键盘,其字母的输入方式如下:
(1)若要输入英文字母“A”,则2键按1下;若要输入“B”,则2键按两下;其他英文字母的输入方式同理。
(2)若连续输入的英文字母在同一数字键中,则在输入下一个英文字母前,需先按下1键以表示确定;若连续输入的英文字母不在同一数字键中,则不需要按1键,直接按所要输入英文字母对应的数字键即可。
(3)若要输入空格,则按0键。
王老师依据该手机的字母输入规则,设计了一个 Python 程序。实现输入按键被点击的顺序,显示手机中输入的英文内容的功能。程序运行界面如图所示:
>>>
输入按键编号顺序:7999844666166
输出的内容是:PYTHON
>>>
实现该功能的程序代码如下:
keyboard={"0":"","2":"ABC","3":"DEF","4":"GHI","5":"JKL","6":"MNO","7":"PQRS","8":"TUV","9":
"WXYZ"}
yw=input("输入按键编号顺序:")
①______
i=k=1
result=""
while i if yw[i]==key:
   k=k+1
 else:
   if yw[i]=="1":
     ②______
   result+=keyboard[key][k-1]
   key=yw[i]
   ③______
 i=i+1
result+=keyboard[key][k-1]
print("输出的内容是:",result)
请回答下列问题:
(1)若按键点击的顺序是“616661666166”,则手机中输入的英文是________。
(2)要实现程序的功能,请完善划线处的代码。
答案  (1)MOON (2)①key=yw[0] ②i=i+1 ③k=1
解析 (1)键6的第1个字母为M,同一数字键中,则在输入下一个英文字母前,需先按下 1 键,键6的第3个字母为O,第2个字母为N。(2)查找连续相同的键的个数。①变量i从1开始遍历,因此key的初值为yw[0]。若遍历到"1",说明是相同两个键的分隔符,i的位置加1。③若不相同,则这个键是下一组的第1个键。
3.在一条宽度为h的小河中,一只青蛙沿着直线从河的左侧跳到右侧。小河中有沿着直线分布的若干片位置互不相同的荷叶,青蛙必须跳到荷叶上过河,否则会掉入水中。开始时青蛙站在河的左侧(坐标为0),接着不停地向右侧跳跃,每次跳跃的距离不超过w,若两片荷叶之间的距离超过w,则在两片荷叶之间,青蛙能跳的最远处增加若干片荷叶,以确保青蛙能跳在荷叶上过河,求需要增加的荷叶数。编写程序代码如下,请将空白处填写完整。
#读取青蛙每次跳跃的最大长度,并存入变量w中
#读取各片荷叶的坐标位置,存入列表a中,代码略
p=0 #第1片荷叶的初始索引位置
d,tot=0,0 #d表示青蛙的位置
while d  if ①________:
   ②______
   p=p+1
  else:
    tot+=1
    ③______
print("至少需要增加的荷叶数为:"+str(tot))
答案 ①a[p]-d<=w ②d=a[p] ③d+=w
解析 ①变量d表示青蛙所处位置,他可能在荷叶上,也可能在新增加的荷叶上,变量p表示青蛙下一步要到过的荷叶或位置,因此只有满足条件a[p]-d<=w才可能到达下一荷叶,若条件为a[p]-a[p-1]>w,当青蛙无法一步到达下一张荷叶时,虽然在else增加了荷叶,但a[p-1]的值没有发生变化,因此还是无法达到下一张荷叶。②更新青蛙的位置。③增加了一张荷叶,更新青蛙可以到过的最大位置。
4.小华设计了一个自习室噪声提醒装置,每秒采集一次噪声数据,若1分钟内采集到超过50分贝的噪声大于30次,则发出提醒。部分Python程序如下,请在划处填入合适的代码。
d=[0]*60 #生成列表d,包含60个元素,每个元素的值都是0
count=0
①________
while True:
 #接收一次采集到的噪声数据并存入val,代码略
 if d[i]>50 and val<=50:
   ②________
 elif d[i]<=50 and val>50:
   count+=1
 ③________
 i=(i+1)%60
 if count>30:
   print("噪声过大")
 #延时1秒,代码略
答案 ①i=0 ②count-=1 ③d[i]=val
解析 ①变量i可以表示一个周期中第0至第59秒,需对变量i赋值初值0。②当前d[i]的值不属于下一周期,因此若当前噪声val大于50,而d[i]的值小于等于50,下一个周期的次数将增加,若d[i]的值大于50,则不增也不减。若当前噪声val小于50,而d[i]的值大于50,说明在下一周期中,count的值将减少。③将当前的val记录到d[i]中,以便和下一周期同时间段的进行比较。
5.某单位打印室有4台打印机(编号0~3),根据打印任务的紧急程度分为加急任务和普通任务,两种任务的分配规则如下:
△任务甲为加急任务,优先分配:
·先选择当前空闲的打印机(同空闲状态则编号小的优先)
·若无空闲打印机,则选当前任务剩余时间最短的打印机(同剩余时间则编号小的优先)
△任务乙为普通任务,按打印机累计打印份数分配,选择累计打印份数最少的打印机(同打印份数则打印机编号小的优先)
(1)某时刻各打印机状态:
打印机0:空闲(累计200份) 打印机1:忙碌,剩余8分钟(累计160份)
打印机2:忙碌,剩余6分钟(累计160份) 打印机3:忙碌,剩余8分钟(累计200份)
此时到达一个打印任务,下列选项中任务和分配的打印机相匹配的是________(单选,填字母)。
A.乙,打印机0 B.乙,打印机1
C.甲,打印机2 D.甲,打印机3
(2)以下Python代码段实现打印任务的分配,请在划线处填入合适代码。
(3)加框处代码有误,请改正。
#[False,0,200]表示打印机状态(空闲),当前任务剩余时间,累计打印份数
printer=[[True,6,200],[True,5,150],[True,8,150],[True,3,220]]
#获取task值,如[True,20]表示任务属性(甲)与需打印份数,代码略
def assignmen_task(printer,task):
 if task[0]:
   k=0
   for i in range(len(printer)):
    if ①__________:
      #更新打印机状态与累计打印份数,代码略
      return printer,i
    elif ②____________:
      k=i
 else:
   k=0
   for i in range(1,len(printer)):
      k=i
 #更新打印机状态与累计打印份数,代码略
 return printer,k
答案 (1)B (2)①not printer[i][0]  ②printer[k][1]>printer[i][1]
(3)printer[k][2]>printer[i][2]
解析 (1)甲为加急任务,先选择当前空闲的打印机0,乙是普通任务,应选打印份数最少的打印机1。(2)task[0]表示任务属性甲,即加急任务,枚举各个打印机的打印任务,找到相应的打印机。①先选择当前空闲的打印机(同空闲状态则编号小的优先),因此找到第一个打印机状态printer[i][0]是空闲,其值为False,则返回打印任务和打印机编号。②若无空闲打印机,则当前打印任务的时间printer[i][1]与剩余时间最短的打印机时间printer[k][1]比较,找到相应的打印机编号。(3)任务乙为普通任务,按打印机累计打印份数分配,选择累计打印份数最少的打印机,当两个打印份数均为最小时,选择打印机编号小,因此不能包含等号。
课时作业
5
1.(2026年1月浙江选考)服务器根据温度数据生成状态码,满足一定条件时发送给智能终端以控制风扇运行。生成和发送状态码的规则如下:
①温度≤15 ℃时,状态码为0;温度≥35 ℃时,状态码为2;其他温度范围,状态码为1。
②当状态码连续k(k>1)个相同,且与最近已发送状态码不同时,则发送该状态码。
请回答下列问题:
(1)若k为3,最近已发送状态码为1,随后生成的状态码序列为“0,0,0,2,0,0,1,1,1,0”,则由该序列触发的状态码发送次数为    次。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
sent=last=-1
#获取k值,代码略
while True:
  #获取温度数据保存到变量t中,代码略
  ①   
  if t>=35:
    code=2
  elif t>15:
    code=1
  if ②    :
    if code!=last:
      cnt=1
    else:
      ③   
      if cnt==k
        #发送状态码 code,代码略
        sent=code
  last=code
  #延时1分钟,代码略
答案 (1)2 (2)①code=0 ②code!=sent ③cnt+=1
解析 本题考查多分支选择结构和枚举算法思想。(1)当状态码连续k(k>1)个相同,且与最近已发送状态码不同时,则发送该状态码。状态码序列为“0,0,0”时发送“0”,状态码序列为“1,1,1”时发送“1”,共发送两次。(2)①温度≤15 ℃时,状态码为0;温度≥35 ℃时,状态码为2;其他温度范围,状态码为1。分支结构只判断了温度≥
35 ℃和温度大于15 ℃且小于35 ℃的情况,因此code的初始值是温度≤15 ℃时的状态码0。②最近已发送状态码与当前状态码不同时,才发送该状态码。从语句sent=code可知,sent记录了上一次发送的状态码,code为当前的状态码,因此当code和sent不相等时才判断是否有k次连续相同的状态码。③last为前一次的状态码,需判断状态码连续相同,因此当code和last相同时,统计连续相同的次数cnt将增加1。
2.某小区停车场私家车车位不收费,收费车位计费规则如下:停车时长不到半小时按2元计费;半小时及以上则按每小时5元计费;超过整小时部分,不足半小时的时长不计费,半小时及以上则按一小时计费。编写Python程序,读取某日的停车记录所有数据,并计算该停车场当日的总收入。请完成下列问题:
#读取某日的停车记录并存储到data列表中,每个元素包含4个数据项,进(出)场时间、车牌号、进出场状态(0表示进场,1表示出场)、车位状态(0表示私家车位,1表示收费车位),代码略。
def calT(Tin,Tout):
 t1=int(Tin[11:13])*60+int(Tin[14:16])
 t2=int(Tout[11:13])*60+int(Tout[14:16])
 return t2-t1
dic={}
price=5;total=0
for car in data:
 if car[2]=='0' and car[3]=='1':
   dic[car[1]]=car[0]
   T=①__________
   if T<30:
    fee=2
   else:
    fee=②________
 total+=fee
print("本日停车费总收入为:",total)
(1)请将划线处代码补充完整。
(2)加框处代码有错误,请改正:___________________________________。
答案 (1)①calT(dic[car[1]],car[0])  ②(T+30)∥60*price或int(T/60+0.5)*price
(2)elif car[3]=='1'
解析 (1)①调用函数计算停车费用。calT函数的第1个参数为入场时间,第2个参数为出场时间,入场时间在dic字典中获取,出场时间为当前记录的时间。②计算费用。超过整小时部分,不足半小时的时长不计费,半小时及以上则按一小时计费,四舍五入计算整小时数,并按每小时5元计费。(2)car[2]进出场状态,car[3]表示车位状态,当进场状态为0且为收费车牌时,在字典dic创建一个车牌号码为键,进场时间为值的键值对,只有收费车牌时才计算费用,而私家车是不用计费的,因此加框部分下面的代码是针对收费车牌的计费方法。
3.某信息系统在传输实验数据时偶发数据包传输错误。每个数据包都具有唯一编号,有效范围为1至接收到的总数据包数,接收端允许数据包乱序到达。经检测,接收到的数据包编号均为正整数,但可能存在以下三类错误情况:
·缺失:有效范围内的某个编号未被接收;
·重复:有效范围内的某个编号被多次接收;
·无效:接收到的编号超出有效范围。
现需检测本次传输中存在错误的数据包编号。请回答下列问题:
(1)若某次接收到的数据包编号分别为2、5、1、3、2,则其中缺失的编号是________。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#将接收到的数据包编号存储在列表pack,代码略。
n=①________
print("编号有效范围:1-",n)
#列表miss、dupl、inv分别用于存储缺失、重复、无效的错误编号
miss=[];dupl=[];inv=[]
for p in pack:
 if abs(p) > n:
   inv.append(abs(p))
   continue
 idx=abs(p)-1
 if pack[idx]<0:
   dupl.append(②__________)
 else:
   pack[idx]*=-1 #将当前编号对应位置的数值取反
for i in range(n):
 if ③__________:
   miss.append(i+1)
#重复数据集dupl和无效编号数据集inv按数值大小排序,代码略
print("缺失:",miss,",重复:",dupl,",无效编号:",inv)
答案 (1)4 (2)①len(pack) ②abs(p)或idx+1 ③pack[i]>0或pack[i]>=0
解析 (1)总包数为5,编号范围为1-5,缺失4号。(2)以pack的值为[3,2,2,7,4]为例,共接收到5个包,正确编号为1-5。当p为3时,pack[2]的值为-2;当p为2时,pack[1]的值为-2;当p为2时,pack[1]的值为-2,2号重复;当p为7时,pack[3]的值为7,无效;当p为4时,pack[3]的值为-7。pack的值为[3,-2,-2,-7,4]。①有效范围为1至接收到的总数据包数len(pack)。②用循环变量p遍历pack中的编号,idx是位置p对应下标,若pack[idx]值为正,表示位置p第1次出现,将其乘以-1,成为负数;否则表示p位置不是第1次出现,将其加入dupl数组中。③数组元素pack[i]为正数,表示该位置本来应该存储的编号为i+1,但没有成为负数,说明是缺失。
4.小明为了研究生物实验室微生物培养皿中适宜的温度数据,通过从服务器数据库导出某培养皿中温度传感器采集到近24小时内全部的温度数据,查找当日温度连续不高于设定阈值(25 ℃)的最长时间段(若含有多段长度相同的最大值,输出最早的一个时间段)。
(1)若采集到的时间点和温度数据用数组a来表示,a[0][0]是第一个采集时间点,a[0][1]是第一个温度值,则[[1,21],[2,24],[3,25],[4,26],[5,22],[6,23]]中符合要求的最长时间段是________(单选,填字母:A.1至4/B.1至3/C.5至6)。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#获取采集到的温度数据,用数组a存放,代码略
s=25;maxlen=0;n=len(a)
start=end=0
i=0
while i  if a[i][1]<=s:
   ①________
   for j in range(i+l,n) :
     if ②__________:
       break
     c=c+1
   if c>maxlen:
     maxlen=c;start=i
     end=③________
   i=i+c
 else:
   i=i+1
print("最长时间段为",a[start][0],"至",a[end][0])
答案 (1)B (2)①c=1 ②a[j][1]>s或a[j][1]>25 
③i+maxlen-1或i+c-1或start+c-1或start+maxlen-1
解析 (1)符合要求的最长时间段为21、24、25,即1至3。(2)①遍历数组a,若当前温度a[i][1]小于等于s,c记录连续的天数,因此c的值为1。②变量j从i+1开始不断地向后查找,若遍历到的温度a[j][1]大于s,则找到一段连续不大于s的温度的日期。③变量i的连续的开始位置,其长度为maxlen,因此结束位置为i+maxlen-1。
5.某系统可记录实验室中n台设备的开关机数据,数据格式记为[a,b],其中a由字母A与数字0~n-1组合表示设备名,如“A0”;b表示设备a开机或关机的时刻,为正整数。系统按开关机时刻依次记录。编写Python程序读取某天t时刻前系统记录的数据,计算实验室中当天截止到t时刻所有设备开机的总时长(每天开始时所有设备都是关机状态)。请回答下列问题:
(1)若系统某天t=50时刻前记录的数据为:["A1",10],["A2",20],["A1",30],
["A3",30],["A1",40],则当天t时刻前实验室所有设备开机的总时长为________。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#读取设备的数量n及时刻t,并读取当天t时刻系统记录的数据存储到列表data中,data每个元素包含两个数据项,分别为设备名和开机或关机时刻。如[["A1",10],["A2",20]]
ans=[]
for i in range(n):
 ans.append([0,-1]) #为ans追加一个元素[0,-1]
for i in range(len(data)):
 cname=data[i][0]
 ①________
 if ans[num][1]==-1:
   ans[num][1]=data[i][1]
 else:
   ②________
   ans[num][1]=-1
sum=0
for i in range(n):
 if ③__________:
   ans[i][0]+=t-ans[i][1]
 sum+=ans[i][0]
print("开机总时长:",sum)
答案 (1)80 (2)①num=int(cname[1:])  
②ans[num][0]+=data[i][1]-ans[num][1]  ③ans[i][1]!=-1
解析 (1)A1设备开机时长:10至30,40至50,共30分钟;A2设备:20至50共30分钟;A3设备:30至50共20分钟。总开机时长为80分钟。(2)①data[i][0]表示当前的设备名cname,设备名固定以“A”开头,编号为cname第2位及后面的数字。②ans数组每个元素的2个值分别是设备累计开机时长和设备上一次开机时间。ans[num][1]记录设备上一次开机时间,若ans[num][1]为-1,则说明设备处于关机状态,需统计本次开机的时长data[i][1]-ans[num][1]并累加到ans[num][0]中。③在t时刻,若设备ans[i]仍处于开机状态(满足条件ans[i][1]!=-1),则需要累加从开机到t时刻的开机时长。
6.编写程序,获取当前时刻温度,参照预警标准,进行启动预警;若温度达到更高一级标准或同等级则进行更新预警。各级预警标准如下:
Ⅰ级预警:24小时内当气温升至40 ℃及以上;
Ⅱ级预警:24小时内当气温升至37 ℃及以上;
Ⅲ级预警:24小时内当气温升至35 ℃及以上。
请回答下列问题:
(1)图中预警的各时刻数据如下:[2,35],[5,41],[5,x],[6,40],[3,29],[10,41],则x的值可能是________(单选,填字母)。
A.30 B.36
C.38 D.41
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
limit=[40,37,35]
pre=-1 #存储前一次预警的数据,初始化状态为-1
while True:
 #采集一次数据,存入列表d,d[0]存储时刻,d[1]存储温度,代码略
  if d[0]==0: #每日0时初始化
   ①________
  for i in range(3):
   if d[1]>=limit[i]:
     if ②__________:
       if pre==-1:
         #启动预警信息,代码略
       else:
         #更新预警信息,代码略
       pre=d[1]
   elif i>0 and pre      #更新预警信息,代码略
      ③________
   break
  #延时1小时,代码略
答案 (1)B (2)①pre=-1 ②pre解析 (1)每2个数据对应图中3条记录,数据[5,x]的预警信息为“Ⅲ级预警”,即根据题意x的取值范围为[35,36]。(2)变量pre存储前一次预警信息时的温度数值。①每日0时初始化pre为-1,表示每天的初识状态下的预警值。②d[1]表示当前的温度值,i表示预警等级,limit[i]为等级i+1时的温度阈值。该表达式为True时,表示温度值达到预警,考虑启动或更新预警。预警等级可能提高或降低,提高预警等级的条件为pre7.小明设计了一个蔬菜大棚自动浇水系统。该系统利用传感器每天早、中、晚三次进行土壤湿度检测,若连续三次湿度值均低于阈值s,则打开阀门浇水,否则将关闭阀门。浇水时间根据土壤平均湿度值ave决定:ave<100为重度干旱,浇水10分钟;100≤ave<200为中度干旱,浇水8分钟;200≤ave<300为轻度干旱,浇水5分钟。请回答下列问题。
(1)若s的值为300,土壤湿度传感器早上、中午和晚上采集的数据依次是190、180和160,则应浇水的时间是________。
(2)请完成下列划线处的代码。
cnt=ave=0
while True:
  hum=float(request.args.get("hum1")) #获取湿度传感器的数值
  #将土壤湿度值存入数据库,并从数据库中读取湿度阈值存入变量s中,代码略
  if hum    cnt+=1
    ①________
  else:
    cnt=0;ave=0
  if cnt==3:
    ave=ave/3
    if ave<100:
      t=10 #t为浇水时间,单位是分钟
    elif ②__________:
      t=8
    elif 200<=ave<300:
      t=5
    cnt=0;sta=1
  else:
    ③________
  #根据sta状态打开浇水系统浇水t分钟或关闭浇水系统
  #延时8小时,代码略
答案 (1)8 (2)①ave+=hum ②ave<200 ③sta=0
解析 (1)土壤平均湿度为176,因此需浇水8分钟。(2)①由语句ave=ave/3可以,先统计温度总和至ave,再计算平均湿度。②若满足条件100≤ave<200为中度干旱,浇水8分钟。③若开启浇水t分钟后,cnt的值为0,当cnt小于3时,将停止浇水。
8.某水库水位预警系统共设立10个监测点,每个监测点可统计水位情况并发送预警信息,信息分为三种状态值,0表示低水位预警,1表示正常水位(不发送预警信息),2表示高水位预警。当超过一半的监测点发送同一预警信息,即正式发布水库水位警报。现要编写程序,每隔1分钟获取各个监测点的水位预警信息,并发布水库水位状况。若出现水库水位警报,需统计警报的持续时间。
(1)某时刻水库未发布水位警报,则10个监测点的状态值之和可能是________(单选,填字母)。
A.0 B.5
C.16 D.20
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
flag=1  #flag 标记水库水位警报情况,0表示低水位警报,1表示正常水位,2表示高水位警报
ti=0   #ti存储警报持续时间
while True:
  t=[0,0,0]
  #t[0]、t[1]、t[2]分别记录低水位预警,正常水位,高水位预警的监测点数量
  #获取10个监测点水位预警信息的状态数据,存入d,代码略
  for i in range(10):
    t[d[i]]=①__________
  if t[0]>5:
    if flag!=0:
      flag=0;ti=0
    else:
      ②__________
    #发送低水位警报和持续时间,代码略
  elif t[2]>5:
    if flag!=2:
      flag=2;ti=0
    else:
      ti+=1
    #发送高水位警报和持续时间,代码略
  else:
    ③__________
  #延时1分钟,代码略
答案 (1)B (2)①t[d[i]]+1 ②ti+=1 ③flag=1
解析 (1)若状态之和为0,表示10个监测点状态均为0,将发出预警。若状态之和为5,则同一状态最多是5个1和5个0,则不会发出预警。若状态和为16,可能为8个状态为2,2个状态为0。若状态和为20,可能为10个状态为2。(2)①统计各个状态d[i]的数量。②flag等于0或2,表示会发送预警信息,第1个t[0]出现大于5时,修改预警状态,以后的预警将统计持续时间ti。③0表示低水位预警,2表示高水位预警,正常水位flag的值为1,不发送预警信息。
9.某活动招募志愿者,将所有报名学生排成一排,然后从中选出连续的若干个人,使得选出的人中男女生人数相等。若有9位学生报名,性别信息依次存储在a[0]至a[8]中,0代表女生,1代表男生。统计第i位学生之前,即a[0]至a[i-1]中男生和女生总人数之差,依次存储在b[1]至b[9]中,如下表所示。
男女生人数相等的连续序列中,总人数rs必定是偶数。从第1位学生开始枚举,排在第i位学生之前的男女生人数相差为b[i],与该学生后面第rs-1位学生比较,相差的人数若等于b[i],说明这个区间内的男女生人数是相等的。如rs值为6,由于b[2]等于b[8],因此第3人开始的6人就是选择的序列。请回答下列问题:
(1)若数组a的值为[1,0,0,1,0,1],则男女生人数相等序列的最多人数为________人。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#输入报名学生总人数n与性别序列a,代码略
b=[0]*(n+1) #存储第1至第n个人的男女生人数之差
for i in range(1,n+1):
  if a[i-1]==0:
    b[i]=b[i-1]-1
  else:
    ①__________
rs=n-n%2
while rs>=2: #枚举男女生人数相等的总人数
  for i in range(0,n-rs+1): #枚举相等的人数起点
    if ②____________:
      print("从第",i+1,"位开始的同学中,有相等的男女生人数",rs)
      rs=0
      break
      ③__________
    else:
      print("报名的全为女生或全为男生。")
答案 (1)6 (2)①b[i]=b[i-1]+1 ②b[rs+i]==b[i] ③rs-=2
解析 (1)经过统计后,前6人的相差人数为0,最长为6人。(2)①如果是男生,则相差的人数在前次相差人数的基础上再加上1个人。②rs表示男女生人数相等的总人数,该数肯定为偶数,表达式n-n%2含义为n若为奇数,最多人数为n-1,若n为偶数,最多人数是n,循环变量i从索引0开始遍历到n-n%2-rs,若b[rs+i]等于b[i],表示从第i+1开始的序列是男女生人数相等的序列。③总人数rs每次递减2人。
10.景区有n个散客团队和m辆空观光车(编号均从1开始),每个散客团队不超10人,每辆车核载10人。现按顺序为团队安排观光车,分配规则如下:每个团队必须整体乘坐同一辆车,优先在已有人的车辆中选择可容纳且剩余座位数最少的车辆;若存在多辆车符合条件,则选择编号小的车辆;若不存在符合条件的车辆,则安排该团队乘坐新的空车,直到团队或车辆分配完毕。编写程序实现上述分配功能,并输出车辆所载的团队编号。请回答下列问题:
(1)若散客团队人数列表s=[3,5,4,2,7,8,9],则4号团队乘坐________号车。
(2)实现模拟上述功能的部分Python程序如下,请在划线处填入合适的代码。
#获取散客团队人数列表,存储在s中
m,ed=5,0;bus=[10 for i in range(m)]
①__________
for i in range(n):
  best,minx=-1,11
  for j in range(0,ed):
    if bus[j]>=s[i] and bus[j]      minx,best=bus[j],j
  if best==-1:
    if ②____________:
      print("车辆已满");break
    else:
      best=ed;ed+=1
  ③__________
#输出车辆编号和对应乘坐的散客团队编号
答案 (1)1 (2)①n=len(s)  ②ed>=m 或 ed==m 或 s[i]>max(bus)
③bus[best]-=s[i] 或 bus[best]=bus[best]-s[i]
解析 (1)每一辆车不超过10人,优先在已有人的车辆中选择可容纳且剩余座位数最少的车辆;1号车坐团队1和2共8人,2号车坐团队3,团队4可以坐1号车。(2)①散客团队s的总数n。②从第0 辆遍历当前已分配的所有车辆ed-1,若当前已安排车辆数ed等于m,表示没有车辆可以再安排。③minx和best表示最少剩余座位数和辆索引,该车辆对应的剩余座位将减少s[i]个。
11.某港口安排摆渡车将旅客从码头送往停靠在附近的游轮。港口规定:摆渡车满载或最早到达的乘客等待超过120秒时安排摆渡车出发。摆渡车往返一次需要10分钟,港口会优先安排已经返回的摆渡车运送旅客,摆渡车荷载10人。
每批旅客的到达信息表示为[时刻,人数],其中第1项表示这批旅客到达的时刻(单位:秒),第2项表示旅客数。编写程序,计算在给定时间段内所需摆渡车总数。
(1)某时间段内旅客的到达数据为[[0,2],[120,8],[150,5],[200,22],[500,8]],港口需要安排的摆渡车数量是____________(注:所有旅客需安排上车)。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#获取旅客的到达数据,按到达时刻升序存入列表d
goback,waitlim=600,120 #摆渡车往返时长goback,旅客最大等待时长waitlim
bus=[] #摆渡车返回时刻
①________
w=0;p=0
for i in range(len(d)):
  t=d[i][0] #让前面等待人员上车,以免超时
  if ②__________:
   if len(bus)>0 and bus[0]<=d[p][0]+waitlim:#安排已返回的摆渡车运送
     bus.pop(0)
   else:
     s+=1
   bus.append(d[p][0]+waitlim+goback) #记录该摆渡车的返回时刻
   w=0;p=i
 w+=d[i][1] #满载发车
 if w>=10:
   for j in range(w∥10):
     bus.append(t+goback)
   while len(bus)>0 and bus[0]<=t and w>=10:#安排已经返回的摆渡车
     bus.pop(0)
     ③________
   s+=w∥10;w=w%10
   if w==0:
     p=i+1
   else:
     p=i
#剩余的乘客安排摆渡车,代码略
#输出所需的摆渡车数量,代码略
答案 (1)5 (2)①s=0 ②t-d[p][0]>waitlim ③w=w-10
解析 (1)第一、二批旅客乘坐第1辆车出发;第三批旅客5人和第四的5人需一辆车;第四批和第五批之间超过120,还需要2辆车;第五批旅客乘坐1辆车,则共需要5辆。(2)①对所需摆渡车数量s赋初值为0。②变量w记录当前共需要出发的旅客人数,变量p记录上一批旅客在列表d中的位置。变量t记录当前批次旅客达到时间。若上一批旅客需要上车人员到达时间t与当前批量旅客到达时间d[p][0]的差值大于waitlim,则需要发车。③先判断上批剩余人数w是否超时,如果超时,先安排车辆。再将当前批次人数d[p][1]累加到w,若w超过10人,优先安排车辆。while语句功能为安排已经返回的摆渡车出发,每次循环表示出发一辆车,则该车出发后,剩余人数w需要减掉满载人数10。
12.现要编写程序,每隔1分钟采集并检测CO浓度,若数值为0或超出传感器量程(最大量程为200ppm),则传感器失效,程序停止。若同一监测点连续3次浓度超过安全阈值(如低于20ppm或高于50ppm),则发送报警信息。请回答下列问题:
(1)监测点a、b、c超过安全阈值的次数分别存放在cnt[0]、cnt[1]、cnt[2]中。若前2分钟采集到的数据为[["c",16],["a",54],["b",27]]和[["b",28],["c",18],["a",30]],则cnt[2]的值为__________(填数字)。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
n=3;L=20;H=50
cnt=[0]*n;flag=True
while flag:
 #将每分钟采集到的监测点数据存入cv中,代码略
 for i in ①__________:
   k=ord(cv[i][0])-97
   if ②__________:
    print("监测点",cv[i][0],"传感器失效")
    flag=False
   elif cv[i][1]H:
    cnt[k]+=1
    if cnt[k]>=3:
      print("监测点",cv[i][0],"异常")
   else:
     ③________
 sleep(60*1000) #延时1分钟
答案 (1)2 (2)①range(n)或range(len(cv))或range(len(cnt))或range(3)或range(0,n)或range(0,len(cv))或range(0,len(cnt))或range(0,3)
②cv[i][1]==0 or cv[i][1]>200 ③cnt[k]=0或cnt[ord(cv[i][0])-97]=0或cnt[ord(cv[i][0])-ord("a")]=0
解析 本题考查简单算法的程序实现。(1)c的值为2。分析两次监测点c(索引2)的浓度:第1次采集数据16低于安全阈值20,第2次采集数据18低于安全阈值20,cnt[2]值为2。(2)①每分钟采集的3个监测点数据。②判断当前监测点数据cv[i][1]是否超出传感器量程(最大量程为200ppm)。③若当前监测点浓度在安全阈值内,需重置该监测点cnt[k]的计数为0。
13.根据2012年出台的气象行业标准,滑动平均气温可以作为入春的划分指标。滑动平均气温值是以当天和前4天这5个日平均气温数据为一组求取的平均值,当滑动平均气温值连续5天大于等于10 ℃且小于22 ℃,才算入春。
从计算这5个滑动平均气温值所对应的9天日平均气温数据中,选取第一个大于等于10 ℃且小于22 ℃的日期,作为春季起始日。小明收集了3~4月份的部分气温数据。请回答下列问题。
(1)若3月8日起的天气数据如下表所示,根据滑动平均气温标准,春季起始日为3月________日。
日期 8 9 10 11 12 13 14 15 16 17 18 …
日平均气温 6 9 12 9 12 11 13.5 10.5 10 17 7.5 …
滑动平均气温 / / / / 9.6 10.6 11.5 11.2 11.4 12.4 11.7 …
(2)编写是否入春时间Python程序代码如下,将请空白处填写完整。
#读取日期并存储到day列表中,如day=["3月8日","3月9日",……]
#读取日平均气温并存储到temp列表中,代码略
t5=[0]*5 #存储5个滑动气温值
count=0
for i in range(len(temp)):
 ①________
 if i>=4:
   x=sum(t5)/5
   if 10<=x<22:
     ②________
    if count==5:
      break
   else:
     count=0
if count==5:
 for j in range(③__________,i+1,1):
   if 10<=temp[j]<22:
     print("春季起始日为:",day[j])
     break
else:
  print("还未入春")
答案 (1)10 (2)①t5[i%5]=temp[i]  ②count+=1 ③i-8
解析 (1)3月17日有连续5个滑动平均气温符合条件,所对应的连续9天的第一天为3月9日,但这天不符合条件,因此3月10日作为春季起始日。(2)①依次遍历日平均气温temp,当i大于等于4时开始利用表达式sum(t5)/5计算滑动平均气温,因此需把当天平均气温temp[i]写入到滑动窗口t5[i%5]中,从而保证t5[0]至t5[4]是最近的5天的平均气温。②滑动平均气温x符合大于等于10且小于22时,连续的天数count增加1。③当count的值为5时,确认已经入春,结束遍历,春季起始日从第i天的前9天(i-9+1)开始,查找第1个符合气温条件的日期。

展开更多......

收起↑

资源列表