Adloun

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`sn 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.

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.