É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 (["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.
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.