Adloun

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

Voici une fonction sans docstring

Langages et programmation · Constructions élémentaires, traces et terminaison · niveau 2

É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 .

tourn % 10sn après
——02026
166202
22820
3082
42100

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.

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 →