本文为分享大学时课程作,代码文章全部纯手码,如有纰漏或错误请见谅。
目录
1.流程分析
项目需要定义类来模拟ATM机的工作流程,通过观察ATM机的主要业务为读卡验证、取款、存款、转账、汇款(无卡存款)、改密、余额查询等主要业务。其中绝大多数业务离不开银行卡。卡在ATM机中主要供机器识别因此我们需要将银行卡实例化。我这里将银行卡设置为卡号的存储器,通过卡中的卡号与系统卡号校验模拟,插卡校验的过程。在校验时ATM要访问系统中存储的用户数据,因此我将每一条用户数据实例化存在系统中方面其他业务的调用。ATM机要负责所以的业务,并且会有多台ATM在工作每台ATM中存放着不同量的现金,因此ATM的实例化也至关重要。
ATM机的工作流程如图1-1所示:
图1-1ATM机工作流程
2.类设计
Python类的定义及应用,项目所需类设计说明(属性、方法等)
定义银行卡类BankCard(),在该定义实施例属性卡号cardid。
定义用户数据类CardData(),定义一个类属性卡号CardID使其自增保证生成的数据卡号都不相同。定义实例属性卡号、用户名、密码、余额,将类属性卡号赋值于实例属性卡号。将实例化的类对象添加至用户数据列表中。
定义ATM的业务类ATM():定义类属性用户数据列表BankSys与实例属性ATM机余额Money初始值为50000、ATM机中的卡Card初始值为空、验证verify设为False;
定义插卡验证方法chaka(self,card,passwprd)传入实例化银行卡对象与密码,从用户数据列表中校验卡号与密码,如果卡号与密码正确则定义实例属性Carddata为匹配的用户数据对象、verify为True并返回该实例对象,如何卡号或密码错误则打印相应语句,定义实例属性verify为False返回值为空;
定义余额查询方法CCYE(self)当verify为True时打印、返回实例属性Carddata的余额self.Carddata.RemainingSum。
定义存款方法SaveMoney(self,money)传入存入金额,当verify为True时使卡余额self.Carddata.RemainingSum+=money、ATM余额self.Money += money,返回交易记录;
定义取款方法withdrawal(self,money)传入取款金额当verify为True时并且ATM余额大于取款金额、卡余额大于取款金额使卡余额减去取款self.Carddata.RemainingSum-=money、ATM余额减去取款self.Money -= money,返回交易记录;
定义ChangePW(self,oidpassword,newpassword1,newpassword2)密码修改函数传入旧密码余两个新密码,当verify为True时并且该对象的密码等于传入旧密码、两个新密码相等时使该对象的密码等于新密码self.Carddata.Password=newpassword1;
定义卡号查询方法CardQuery(self,cardid)传如查询的卡号,从用户数据列表中查询对应卡号的对象,返回打印对应对象的用户名代用户验证,用户验证通过后返回对应数据对象,否则返回为空;
定义转账方法def EFT(self ,cardid, money)传入卡号、转账金额,当verify为True时调用卡号查询方法CardQuery(self,cardid)传入卡号当返回值不为空时并且该账号余额大于转账金额该对象余额减转账金额,查询对象余额加转账金额返回交易记录;
定义汇款(无卡存款)方法remittance(self, cardid, money)传入卡号、汇款金额,调用卡号查询方法CardQuery(self,cardid)传入卡号当返回值不为空时查询对象余额加汇款金额,ATM余额加汇款余额,返回交易记录;
定义退卡函数tuika(self):使self.Card=None、self.Carddata=None、self.verify=False
定义一个客户端类ATM_client(ATM)继承ATM类,实现ATM机业务的键盘交互与回滚。
定义客户端插卡验证函数C_chaka(self,card)通过input与调用ATM中chaka(card,passwprd)函数实现密码的键盘输入,并实现业务回滚。
定义票据打印函数C_PrintNote(self,note)便于存款、取款、转账、汇款时的票据打印。
定义存款函数C_SaveMoney(self):调用C_PrintNote(self,note)函数与ATM类中SaveMoney(money)函数实现存款业务与其的票据打印。
定义取款函数C_withdrawal(self):实现金额输入、业务回滚、票据打印。
定义定义改密函数C_ChangePW(self):实现新旧密码的输入,调用ATM类中ChangePW(oldpassword,newpassword1,newpassword2)函数实现验证与更改,并实现业务的回滚。
定义转账函数C_EFT(self):实现卡号和金额的输入调用ATM中EFT(cardid,money)函数实现,并且实现业务回滚。
定义汇款方法C_remittance(self):实现卡号金额的输入调用ATM类中remittance(cardid,money)实现业务,并且使业务实现回滚。
定义实现业务键盘交互与回滚的关键函数C_JH(self):设置7个不同输入对应不用业务。
3.代码实现
import sys
#定义一个银行卡类
class BankCard():
CardID=str
def __init__(self,cardid):
self.CardID=cardid
#卡信息的类
class CardData():
CardID = "1001"
def __init__(self,username,password,remainingsum):#用户名、密码、余额
self.CardID=self.CardID
self.UserName=username
self.Password=password
self.RemainingSum=remainingsum
ATM.BankSys.append(self)
# print(self.CardID)
CardData.CardID=str(int(self.CardID)+1)
#定义一个ATM类
class ATM():
BankSys=[]
def __init__(self):
self.Money=50000
self.Card=None
self.verify = False
#定义一个插卡验证方法
def chaka(self,card,passwprd):
for carddata in self.BankSys:
# print(carddata.CardID,self.Card.CardID)
if self.Card==None or self.Card==card:
if carddata.CardID==card.CardID:
self.Card = card
if carddata.Password==passwprd:
self.Carddata=carddata
self.verify=True
return self
else:
print("密码错误")
return
else:
return
print("卡号错误")
return
#退卡函数
def tuika(self):
self.Card=None
self.Carddata=None
self.verify=False
#余额查询方法
def CCYE(self):
if self.verify:
print(self.Carddata.RemainingSum)
return self.Carddata.RemainingSum
#存款方法
def SaveMoney(self,money):
if self.verify:
self.Carddata.RemainingSum+=money
self.Money+=money
print("存款成功")
return self.Card.CardID+"存款"+str(money)
#取款方法
def withdrawal(self,money):
if self.verify:
if self.Money>=money:
if self.Carddata.RemainingSum >= money:
self.Carddata.RemainingSum-=money
self.Money -= money
print("取款成功")
return self.Card.CardID+"取款"+str(money)
else:
print("!!账户余额不足!!")
return 1
else:
print("!!ATM余额不足无法服务!!")
return -1
#修改密码方法
def ChangePW(self,oldpassword,newpassword1,newpassword2):
if self.verify:
if self.Carddata.Password==oldpassword:
if newpassword1==newpassword2:
self.Carddata.Password=newpassword1
print("修改成功")
return True
else:
print("!!两个新密码不相同!!")
return 1
else:
print("!!密码错误!!")
return -1
#卡号查询方法
def CardQuery(self,cardid):
for carddata in self.BankSys:
if carddata.CardID == cardid:
print("用户名为:",carddata.UserName)
verify=input()
if verify=='0':
return carddata
else:
return
print("!!卡号错误!!")
return
#转账方法
def EFT(self ,cardid, money):
if self.verify:
C_Carddata = self.CardQuery(cardid)
if C_Carddata!=None:
if self.Carddata.RemainingSum>=money:
self.Carddata.RemainingSum -= money
C_Carddata.RemainingSum+=money
return self.Card.CardID+"转账"+cardid+"金额:"+str(money)
else:
print("!!余额不足!!")
return
else:
return
# 汇款方法
def remittance(self, cardid, money):
C_Carddata = self.CardQuery(cardid)
if C_Carddata != None:
C_Carddata.RemainingSum += money
self.Money += money
return "汇款"+cardid+"金额:"+str(money)
else:
return
#定义一个客户端类
class ATM_client(ATM):
#定义插卡
def C_chaka(self,card):
print("--------------------欢迎使用----------------------")
passwprd = input("请输入密码:")
if self.chaka(card,passwprd) == None:
self.C_chaka(self.Card)
else:
self.C_JH()
#定义票据打印
def C_PrintNote(self,note):
x = input("打印票据请输入 1 ,退出请按任意键")
if x == "1" :
print(note)
if self.verify:
self.C_JH()
else:
sys.exit()
else:
if self.verify:
self.C_JH()
else:
sys.exit()
#定义存款
def C_SaveMoney(self):
money=int(input("请输入存款金额:"))
note=self.SaveMoney(money)
self.C_PrintNote(note)
#定义取款
def C_withdrawal(self):
money=int(input("请输入取款金额:"))
note=self.withdrawal(money)
if note != 1 and note!= -1:
self.C_PrintNote(note)
elif note==1:
if input("回车继续") != '':
self.C_JH()
else:
self.C_withdrawal()
elif note==-1:
self.C_JH()
#定义改密
def C_ChangePW(self):
oldpassword=input("请输入原始密码:")
newpassword1=input("请输入新密码:")
newpassword2=input("请再次输入新密码验证:")
X=self.ChangePW(oldpassword,newpassword1,newpassword2)
if X :
self.C_JH()
elif input("回车继续") != '':
self.C_JH()
else:
self.C_ChangePW()
#定义转账
def C_EFT(self):
cardid=input("请输入转账卡号:")
C_Carddata = self.CardQuery(cardid)
if C_Carddata is not None:
money=int(input("请输入转账金额:"))
note=self.EFT(cardid,money)
if note is not None:
self.C_PrintNote(note)
elif input("回车继续") != '':
self.C_JH()
else:
self.C_EFT()
elif input("回车继续") != '':
self.C_JH()
else:
self.C_EFT()
#定义汇款
def C_remittance(self):
cardid=input("请输入汇款卡号:")
C_Carddata = self.CardQuery(cardid)
if C_Carddata is not None:
money=int(input("请放入现金:"))
note=self.remittance(cardid,money)
self.C_PrintNote(note)
elif input("回车继续") != '':
if self.verify:
self.C_JH()
else:
self.tuika()
else:
self.C_remittance()
def C_JH(self):
n = input("查询余额请输入1 存款请输入2\n取款请输入3 改密业务请输入4\n转账请输入5 汇款请输入6\n退卡请输入0\n请输入:")
if n=="1":
self.CCYE()
self.C_JH()
elif n=="2":
self.C_SaveMoney()
elif n=="3":
self.C_withdrawal()
elif n=="4":
self.C_ChangePW()
elif n=="5":
self.C_EFT()
elif n=="6":
self.C_remittance()
elif n=="0":
print("--------------------谢谢使用----------------------")
self.tuika()
# sys.exit()
return
else:
print('!!请输入正确服务号!!')
self.C_JH()
4.测试
#ATM类测试
#定义三条用户数据对象与对应的卡对象
cardDT1=CardData("xcx","010328",100);card1=BankCard("1001")
cardDT2=CardData("xxx","123456",100);card2=BankCard("1002")
cardDT3=CardData("xxx","123456",100);card3=BankCard("1003")
#定义三个ATM机
atm1=ATM();atm2=ATM();atm3=ATM()
print("----------------用户一---------------")
atm1_1=atm1.chaka(card1,"010328")#用户一在ATM机atm1插卡1验证
print(atm1_1.SaveMoney(1000))#用户一存款1000元
print(atm1_1.EFT("1002",500))#用户向用户二转账500
print("余额为:",atm1_1.CCYE())#用户一查询余额
atm1_1.tuika()#用户一退卡
print("++++++++++++++++atm1++++++++++++++++")
print("atm1余额为:",atm1.Money)#打印ATM机atm1的余额
print("----------------用户二---------------")
atm2_1=atm2.chaka(card2,"123456")#用户二在ATM机atm2插卡验证
print("余额为:",atm2_1.CCYE())#用户二查询余额
print(atm2_1.withdrawal(400))#用户二取款400
print(atm2_1.ChangePW("123456","654321","654321"))#用户二修改密码
atm2_1.tuika()#用户二退卡2
print(atm2.remittance("1003",800))#用户二向卡3汇款800
atm3_1=atm3.chaka(card2,"654321")#用户二在ATM机atm3上插入卡2验证(新密码)
print("余额为:",atm3_1.CCYE())#用户二查询余额
print("++++++++++++++++atm2++++++++++++++++")
print(atm2.Card)#打印ATM机atm2中卡
print("atm2余额为:",atm2.Money)#打印ATM机atm2的余额
print("++++++++++++++++atm3++++++++++++++++")
print(atm3.Card)#打印ATM机atm3中卡
测试结果如图4-1所示
#ATM_client(ATM)类测试
atm1=ATM_client()
atm1.C_chaka(card1)