Écrire un contrôle de cohérence complet de la table
Exercice de TD · niveau 3 (difficile) · NSI (première), chapitre 6 — Traiter des données en tables · Doublons, cohérence, domaines
Énoncé
Écrire un contrôle de cohérence complet de la table : toutes les lignes ont les mêmes descripteurs, aucune valeur manquante, les moyennes sont dans , les classes appartiennent à une liste connue.
Corrigé
Le contrôle ne doit pas s'arrêter à la première anomalie : il doit toutes les rapporter, avec le numéro de ligne et la colonne fautive — sinon on corrige un défaut, on relance, on en découvre un autre, et ainsi de suite.
CLASSES_CONNUES = ["1G1", "1G2", "1G3"]
def coherence(table, domaines):
"""Rapport de cohérence : descripteurs, valeurs manquantes, domaines.
domaines associe à un nom de colonne une fonction valeur -> booléen.
Postcondition : le rapport ne modifie pas la table.
"""
rapport = {"memes_descripteurs": True, "manquantes": [], "hors_domaine": []}
if len(table) == 0:
return rapport
desc = set(table[0].keys())
rapport["memes_descripteurs"] = all(set(l.keys()) == desc for l in table)
for i, ligne in enumerate(table):
for c, valeur in ligne.items():
if valeur is None or valeur == "":
rapport["manquantes"].append((i, c))
for c, valide in domaines.items():
if c in ligne and not valide(ligne[c]):
rapport["hors_domaine"].append((i, c, ligne[c]))
return rapport
DOM = {"moyenne": lambda x: isinstance(x, float) and 0.0 <= x <= 20.0,
"classe": lambda x: x in CLASSES_CONNUES,
"nom": lambda x: isinstance(x, str) and len(x) > 0}
Sur la table saine : {'memes_descripteurs': True, 'manquantes': [], 'hors_domaine': []}.
Sur une table abîmée à dessein — classe de Yanis écrite "1g3", moyenne de Sofia passée à (point décimal oublié), nom d'Adam effacé :
{'memes_descripteurs': True,
'manquantes': [(4, 'nom')],
'hors_domaine': [(2, 'classe', '1g3'), (3, 'moyenne', 172.5), (4, 'nom', '')]}
Les trois défauts sont vus, et le nom vide est signalé deux fois — comme valeur manquante et comme valeur hors domaine. Ce n'est pas un défaut du contrôle : ce sont deux critères différents qui se trouvent tomber d'accord.
Ce que ce contrôle attrape et qu'aucun autre ne voit. Aucune des trois anomalies ne fait planter le programme. La moyenne de fera monter la moyenne de classe sans aucun message, et le "1g3" fera disparaître une ligne à la fusion. Un défaut de données ne provoque pas d'erreur : il provoque un résultat faux.
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.