HJ98 自动售货系统 模拟(用类实现模拟)

发布时间 2023-05-04 15:00:21作者: Aneverforget

模拟主要考的是类的组织与实现。

#其中非传入参数可以不作为实例变量,有个问题就是在后面方法调用参数需要另外传入变量。

#如果一个方法作为类参数,在方法中使用需要用类名的方法引用。

如本体,若字典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