题目
- 设计并实现一个简单的银行账户管理系统,具有以下功能:
- 记录用户的账户信息,包括账户名,账户号码和余额
- 允许用户进行存款和取款操作
- 允许用户查询账户余额
- 请设计响应的类和方法,并编写代码实现该银行账户管理系统。
思路
- 首先设计一个账户类:Account,类中包含账户ID、用户名、用户密码和账户金额 成员
- 再设计另外一个账户管理类
- 成员: 账户(Account)、存储账户信息的文件及操作的金额(取钱或者存钱的金额)
- 成员函数:
-
createAccount() - 创建新账户,账户的ID会自动生成
-
getAccount() - 查询账户,获取账户信息
-
updateData() - 更新数据
-
drawMoney() - 取钱
-
saveMoney() - 存钱
-
getMaxAccoutID() - 获取最大用户ID
-
-
定义一个AccountManageSystem()函数,主要用来提供一些人机交互,并实现人机交互相关动作背后的功能
注意
- 在运行的时候,需要在和代码文件同目录下创建一个名为'AccountInfo.txt'文件。
代码
import os
from typing import Any
class Account: #账户类
def __init__(self, **kwargs): #构造函数
self.accountID = kwargs.get("accountID") #账户ID
self.name = kwargs.get("name") #用户名
self.password = kwargs.get("password") #用户密码
self.blance = kwargs.get("blance") #账户金额
def __str__(self) -> str: #重写__str__
return str(self.accountID)+","+str(self.name)+","+str(self.password)+","+str(self.blance)+"\n" #返回组合后字符串
class AccountManagement:
def __init__(self, **kwargs):
self.account = kwargs.get("account") #账户
self.filePath = kwargs.get("filePath") #存储账户信息的文件
self.operMoney = kwargs.get("operMoney") #操作的金额
def createAccount(self): #创建新账户
with open(file=self.filePath, mode="a") as file: #打开存储账户信息的文件
strAccountID = self.getMaxAccoutID() #获取文件最后的账户ID
if strAccountID == "空文件": #空文件
self.account.accountID = "A000001" #第一个账户ID
print("test debug:"+self.account.name)
else: #非空文件
tempID = int(strAccountID[1:])+1 #账户ID+1
self.account.accountID = "A"+f'{tempID:0>6}' #格式化
#print("test debug2:"+self.filePath)
file.write(self.account.__str__()) #新的账户写入文件
def getAccount(self): #查询账户,获取账户信息
with open(file=self.filePath, mode="r") as file: #打开文件
for line in file: #逐行遍历
if(line.find(self.account.accountID) != -1) and (line.find(self.account.password) != -1):#找到用户ID且密码正确
self.account.name = line.split(",")[1] #获取账户用户名
self.account.blance = float(line.split(",")[3]) #获取用户账户金额
return True #找到账户,返回true
return False #没找到账户,返回false
def updateData(self): #更新数据
with open(file=self.filePath, mode="r",encoding="utf-8") as f1, open("%s.bak"%self.filePath,mode="w",encoding="utf-8") as f2:#打开文件
for line in f1: #逐行遍历
if line.find(self.account.accountID) != -1: #找到原账户信息
f2.write(self.account.__str__()) #新文件中写入账户的新信息
else: #不是原账户
f2.write(line) #直接写入
os.remove(self.filePath) #移除老文件
os.rename("%s.bak"%self.filePath,self.filePath) #更改新文件的文件名
def drawMoney(self) -> str: #取钱
if self.getAccount(): #得到用户账户信息
if(self.account.blance < self.operMoney): #当前账户余额小于取款金额
return "账户余额不足" #返回结果
else: #余额充足
self.account.blance -= self.operMoney #余额更新
self.updateData() #更新数据
return "取款成功,取款后余额为:%.2f" %self.account.blance #返回结果
def saveMoney(self) -> str:
if self.getAccount(): #得到用户账户信息
self.account.blance += self.operMoney #余额更新
self.updateData() #更新数据
return "存款成功,存款后余额为:%.2f" %self.account.blance #返回结果
def getMaxAccoutID(self) -> str: #获取最大用户ID
with open(file=self.filePath, mode="r") as f:
lines = len(f.readlines()) #计算文件行数
if(lines == 0): #空文件
return "空文件"
f.seek(0, 0) #移动文件读写指针到最后一行
for i in range(lines-1):
f.readline() #读取最后一行数据
last_line = f.readline() #最后一行值赋给变量
return last_line.split(",")[0] #返回最后一行Account ID
def AccountManageSystem():
account = Account() #创建已个账户类对象
accMang = AccountManagement() #创建账户管理类对象
accMang.account= account #赋值 - 账户
accMang.filePath = os.path.dirname(os.path.abspath(__file__))+"\AccountInfo.txt" #赋值 - 当前文件所在目录下的文件
tmpName = "" #临时变量,用来存储用户名
tmpPwd = "" #临时变量,用来存储用户密码
tmpBlance = 0.0 #临时变量,用来存储用户账户金额
while True:
print("欢迎使用银行账户管理系统,请选择(输入数字):") #交互提示信息
print("1--创建新的账户 2--查询账户余额") #交互提示信息
print("3--存钱 4--取钱") #交互提示信息
print("5--退出\n") #交互提示信息
while True:
try:
num = int(input("请输入:")) #提示用户输入
except ValueError as err: #捕捉到异常
print("输入错误!") #提示用户输入错误
else: #输入为数字
if num>=1 and num <=5: #输入数字为1~5
break #输入正常,退出循环
else: #输入错误
print("输入错误!") #提示用户输入错误
if num == 1: #创建新的账户
adminName = input("请输入系统管理员用户名:") #提示输入
adminPwd = input("请输入系统管理员密码:") #提示输入
if adminName == "admin" and adminPwd == "admin": #系统管理员账户和密码正确
#print("系统管理员为:%s" %adminName)
while True: #当用户名不符合要求,循环输入
tmpName = input("请输入用户名:") #获取输入的用户名
if tmpName != "": #用户名不为空
break #退出循环
else: #用户名为空
print("用户名不能为空,请重新输入!") #提示重新输入
while True: #当密码不符合要求,循环输入
tmpPwd = input("请设置用户密码(由字母和数字组成):") #获取第一次输入的密码
tmpPwd2 = input("请再次输入用户密码(由字母和数字组成):") #获取第二次输入的密码
if tmpPwd != "" and tmpPwd2 != "": #两次密码都不为空
if tmpPwd == tmpPwd2: #两次密码一致
if tmpPwd.isalnum(): #判断密码是否由字母和数字组成
break #退出循环
else: #含有除字母和数字之外的字符
print("密码只能由字母和数字组成,请重新输入!") #提示重新输入
else: #两次密码不一致
print("两次密码不一致,请重新设置!") #提示重新输入
else: #密码为空
print("密码不能为空,请重新输入!") #提示重新输入
while True: #当存款金额不符合要求,循环输入
try:
tmpBlance = float(input("请输入首次存款金额:")) #获取输入的存款金额
except ValueError as err: #捕捉到异常
print("金额输入错误,请重新输入!") #提示用户输入错误
else: #输入可以转换为float
if tmpBlance > 0: #金额大于0
break #退出循环
else: #输入金额不大于0
print("首次存款必须大于0,请重新输入!") #提示重新输入
account.name = tmpName #赋值
account.password = tmpPwd #赋值
account.blance = tmpBlance #赋值
accMang.createAccount() #创建新账户
print("\n-----账户创建成功,请牢记账户ID作为存取款的依据-----") #提示信息
print("当前账户ID为:%s"%account.accountID) #提示信息
print("当前账户余额为:%.2f\n"%account.blance) #提示信息
account.accountID = "" #操作完成,清空对象ID
account.name = "" #操作完成,清空对象用户名
account.password = "" #操作完成,清空对象密码
account.blance = 0 #操作完成,清空对象金额
tmpName = "" #临时变量,用来存储用户名
tmpPwd = "" #临时变量,用来存储用户密码
tmpBlance = 0.0 #临时变量,用来存储用户账户金额
else: #系统账户用户名或者密码错误
print("系统管理员用户名或者密码错误") #提示信息
elif num == 2: #查询账户
account.accountID = input("请输入账户ID:") #获取输入的账户ID
account.password = input("请输入账户密码:") #获取输入的账户ID
if accMang.getAccount(): #找到账户
print("\n-----查询结果如下-----") #打印查询信息
print("你好,%s"%account.name) #打印查询信息
print("账户余额为:%.2f\n"%account.blance) #打印查询信息
account.accountID = "" #操作完成,清空对象ID
account.name = "" #操作完成,清空对象用户名
account.password = "" #操作完成,清空对象密码
account.blance = 0 #操作完成,清空对象金额
else: #账户或者密码错
print("账户ID不存在或者密码错误!\n") #提示信息
elif num == 3: #存钱
account.accountID = input("请输入账户ID:") #获取输入的账户ID
account.password = input("请输入账户密码:") #获取输入的账户ID
if accMang.getAccount(): #找到账户
print("你好,%s"%account.name) #打印当前信息
print("账户余额为:%.2f\n"%account.blance) #打印当前信息
while True: #当存款金额不符合要求,循环输入
try:
tmpBlance = float(input("请输入存款金额:")) #获取输入的存款金额
except ValueError as err: #捕捉到异常
print("金额输入错误,请重新输入!") #提示用户输入错误
else: #输入可以转换为float
if tmpBlance > 0: #金额大于0
account.blance += tmpBlance #更新存款金额
accMang.updateData() #最近的金额写入文件
print("\n-----存款成功-----") #打印提示信息
print("存款后,账户余额为:%.2f\n"%account.blance) #打印存款信息
account.accountID = "" #操作完成,清空对象ID
account.name = "" #操作完成,清空对象用户名
account.password = "" #操作完成,清空对象密码
account.blance = 0 #操作完成,清空对象金额
break #退出循环
else: #输入金额不大于0
print("存款必须大于0,请重新输入!") #提示重新输入
else: #账户或者密码错
print("账户ID不存在或者密码错误!\n") #提示信息
elif num == 4: #取钱
account.accountID = input("请输入账户ID:") #获取输入的账户ID
account.password = input("请输入账户密码:") #获取输入的账户ID
if accMang.getAccount(): #找到账户
print("你好,%s"%account.name) #打印当前信息
print("账户余额为:%.2f\n"%account.blance) #打印当前信息
while True: #当存款金额不符合要求,循环输入
try:
tmpBlance = float(input("请输入取款金额:")) #获取输入的取款金额
except ValueError as err: #捕捉到异常
print("金额输入错误,请重新输入!") #提示用户输入错误
else: #输入可以转换为float
if tmpBlance > 0: #金额大于0
if tmpBlance <= account.blance: #取款金额小于等于账户金额
account.blance -= tmpBlance #更新存款金额
accMang.updateData() #最近的金额写入文件
print("\n-----取款成功-----") #打印提示信息
print("取款后,账户余额为:%.2f\n"%account.blance) #打印存款信息
account.accountID = "" #操作完成,清空对象ID
account.name = "" #操作完成,清空对象用户名
account.password = "" #操作完成,清空对象密码
account.blance = 0 #操作完成,清空对象金额
break #退出循环
else: #取款金额大于账户余额
print("取款金额大于账户余额不能取款!") #提示信息
else: #输入金额不大于0
print("存款必须大于0,请重新输入!") #提示重新输入
else: #账户或者密码错
print("账户ID不存在或者密码错误!\n") #提示信息
elif num == 5: #退出系统
break #退出循环
if __name__ == "__main__":
AccountManageSystem()