Adloun

Écrire moyenne colonne(table, colonne)

Exercice de TD · niveau 2 · NSI (première), chapitre 6 — Traiter des données en tables · Sélectionner, projeter, agréger

Énoncé

Écrire moyenne_colonne(table, colonne). Quelles préconditions faut-il — et pourquoi la postcondition ne doit-elle pas s'écrire avec une égalité stricte (chapitre 2) ?

Corrigé

Trois préconditions. La table est non vide (sinon division par zéro) ; la colonne existe dans chaque ligne ; ses valeurs sont des nombres — c'est-à-dire que convertir a déjà été appelé.


def moyenne_colonne(table, colonne):
    """Moyenne arithmétique d'une colonne numérique.

    Préconditions : table non vide ; colonne présente dans chaque ligne ;
                    valeurs numériques (donc converties à l'import).
    Postcondition : min <= résultat <= max, à la tolérance des flottants près.
    """
    assert len(table) > 0, "table vide"
    assert all(colonne in l for l in table), "colonne absente"
    total = 0
    for ligne in table:
        total = total + ligne[colonne]
    return total / len(table)

Contrôle. moyenne_colonne(eleves, &quot;moyenne&quot;) rend , et .

Pourquoi pas d'égalité stricte. Une moyenne est une somme de flottants divisée par un entier ; l'addition flottante n'est ni exacte ni associative. Le contre-exemple tient en trois valeurs :


t = [{"m": 0.1}, {"m": 0.2}, {"m": 0.3}]
moyenne_colonne(t, "m")            # 0.20000000000000004
moyenne_colonne(t, "m") == 0.2     # False
abs(moyenne_colonne(t, "m") - 0.2) < 1e-9   # True

Sur triplets de valeurs tirées au hasard à deux décimales, l'addition séquentielle diffère de dans cas, soit % du temps. Une postcondition écrite assert m == attendu échouerait donc une fois sur sept sur du code juste. La bonne écriture est celle du chapitre 2 : assert abs(m - attendu) &lt; 1e-9.

Remarque : sur la table eleves l'égalité stricte passe par chance. C'est bien pourquoi il ne faut pas s'y fier : un test qui passe par hasard est un test qui échouera un jour sans que rien n'ait changé.

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.