HJ98 自动售货系统 模拟(用类实现模拟)
模拟主要考的是类的组织与实现。
#其中非传入参数可以不作为实例变量,有个问题就是在后面方法调用参数需要另外传入变量。
#如果一个方法作为类参数,在方法中使用需要用类名的方法引用。
如本体,若字典d放入类中,作为类变量,则引用时形式为sale.d
作为实例变量,引用时形式为self.d
#模拟一个自动售货系统,
实现投币,购买,退币,查询库存商品,查询存钱盒信息功能
实现思路:
#初始化参数:
商品数量,价格,纸币面额,张数。
#退币原则:
纸币张数最少,若零钱不足,因尽最大可能退币减少顾客损失。
该纸币面额设置符合贪心算法,因此采用贪心算法。
#投币说明
投币余额:每次投入面额累加到投余额。
存钱盒:投币后存钱盒面额相应增加,也就是可找零的钱
#退余额
退币余额遵循退币原则,退币成功后退币余额清0,
同时扣除存钱盒相应金额
购买商品操作说明:
一次只可以买一件,购买成功后,商品数量减1,投币余额扣除本次价格
操作说明(输入说明):
命令字与第一个参数间使用一个空格分隔,多条命令采用分号隔开
不考虑非法输入
1 ''' 2 测试案例 3 输入 4 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; 5 输出 6 S001:Initialization is successful 7 E009:Work failure 8 E010:Parameter error 9 S002:Pay success,balance=1 10 E008:Lack of balance 11 1 yuan coin number=1 12 2 yuan coin number=0 13 5 yuan coin number=0 14 10 yuan coin number=0 15 E008:Lack of balance 16 E008:Lack of balance 17 E009:Work failure 18 E010:Parameter error 19 S002:Pay success,balance=5 20 ''' 21 class sale(): #一个自动售货系统 22 def __init__(self,init1,init2): 23 self.num=0 24 self.temp=[2,3,4,5,8,6]#对应商品价格 25 self.init1=list(map(int,init1))#对应商品数量 26 self.init2=list(map(int,init2))[::-1]#1,2,5,10面额数目取反10,5,2,1 27 self.dnum={10:0,5:1,2:2,1:3}#获取面额数目列表下标 28 self.l1=[]#退给顾客的零钱 29 self.goods=['A1','A2','A3','A4','A5','A6'] 30 def pay(self,num): 31 if num!=1 and num!=2 and num!=5 and num!=10: 32 print(d['E002']) 33 elif self.init2[2]*2+self.init2[3]<num: 34 print(d['E003']) 35 elif sum(self.init1)==0: 36 print(d['E005']) 37 else: 38 self.num=self.num+num #可用余额 39 self.init2[self.dnum[num]]+=1 #存钱数列数目加1 40 X=self.num 41 print(d['S002'].format(X)) 42 def buy(self,good): 43 self.good=good 44 if self.good not in self.goods: 45 print(d['E006']) 46 elif self.init1[self.goods.index(self.good)]==0: 47 print(d['E007']) 48 elif self.num<self.temp[self.goods.index(self.good)]: 49 print(d['E008']) 50 else: 51 self.num=self.num-self.temp[self.goods.index(self.good)]#剩余钱币减少 52 X=self.num 53 print(d['S003'].format(X)) 54 def change(self): 55 self.l1=[] 56 while self.num>=1: 57 if self.num//10>0: 58 if self.init2[self.dnum[10]]>=self.num//10: 59 self.init2[self.dnum[10]]-=self.num//10#存钱盒数列数目减少 60 self.l1.append(self.num//10) 61 self.num-=self.num//10*10 62 else: 63 self.l1.append(self.init2[self.dnum[10]]) 64 self.num-=self.init2[self.dnum[self.num]]*10 65 self.init2[self.dnum[10]]=0#存钱盒数列数目减少 66 else: 67 self.l1.append(0) 68 if self.num//5>0: 69 if self.init2[self.dnum[5]]>=self.num//5: 70 self.init2[self.dnum[5]]-=self.num//5#存钱盒数列数目减少 71 self.l1.append(self.num//5) 72 self.num-=self.num//5*5 73 else: 74 self.l1.append(self.init2[self.dnum[5]]) 75 self.num-=self.init2[self.dnum[5]]*5 76 self.init2[self.dnum[5]]=0#存钱盒数列数目减少 77 else: 78 self.l1.append(0) 79 if self.num//2>0: 80 if self.init2[self.dnum[2]]>=self.num//2: 81 self.init2[self.dnum[2]]-=self.num//2#存钱盒数列数目减少 82 self.l1.append(self.num//2) 83 self.num-=self.num//2*2 84 else: 85 self.l1.append(self.init2[self.dnum[2]]) 86 self.num-=self.init2[self.dnum[2]]*2 87 self.init2[self.dnum[2]]=0#存钱盒数列数目减少 88 else: 89 self.l1.append(0) 90 if self.num>0: 91 if self.init2[self.dnum[1]]>=self.num: 92 self.init2[self.dnum[1]]-=self.num#存钱盒数列数目减少 93 self.l1.append(self.num) 94 self.num-=self.num#全部找零 95 else: 96 #self.l1.append(self.init2[self.dnum[self.num]]) 97 self.l1.append(self.num)#退币数量 98 self.init2[self.dnum[1]]=0#存钱盒数列数目减少 #顾客损失钱 99 else: 100 self.l1.append(0) 101 def withdrawc(self): 102 if self.num<=0: 103 print(d['E009']) 104 else: 105 self.change() #在类中引用类方法,self变量不需要传入 106 self.out=self.l1 107 self.output=f"1 yuan coin number={self.out[3]};\ 108 2 yuan coin number={self.out[2]};\ 109 5 yuan coin number={self.out[1]};\ 110 10 yuan coin number={self.out[0]}".split(";") 111 for i in self.output: 112 print(i) 113 def query(self,p): 114 self.forq=list(zip(self.goods,self.temp,self.init1)) 115 if p!='0' or p!='1': 116 print(d['E010']) 117 elif p=='0': 118 for i in self.forq: 119 print(" ".join(str,i)) 120 elif p=='1': 121 #self.init2 122 self.output=f"1 yuan coin number={self.init2[3]};\ 123 2 yuan coin number={self.init2[2]};\ 124 5 yuan coin number={self.init2[1]};\ 125 10 yuan coin number={self.init2[0]}".split(";") 126 for i in self.output: 127 print(i) 128 #提示语词典 129 d={"S001":"S001:Initialization is successful", 130 "S002":"S002:Pay success,balance={0}", 131 "S003":"S003:Buy success,balance={0}", 132 "E002":"E002:Denomination error", 133 "E003":"E003:Change is not enough, pay fail", 134 "E005":"E005:All the goods sold out", 135 "E006":"E006:Goods does not exist", 136 "E007":"E007:The goods sold out", 137 "E008":"E008:Lack of balance", 138 "E009":"E009:Work failure", 139 'E010':'E010:Parameter error' } 140 #处理输入 141 never=input() 142 #never='r 27-29-1-29-17-8 3-6-27-28;b A5;c;p 10;p 2;c;q1;c;q0;b A3;b A4;c;q0;b A1;b A6;q1;p 10;b A6;b A5;p 1;b A5;c;c;b A2;p 1;p 1;p 10;' 143 l=never.split(";") 144 l.remove('') 145 a=l[0].split() 146 if a[0]=='r': 147 print(d['S001']) 148 else: 149 print('ERROR') 150 init1=list(map(int,a[1].split("-"))) 151 init2=list(map(int,a[2].split("-"))) 152 inp1=[] 153 for i in l[1:]: 154 try: 155 inp1.append(i.split()) 156 except: 157 inp1.append([i]) 158 inst=sale(init1,init2) 159 #print(inp1) 160 for i in inp1: 161 if i[0]=='p': 162 inst.pay(int(i[1])) 163 #print(int(i[1])) 164 elif i[0]=='b': 165 inst.buy(i[1]) 166 elif i[0]=='c': 167 inst.withdrawc() 168 elif 'q' in i[0]: 169 #print(i) 170 try: 171 temp=i[1] 172 inst.query(temp) 173 except: 174 inst.query('2') 175