Adloun

Un tableau de points du plan se représente naturellement par un…

Exercice de TD · niveau 2 · NSI (première), chapitre 4 — Les types construits · P-uplets, déballage et affectation multiple

Énoncé

Un tableau de points du plan se représente naturellement par un tableau de couples. Écrire barycentre(points) qui en renvoie le centre de gravité, sous forme de couple. Pourquoi le couple est-il ici le bon type, plutôt qu'un tableau de deux cases ?

Corrigé


def barycentre(points):
    """Centre de gravite d'un tableau non vide de couples (x, y).

    Precondition  : points est non vide, et chaque element est un couple
                    de nombres.
    Postcondition : le resultat est un couple ; chaque coordonnee est comprise
                    entre le minimum et le maximum des coordonnees des points.
    """
    assert len(points) > 0, "aucun point"
    sx = 0
    sy = 0
    for x, y in points:          # deballage a la volee : le coeur de l'exercice
        sx = sx + x
        sy = sy + y
    return sx / len(points), sy / len(points)

La ligne for x, y in points est l'affectation multiple appliquée au parcours : à chaque tour, le couple courant est déballé en deux variables nommées. C'est plus lisible que p[0] et p[1], et l'on ne peut pas confondre l'abscisse et l'ordonnée.

Vérification.


assert barycentre([(0, 0), (2, 0), (0, 2)]) == (2 / 3, 2 / 3)
assert barycentre([(1, 1)]) == (1.0, 1.0)
assert barycentre([(0, 0), (4, 6)]) == (2.0, 3.0)

Le dernier cas est le milieu d'un segment, dont on connaît la réponse sans calcul : .

Pourquoi un couple, et non un tableau de deux cases. Parce qu'un point n'est pas une collection de deux nombres : c'est une valeur composite dont les deux composantes n'ont de sens qu'ensemble. Trois conséquences concrètes :

L'immuabilité n'est pas une gêne, c'est une information : elle dit au lecteur que l'objet ne changera pas.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.