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.
Prévoir ce qu'affiche un programme, en suivant les valeurs pas à pas.
Écrire un programme répondant à un problème donné.
Repérer et corriger une erreur dans un programme.
Ce que le programme affiche
On considère le programme suivant :
total = 0
for k in range(6):
total = total + 2 * k
print(total)
-
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.
-
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\).
-
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.
-
Par quel nombre faut-il multiplier la population chaque année ?$$ 1{,}03 $$
-
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} $$ -
Écrire le programme.
population = 4000 annees = 0 while population <= 5000: population = population * 1.03 annees = annees + 1 print(annees) -
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)
-
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\).
-
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.
-
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.