2017-10-03 4 views
1

J'essaie de résoudre l'exercice Think Python qui demande d'écrire un programme qui demandera à l'utilisateur d'entrer la taille de trois bâtons afin de calculer s'ils peuvent former un triangle. La règle est que si l'une des trois longueurs des bâtons est supérieure à la somme des deux autres, le triangle ne peut pas être fait. Ce que j'ai fait est créé une équation pythagorienne qui fonctionne quand vous entrez les valeurs comme is_triangle autonome, mais quand j'essaie de passer les valeurs à travers triangle_demo() cela ne fonctionne pas et renvoie une invite d'erreur.Think python excercise 5.3.2 Renvoie l'erreur

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) 

Répondre

1

Comme d'autres l'ont mentionné, la logique est erronée dans

ans = (input(int(prompt))) 

Vous devez convertir la sortie de input en nombre, mais vous essayez de convertir son invite en un nombre à la place, ce qui élever un ValueError. En fait, il serait préférable de convertir l'entrée à float, plutôt que int; De cette façon, votre programme sera capable de gérer des triangles avec des côtés non entiers. En outre, nous pouvons améliorer prompt_input en faisant en boucle jusqu'à ce que l'utilisateur fournit une entrée valide, plutôt que de renvoyer None si l'utilisateur fournit une entrée non valide.

En outre, la logique de votre fonction is_triangle teste uniquement les triangles rectangles, mais elle est censée tester tous les triangles, pas seulement les triangles rectangles. Le triangle inequality stipule que chaque côté doit être inférieur à la somme des deux autres côtés. Donc, si les 3 côtés sont a, b et c, puis

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

Nous pouvons simplifier

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

En d'autres termes, chacun a, b, et c doit être inférieur à (a + b + c)/2

Voici une version réparée de votre code.

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()) 
+0

Génial, merci pour l'explication! –

0

Vous devez convertir la sortie de input() à un int (tu avais dans le mauvais sens):

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

En aparté, la logique dans is_triangle ne correspond pas à la logique que vous décrit dans votre question, mais c'est une autre question tout à fait, et je pense que vous pouvez vous en sortir.

1

Votre test pour un triangle possible est incorrect. Pour affirmer qu'un triangle peut être formé, vous devez vous assurer que le bord le plus court est plus long que (ou égal à) la différence des deux autres.

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 

Une autre question plus triviale dans votre code est que l'entrée de vos valeurs doivent être converties en nombres:

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