Think python excercise 5.3.2返回错误

时间:2017-10-03 06:42:56

标签: python python-3.x input

我试图解决Think Python的练习,该练习要求编写一个程序,提示用户输入三个大小的大小,以便计算它们是否可以构成一个三角形。规则是如果棒的三个长度中的任何一个大于其他两个的总和,则不能制作三角形。我所做的是创建了一个毕达哥拉斯方程,当你输入值作为一个独立的is_triangle,但是当我尝试通过triangle_demo()传递值时,它不起作用并返回错误提示。

def is_triangle(a,b,c):
    if a**2 + b**2 == c**2:
        print('pythagore checks out')
        return a**2 + b**2 == c**2
    else:
        print('no')


def prompt_input(prompt):
    try:
        ans = (input(int(prompt)))
        return ans
    except ValueError:
            print('value error and stuff')


def triangle_demo():
    print('input dem values')
    a = prompt_input('input side a: ')
    b = prompt_input('input side b: ')
    c = prompt_input('input side c: ')
    return is_triangle(a,b,c)

3 个答案:

答案 0 :(得分:1)

您对可能的三角形的测试是错误的。要声明可以形成三角形,您需要确保最短边长于(或等于)其他两个边的差异。

def is_triangle(a, b, c):
    d, e, f = sorted([a, b, c])
    return f - e <=  d

a, b, c = 10, 12, 20
print(is_triangle(a, b, c))   # True

a, b, c = 10, 12, 44
print(is_triangle(a, b, c))   # False

您的代码中另一个更微不足道的问题是您的值的输入必须转换为数字:

side = float(input('enter a side length'))

答案 1 :(得分:1)

正如其他人所说,

中的逻辑是错误的
ans = (input(int(prompt)))

您应该将输出input转换为数字,但是您尝试将其提示转换为数字,这会引发ValueError 。实际上,最好将输入转换为float,而不是int;这样,您的程序将能够处理具有非整数边的三角形。此外,我们可以通过循环直到用户提供有效输入来改进prompt_input,而不是在用户提供无效输入时返回None

此外,is_triangle函数中的逻辑仅测试直角三角形,但它应该测试所有三角形,而不仅仅是直角三角形。 triangle inequality表示每一方必须小于另外两方的总和。所以,如果3面是a,b和c,那么

a < b + c
b < a + c
c < a + b

我们可以简化这个

2a < a + b + c
2b < a + b + c
2c < a + b + c

换句话说,a,b和c中的每一个必须小于(a + b + c)/ 2

这是修复后的代码版本。

def is_triangle(*t):
    # Make sure there are 3 sides
    if len(t) != 3:
        return False
    # Make sure that all the sides are positive
    if not all(u > 0 for u in t):
        return False
    # Test that no side is too big
    semiperimeter = sum(t) / 2
    return all(semiperimeter > u for u in t)

def prompt_input(prompt):
    while True:
        try:
            s = input(prompt)
            return float(s)
        except ValueError:
            print(s, 'is not a number')

def triangle_demo():
    print('input the values')
    a = prompt_input('input side a: ')
    b = prompt_input('input side b: ')
    c = prompt_input('input side c: ')
    return is_triangle(a, b, c)

print(triangle_demo())

答案 2 :(得分:0)

您需要将input()的输出转换为int(你的错误方法):

try:
    ans = int(input(prompt))
    return ans

顺便说一句,is_triangle中的逻辑与你在问题中描述的逻辑不符,但这完全是另一个问题,我认为你可以解决这个问题。