Adloun

Reprendre le premier programme du chapitre (celui qui calcule total…

Exercice de TD · niveau 2 · NSI (première), chapitre 3 — Langages et programmation · Constructions élémentaires, traces et terminaison

Énoncé

Reprendre le premier programme du chapitre (celui qui calcule total, message et etapes pour ). Dérouler à la main la boucle while, en dressant le tableau des valeurs de reste et de etapes après chaque tour. Prédire ensuite la valeur de etapes pour , puis vérifier sur machine. Enfin, exprimer etapes en fonction du nombre de bits de .

Corrigé

La trace, pour . On part de reste = 7 et etapes = 0. Le test est évalué avant chaque tour.

tourtest resteetapes
------70
1 vrai31
2 vrai12
--- faux : sortie12

La boucle fait donc deux tours et etapes vaut .

Prédiction pour . Chaque tour divise par deux : . Six tours.

Vérification.


def etapes_de(n):
    """Nombre de divisions par 2 pour ramener n >= 1 a 1."""
    reste = n
    etapes = 0
    while reste > 1:
        reste = reste // 2
        etapes = etapes + 1
    return etapes

print(etapes_de(7), etapes_de(100))    # 2 6

Le lien avec le chapitre 1. Diviser par deux, c'est effacer le bit de poids faible. Partir d'un nombre de bits et arriver à (un seul bit) demande donc effacements :


for n in range(1, 100000):
    assert etapes_de(n) == nb_bits(n) - 1

Les cas passent. Contrôle : a trois bits, et ; en a sept, et .

Piège de la trace : placer la mise à jour de etapes avant celle de reste ne change rien ici, mais écrire le test après le corps — c'est-à-dire une boucle « répéter jusqu'à » — donnerait un tour de plus pour .

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.