informatique (tronc commun des prépas scientifiques) · Chapitre 1 · Exercice de TD
Le contrat ambigu
La discipline de programmation · niveau 2
Énoncé
On souhaite spécifier une fonction arrondi(x) renvoyant l'entier le plus proche du flottant x. Comment lever l'ambiguïté des demi-entiers (comme 2.5) ? Proposer un contrat et le jeu de tests associé.
Corrigé
Le contrat doit explicitement choisir une règle pour départager les deux entiers équidistants. On choisit de renvoyer le plus grand d'entre eux :
def arrondi(x: float) -> int:
"""Renvoie l'entier n qui minimise |x - n|.
En cas d'égalité (x de la forme k + 0.5 avec k entier), renvoie n = k + 1.
Postcondition : |x - arrondi(x)| <= 0.5
"""
Jeu de tests associé :
assert arrondi(2.3) == 2
assert arrondi(2.7) == 3
assert arrondi(2.5) == 3 # règle du demi-entier positif
assert arrondi(-2.5) == -2 # demi-entier négatif : -2 est plus grand que -3
assert arrondi(4.0) == 4 # cas nominal : valeur entière exacte