Python三角形边长识别器输入字符串校验逻辑异常问题求助
三角形类型识别工具输入校验bug修复方案
核心问题根源
input()函数返回的所有结果默认都是字符串类型,你写的str(x) == x判断永远为真,输入合法数字时,int(x)是整数类型、和字符串类型的x比较必然不相等,所以所有输入都会触发非法提示,这是最核心的bug。- 未将输入转换为数值类型,后续的边长比较、直角判断逻辑本质是在比较字符串,结果完全不符合预期。
- 判断逻辑顺序错误:直角三角形的判断放在了不等边判断之后,只要满足不等边条件就不会走到直角判断分支,直角判断永远不会生效。
- 缺少基础三角形合法性校验:没有校验三边是否满足「两边之和大于第三边」,1、2、3这类无法构成三角形的输入也会输出错误结果。
- 只校验了第一个输入x,y、z未做任何校验。
修复后的完整代码
print("please input the sides of the triangle") # 封装输入校验转换函数 def get_valid_side(prompt): while True: s = input(prompt) try: side = float(s) if side <= 0: print("边长必须为正数,请重新输入") continue return side except ValueError: print("please choose a viable unit") # 获取三个合法边长 x = get_valid_side("the first side = ") y = get_valid_side("the second side = ") z = get_valid_side("the third side = ") # 先校验是否能构成三角形 if (x + y <= z) or (x + z <= y) or (y + z <= x): print("输入的边长无法构成合法三角形") else: # 存储结果 res = [] # 先判断是否为直角三角形,加误差阈值避免浮点数精度问题 if abs(x**2 + y**2 - z**2) < 1e-6 or abs(x**2 + z**2 - y**2) < 1e-6 or abs(y**2 + z**2 - x**2) < 1e-6: res.append("right") # 判断边的类型 if x == y == z: res.append("equilateral") elif x == y or y == z or x == z: res.append("isosceles") else: res.append("scalene") print(f"the triangle is {' '.join(res)}")
修复说明
- 用
try-except捕获转换数值失败的异常,只要输入无法转成正浮点数就会提示非法输入,不会导致程序崩溃 - 新增了边长正数校验、三角形合法性校验,避免无效输入返回错误结果
- 调整了判断顺序,优先判断直角属性,再判断边的相等关系,支持输出「isosceles right」这类组合结果
- 用浮点误差阈值
1e-6判断平方和相等,避免浮点数精度问题导致直角判断错误 - 三个输入项都做了统一校验,无需单独写重复逻辑
内容的提问来源于stack exchange,提问作者ZIRUS
相关产品推荐
相关产品推荐

