python函数过程

#函数内部可能设计有点问题,挺简单的逻辑
按照我的逻辑来说,柜台编号越靠前越容易服务人数更多,如果服务客户未完成数量较多的话,应该是某个柜台卡住了,即counter[i].freetime 无法正常对照,在entercounter中无法调整状态,也有可能是choosecounter里面发生某些问题,求解一下哪儿出问题了.

回答能够完善这个程序才会采纳!


```python
import random
from collections import deque

class Time():                 #时间类,记录时钟、分钟
    def __init__(self):
        self.minute=0
        self.hour=9

    def timechange(self):      #调用每次使时间增加一分钟
        self.minute+=1
        if self.minute==60:
            self.minute=0
            self.hour+=1
     

class Guest():                  #客户类,记录抵达时间,以及业务种类(用随机数对4取余,四种情况对应四种业务)
    def __init__(self,a,hour,minute):
        self.business=chr(ord('A')+a%4)
        self.arrivehour=hour
        self.arriveminute=minute

class Counter():
    def __init__(self):            #柜台类,记录柜台状态,空闲时间,服务总人数,各业务人数(A,B,C,D分别对应存款业务,取款业务,挂失业务,还贷业务)
        self.free=1
        self.freetime=[None,None]
        self.servecount=0
        self.Acount=0
        self.Bcount=0
        self.Ccount=0
        self.Dcount=0
    
    def displaywork(self):
        print("%10d %11d %13d %13d %13d"%(self.servecount,self.Acount,self.Bcount,self.Ccount,self.Dcount))  #柜台类展示数据

def pguest():                     #产生随机数,以范围概率确认是否有客户抵达
    rand=random.randint(1,53)
    if 0<rand<=4:
        return rand
    else:
        return None

def creatcounter():              #创建四个柜台类
    counter1=[None,None,None,None]
    for i in range(4):
        counter1[i]=Counter()
    return counter1

def business(a):                #客户的业务从字符转换为实际意义
    if a =='A':
        return '存款业务' 
    if a=='B':
        return '取款业务'
    if a=='C':
        return '挂失业务'
    if a=='D':
        return '还贷业务'

def showTicket(guest):          #展示票据时间,编号,业务,同时统计编号
    global numb
    numb+=1
    hour=guest.arrivehour
    minute=guest.arriveminute
    str=business(guest.business)
    print("    一位客户进入银行取票:时间为%02d时%02d分,编号%02d,业务为%s"%(hour,minute,numb,str))

def entercounter(time,counter,waitingqueue):           #验证是否有空柜台,并且有空柜台时返回等待客户的第一位
    i=0
    for i in range(0,4):
        if counter[i].freetime[0]==time.hour and counter[i].freetime[1]==time.minute:
            counter[i].free=1                       #更新柜台状态
    if counter[0].free==1 or counter[1].free==1 or counter[2].free==1 or counter[3].free==1:
        if waitingqueue:                               #寻找是否有空柜台
            guest=waitingqueue.popleft()               #等待队列第一位客户出列
            return guest
    return None

def choosecounter(counter,guest,time):           #选择空柜台,并且更改柜台数据
    timeh=time.hour                              #记录时间
    timem=time.minute
    i=0
    for i in range(0,4):                         #寻找空柜台
        if counter[i].free==1:
            break
    counter[i].servecount+=1                     #柜台服务总人数+1
    counter[i].free=0                       #更改柜台状态
    if guest.business=='A':                      #对应业务并修改时间,其中A,B业务花费5分钟,C,D业务花费10分钟
        counter[i].Acount+=1
        timem+=5
        if timem==60:
            timeh+=1
            timem-=60
    if guest.business=='B':
        counter[i].Bcount+=1
        timem+=5
        if timem==60:
            timeh+=1
            timem-=60
    if guest.business=='C':
        counter[i].Ccount+=1
        timem+=10
        if timem==60:
            timeh+=1
            timem-=60
    if guest.business=='D':
        counter[i].Dcount+=1
        timem+=10
        if timem==60:
            timeh+=1
            timem-=60
    counter[i].freetime[0]=timeh           #记录柜台的空闲时间,用于更新柜台状态
    counter[i].freetime[1]=timem+1
    return [timeh-guest.arrivehour,timem-guest.arriveminute]    #返回逗留时间(客户业务结束时间-抵达时间)

def average_time(b):       #传递列表计算平均时间
    t=len(b)
    totaltime=0
    for i in range(t):
        totaltime+=60*b[i][0]+b[i][1]  #将小时均转化为分钟
    return float(totaltime/t)


if __name__=='__main__':
    global numb
    numb=0                     #开始服务人数为0
    time=Time()                #创建时间
    counter=creatcounter()     #创建柜台
    waitingqueue=deque()       #创建等待队列
    staytime=[]                #记录客户逗留时间列表
    print('银行九点开门,十七点停业,客户进门状况如下:')
    while time.hour<17:
        new_guest=pguest()                                 #随机确认是否来客人
        if new_guest:
            guest=Guest(new_guest,time.hour,time.minute)   #通过随机数建立客人的业务要求,到达时间
            showTicket(guest)                              #展示客人票据
            waitingqueue.append(guest)                     #将客人加入等待序列中
        guest1=entercounter(time,counter,waitingqueue)     #检查柜台是否空余,返回队列中第一位客户或者None
        if guest1:
            b=choosecounter(counter,guest1,time)           #客户进入空柜台,并且柜台统计客人数及业务
            staytime.append(b)                             #将逗留时间添加入表
        time.timechange()
    print("十七点停止取票,并且仅完成柜台正在办理客户,后续等待客户无法办理业务。")
    r=len(waitingqueue)                                    #记录等待队列人数
    average=average_time(staytime)
    print()
    print('今日接待客户数为%d,剩余%d个客户未完成'%(numb,r))
    print('客户平均逗留时间为%0.1f分钟'%average)
    print(' 柜台编号   服务总人数  存款业务人数  取款业务人数  挂失业务人数 还贷业务人数 ')
    for i in range(4):
        print(' %d号柜台'%(i+1),end='')
        counter[i].displaywork()

这个地方错了:

        if timem==60: 所有的这个判断都要改成 timem >= 60
            timeh+=1
            timem-=60

1.在函数entercounter()中,检查空柜台的循环范围错误。当前代码是从0到3,但是柜台列表counter的索引是从1到4。你需要将循环范围修改为range(4)。

for i in range(4):


2.在函数choosecounter()中,计算柜台服务时间时,你使用了客户抵达时间和结束时间的差值作为逗留时间。然而,客户抵达时间的小时和分钟是整数,结束时间的小时和分钟是增加后的值,可能会超过60。这会导致计算出的逗留时间不准确。你可以改为计算客户业务结束时间的分钟数,并将其减去客户抵达时间的分钟数,得到逗留时间。

return [(timeh - guest.arrivehour) * 60 + (timem - guest.arriveminute)]


看看行不行

如果你选择空柜台是随机的话,那结果就不是编号越前服务人数越多了