IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

matser

correction d'un livre sur python

Noter ce billet
par , 15/06/2021 à 15h36 (12266 Affichages)
dans le livre sur python en classe de seconde, écrit par Lou Chalmin et Quentin Fortier, on lit cet exemple pour l'instruction if. on a les point a et b, représentés par des couples constitués de leurs coordonnées. la distance ab est calculé par la fonction "norme" ci-dessous:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
>>> def norme(a,b):
...     xa,ya=a
...     xb,yb=b
...     return sqrt((xb-xa)**2+(yb-ya)**2)
...
on a ensuite une fonction qui écrit "le triangle abc est rectangle" si le triangle abc est rectangle

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
>>> def est_rectangle(a,b,c):
    	ab=norme(a,b)
	ac=norme(a,c)
	bc=norme(b,c)
	if bc**2==ab**2+ac**2:
	   return 'ABC est rectangle en A'
	elif ac**2==ab**2+bc**2:
	   rerurn 'ABC est rectangle en B'
	elif ab**2==ac**2+bc**2:
	   return 'ABC est rectangle en C'
	else:
	   return "le triangle n'est pas rectangle"
voici, selon le livre, un exemple:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
>>> a=(-2,2)
>>> b=(2,4)
>>> c=(6,-4)
>>> est_rectangle(a,b,c)
'ABC est rectangle en B'
>>> est_rectangle(a,b,d)
"le triangle n'est pas rectangle"
en fait, cela ne fonctionne pas. L'appel suivant donne:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
>>> est_rectangle(a,b,c)
"le triangle n'est pas rectangle"
étonnant non?
voici pourquoi cela ne fonctionne pas:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
>>> norme(a,b)**2+norme(b,c)**2
100.00000000000001
>>> norme(a,c)**2
100.0
ainsi, il trouve que norme(a,b)**2+norme(b,c)**2 est différent de norme(a,c) et conclue que le triangle n'est pas rectangle

Voici ce que je propose:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def normeAuCarré(a,b):
    xa,ya=a
    xb,yb=b
    return (xb-xa)**2+(yb-ya)**2

def est_rectangle(a,b,c):
    ab2=normeAuCarré(a,b)
    ac2=normeAuCarré(a,c)
    bc2=normeAuCarré(b,c)
    if bc2==ab2+ac2:
        print('le triangle dont les sommets ont pour coordonnées ',a,b,c,
              ' est rectangle et son sommet droit a pour coordonnées ',a)
    elif ac2==ab2+bc2:
        print('le triangle dont les sommets ont pour coordonnées ',a,b,c,
              ' est rectangle et son sommet droit a pour coordonnées ',b)
    elif ab2==ac2+bc2:
        print('le triangle dont les sommets ont pour coordonnées ',a,b,c,
              ' est rectangle et son sommet droit a pour coordonnées ',c)
    else:
        print('le triangle dont les sommets ont pour coordonnées ',a,b,c,
              " n'est pas rectangle")

a=(-2,2)
b=(2,4)
c=(6,-4)
d=(-3,5)
est_rectangle(a,b,c)
est_rectangle(a,b,d)
voici ce que cela donne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
le triangle dont les sommets ont pour coordonnées  (-2, 2) (2, 4) (6, -4)  est rectangle et son sommet droit a pour coordonnées  (2, 4)
le triangle dont les sommets ont pour coordonnées  (-2, 2) (2, 4) (-3, 5)  n'est pas rectangle

Envoyer le billet « correction d'un livre sur python » dans le blog Viadeo Envoyer le billet « correction d'un livre sur python » dans le blog Twitter Envoyer le billet « correction d'un livre sur python » dans le blog Google Envoyer le billet « correction d'un livre sur python » dans le blog Facebook Envoyer le billet « correction d'un livre sur python » dans le blog Digg Envoyer le billet « correction d'un livre sur python » dans le blog Delicious Envoyer le billet « correction d'un livre sur python » dans le blog MySpace Envoyer le billet « correction d'un livre sur python » dans le blog Yahoo

Catégories
Sans catégorie

Commentaires

  1. Avatar de Bousk
    • |
    • permalink
    Je parie que le livre a été écrit avec une version de Python différente que celle que tu utilises.
    Et que les nombres ont une représentation différente.
    Auparavant c'étaient des entiers. Depuis Python 3.x, ce sont des float.
    Si tu ne travailles pas avec des entiers, une comparaison se fait avec epsilon, qui se trouve dans sys.float_info.epsilon.
    Avec Python 3.5+, il faudrait utiliser math.isclose
    Pour comparer une distance, la bonne pratique est de comparer leur carré, parce que le calcul d'une racine est coûteuse, et le résultat est similaire.
    En Python, tu as math.hypot.
    Mis à jour 16/06/2021 à 19h25 par Bousk
  2. Avatar de matser
    • |
    • permalink
    le livre date de 2019 et j'utilise Python 3.9.5. Ils parlent bien du type float dans ce livre.
    utiliser les carré des distance est exactement ce que je propose. Je compare le carré d'un côté avec la somme des carrés des deux autres côtés, et cela fonctionne.
    tu m'excusera d'être débutant en python, je ne connais pas encore toutes les bibliothèques.
    sinon, merci pour l'info.
  3. Avatar de Bousk
    • |
    • permalink
    Je ne connaissais pas non plus isclose ou hypot, c'est Google qui m'a donné l'info.
    Comparer des carrés ne marche pas mieux que des non carrés. Le problème c'est que ce sont des nombres flottants et donc leur égalité se teste avec epsilon.
    C'est le cas en Python comme dans la majorité des langages, parce que des flottants ne représentent que des valeurs approchées. Il doit bien y avoir une centaine de discussions sur ce forum de personnes qui ne comprennent pas pourquoi leur == entre 2 flottants ne marche pas.
    Tout le reste n'est que hasard et coup de chance.