1. 人们通过研究发现,将某些不同商品(如休闲食品和饮料)陈列在一起销售,能使商品的销售量增长。为了寻找这些能相互促进销量的商品,就需要进行商品的关联分析。“支持度”是反映商品关联性的一个重要度量值,为了统计相关商品的支持度,需要先统计相关商品的关联次数。关联次数指的是不同商品同时出现在同一个购物流水中的次数。如图所示的流水文件,关联次数最多的一组商品是x4和x5。现编写程序找出关联次数最多的商品组,若有多组,则全部输出,请补充程序划线处。
(1) 以下自定义函数用于读取流水文件,并进行预处理。假设流水文件中每一行数据由流水号及商品名组成,每项内容之间用逗号隔开,商品名由字母“x”加一位数字组成。

def read(file):

    f=open(file,'r') #读取文件

    li=[]

    for line in f:

       

        s=''

        for i in range(len(line.strip())):  #strip()函数删除字符串末尾的“\n”

            ch=line[i]

            if ch==',':

                flag=True

            if ch>='0'and   ch<='9'and  flag:

                s=s+ch

        li.append(s)

    f.close()

return li

(2) 以下自定义函数用于生成商品的关联。

def gl(s):

    a=[]

    for i in range(len(s)- 1):

        x=s[i]

        for j in range():

            y=s[j]

           

    return a

(3) 以下自定义函数用于查找最高关联次数。

def  maxgl(dic):

    mt=0

    for i in dic:

        if  dic[i]>mt:

           

    return mt

(4) 以下是主程序。

dic={}

li=read('data.txt')#data.txt     是流水文件

for i in li:

    if len(i)>1:

        a=g1(i)

        for j in a:

            if j in dic:

                dic[j]+=1

            else:

                dic[j]=1

mt=maxg1(dic)

for i in dic:

    if

        print('关联度最多的一组商品是: x'+i[0]+'和x'+i[1])

(5) 若将加框处代码精简为“a.append(x+y)” (不包括引号),程序的运行结果是否 有影响?  (选填:是或否)。
【考点】
过程与自定义函数; 分支结构语句及程序实现; 循环结构语句及程序实现; 常用标准函数;
【答案】

您现在未登录,无法查看试题答案与解析。 登录
综合题 困难
能力提升
换一批
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}分")

综合题 困难