You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:42:01