Afficher le corrigé
Moon Arrows Sun
Arrows

Problèmes d'algorithmique

Un programme qui calcule une moyenne, un autre qui cherche un seuil, un troisième qui ne donne pas ce qu'on attendait : lire, écrire, et corriger.

Ce que le programme affiche

On considère le programme suivant :

total = 0
for k in range(6):
    total = total + 2 * k
print(total)
  1. Quelles valeurs la variable \(k\) prend-elle ?
    $$ 0 \ ; \ 1 \ ; \ 2 \ ; \ 3 \ ; \ 4 \ ; \ 5 $$

    Six valeurs, de zéro à cinq : « range(6) » compte six tours et s'arrête avant six.

  2. Dresser le tableau des valeurs de \(total\), tour après tour.
    $$ 0 \ \rightarrow \ 0 \ \rightarrow \ 2 \ \rightarrow \ 6 \ \rightarrow \ 12 \ \rightarrow \ 20 \ \rightarrow \ 30 $$

    À chaque tour on ajoute \(2k\), c'est-à-dire \(0\), puis \(2\), \(4\), \(6\), \(8\) et \(10\).

  3. Qu'affiche le programme ? Retrouver ce résultat sans la boucle.
    $$ 30 $$

    C'est le double de \(0 + 1 + 2 + 3 + 4 + 5 = 15\).

Le programme à écrire

Une population de \(4 \ 000\) habitants augmente de \(3 \ \%\) par an. On cherche au bout de combien d'années elle dépassera \(5 \ 000\) habitants.

  1. Par quel nombre faut-il multiplier la population chaque année ?
    $$ 1{,}03 $$
  2. Faut-il une boucle bornée ou non bornée ? Justifier.

    On ne sait pas combien d'années il faudra, mais on sait quand s'arrêter : dès que la population dépasse \(5 \ 000\).

    $$ \text{une boucle non bornée} $$
  3. Écrire le programme.
    population = 4000
    annees = 0
    while population <= 5000:
        population = population * 1.03
        annees = annees + 1
    print(annees)
  4. Donner la réponse, en calculant les premières valeurs.

    La population vaut successivement \(4 \ 120\), \(4 \ 244\), \(4 \ 371\), \(4 \ 502\), \(4 \ 637\), \(4 \ 776\), \(4 \ 919\), \(5 \ 067\).

    $$ 8 \ \text{années} $$

Le programme qui se trompe

Ce programme devait calculer la moyenne de trois notes saisies. Il donne \(15\) pour les notes \(12\), \(15\) et \(18\), alors que la réponse attendue est \(15\)… mais il donne aussi \(15\) pour \(0\), \(0\) et \(0\).

notes = [12, 15, 18]
somme = 0
for note in notes:
    somme = somme + note
    moyenne = somme / 3
print(moyenne)
  1. Que vaut \(moyenne\) après chacun des trois tours ?
    $$ 4 \ \rightarrow \ 9 \ \rightarrow \ 15 $$

    La somme vaut \(12\), puis \(27\), puis \(45\), chaque fois divisée par \(3\).

  2. Le programme donne-t-il le bon résultat ici ? Est-il correct pour autant ?

    Il donne \(15\), qui est bien la moyenne. Mais c'est un hasard : seul le dernier tour compte, et il se trouve que la division finale est la bonne.

    Le calcul de la moyenne est à l'intérieur de la boucle : il est refait à chaque tour, inutilement, et les valeurs intermédiaires n'ont aucun sens.

  3. Corriger le programme, et dire à quel piège il correspond.
    notes = [12, 15, 18]
    somme = 0
    for note in notes:
        somme = somme + note
    moyenne = somme / 3
    print(moyenne)

    Le calcul sort de la boucle : une seule indentation de moins. C'est le troisième piège - une instruction placée dans la boucle au lieu d'après.