内容正文:
高效作业14[第14课 算法的程序实现综合]
【A级 新教材落实与巩固】
1.小明编写了一个Python程序,其功能为:输入一段英语短文,程序运行后输出该短文中出现次数最多的字母及次数(字母不分大小写,结果以大写形式输出;若有多个字母,则全部输出)。程序运行界面如图所示:
实现上述功能的Python 程序如下:
wz=input(”请输入一段英文:”)
wz=wz.upper() #小写字母转换为大写字母
zf=[0]*26
for i in ①__range(len(wz))__:
ch=wz[i]
if ”A”<=ch<=”Z”:
n=ord(ch)-ord(”A”)
②__zf[n]=zf[n]+1或zf[n]+=1__
maxzf=[]
maxn=0
for i in range(26):
if :
maxn=zf[i]
for i in range(26):
if zf[i]==maxn:
maxzf.append(③__chr(i+ord(”A”))或__chr(i+65)__)
print(”出现次数最多的字母是”,maxzf)
print(”共出现”,maxn,”次”)
请回答下列问题。
(1)请在横线处填入合适的代码。
(2)若将上述程序中加框处的代码改为“zf[i]>=maxn”,则这对输出结果__不会__(选填:会/不会)产生影响。
【解析】 (1)空①由下面语句可知,i是索引,需要遍历每个字符,答案为range(len(wz));空②利用桶的思维统计每个字母的出现次数,zf[n]表示n位置上的字母次数,其中zf[0]表示字母“A”;空③输出出现次数最多的字母。
(2)zf[i]>maxn 与zf[i]>=maxn都是查找最大数,故不影响。
2.某阅卷系统设计如下:读取学生答案文件,将学生答案与标准答案进行对照并判分,题型分为单选、多选和填空。单选阅卷规则:与标准答案一致得全部分数,错选或不选不给分。多选阅卷规则:与标准答案一致得全部分数,漏选给一半分数,错选或不选不给分。填空阅卷规则: 标准答案表中允许有多种答案存在。学生的答案在标准答案中存在,得全部分数,不存在或未填不给分。
例如,文件“学生答案.txt”的内容如下:
张三|A|D|AC|AD|字符串|
李四|A|D|ACD|A|string|i>=0
标准答案:
题号
1
2
3
4
5
6
题型
单选
单选
多选
多选
填空
填空
答案
A
D
ACD
AD
字符串
或string
i==0
或i>=0
分值
2
2
2
2
2
2
该程序的执行结果为:
实现上述功能的Python程序段如下:
def dx(s1,s2,n): # 对多选题进行判分
flag=True
for i in s1:
if ①__i__not__in__s2__或__not__i__in__s2__或__i__in__s2==False__:
flag=False
break
if s1==s2:
return n
elif ②__s1==””__or__flag==False__:
return 0
else:
return n/2
f=open('学生答案.txt')
line=f.readline() # 按行读取“学生答案.txt”文件
bzda=['单选','A',2,'单选','D',2,'多选','ACD',2,'多选','AD',2,'填空',['字符串','string'],2,'填空',['i==0','i>=0'],2]
while line:
studa=line.split('|') # 将字符串以“|”为间隔分割成多个字符串组成的列表
zf=0
for i in range(len(studa)-1):
p=3*i
if bzda[p]=='单选': # 对单选题判分
if studa[i+1]==bzda[p+1]:
zf=zf+bzda[p+2]
elif bzda[p]=='多选': # 对多选题判分
zf=③ zf+dx(studa[i+1],bzda[p+1],bzda[p+2])
或zf+dx(studa[i+1],bzda[3*i+1],bzda[3*i+2])
else:
if studa[i+1]!='' and studa[i+1] in bzda[p+1]:
zf=zf+bzda[p+2]
print(studa[0],'成绩: ',zf,'分')
line=f.readline() # 读取下一行
f.close()
请回答下列问题。
(1)若学生答案数据为“王五|A|C|AD|ACD|string|i=0”,则输出的结果是__王五__成绩:__5__分__。
(2)请在横线处填入合适的代码。
【解析】 (1)王五|A|C|AD|ACD|string|i=0
2 0 1 0 2 0
(2)读取学生答题情况文件,并将每一行转换为列表studa,依次与标准答案比较,判断得分;单选题只需判定是否相等即可(bzda3个一组,所以p是3的倍数);多选题需要调用函数dx(),需要传递参数学生答案、标准答案和分值;函数dx()中判断多选得分。①若学生答案不在标准答案中,则记下flag为False;②若答案为空,或flag为False,得0分。
3.图形转化为文本表达。应用Python 中的Image 模块,将手写的数字图片处理成由0、1 表达的文本文件。手写图像如图1所示,运行后文本文件结果如图2所示。请回答下列问题。
图1 图2
(一)项目分析与算法思路
(1)先将图像统一转换为黑白图像。以彩色图像(RGB 颜色模式)为例,可以按照如下数学模型将彩色图像中每个像素的RGB 值转换成灰度值:gray=0.299×R+0.587×G+0.114×B。
(2)再根据像素的灰度值来判定。若灰度值小于限定值(如132),则判定为黑色,用ASCII 码字符“1”填充;否则判定为白色,用ASCII 码字符“0”填充。
(3)算法思路:遍历图片中的所有像素点→判定每个像素点灰度值对应的填充字符→把填充字符写入文本文件。
(二)完善程序
(1)若图1的图像大小为 512×120像素,则生成的文本文件(“1.txt”)的容量约为__B__KB(单选,填字母:A.7.5;B.60)。
(2)实现上述功能的Python 程序如下,请在横线处填入合适的代码。
from PIL import Image
def judge(R,G,B):
gray=0.299*R+0.587*G+0.114*B
#转成灰度值
color=①__gray//132__或int(gray/132)__或int(gray>=132)或gray>=132__或其他等价答案__
return color
#end judge
img=Image.open(”sx.jpg”)
pix=img.load() #读取所有像素的颜色值
fh=open(”1.txt”,”w”)
width=img.size[0] #图像宽度
height=②__img.size[1]__或img.height__ #图像高度
for i in range(height):
line=''
for j in range(width):
R,G,B=pix[j,i] #根据像素坐标获得该点的RGB 值
③__color=judge(R,G,B)__
if color==0:
line=line+”1”
else:
line=line+”0”
fh.write(line)
fh.write(”
”)
fh.close()
【解析】 (1)文本文件的大小与字符的个数和内容有关。结合题干的代码段可知,本题是将数字图片处理成由0,1字符组成的文本文件,一个像素经过转化后用一个0 或者1 表示,即一个像素对应一个ASCII 字符,用一个字节存储。所以转换后的文件大小为总像素点数×1Byte。此题对应的文件大小为512×120×1÷1024=60KB。
(2)①当前自定义函数是根据图像每个像素点RGB 三个分量计算出灰度值。根据灰度值gray 和限定值132的关系返回0 或非0。由于False 转换成整数为0,故此空可填gray//132 或int(gray/132) 或int(gray>=132) 或gray>=132。
②通过导入PIL 库中的Image 模块,Image.size 能获取图像的像素,对应的是一个元组(tuple)类型的数据,Image.size(width,height),分别对应图像的宽度和高度。根据注释“图像高度”,②是获取图像的高度值,所以此空可填img.size[1] 或img.height 。
③根据上下代码段,此空需要给变量color 赋值,color 是用于判断图像每个像素点转换为0 或1 的变量,需要调用自定义函数judge(R,G,B),所以此空答案为color=judge(R,G,B)。
4.小明使用Python编写了某答题卡中单项选择题的判分程序,该单选题每题2分。扫描答题卡获取选项填涂信息,输入标准答案,程序自动判断并输出分数。
具体方法:一个选项是否被填涂,可以从判断一个像素的颜色开始,像素的填涂情况是通过RGB的值来判断,灰度值低于132的表示该点被填涂;一个信息点64%的像素被填涂,则认为该区域已填涂,返回值为“1”。区域未填涂时返回值为“0”;各选项的编码为A→“1000”,B→“0100”,C→“0010”,D→“0001”,输入标准答案,程序进行对比并返回结果。答题卡相关信息如图所示:
请回答下列问题。
(1)若某题的标准答案为“C”,该题填涂情况为“0100”,则分数为__0__分。
(2)实现上述功能的Python程序如下,请在横线处填入合适的代码。
from PIL import Image
#输入起始点坐标(xs,ys),信息点宽度高度(fw, fh),间隔宽度高度(sw,sh),代码略
num=5 # 判分个数
def bw_judge(R,G,B):
#bw_judge用于判断一个像素的填涂情况,代码略
def fill_judge(x,y):
# fill_judge用于判断信息点的填涂情况
count=0
for i in range(x,x+fw+1):
for j in range(y,y+fh+1):
R,G,B=pixels[i,j]
if bw_judge(R,G,B)==True:
count=count+1
if count>=①__fw*fh*0.64__:
return True
total_width=fw+sw
total_height=fh+sh
image=Image.open(”t2.bmp”)
pixels=Image.load()
number=””
bz=[””]*num
df=0
bzd=input('请输入标准答案: ')
da={”A”:”1000”,”B”:”0100”,”C”:”0010”,”D”:”0001”}
for i in range(len(bzd)):
bz[i]=②__da[bzd[i]]__
for row in range(num): #分数判定
for col in range(4):
③__x=xs+total_width__*__col__
y=ys+total_height*row
if fill_judge(x,y)==True:
number=number+'1'
else:
number=number+'0'
if number==bz[row]:
df+=2
number=””
print(”得分为: ”,df)
【解析】 (1)C的填涂情况应为0010,答案错误,得0分。
(2)首先输入标准答案,并将标准答案转换为4位二进制数,利用字典形式转换;总共有num个题目,需要找到每个选项的答题情况,则需要读取图像;total_width、total_height表示1个填图点加空隙的像素,xs、ys表示左上角开始位置;利用循环的形式找到每个填图点的开始位置,并利用fill_judge()函数判断填图情况。
5.针对选考2024·南浔中学检测为了让乘客实时掌握公交到站时间,提高乘客的出行体验,某公交公司开发了一款小程序,其主要功能有:乘客输入当前时刻和上下站点序号,可以查询到最近到达班次、候车时间及预计乘车时间。某线路的部分发车信息存储在文件“gj.csv”中,时刻表如下表所示:
站点序号
班次1
班次2
班次3
班次4
班次5
1
7:20
8:00
8:30
9:00
9:30
2
7:24
8:06
8:38
9:05
9:38
3
7:28
8:13
8:48
9:15
9:44
4
7:32
8:15
8:54
9:20
9:50
5
7:35
8:17
9:00
9:24
10:00
6
7:37
8:20
9:05
9:28
10:17
7
7:40
8:24
9:13
9:30
10:25
8
7:43
8:28
9:18
9:40
10:35
9
7:50
8:30
9:25
9:43
10:55
10
8:00
8:40
9:40
10:00
11:09
程序运行界面如图所示:
请回答下列问题。
(1)如果当前时刻是9:18,从站点4 上车,站点10 下车,预计乘车用时为__40__分钟。
(2)实现上述功能的Python程序如下,请在横线处填入合适的代码。
import csv
f=open(”gj.csv”,”r”)
f_csv=csv.reader(f)
time=[]
for row in f_csv:
time.append(row)
def change(times): #转换时间的单位为分钟,参数times 格式如“6:00”
#times.split(':')表示将字符串times 按照':'进行分割,返回结果为列表
hours=times.split(':')[0]
minutes=times.split(':')[1]
res=①__int(hours)*60+int(minutes)____
return res
for i in range(1,len(time)): #将公交时间表中的时刻统一转为分钟单位
for j in range(1,len(time[i])):
time[i][j]=change(time[i][j])
now=change(input(”乘客您好!请输入当前时刻: ”))
p1=int(input(”请输入上车站点: ”))
p2=int(input(”请输入下车站点: ”))
n=len(time[0])-1
min=time[p1][1]-now
k=1
for i in range(②__2,n+1__或1,n+1__):
if time[p1][i]-now<min or ③__min<0__:
min=time[p1][i]-now
k=i
tot=④__time[p2][k]-time[p1][k]__
print(”最近到站的公交为第”+str(k)+”班次, 候车时间为”+str(min)+”分钟, 预计您的乘车用时为”+str(tot)+”分钟。 ”)
【解析】 (1)由表格可知,9点20开始,10点结束。
(2)空①函数change()的作用是将时刻统一转换为分钟单位,res是需要返回的转换的结果;n为班次数量,min初值为当前时刻与上车站点第1个班次之间的差值,遍历所有班次,找出最小差值;空②从班次2开始遍历,结合range的特点可知;空③遇到差值更小的更新或者min<0(班次早于当前时刻)的更新;空④计算所乘坐班次的乘坐时间。
【B级 素养形成与评价】
6.某停车场停车计费规则如下:停车时长不到半小时按2 元计费;停车半小时及以上则按每小时5 元计费,超过整小时部分,不足半小时的时长不计费,半小时及以上则按一小时计费。
该停车场某天的停车记录存储在“parking.txt”文件中,文件内容如图所示。每一行共有三项数据,用逗号分隔,第一项数据为进(出)场时间,第二项数据为车牌号,第三项数据为进出场状态(0 表示进场,1 表示出场)。小明编写了Python 程序,从该文本文件中读取所有数据,计算该停车场一天的总收入及处于满位状态的总时长。
请回答下列问题。
(1)“parking.txt”文件中的数据属于__A__(单选,填字母:A.结构化数据;B.半结构化数据;C.非结构化数据)。
(2)实现上述功能的Python程序如下,请在横线处填入合适的代码。
def trans(s):
return int(s[11:13])*60+int(s[14:16])
f=open(”parking.txt”,”r”)
line=f.readline()
dic={ }
price,total=5,0
cnt,sumt=0,0
start=-1
p=300 #车场空位数量
while line!=””:
line=line.strip() #去除末尾换行符
a=line.split(”,”)
if a[2]==”0”:
dic[a[1]]=a[0]
cnt+=1
else:
①__cnt-=1__
m=trans(a[0])-trans(dic[a[1]])
if m<30:
fee=2
else:
②__fee=int(m/60+0.5)__*__price或fee=(m//60+m__%60//30)*price或其他等价答案__
total+=fee
if cnt==p:
if start==-1:
start=trans(a[0])
elif start>-1:
sumt=③__sumt+trans(a[0])-start__
start=-1
line=f.readline()
f.close()
#若读取当天所有记录后,车场为满位状态,则计算剩余满位时长,代码略
print(”该天停车费总收入为: ”,total)
print(”该天停车场满位总时长为: ”,sumt,”分钟”)
【解析】 (1)由二维表结构来进行逻辑表达和实现的数据,这是结构化数据。
(2)读取每一行数据,并转换为列表a,其中a[0]表示时间,a[1]表示车牌,a[2]表示进出场状态,0表示进场,1表示出场,并记下停车场里的车辆数cnt;当a[2]==”0”时,记下车牌和进入时间;当a[2]==”1”时,计算停留时间,并根据停车时间判断停车费;如果cnt==p,表示停车场已满,如果第1次出现,则利用start记下开始位置,如果不是第1次出现,则sumt记下累计时间。
7.某校餐厅实行学生点餐系统, 每餐提供荤素搭配营养丰富的五个套餐(分别是A、B、C、D、E)让学生选择。小明根据所学知识,在班级同学均已完成点餐的情况下,对某一次的原始点餐数据(包含学号和套餐名称,部分界面如图1 所示)进行了一系列处理,分析最受学生欢迎的套餐及其点餐率,以期向学校餐厅提出更好的建议。小明编写了以下程序, 运行结果的部分截图如图2所示。
图1 图2
实现上述功能的Python程序如下,请在横线处填入合适的代码。
#从文件“meal.txt”中读取学生原始点餐数据,存储于列表text中
f=open(”meal.txt”,encoding=”utf-8”) #打开文件
text=[]
s=”ABCDE”
sno=””
line=f.readline()
while line:#从文件中读取一行
for i in range(len(line)):
if line[i] in s:
①__meal=line[i]____
break
elif”0”<=line[i]<=”9”:
sno=sno+line[i]
elif line[i]==””:
i+=1
text.append([sno,meal])
sno=””
line=f.readline()
f.close()
#查找最受欢迎的套餐, 并统计其点餐率
maxn=0
num={”A”:0,”B”:0,”C”:0,”D”:0,”E”:0}
②__n=len(text)__
for i in range(n):
x=text[i][1]
③__num[x]+=1__
if num[x]>maxn:
maxn=num[x]
mealn=x
rate=round(maxn/n*100,2)
print(”最受欢迎的套餐是: ”,mealn)
print(”点餐率为: ”,rate,”%”)
【解析】 从“if num[x]>maxn:”语句可知,num[x]代表某个套的数量。从之后程序可知,num是一个字典。在初值里放置各个套餐的数量为0。因此在num初值与if语句之间应该要对字典num所记录的各个套餐数量进行统计, 统计的方式应该是出现一种套餐, 该套餐的数量要加1。从上、下语句来看只有变量x才可能是套餐的类别。因此③填num[x]+=1。x代表套餐名,则text[i][1]代表套餐名。再向上查看text列表的产生过程。text列表的数据通过text.append([sno,meal])产生。因此变量meal代表套餐名。而且meal变量值在前面没有产生过, 因此在①处必然填对变量meal的赋值语句。学生点餐的原始数据是从文件“meal.txt”读取进来的。从语句if line[i] in s可知line[i]就是套餐名,因此①处填meal=line[i]。在统计各个套餐数量时, 必须全体参与。在“for i in range(n)”语句中, 变量n的值还没有初值。因此②处填n=len(text)。
8.针对选考2024·柯桥中学检测某校举办国庆师生联欢活动, 活动时给每位师生发放一个号码(由6个不重复的大写字母组成),在活动结束时将从已发放的号码中找出幸运号码。幸运号码产生过程如下:
①将每个发放的号码与其他所有号码对比,找出该号码的亲密号码, 如两号码为亲密号码关系, 则两号码为亲密号码对。(亲密号码判断方式:若调换号码1中两个位置上的字符得到的号码与号码2完全相同, 则称号码1与号码2是一对亲密号码对。如号码“ABCDEF”,调换其位置3和位置5中的字符“C”“E”得到号码“ABEDCF”, 即号码“ABCDEF”和“ABEDCF”为一对亲密号码对。)
②在所有亲密号码对中, 找出出现次数最多的号码作为幸运号码,若出现次数最多的号码有多个, 均作为幸运号码。
初步处理号码数据并将其保存在“编号.txt”中,如图所示。实现上述功能的Python程序段如下:
#判断x、y是否是亲密号码对,如果是则返回True,不是则返回False
def judge(x,y):
a=[]
for i in range(len(x)) :
if x[i]!=y[i]:
a.append([x[i],y[i]])
ifa[0][0]==a[1][1] and a[0][1]==a[1][0]:
return True
else:
①__return__False__
f=open(”编号.txt”,”r”) #打开文件
bh=f.read().split(”,”)#把各号码存储到列表bh中
#从列表bh中逐一比对所有号码,找到一对亲密号码,并将这对号码存储到列表qmbh中
qmbh=[]
for i in range(len(bh)-1) :
for j in range(i+1,len(bh)):
if②__judge(bh[i],bh[j])__:
qmbh.append([bh[i],bh[j]])
cs={}
#遍历列表qmbh中的亲密号码对,统计各号码出现的次数,结果存放在字典cs中
for bh_dui in qmbh:
for j in bh_dui:
if j in cs:
③__cs[j]+=1__
else:
cs[j]=1
#找出出现在亲密号码对中次数最多的号码
for key,value in cs.items():
if value==max(cs.values()):
print(”幸运号码为”,key)
print(f”与{key}为亲密号码的共{value}个”)
请回答下列问题。
(1)若号码分别是“ABCDEF”“ABEDCF”“AFEDCB”“ADBCEF”,则幸运号码为__ABEDCF__。
(2)请在横线处填入合适的代码。
(3)上述程序段中加框处代码有误,请改正:__len(a)==2__and__a[0][0]==a[1][1]__and__a[0][1]==a[1][0]____。
【解析】 (1)ABEDCF与ABCDEF、AFEDCB是亲密号码对,出现次数最多。
(2)读取文件,并将其转换为列表bh;接着在列表bh中逐一比对所有号码,找到一对亲密号码对,并将这对号码存储到列表qmbh中,qmbh的结构为[[,],[,],…,[,]];②调用judge()函数,判断x、y是否是亲密号码对;①judge()函数中当两个号码不同时,存入列表a中,当不同个数等于2个且交替相等时,返回True,否则返回False;③利用桶的思维统计亲密号码对个数,其中桶使用字典实现,如果j在字典中,则次数增加1次,否则添加新的字典元素。
9.针对选考利用某火车购票系统购票,购买者输入“出发站”“目的站”,系统会统计两站之间的占座情况,根据空座数量(出发站至目的站之前一直是空的座位即为空座)返回余票情况,购买者根据余票信息购买车票,获得具体的座位号。
根据上述功能,小王编写了一个Python 程序模拟该购票系统,以“杭台高铁”为例,全线共设9 个车站,某趟列车共有8 节车厢,每节车厢共有17 排,每排5 个座位(编号分别是A、B、C、D、F),共680 个座位,某时刻的占座情况如图所示。具体设计如下:从数据库中读取占座情况存储在列表seat 中(例如,序号为84 座位的各站点的占座情况,在seat[84]中表示为[1,1,0,0,0,0,1,1],索引号2 至5 的值都为0,则当出发站为临海站、目的站为上虞南站时,该座位为空座),然后根据购买者输入的出发站和目的站的站点名称,统计空座数量及相应的座位序号,根据购票信息,输出购票的具体座位(其中连票数量尽可能多)。
杭台高铁某一时刻占座情况一览表
(0表示空座,1表示占座)
座位
序号
具体座位
序号
0
1
2
3
4
5
6
7
站点
温岭
台州
临海
天台山
嵊州新昌
嵊州北
上虞南
绍兴北
0
1号车厢1排A座
0
1
1
0
1
0
1
1
1
1号车厢1排B座
1
1
1
1
0
0
0
0
…
…
…
…
…
…
…
…
…
…
84
1号车厢17排F座
1
1
0
0
0
0
1
1
85
2号车厢1排A座
0
0
1
1
1
0
0
1
…
…
…
…
…
…
…
…
…
…
679
8号车厢17排F座
1
0
0
0
1
1
1
1
请回答下列问题。
(1)主程序如下,请根据购票步骤,在横线处填入合适的代码。
#获取列车每个座位号及其在各站点的占座情况,存储在二维列表seat 中,代码略
site=[”温岭”,”台州”,”临海”,”天台山”,”嵊州新昌”,”嵊州北”,”上虞南”,”绍兴北”,”杭州东”]
begin=site.index(input(”输入出发站: ”)) #index 方法用于获取列表的索引号
end=site.index(input(”输入目的站:”))
tic=gethavet(begin,end) #获取基于出发站和目的站前的所有空座座位序号列表
if len(tic)>0:
num=int(input(”尚有余票”+①__str(len(tic))__+”张, 请输入购买的数量: ”))
if num<=len(tic):
seatno,ser=assignment(num,tic) #获取相应座位序号及连票数量
#列表seatno存储格式如[4,5,6,7,8]或[4,5,6,8,9]
print(”购票”+str(num)+”张, 其中连票数量”+str(ser)+”张!座位信息如下: ”)
snum=['A','B','C,'D','F'] #每排座位的编号
for k in seatno:
coach,row=k//85+1,k%85//5+1
②__number=snum[k%5]__
print(str(coach)+”车厢”+str(row) +”排”+number+”座”)
#将新的占座数据写入数据库,代码略
else:
print(”购买数量不得大于余票数量! ”)
else:
print(”余票不足! ”)
(2)获取余票数据,编写gethavet() 函数,获取出发站至目的站前的空座座位序号,保存在列表s 中并返回。请在横线处填入合适的代码。
def gethavet(x,y):
s=[]
for i in range(680):
nows=seat[i] #nows 存储当前序号各个站点的占座情况
if__sum(nows[x:y])==0__或nows[x:y].count(1)==0或nows[x:y].count(0)==y-x__或not__1__in__nows[x:y]__:
s.append(i)
return s
(3)座位分配,编写assignment() 函数,按序号查找连票。如果找到一组连票数量等于购买的数量,则退出查找并返回相应信息;若连票数量不足,则补充座位数量后返回。请在横线处填入合适的代码。
def assignment(n,tic):
maxs,head,tmp=1,0,1
for i in range(1,len(tic)):
if__tic[i]==tic[i-1]+1__:
tmp+=1
if tmp>maxs:
maxs=tmp
head=i-maxs+1
#记录连票的开始位置
if maxs==n:
break
#满足需要的数量,结束查找
else:
tmp=1
#将连票的座位序号存于列表slist,若连票数量不足则补充座位的数量,代码略
return [slist,maxs]
【解析】 (1)主程序,tic 变量从注释中可以了解到存储了可用的空座序号列表。第①空要求表示可用空座的数量,即len(tic)。本题中由于使用“+”运算符做字符串运算,因此需要额外使用str()函数转换为字符串类型。因此答案为str(len(tic))。输出座位时,分别使用conch、row、number 变量存储当前座位的车厢、排、座位编号。对于每个座位序号k in sentno,通过对85 的整除和模运算计算了车厢和排序号,座位编号是在A、B、C、D、F上循环编号的,所以第②空的答案是number=snum[k%5]。
(2)完善主程序中调用的gethavet()函数。函数功能是计算空座列表。
84
1号车厢17排F座
1
1
0
0
0
0
1
1
85
2号车厢1排A座
0
0
1
1
1
0
0
1
上表所示的两个座位84 和85,分别存储为[1,1,0,0,0,0,1,1]和[0,0,1,1,1,0,0,1],根据题目要求,连续的0 即为连续站的空座,是在这些站上可售的座位。因此,对于nows=seat[i](seat[i]中存储了当前第i 个座位在各站的空座情况),nows[x:y]表示当前座位在出发站到终点站前的空座情况,只要该连续站上均为空座即可售票。注意:now[x:y+1]是错误的,因为在终点站下车,终点站本身是否有空座并不重要。横线处的等价答案很多,通常习惯用sum(nows[x:y])==0。
(3)寻找连续的座位,观察代码“for i in range(1,len(tic))”可以判断相邻项的比较次序为:当前项与前一项。因此,答案为tic[i]==tic[i-1]+1。
10.针对选考2024·萧山中学检测你获得一个奖励,可以去参加一场名人庆祝派对,并且只能待一个小时,但你可以选择在哪个时间段出席派对。你有一张时间表,如图1所示,上面准确地列有每位名人出席派对的时间段(如某位名人出席时间为7、离开时间为10,代表你7 点、8 点、9 点都可以与这位名人合影)。你希望与尽可能多的名人合影,于是编写Python程序用来寻找可与最多名人合影的出席派对的时间段和名人数量。(解题思路:检查每一小时内有几位名人在场,并选出最大值,该时刻就是参加派对的最佳时间)。程序运行界面如图2所示。
图1 图2
实现上述功能的Python程序段如下:
def bestTimeToParty(schedule):
start=schedule[0][0]
end=schedule[0][1]
for c in schedule:
start=min(c[0],start)
end=max(c[1],end)
①__count=statistics(schedule,start,end)__
maxcount=0
for i in range(start,end+1):
if count[i]>maxcount:
maxcount=count[i]
time=i
print('最佳出席时间是在',time,'点钟', ' ; ',maxcount,'个名人会在现场!')
def statistics(sched,start,end): #寻找每个时间段的现场名人数量
count=[0] *end
for i in range(start,end+1):
count[i]=0
for c in sched:
if ②__c[0]<=i__and__c[1]>i____:
count[i]+=1
return count
n=int(input()) #输入出席派对的名人数量
sched=[] #保存名人出席派对的时间
for i in range(n): #逐个输入名人出席和离开派对的时间(整数)
sched.append(③__[int(input()),int(input())]__)
#结果如sched=[(6,7),(6,8),(6,12),(7,8),(7,10)]
请回答下列问题。
(1)bestTimeToParty(sched)案例中输入名人参加派对的次序发生变化,__不会__(选填:会/不会)影响最终输出结果。例如,sched=[(6,7),(6,8),(6,12),(7,8),(7,10)]改为sched=[(6,8),(6,12),(6,7),(7,8),(7,10)]
(2)请在横线处填入合适的代码。
(3)上述程序段中加框处代码有误,请改正:__count=[0]__*__(end+1)____。
【解析】 (1)观察程序代码可知,无论是计算最大、最小时间还是计算每个时间点会场内的人数,都与数据的排列顺序无关,因此修改输入顺序并不会影响程序的运行结果。
(2)(3)在主程序与函数bestTimeToParty()、statistics()做调用和值传递。函数bestTimeToParty()的作用是计算并输出人数最多的时间点,变量start 和end 分别存储了最早到场和最晚到场时间。在后面计算人数最多的时间点时使用了counts 数组,因此第①空必须对count 数组初始化。count 数组存储了每个时间点的人数,关于count 的赋值由statistics()函数完成。statistics()函数对每个时间点遍历全部人员行程数据,若时间点i 在人员c 的行程内,则更新count[i]。这里要用变量c 直接遍历行程表sched,sched 的每个元素是一个包含了进、出时间的二元组,且根据样例“出席时间为7,离开时间为10,代表你7 点、8 点、9 点都可以与名人合影”,离开时间不计入,所以第②空答案为c[0]<=i <c[1]。在对时间点i 的遍历中,for 循环遍历的范围是range(start,end+1),对于count[i],i 最大可以取值为end,因此count 数组的初始化长度为end+1 以确保count[i]不会索引越界。第(3)题改错答案为count=[0] * (end+1)。在主程序中,③处输入行程表,前面代码和样例中均提到行程表是由包含进出时间的二元组组成的列表,因此输入时注意将连续的两个输入值转化为整型二元组,所以第③空答案为[int(input()),int(input())]。
学科网(北京)股份有限公司
$$