Adloun

NSI (première) · Chapitre 6 · Exercice de TD

Écrire un contrôle de cohérence complet de la table

Traiter des données en tables · Doublons, cohérence, domaines · niveau 3 (difficile)

É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.

100 % gratuit

Essaie le suivant avec le tuteur

Faire l'exercice suivant avec le tuteur

Sans compte : le cours, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant avec le tuteur →