Adloun

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

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

Langages et programmation · Spécifier : prototype, préconditions, postconditions · niveau 2

É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 (["ali", "zoe"]), 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.

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 →