Voici une fonction sans docstring
Exercice de TD · niveau 2 · NSI (première), chapitre 3 — Langages et programmation · Constructions élémentaires, traces et terminaison
Énoncé
Voici une fonction sans docstring :
def mystere(n):
s = 0
while n > 0:
s = s + n % 10
n = n // 10
return s
La dérouler à la main pour , dire ce qu'elle calcule, écrire sa spécification complète (prototype, précondition, postcondition), puis vérifier cette spécification sur machine.
Corrigé
La trace, pour .
| tour | `n % 10` | s | n après |
|---|---|---|---|
| --- | --- | 0 | 2026 |
| 1 | 6 | 6 | 202 |
| 2 | 2 | 8 | 20 |
| 3 | 0 | 8 | 2 |
| 4 | 2 | 10 | 0 |
Sortie : .
Ce qu'elle calcule. n % 10 est le chiffre des unités, n // 10 efface ce chiffre : la fonction additionne les chiffres de l'écriture décimale de . C'est exactement le mécanisme des divisions successives du chapitre 1, avec .
La spécification.
def somme_des_chiffres(n):
"""Somme des chiffres de l'ecriture decimale de n.
Precondition : n est un entier >= 0.
Postcondition : le resultat est un entier >= 0 ; il vaut 0 si et
seulement si n vaut 0 ; il est congru a n modulo 9.
"""
assert n >= 0
s = 0
while n > 0:
s = s + n % 10
n = n // 10
return s
La vérification.
for n in range(0, 20000):
assert somme_des_chiffres(n) == sum(int(c) for c in str(n))
Les cas passent. Contrôles : , , .
Le cas est le vrai piège : la boucle ne s'exécute pas une seule fois, et s garde sa valeur initiale — ce qui se trouve être la bonne réponse. Ce n'est pas un hasard heureux mais un accumulateur bien initialisé : la somme d'aucun terme vaut zéro. Pour les négatifs, la boucle ne s'exécuterait pas non plus et rendrait : d'où la précondition.
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.