题目

  • 设计并实现一个简单的银行账户管理系统,具有以下功能:
    • 记录用户的账户信息,包括账户名,账户号码和余额
    • 允许用户进行存款和取款操作
    • 允许用户查询账户余额
    • 请设计响应的类和方法,并编写代码实现该银行账户管理系统。

思路

  1. 首先设计一个账户类:Account,类中包含账户ID、用户名、用户密码和账户金额 成员
  2. 再设计另外一个账户管理类
    • 成员: 账户(Account)、存储账户信息的文件及操作的金额(取钱或者存钱的金额)
    • 成员函数:
      • createAccount() – 创建新账户,账户的ID会自动生成

      • getAccount() – 查询账户,获取账户信息

      • updateData() – 更新数据

      • drawMoney() – 取钱

      • saveMoney() – 存钱

      • getMaxAccoutID() – 获取最大用户ID

  3. 定义一个AccountManageSystem()函数,主要用来提供一些人机交互,并实现人机交互相关动作背后的功能

注意

  • 在运行的时候,需要在和代码文件同目录下创建一个名为’AccountInfo.txt’文件。

代码

import osfrom typing import Anyclass Account: #账户类def __init__(self, **kwargs):#构造函数self.accountID = kwargs.get("accountID") #账户IDself.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() #获取文件最后的账户IDif strAccountID == "空文件":#空文件self.account.accountID = "A000001" #第一个账户IDprint("test debug:"+self.account.name)else:#非空文件tempID =int(strAccountID[1:])+1#账户ID+1self.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#找到账户,返回truereturn False #没找到账户,返回falsedef 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  str:if self.getAccount():#得到用户账户信息self.account.blance += self.operMoney#余额更新self.updateData()#更新数据return "存款成功,存款后余额为:%.2f" %self.account.blance #返回结果def getMaxAccoutID(self) -> str: #获取最大用户IDwith 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 IDdef 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  0:#金额大于0break#退出循环else:#输入金额不大于0print("首次存款必须大于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 = ""#操作完成,清空对象IDaccount.name = "" #操作完成,清空对象用户名account.password = "" #操作完成,清空对象密码account.blance = 0#操作完成,清空对象金额tmpName = ""#临时变量,用来存储用户名tmpPwd = "" #临时变量,用来存储用户密码tmpBlance = 0.0 #临时变量,用来存储用户账户金额else: #系统账户用户名或者密码错误print("系统管理员用户名或者密码错误")#提示信息elif num == 2:#查询账户account.accountID = input("请输入账户ID:") #获取输入的账户IDaccount.password = input("请输入账户密码:")#获取输入的账户IDif accMang.getAccount():#找到账户print("\n-----查询结果如下-----")#打印查询信息print("你好,%s"%account.name)#打印查询信息print("账户余额为:%.2f\n"%account.blance) #打印查询信息account.accountID = ""#操作完成,清空对象IDaccount.name = "" #操作完成,清空对象用户名account.password = "" #操作完成,清空对象密码account.blance = 0#操作完成,清空对象金额else: #账户或者密码错print("账户ID不存在或者密码错误!\n") #提示信息elif num == 3:#存钱account.accountID = input("请输入账户ID:") #获取输入的账户IDaccount.password = input("请输入账户密码:")#获取输入的账户IDif accMang.getAccount():#找到账户print("你好,%s"%account.name)#打印当前信息print("账户余额为:%.2f\n"%account.blance) #打印当前信息while True:#当存款金额不符合要求,循环输入try:tmpBlance = float(input("请输入存款金额:")) #获取输入的存款金额except ValueError as err:#捕捉到异常print("金额输入错误,请重新输入!") #提示用户输入错误else:#输入可以转换为floatif tmpBlance > 0:#金额大于0account.blance += tmpBlance#更新存款金额accMang.updateData() #最近的金额写入文件print("\n-----存款成功-----") #打印提示信息print("存款后,账户余额为:%.2f\n"%account.blance) #打印存款信息account.accountID = "" #操作完成,清空对象IDaccount.name = ""#操作完成,清空对象用户名account.password = ""#操作完成,清空对象密码account.blance = 0 #操作完成,清空对象金额break#退出循环else:#输入金额不大于0print("存款必须大于0,请重新输入!") #提示重新输入else: #账户或者密码错print("账户ID不存在或者密码错误!\n") #提示信息elif num == 4:#取钱account.accountID = input("请输入账户ID:") #获取输入的账户IDaccount.password = input("请输入账户密码:")#获取输入的账户IDif accMang.getAccount():#找到账户print("你好,%s"%account.name)#打印当前信息print("账户余额为:%.2f\n"%account.blance) #打印当前信息while True:#当存款金额不符合要求,循环输入try:tmpBlance = float(input("请输入取款金额:")) #获取输入的取款金额except ValueError as err:#捕捉到异常print("金额输入错误,请重新输入!") #提示用户输入错误else:#输入可以转换为floatif tmpBlance > 0:#金额大于0if tmpBlance <= account.blance:#取款金额小于等于账户金额account.blance -= tmpBlance#更新存款金额accMang.updateData() #最近的金额写入文件print("\n-----取款成功-----") #打印提示信息print("取款后,账户余额为:%.2f\n"%account.blance) #打印存款信息account.accountID = "" #操作完成,清空对象IDaccount.name = ""#操作完成,清空对象用户名account.password = ""#操作完成,清空对象密码account.blance = 0 #操作完成,清空对象金额break#退出循环else:#取款金额大于账户余额print("取款金额大于账户余额不能取款!")#提示信息else:#输入金额不大于0print("存款必须大于0,请重新输入!") #提示重新输入else: #账户或者密码错print("账户ID不存在或者密码错误!\n") #提示信息elif num == 5:#退出系统break #退出循环if __name__ == "__main__":AccountManageSystem()