1. 为了让乘客实时掌握公交到站时间,提高乘客的出行体验,某公交公司开发了一款小程序,其主 要功能有:乘客输入当前时刻和上下站点序号,可以查询到最近到达班次、候车时间及预计乘车时 间。某线路的部分发车信息存储在文件"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下车,预计乘车用时为分钟。
(2) 实现上述功能的部分程序如下,请在划线处填上合适的代码。

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=①

    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(②):

    if time[p1] [i]-now< min or ③ :

        min= time[p1][i]-now

        k=i

tot=④

print( "最近到站的公交为第"+str(k)+"班次,候车时间为"+str(min)+"分钟,预计您的乘车用时为 "+str(tot)+"分钟。")

【考点】
过程与自定义函数; 分支结构语句及程序实现; 循环结构语句及程序实现;
【答案】

您现在未登录,无法查看试题答案与解析。 登录
综合题 困难
能力提升
真题演练
换一批
1. 在计算机的操作系统中,经常需要给应用程序“分配内存”和“释放内存”。若有大小为1024B的内存,如1图所示:

使用列表["+",5]表示申请连续5B的内存,使用列表[2,2]表示回收位置2开始连续2B的内存。若指令集表示为:order=[["+",5],[2,2],["+",8],[8,3]]。随着指令集被执行,1024B连续的内存块会被分割成若干个占用内存空闲内存。为方便起见,“占用内存”用1表示,“空闲内存”用0表示,故执行上述指令集后,内存占用情况如2图所示:

若将空闲块用链表组织起来,就可以快速查找空闲块和删除空闲块。把连续的空闲块定义为一个节点,每个节点由[空闲块起点, 空闲块长度, 下一个空闲块位置]三部分内容构成。根据2图内存占用情况,创建的空闲块链表如3图所示:

(1) 根据2图所示的内存占用情况,执行指令[4,4]后(连续空闲块要合并),内存中“空闲块”的数量变为个。
(2) 根据内存占用情况列表allot,创建空闲块链表代码如下:

def linkList(allot): #linkList函数功能:根据内存占用0/1列表allot,创建空闲块链表link

 link = [ [-1,-1,-1] ] #链表包含一个空头节点

 head = tail = 0 ; n = len( allot ) ; i = 0

 while i < n :

 if allot[ i ] == 0 :

 j = i + 1

 while j<n and allot[ j ] == 0: 

 j = j + 1

 link.append( [ i , j – i , -1 ] )

 link[ tail ][ 2 ] =     ▲

 tail = len( link ) - 1

            

 else:

 i += 1

return head , link

请在▲处填入合适的代码

若将加框处的代码修改为i = j,是否影响程序的执行结果(选填:是/否)。

(3) 模拟上述内存操作的Python程序如下,请在划线处填入合适的代码。

#通过文件读入内存分配表allot和指令集order,其代码略。

head , link = linkList ( allot )

for i in range( len( order ) ):

 if order[ i ][ 0 ] == " + ": #必须分配连续的空闲块,且由第一个满足空间大小的节点分配

 p = head ; q = link[ head ][ 2 ]

 while 

 p = q ; q = link[ q ][ 2 ]

 if  q == -1:

 print( "内存不足!" )

 else:

 if link[q][1] == order[i][1]: 

                

 else:

 link[ q ][ 0 ] = link[ q ][ 0 ] + order[ i ][ 1 ]

 link[ q ][ 1 ] = link[ q ][ 1 ] - order[ i ][ 1 ]

 else:

 p = head ;  q = link[ head ][ 2 ]

 while q != -1 and link[ q ][ 0 ]<order[ i ][ 0 ]:

 p = q ; q = link[ q ][ 2 ]

 if link[ p ][ 0 ] + link[ p ][ 1 ] == order[ i ][ 0 ]: #前面节点合并

 link[ p ][ 1 ] = link[ p ][ 1 ] + order[ i ][ 1 ]

 else:

 link.append([ order[ i ][ 0 ] , order[ i ][ 1 ] , q]) #添加节点

 link[ p ][ 2 ] = len( link ) - 1

            p = link[ p ][ 2 ]

   if q != -1 and : #后面节点合并

 link[ p ][ 1 ] = link[ p ][ 1 ] + link[ q ][ 1 ]

 link[ p ][ 2 ] = link[ q ][ 2 ]

综合题 困难
2.  某网约旅游小巴士,核载乘客m人(不算司机),途径n个景点(编号从1到n),小巴士从1号景点向n号景点行驶,中途不改变方向。游客提供订单号,由3个数字组成分别是:乘客人数、上车景点编号、下车景点编号。如订单“2,1,5,”(数字之间用逗号“,”分隔,并以逗号结尾)表示2位乘客从1号景点上车5号景点下车。编写python程序,读取已经预约成功的订单信息,并判断新提交的订单能否预约成功。

设m=12,n=10,如图a所示,是已经预约成功的5个订单对应的各景点车上人数。当输入新的订单号:“4,5,8,”,程序提示预约不成功,如图b所示。

图a

图b

(1) 结合题意与图a,若输入订单号为“3,6,9,”,(选填:能/不能)预约成功。
(2) 实现上述功能的python程序如下,请在划线处填写合适的代码。

#定义函数,读取订单中的人数和上下车景点编号

def order(s):

 num,start,end=0,0,0

 j,k=0,1

 for i in range(len(s)):

        

 if ch==",":

 tmp=int(s[j:i])

 j=i+1

 if k==1:

 num=tmp

 elif k==2:

 start=tmp

 elif k==3:

 end=tmp

            

 return num,start,end

#主程序

#读取已预约成功订单,存入列表 lst,数据元素为订单号

# 如 lst=["2,1,5,","1,3,7,","3,2,8,","2,4,7,","3,5,10,"]

n=10 #站点数

m=12 #巴士空座位总数

count=[0]*(n+1)

for i in lst: #处理预约成功订单

 num,start,end=order(i)

 for i in range():

 count[i]+=num

s=input("请输入订单号:")#处理新订单

a,b,c=order(s)

if a*b*c!=0:

 if :

 print("预约不成功,请重新输入!")

 else:

 print("预约成功!")

else:

 print("订单格式输入错误,请重新输入!")

#更新预约成功订单,再次等待新订单,代码略

综合题 困难
3.  某学生编写了一个程序来模拟答题卡中单项选择题的判分过程。实现方法是:使用“0”和“1”的组合来分别编码ABCD的填涂情况,具体方式如图a所示,例如,填涂结果“A”用“1000”编码。12道选择题以图b的方式进行排列。

图 a

图 b

图 c

编写程序:对给定的标准答案,生成并输出每道题的填涂信息,对应的选项、分值(答对得2分,答错或不答得0分),以及最后的总得分,输出结果如图c所示。请回答下列问题:

(1) 若生成的填涂信息如下图所示,输入的标准答案为“ABCDCADCABAD”,则获得的总分为(填数值)。

(2) 实现上述功能的程序如下,请在划线处填入合适的代码。

import random

n = 12 # 定义题数

da = "ABCDDABDAACA" # 存储标准答案

def check(s, w, da): # 判断得分

    if :

        return 2

    else:

        return 0

a=[[] for i in range(n)] # 存储每题 ABCD 选项的编码值

ans = [""] * n # 存储模拟生成的填涂选项

res = ""

s=""

total = 0

for i in range(n): # 模拟生成每题选项对应的 4 位编码

    t = random.randint(0, 4) # 随机生成第 i+1 题的填涂情况

    for j in range(4):

        if :

            a[i].append(1)

        else:

            a[i].append(0)

print("填涂卡情况:")

num=1

for i in range(n): # 打印填涂卡情况

    s = s + str(a[num-1])

    for j in range(4):

        if a[num-1][j] == 1:

            

    res = res + str(num) + "" + s + "

    s = ""

    

    if (i+1) % 3 == 0 :

        print(res)

        res = ""

        num-=11

print("题号  选项  分值")

for i in range(n): # 输出每题的答案和得分

    if ans[i] != " " :

        df = check(ans[i], i, da)

        print(f"{i+1} {ans[i]} {df}")  #按格式要求输出

        total += df

    else:

        df = 0

        print(f"{i+1} 未填涂    {df}")

print(f"该学生选择题得分:{total}分")

综合题 困难