银行ATM模拟代码运行异常:余额显示/姓名存储等问题求助
ATM模拟代码问题修复
问题现象
- 输入B、D或W时,循环显示0.0而非输入的初始余额
- 姓名无法传入
printMenu(n),输出仅显示空白;若执行Name=printMenu(n),会打印输入的姓名但同时输出“none” - 取款、存款功能逻辑完全错误
问题根源
- 主程序中用户输入姓名和余额后,立即用
Name = ""、Balance = 0.0覆盖了初始值,导致后续操作使用的是0余额 printMenu函数无返回值,赋值给变量会得到None;且调用时传入的是被覆盖后的空字符串,所以显示空白withdraw函数缩进错误,余额修改代码在return之后永远不会执行,且取款逻辑逻辑颠倒- 主循环中各命令逻辑错误:
- B命令错误执行
Balance = Balance + Amount,未正确显示当前余额 - W命令使用了不存在的
withdrawl变量,逻辑混乱 - D命令错误执行
Deposit = Deposit + Balance,未正确更新余额
- B命令错误执行
修复后的完整代码
# april 8th, 2023 # bank atm def printMenu(n): print("*" * 40) print("welcome", n, "to the bank") print("W for the WITHDRAWAL, B for balance, D for deposit, Q for quit") print("*" * 40) def getTransaction(): retval = input("what would you like to do: ").strip().upper() return retval def formatCurrency(amt): return "${:,.2f}".format(amt) def withdraw(bal, amt): # 判断余额是否足够取款 if bal >= amt: return bal - amt else: print("Insufficient balance!") return bal # main program Name = input("name on your bank account: ") Balance = float(input("your current balance: ")) # 移除覆盖初始值的错误代码 Amount = 0.0 Command = "" printMenu(Name) Command = getTransaction() while Command != "Q": if Command == "B": # 显示当前余额,使用格式化函数 print("Current Balance:", formatCurrency(Balance)) elif Command == "W": try: Amount = float(input("Enter withdrawal amount: ")) Balance = withdraw(Balance, Amount) print("Withdrawal successful! New balance:", formatCurrency(Balance)) except ValueError: print("Invalid amount! Please enter a number.") elif Command == "D": try: Amount = float(input("Enter deposit amount: ")) if Amount > 0: Balance += Amount print("Deposit successful! New balance:", formatCurrency(Balance)) else: print("Deposit amount must be positive!") except ValueError: print("Invalid amount! Please enter a number.") else: print("Invalid command! Please enter W/B/D/Q.") printMenu(Name) Command = getTransaction() print("thank you for your transactions.")
修复说明
- 保留用户输入的初始姓名和余额,移除覆盖变量的错误代码
- 修正
printMenu的调用方式,直接传入用户输入的Name,无需赋值(函数无返回值) - 修复
withdraw函数的缩进和逻辑:判断余额是否足够,返回更新后的余额或原余额(取款失败时) - 优化
getTransaction函数,自动将输入转为大写并去除空格,提升容错性 - 修正主循环中各命令的逻辑:
- B命令:调用
formatCurrency格式化显示当前余额 - W命令:让用户输入取款金额,调用
withdraw函数更新余额,增加异常处理防止非法输入 - D命令:让用户输入存款金额,验证金额为正数后更新余额,增加异常处理
- B命令:调用
- 添加无效命令的提示,提升用户体验
内容的提问来源于stack exchange,提问作者coolbans
相关产品推荐
相关产品推荐

