# 自动售货系统,详见注解 good_value = [2,3,4,5,8,6] coin_value = [1,2,5,10] input = 'r 22-18-21-21-7-20 3-23-10-6;c;q0;p 1;b A6;c;b A5;b A1;c;q1;p 5;' input = 'r 28-12-11-1-16-10 19-30-8-11;b A1;p 1;' L = input.strip().split(';') left = 0 # 这里要维护一个已投币总额,或购物剩余的一个变量left for com in L: if com: # 最后一个分号;后面为空,排除 #--------------------------------------------------------------------- # 命令合法检查 if com[0] not in 'rpbcq': print('E010:Parameter error') continue else: if com[0] in 'rpbq' and com[1] != ' ': print('E010:Parameter error') continue if com[0] == 'c' and len(com) != 1: print('E010:Parameter error') continue #--------------------------------------------------------------------- # 初始化:长度不合法提示 if com[0]=='r': good_num,coin_num = com[2:].strip().split() good_num = list(map(int,good_num.split('-'))) # A1~A6 coin_num = list(map(int,coin_num.split('-'))) # 1,2,5,10 #print('good_value=',good_value) #print('good_num=',good_num) #print('coin_value=',coin_value) #print('coin_num=',coin_num) if len(good_num)==6 and len(coin_num)==4: print('S001:Initialization is successful') else: print('E010:Parameter error') #--------------------------------------------------------------------- # 投币 if com[0]=='p': coin = int(com[2:].strip()) #print('>> coin=',coin) if not(coin==1 or coin==2 or coin==5 or coin==10): # 只接受1,2,5,10的投币 print('E002:Denomination error') elif (coin==5 or coin==10) and coin_value[0]*coin_num[0] + coin_value[1]*coin_num[1] < coin: # 投5,10币时检查1,2元币是否足够找零 print('E003:Change is not enough, pay fail') elif sum(good_num)==0: print('E005:All the good_num sold out') else: # 投币成功后,钱币数量加1,投币总额增加 if coin==1: coin_num[0] += 1 if coin==2: coin_num[1] += 1 if coin==5: coin_num[2] += 1 if coin==10: coin_num[3] += 1 left += coin #print('coin_num=',coin_num) print('S002:Pay success,balance='+str(left)) # 提示投币总额 #print('----post-left=',left) #--------------------------------------------------------------------- # 购物 if com[0]=='b': buy = com[2:].strip() #print('>> buy=',buy) good_name = ['A1','A2','A3','A4','A5','A6'] if buy not in good_name: print('E006:Goods does not exist') elif good_num[good_name.index(buy)]==0: print('E007:The goods sold out') elif left < good_value[good_name.index(buy)]: print('E008:Lack of balance') else: # 购物成功后,投币总额减少,货物数量减1 left -= good_value[good_name.index(buy)] good_num[good_name.index(buy)] -= 1 #print('left=',left) #print('good_num=',good_num) print('S003:Buy success,balance='+str(left)) # 提示投币总额 #print('----buy-left=',left) #--------------------------------------------------------------------- # 退币 # if com[0]=='c': #print('>> change') if left == 0: print('E009:Work failure') elif left > 0: c1 = left%10%5%2 # 找零规则,类似于进制转换算法,通过整除和余数实现 c2 = left%10%5//2 c5 = left%10//5 c10 = left//10 # coin_value[0]*coin_num[0] + coin_value[1]*coin_num[1] < coin: # 投5,10币时检查1,2元币是否足够找零 # 按正常逻辑,上面这条规则保证了,当1元钱币不够时,coin_num[0]==-1,此时强制coin_num[0]=0,c1=0,欠用户1元 if coin_num[0]-c1 < 0: coin_num[0] = 0 c1 = 0 else: coin_num[0] -= c1 coin_num[1] -= c2 coin_num[2] -= c5 coin_num[3] -= c10 print('1 yuan coin number='+str(c1)) print('2 yuan coin number='+str(c2)) print('5 yuan coin number='+str(c5)) print('10 yuan coin number='+str(c10)) #print('coin_num=',coin_num) left -= (c1+ 2*c2 + 5*c5 + 10*c10) #print('----change-left=',left) #--------------------------------------------------------------------- # 查询 if com[0]=='q': query = int(com[2:].strip()) #print('>> query=',query) if query==0: tmp = [['A1 2 ',good_num[0]], ['A2 3 ',good_num[1]], ['A3 4 ',good_num[2]], ['A4 5 ',good_num[3]], ['A5 8 ',good_num[4]], ['A6 6 ',good_num[5]]] tmp = sorted(tmp,key=lambda x:x[1],reverse=1) # 按货物数量排序 for i in range(6): print(tmp[i][0]+str(tmp[i][1])) if query==1: print('1 yuan coin number='+str(coin_num[0])) print('2 yuan coin number='+str(coin_num[1])) print('5 yuan coin number='+str(coin_num[2])) print('10 yuan coin number='+str(coin_num[3]))