Adloun

Écrire est croissant(t) , qui dit si le tableau t est trié au sens…

Exercice de TD · niveau 2 · NSI (première), chapitre 3 — Langages et programmation · Spécifier : prototype, préconditions, postconditions

Énoncé

Écrire est_croissant(t), qui dit si le tableau t est trié au sens large. Quelle est la précondition ? Que doit-elle rendre sur le tableau vide, et sur un tableau à un seul élément ? Justifier ces deux choix, puis les vérifier — ainsi que la fonction elle-même — sur tableaux aléatoires.

Corrigé


def est_croissant(t):
    """Vrai si t est trie par ordre croissant au sens large.

    Precondition  : les elements de t sont deux a deux comparables.
    Postcondition : le resultat vaut True si et seulement si
                    t[i] <= t[i+1] pour tout i de 0 a len(t)-2.
    """
    for i in range(len(t) - 1):
        if t[i] > t[i + 1]:
            return False
    return True

Les deux cas limites. Sur le tableau vide et sur le singleton, la postcondition porte sur un ensemble vide d'indices : « pour tout » d'un ensemble vide est vrai. Les deux doivent donc rendre True, et c'est ce que fait le code sans cas particulier — range(-1) et range(0) sont vides. Une bonne postcondition rend les cas limites automatiques ; une mauvaise oblige à des if supplémentaires.

La précondition n'est pas « t est un tableau de nombres » mais, plus généralement, « les éléments sont comparables entre eux ». Un tableau de chaînes convient ([&quot;ali&quot;, &quot;zoe&quot;]), un tableau mélangeant nombres et chaînes non : la comparaison lèverait TypeError.

La vérification par oracle. Plutôt que d'écrire les réponses attendues à la main, on compare à une propriété de référence :


for _ in range(3000):
    t = [random.randint(0, 6) for _ in range(random.randint(0, 8))]
    assert est_croissant(t) == (t == sorted(t))

Les cas passent. Le petit intervalle de valeurs ( à ) est délibéré : il produit beaucoup d'ex æquo, donc beaucoup de cas où le « sens large » compte.

Contrôles : est_croissant([]) et est_croissant([5]) rendent True ; [1, 1, 2] rend True ; [1, 3, 2] rend False.

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.