Les valeurs 1,1,1.4142135623730951 le résultat isocèle au lieu de rec. isocèle

Fermé
domxav1759 - Modifié le 1 déc. 2020 à 22:37
Whismeril Messages postés 19045 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 21 mai 2024 - 2 déc. 2020 à 08:20
Bonjour,
En testant les valeurs 1,1,1.4142135623730951 le résultat obtenu est ISOCELE au lieu de RECTANGLE ISOCELE

from math import *

def ma_fonction(a,b,c):
    if a*b==b*c and b*c==a*c and a*c==a*b:
       return "EQUILATERAL"
    elif a*b==b*c or b*c==a*c or a*c==a*b and a*b*a*b+b*c*b*c==a*c*a*c or b*c*b*c+a*c*a*c==a*b*a*b or a*c*a*c+a*b*a*b==b*c*b*c:
        return "ISOCELE"
    else:
        if a*b==b*c or b*c==a*c or a*c==a*b :
            return "ISOCELE"
        elif(a*a==b*b+c*c or b*b==a*a+c*c or c*c==a*a+b*b):
            return "RECTANGLE"
        else:
            return "QUELCONQUE"

print(ma_fonction(1,1,1.4142135623730951))


Veuillez m'aider s'il vous plaît

Configuration: Windows / Firefox 83.0

4 réponses

NHenry Messages postés 15123 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 20 mai 2024 332
1 déc. 2020 à 22:37
A cause de la condition :
a*b==b*c or b*c==a*c or a*c==a*b
Quand tu as des conditions avec and et or, toujours mettre des parenthèses pour éviter les erreurs de priorités

De plus ton triangle est rectangle et isocèle (2 côtés à 1).
0
Whismeril Messages postés 19045 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 21 mai 2024 912
1 déc. 2020 à 23:26
Bonsoir à tous les 2

J’ajoute que tes conditions sont plus compliquées que nécessaire.

Par exemple, la définition d’un triangle équilatéral est que les longueurs des 3 côtés sont égales et toi tu as écrit cette condition
   if a*b==b*c and b*c==a*c and a*c==a*b:

Oui mathématiquement a*b == b*c est égal à a == c, mais pourquoi faire plus de calculs qu’il n’en faut. Ça ralenti l’exécution et surtout ça augmente le risque d’erreurs en codant.

En appliquant cette simplification, la condition se résume à
   if b==c and b==a and c==b:

Maintenant, que c’est plus simple, et plus clair, on s’aperçoit que tu testes 2 fois la même condition à savoir si b est égal à c
Au final
   if b==c and b==a :
est le strict nécessaire pour savoir si ce triangle est équilatéral.

Après avoir réduit tes autres conditions au strict nécessaire, il sera plus simple de voir où mettre des parenthèses pour éviter des problèmes de priorité comme l’a souligné NHenry
0
parenthèses à mettre chaque or
ou une pair de parenthèses pour ensemble or comme ceci:


elif ((a*b==b*c) or (b*c==a*c) or (a*c==a*b)) and (a*b*a*b+b*c*b*c==a*c*a*c) or (b*c*b*c+a*c*a*c==a*b*a*b) or (a*c*a*c+a*b*a*b==b*c*b*c):


merci à votre aide
0
quel est le formule pour rectangle isocèle
est ce que ce bien ça?
a*a == b*b+c*c or b*b == a*a+c*c or c*c == a*a+b*b:

en l' appliquant ça
il me donne erreur suivant:
le résultat obtenu est ISOCELE au lieu de RECTANGLE ISOCELE


from math import *
def ma_fonction(a, b,c ):

if a == b or b == c or a == c:
return "ISOCELE"
elif a==b==c:
return "EQUILATERAL"
elif c ** 2 == a ** 2 + b ** 2:
return "rectangle"
elif a*a == b*b+c*c or b*b == a*a+c*c or c*c == a*a+b*b: # rectangle isocele
return "rectangle isocèle"
else:
return "QUELCONQUE"


print(ma_fonction(1, 1, 1.4142135623730951))


en l’exécutant dans l’éditeur "pycharme"
il me donne output suivante:
ISOCELE

s'il vous plaît
0
Whismeril Messages postés 19045 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 21 mai 2024 912
2 déc. 2020 à 08:20
Bonjour

Pour tes prochains posts, merci de lire attentivement ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Pour ton problème, quand tu as une cascade de if / else if, si plusieurs conditions sont vraies, la quelle est « choisie » par cette cascade?

Par exemple, ma variable est une voiture de marque « truc ».
if vehicule == moto :
    #choix 1
elif vehicule == voiture :
    #choix 2
elif vehicule == voiture and  vehicule.marque == truc :
    #choix 3

Quel choix est fait?
0