新手技术问询:如何让ATM程序变量随用户选择的账户切换
多账户ATM程序修改方案
原代码的核心问题
你当前的ATM代码依赖全局变量bal和lock,只能对应单个账户,无法区分person1、person2、person3的独立余额与锁定状态。要实现多账户切换,必须把每个用户的专属数据单独存储,再根据用户选择定向操作对应数据。
修改思路
- 用字典存储所有账户信息:每个账户对应一个子字典,包含该账户的余额(balance)和锁定次数(lock_count)。
- 先让用户选择目标账户,确认有效后再进入业务操作流程。
- 将原代码中所有操作
bal和lock的逻辑,替换为对当前选中账户对应字段的操作。 - 修复原代码的隐性bug:比如
lockloop未提前初始化、条件判断优先级错误的问题。
具体修改步骤
初始化多账户数据
删除原全局变量bal=500、lock=0,替换为账户字典(可按需修改初始余额):accounts = { 'person1': {'balance': 500, 'lock_count': 0}, 'person2': {'balance': 500, 'lock_count': 0}, 'person3': {'balance': 500, 'lock_count': 0} }添加账户选择流程
在atm()函数开头加入账户选择逻辑,循环直到用户输入有效账户:def atm(): end = False # 将end改为局部变量,避免全局污染 # 选择目标账户 while True: selected_user = input("请选择要操作的账户:person1、person2、person3\n").strip() if selected_user in accounts: current_account = accounts[selected_user] break print("无效账户,请重新输入!")替换全局变量引用
把原代码中所有bal替换为current_account['balance'],所有lock替换为current_account['lock_count']。例如:- 原
print("Your balance is $",bal, sep='')改为print(f"当前账户余额:${current_account['balance']}") - 原
bal=bal+lk改为current_account['balance'] += lk
- 原
修复逻辑bug
- 原代码中
lockloop在进入锁定循环前才定义,会触发未初始化错误,需提前在函数开头初始化lockloop = False。 - 原条件判断
des=="deposit" or des=="d" and lock<4优先级有误,需加括号修正为(des == "deposit" or des == "d") and current_account['lock_count'] <4。
- 原代码中
修改后的完整代码
# 初始化多账户数据 accounts = { 'person1': {'balance': 500, 'lock_count': 0}, 'person2': {'balance': 500, 'lock_count': 0}, 'person3': {'balance': 500, 'lock_count': 0} } def atm(): end = False lockloop = False # 提前初始化锁定循环标记 # 选择要操作的账户 while True: selected_user = input("请选择要操作的账户:person1、person2、person3\n").strip() if selected_user in accounts: current_account = accounts[selected_user] break print("无效账户,请重新输入!") while not end: # 处理账户锁定状态 if current_account['lock_count'] >= 4: lockloop = True while lockloop: try: print(f"当前账户余额:${current_account['balance']}") lk = int(input("账户已锁定,请存入资金直到余额为正:\n$")) if lk <= 0: print("请输入正数金额!") continue current_account['balance'] += lk if current_account['balance'] < 0: continue except ValueError: print("输入无效,请重试!") continue else: lockloop = False current_account['lock_count'] = 0 print(f"账户已解锁,当前余额:${current_account['balance']}") # 业务操作选择 des = input("请选择操作:(d)存款、(w)取款、(b)查询余额、(e)退出\n").strip().lower() witloop = True deploop = True # 锁定次数重置逻辑(余额为正时) if current_account['lock_count'] > 1 and current_account['balance'] >= 0: current_account['lock_count'] = 1 # 存款操作 if (des == "deposit" or des == "d") and current_account['lock_count'] < 4: while deploop: try: dep = int(input("请输入存款金额:")) if dep <= 0: print("请输入正数金额!") continue except ValueError: print("输入无效,请重试!") continue else: deploop = False current_account['balance'] += dep # 透支处理 if current_account['balance'] < 0 and current_account['lock_count'] == 0: current_account['balance'] -= 50 current_account['lock_count'] += 1 print("账户透支,已收取50美元透支手续费!") elif current_account['balance'] < 0 and current_account['lock_count'] != 0: current_account['lock_count'] += 1 print("账户仍处于透支状态,请尽快存入资金!") print(f"当前账户余额:${current_account['balance']}") continue # 取款操作 elif (des == "withdraw" or des == "w") and current_account['lock_count'] < 4: if current_account['balance'] <= 0: print("当前余额不足,无法取款!") continue while witloop: try: wit = int(input("请输入取款金额:")) if wit <= 0: print("请输入正数金额!") continue except ValueError: print("输入无效,请重试!") continue else: witloop = False current_account['balance'] -= wit # 透支处理 if current_account['balance'] < 0 and current_account['lock_count'] == 0: current_account['balance'] -= 50 current_account['lock_count'] += 1 print("账户透支,已收取50美元透支手续费!") elif current_account['balance'] < 0 and current_account['lock_count'] != 0: current_account['lock_count'] += 1 print("账户仍处于透支状态,请尽快存入资金!") print(f"当前账户余额:${current_account['balance']}") continue # 查询余额 elif des == "balance" or des == "b": print(f"当前账户余额:${current_account['balance']}") continue # 退出操作 elif (des == "end" or des == "e") and current_account['lock_count'] == 0: end = True print("感谢使用Nolan银行服务,祝您愉快!") # 无效输入处理 else: print("无效选项,请重新输入!") continue atm()
内容的提问来源于stack exchange,提问作者Nolan
相关产品推荐
相关产品推荐

