Spécifier et écrire borner(x, a, b), qui ramène x dans l'intervalle
Exercice de TD · niveau 3 (difficile) · NSI (première), chapitre 3 — Langages et programmation · Mettre au point : construire un jeu de tests
Énoncé
Spécifier et écrire borner(x, a, b), qui ramène x dans l'intervalle . Donner la précondition, la postcondition, et un jeu de tests exhaustif sur un petit domaine — en expliquant pourquoi l'exhaustivité y est possible alors qu'elle ne l'est pas en général.
Corrigé
def borner(x, a, b):
"""Ramene x dans l'intervalle [a, b].
Precondition : a <= b.
Postcondition : a <= resultat <= b, et resultat == x lorsque a <= x <= b.
"""
assert a <= b, "intervalle vide"
if x < a:
r = a
elif x > b:
r = b
else:
r = x
assert a <= r <= b
return r
La précondition n'est pas cosmétique. Si , l'intervalle est vide : aucune valeur ne peut satisfaire , et la postcondition serait impossible à tenir. Une précondition trop large ne rend pas la fonction plus utile — elle rend sa promesse fausse.
La postcondition en deux parties est essentielle. La première seule () serait satisfaite par la fonction return a, qui est absurde. C'est la seconde clause — « et r == x quand x était déjà dans l'intervalle » — qui interdit cette tricherie.
Le jeu de tests exhaustif.
compte = 0
for a in range(-3, 4):
for b in range(a, 4):
for x in range(-6, 7):
r = borner(x, a, b)
assert a <= r <= b
if a <= x <= b:
assert r == x
compte = compte + 1
print(compte) # 364
triplets, tous conformes.
Pourquoi l'exhaustivité est ici possible. Parce qu'on a restreint le domaine : et entre et , entre et . Sur les entiers Python, le domaine est infini — aucun jeu de tests ne peut le couvrir. Le pari, raisonnable mais non démontré, est que si la fonction est fausse, elle l'est déjà sur de petites valeurs. On teste par-dessus le marché les bornes elles-mêmes : borner(0, 0, 10) rend et borner(10, 0, 10) rend — les deux endroits où un < écrit à la place d'un <= se verrait.
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.