带异常检测的计算器代码故障:符号校验被跳过且未执行计算求助
你的计算器符号校验问题分析与修复方案
问题定位
你的代码主要存在以下几个逻辑和语法错误,导致符号校验失效、计算流程异常:
- 符号校验逻辑错误:
if i in num1 or num2:的写法完全不符合预期,实际等价于(i in num1) or num2,只要num2不为空就会触发条件,直接误判为非法符号。 - 全局变量作用域与重置问题:
NoSym作为全局变量,在函数内修改时未声明global,且每次校验前没有重置为True。一旦触发过一次非法符号,后续所有计算都会直接判定为非法。 - 运算符判断逻辑混乱:最后分支的
if cal != fo[0] and fo[1] and fo[2] and fo[3]:写法错误,只要输入不是+,就会进入该分支输出no,干扰正常计算流程。 - 递归调用的潜在风险:每次操作后递归调用
calc(),容易触发递归深度限制,不如循环结构稳定。
修复后的代码
sym = "!@#$%?" fo = ["+", "-", "*", "/"] def calc(): while True: cal = input("请输入运算符(+/-/*/):") # 判断是否为有效运算符 if cal not in fo: print("无效运算符,请重新输入") continue num1 = input("num1 - ") num2 = input("num2 - ") # 检查输入是否包含字母 if num1.isalpha() or num2.isalpha(): print("输入不能包含字母,请重新输入") continue # 检查输入是否包含非法符号 has_invalid_sym = False for i in sym: if i in num1 or i in num2: has_invalid_sym = True break if has_invalid_sym: print("输入不能包含非法符号(!@#$%?),请重新输入") continue # 执行计算(增加异常捕获和除数为0判断) try: num1 = float(num1) num2 = float(num2) if cal == "+": ans = num1 + num2 elif cal == "-": ans = num1 - num2 elif cal == "*": ans = num1 * num2 elif cal == "/": if num2 == 0: print("除数不能为0,请重新输入") continue ans = num1 / num2 print(f"计算结果:{ans}") except ValueError: print("输入不是有效的数字,请重新输入") calc()
修复说明
- 用
while True循环替代递归,避免递归深度溢出问题,流程更直观可控。 - 移除全局变量
NoSym,改用局部变量has_invalid_sym,每次校验前自动重置,彻底解决作用域问题。 - 修正符号校验逻辑为
if i in num1 or i in num2:,确保准确检测非法符号。 - 用
cal not in fo直接判断无效运算符,逻辑清晰不易出错。 - 增加
try-except捕获数字转换异常(比如输入多个小数点),同时补充除法的除数为0判断,提升程序鲁棒性。 - 优化输入提示文字,让用户更清楚该输入什么。
内容的提问来源于stack exchange,提问作者TheAX 0198
相关产品推荐
相关产品推荐

