Avant -propos
Cette page sert à acquérir la notion de boucle répétitive en algorithmique et son implémentation dans le langage Python.
Cette page contient :
-
De vidéos qui permettent de reprendre chez vous des points sur lesquels vous ne vous sentez pas très à l'aise ou pour vous
remémorer le contenu.
-
Des rappels écrits des notions avec des exemples,
-
Des exercices fondamentaux, ceux où apparaissent la balise "fondamental", à savoir faire en seconde,
-
Des exercices de renforcement, ceux en fin de page où apparaissent la balise "renforcement" et accessible directement par un lien,
pour s'assurer que les exercices fondamentaux sont maîtrisés ; tous ces exercices de renforcement possèdent une correction
librement disponible depuis le site,
-
Quelques exercices plus poussés, ceux étiquetés par la balise "confirmé".
C'est ce niveau d'exercices qu'il faut essayer d'atteindre en fin de seconde.
Découverte
Un exemple introductif
Virgile veut expliquer, par téléphone, à son ami Dante comment dessiner la frise dessinée sur le quadrillage ci-dessous :
Il utilise pour cela les instructions suivantes :
-
B : déplacement d’un carreau vers le Bas.
-
D : déplacement d’un carreau vers la Droite.
-
H : déplacement d’un carreau vers le Haut.
-
Donner la suite d’instructions que Virgile doit transmettre à Dante :
-
Identifier une séquence d’instructions qui se répète plusieurs fois.
-
Combien de fois est-elle répétée ?
Formalisation
Lorsque l’on doit dans un programme effectuer plusieurs fois la même tâche pendant un nombre connu d'itérations (=répétitions),
on utilise une boucle répétitive, c’est à dire une boucle du type ci-contre :
Pour variable allant de valeurdépart à valeurfin
faire tâche
Fin_Pour
-
La variable d’une boucle itérative est un compteur : elle permet de compter le nombre de fois où la boucle est effectuée.
Souvent, on utilise la lettre i
(pour itération) pour ce compteur.
-
On sait à l’avance combien de fois sera répéter la tâche : $valeurfin−valeurdépart+1$.
-
Ce type d'écriture d'un programme s'appelle du pseudo-langage.
Les coureurs de 10000 mètres doivent parcourir 25 tours d'une piste faisant 400 mètre de longueur. Ils savent à l'avance qu'ils doivent effectuer
25 tours pour franchir la ligne d'arrivée. On peut modéliser cette course par l'algorithme suivant en pseudo-langage :
Pour tour allant de 1 à 25
faire courir un tour de piste
Fin_Pour
afficher("Arrivée")
Voici un algotihme écrit en pseudo-langage et aussi en Scratch2 comme vous avez normalement déjà vu au collège :
Programme en pseudo-langage |
Programme en Scratch2 |
Saisir X # correspond en langage Python à : input("X=")
Y ← 1 # correspond en langage Python à : Y = 1
Pour i allant de 1 à 4 faire # ici le comteur est noté i
Y ← Y×X # correspond en langage Python à : Y = Y*X
Fin_Pour
Afficher(Y) # correspond en langage Pyton à : print(Y)
|
|
-
Quel calcul est répété dans la boucle répétitive Pour ?
-
Combien de fois l’instruction Pour permet de répéter ce calcul ?
-
-
Reproduire et compléter le tableau ci-dessous pour en déduire la valeur de Y affichée en fin de programme.
|
Avant le début de la boucle
|
Fin de la première itération
|
Fin de la deuxième itération
|
Fin de la troisième itération
|
Fin de la quatrième itération
|
X vaut |
... |
... |
... |
... |
... |
i vaut |
... |
... |
... |
... |
... |
Y vaut |
... |
... |
... |
... |
... |
-
Quelle est la valeur de Y qui sera affichée ?
-
Reproduire la démarche précédente afin de connaître la valeur de Y affichée si initialement X prend la valeur 3.
-
Plus généralement, exprimer en fonction de la lettre X l'expression de Y qui sera affichée.
exercice de renforcement
Un village en zone périurbaine compte aujourd'hui 2300 habitants. Le village voit sa population augmenter chaque année de 150 habitants.
Pour étudier l'évolution de la population au cours du temps, un cabinet d'experts propose au conseil municipal l'algorithme suivant
(écrit en oseudo-langage à gauche et en Scratch 2) :
Programme en pseudo-langage |
Programme en Scratch2 |
Entrer N
P ← 2300
Pour i allant de 1 à N faire
P ← P+150
Fin Pour
Afficher P
|
|
-
Compléter le tableau pour en déduire la valeur de P affichée en sortie lorsque l'on saisit 4 dans la variable N.
|
Avant le début de la boucle
|
Fin de la première itération
|
Fin de la deuxième itération
|
Fin de la troisième itération
|
Fin de la quatrième itération
|
N vaut |
... |
... |
... |
... |
... |
P vaut |
... |
... |
... |
... |
... |
i vaut |
... |
... |
... |
... |
... |
-
Quel est le sens concret de la valeur P affichée en sortie lorsque l'on saisit 4 dans la variable N ?
Que permet d'afficher l'algorithme si l'instruction "Afficher P" est dé placée comme ci-dessous ?
Entrer N
P ← 2300
Pour i allant de 1 à N faire
P ← P+150
Afficher P # l'affichage est déplacé ici, c'est le seul changement
Fin Pour
Comment utiliser l'algorithme pour connaître la population prévisible de la commune en 2030 ?
exercice de renforcement
Votre ami Crésus dispose d'une somme de 1000€ qu'il décide de placer en banque.
La banque lui propose pour un placement d’un montant de 1000 euro fait le $\text{1}^\text{er}$ janvier 2021,
un taux d’intérêt composé annuel de 2 %. Cela signifie qu’à la fin de chaque année la somme en banque augmente de 2%.
Augmenter de 2% revient à multiplier par $\displaystyle{\left(1+\frac{2}{100}\right)}$.
-
Quelle somme d'argent disposera Crésus sur son placement en janvier 2022 ?
-
Quelle somme d'argent disposera Crésus sur son placement en janvier 2023 ?
Le but est de connaître la somme présente sur le placement au bout de 10 ans, soit en janvier 2031,
en supposant qu'aucun retrait ne sera effectué.
Pour cela, reproduire et compléter l'algorithme en pseudo-code ci-dessous en sachant que :
-
N correspond à l'année considérée,
-
P à la somme présente sur son placement l'année N.
-
i est le compteur de la boucle répétitive Pour.
N ← …………………
P ← ………………
Pour i allant de ……… à ………
N ← ……………………………………
P ← ……………………………………
………………………………………………
FinPour
Afficher (« Au bout de 10 ans, Crésus aura » ,…………,« €.»)
Il se peut que certains ………………………… doivent rester vides.
Boucle itérative en langage Python : for
Avec l'instruction range
La boucle répétitive
Pour i allant de 0 à n
instruction 1
instruction 2
...
FinPour
s'écrit en langage Python avec les mots-clés for
et range
comme ci-dessous :
for i in range(n+1):
instruction 1
instruction 2
...
-
Dans cette boucle $i$ prendra les valeurs de 0 à $n$,
Bien noter le décalage entre la valeur finale $n$ et la notation range(n+1)
: la dernière valeur du range
n'est jamais prise en compte !
-
Comme pour l'instruction if ... elif ... else, il est nécessaire de terminer la ligne du for avec deux points :
,
-
Toutes les instructions dans la boucle seront appliquées pour chaque valeur de $i$,
-
Dans cette structure, on connait à l'avance le nombre de répétitions. Dans notre cas, il est égal à $n+1$.
Cette boucle suivante écrite en Python fait le calcul : $0+1+2+3+4+5$
s=0
for i in range(6):
s=s+i
print(s)
-
Vérifier en copiant ce code dans Edupuython que le résultat affiché correspond bien à la somme $0+1+2+3+4+5$.
-
Modifier le code précédent de sorte d'afficher la somme $0+1+2+3+...+99+100$.
Vous pouvez visualiser les différentes étapes de calcul mises en oeuvre dans cet algorithme dans le cas où il s'arrête
avec $i=10$ :
Plus généralement, lors de l'instruction for i in range(m,n)
, où m
et n
sont deux entiers tels que
n>m
, i
prend toutes les valeurs entières entre m
et n-1
.
Le code suivant :
for i in range(5,9):
print(i)
affiche successivement : 5, 6, 7 et 8. La dernière valeur de i est donc 8 puisque range
se termine avec 9.
Écrire un programme qui demande à l'utilisateur $n$ est un entier naturel $n$ supérieur à 10 et qui affiche la valeur de la somme $10+11+12+...+n$.
exercice de renforcement
Un village en zone périurbaine compte aujourd'hui 2300 habitants. Le village voit sa population augmenter chaque année de 120 habitants.
-
Proposez un programme qui demande à l'utilisateur un entier $N$ correspondant au nombre d'années projetés à partir de cette année
et qui renvoie la population de ce village au bout de $N$ années écoulées.
-
Testez votre fonction avec quelques valeurs.
Correction de l'exercice en vidéo accessible par ce lien.
exercice de renforcement
Proposez un programme qui affiche tous les résultats possibles (éventuellement redondants) du produit deux nombres entiers compris entre 0 et 10.
Pour affciher un résutat comme "2*3=6" o ù 2 et 3 sont stockés dans deux variables a
et b
, il suffit de saisir le code
print(a,"*",b,"=",a*b)
.
exercice de renforcement
On considère le programme ci-contre écrit en Python :
a = "Je vous dis"
for loop in range(1,5):
a = a + " bravo"
a = a + "!"
print(a)
-
Saisir le code sur EduPython.
-
Quel est le type de valeur stockée de la variable a ?
-
Quel affichage obtient-on ?
-
Combien de fois a été répété le mot bravo ?
-
Que se passe-t-il si l’on omet le symbole :
à la fin de la deuxième ligne ?
-
Que se passe-t-il si on remplace la variable loop
par une variable nommée remplace
? Pourquoi ?
-
Comment repère-t-on la fin de la tâche qui est répétée ?
-
Quel est le rôle du symbole +
sur des chaînes de caractères ?
-
Comment modifier ce programme pour obtenir 8 fois le mot bravo dans la phrase répétée ?
sur un objet itérable
La structure "for" avec in
Voici la structure en Python d'une boucle for avec in
for elt in iterable:
instruction 1
instruction 2
...
Dans cette boucle, elt
va parcourir les éléments de la iterable
.
La iterable
peut être une chaine de caractères
.
Le programme ci-dessous affiche séparément chaque caractère d'une chaîne de caractères :
# -*- coding: utf-8 -*-
ch="Bonjour à tou.te.s"
for elt in ch:
print(elt)
Vérifier que le programme .
Tester le script ci-dessus pour vérifier qu'il réalise bien à ce qui a été annoncé et modifier la chaîne de carctères
avec une autre phrase (Vous pouvez aussi rajouter des nombres et des symboles).
-
Que fait le code suivant :
# -*- coding: utf-8 -*-
citation="Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions."
compteur=0
for elt in citation:
if elt=="e":
compteur=compteur+1
print(compteur)
-
Transformer le code pour qu'il compte le nombre de i.
exercice de renforcement
Proposer un programme en langage Python qui demande à l'utilisateur une phrase (=chaîne de caractères) et
qui remplace tous les "e" de la phrase saisie par un espace " ".
Exercices
Sur la notion de boucle répétitive Pour
La famille Elpmip va consacrer 2000€ cette année 2021 pour ses loisirs.
Afin d'économiser pour un projet immobilier, la famille Elpmip prévoit de réduire chaque année son budget loisir de 5% par an.
Diminuer de 5% revient à multiplier par $\displaystyle{\left(1-\frac{5}{100}\right)}$.
-
Calculer le budget loisir B de la famille Elpmip prévu pour 2022 ?
-
Quel budget cumulé aura consacré en tout la famille Elpmip au cours des deux premières années 2021 et 2022 ?
-
Le but est de connaître le budget total T consacré à ses loisirs par la famille Elpmip sur les 5 prochaines
années, en supposant que le plan d'économie est respecté.
Pour cela, reproduire et compléter l'algorithme en pseudo-code ci-dessous en sachant que :
-
N correspond à l'année considérée,
-
B au budget loisirs consacré par la famille Elpmip l'année N.
-
T au budget total loisirs consacré par la famille Elpmip entre 2021 et l'année N.
-
i est le compteur de la boucle répétitive Pour.
N ← …………………
B ← …………………
T ← …………………
Pour I allant de ………… à …………
N ← ………………………………………
………… ← ………………………………………
………… ← ………………………………………
FinPour
Afficher (« Au bout de 5 ans, le budget total loisirs sera de», ………, « €.»)
Il se peut que certains ………………………… doivent rester vides.
Votre ami Youssouf possède une somme S de 5000€ qu’il aimerait placer sur un compte rémunéré à la banque.
La banque lui propose un taux à intérêts composés de 3% l’an, c’est à dire que son compte est augmenté de 3% chaque année.
Youssouf voudrait connaître la somme d’argent qu’il possèderait chaque année ainsi que la somme totale au bout de 10 ans.
Il fait appel à vous afin que vous lui proposiez un algorithme permettant de savoir le capital au bout de 10 ans.
Réaliser cet algorithme.
Alain place, début janvier 2021, 6000€ sur un compte rémunéré à 1% l’an.
Chaque début d’année suivante, il placera 1200€ sur ce compte en plus. Il décide de faire fructifier ce compte jusqu'au début janvier 2030.
Il veut savoir quelle somme d’argent sera sur ce compte début janvier 2030.
Recopier et compléter l’algorithme ci-dessous traduisant le problème de placement sachant que la variable S correspond à la
somme sur le compte et N au nombre d’années déjà écoulées :
N ← …………………
S ← …………………
……………………………
…………………………………………………………………… faire
………… ← ………………………………………
………… ← ………………………………………
FinPour
Afficher (« La somme finale sur le compte sera de», ………, « €.»)
-
introduire d’autres variables si besoin à condition de les définir dans les variables,
-
ne pas utiliser tous les espaces pointillés.
Implémentation en Python avec for
et range
Mme Elmip Lise veut placer 20000€ sur un compte rémunéré au taux d’intérêt composé de 1% (chaque année, la somme d’argent placée augmente de 1%).
Mme Elmip Lise a fait appel à un ami afin de savoir quelle somme elle disposera sur ce compte au bout de 10 ans, sans retrait intermédiaire.
-
Cet ami lui propose l'algorithme suivant :
capital = 20000
for i in range(1,10)
capital = capital * (1+1/100)
print(capital)
Vous paraît-il correct ou non pour répondre au problème de Mme Elpmip ? Si non, proposez une correction.
-
Corriger éventuellement cet algorithme puis l'exécuter sur EduPython pour répondre à la question que se pose Mme Elpmip.
-
Modifier l'algorithme précédent afin que le programme :
-
demande le nombre d'années du placement à l'utilisateur du programme,
-
stocke ce nombre d'années dans une variable annee
,
-
affiche le capital sur le compte au bout de ce temps de placement.
M. Ed Moah veut placer 15000€ sur un compte rémunéré au taux d’intérêt composé de 1.5% (chaque année, la somme d’argent placée augmente de 1.5%).
M. Ed Moah fait appel à vous afin de savoir quelle somme il disposera sur ce compte au bout de 10 ans, sans retrait intermédiaire.
-
Compléter l’algorithme ci-dessous écrit en Python (C stocke le capital sur le compte) :
C = ....................
for ..................
C = ..............
print(...)
-
Programmer cet algorithme sur Python pour répondre à la question de M. Ed Moah.
Afin de faire une promotion sur les pommes, un supermarché décide de les présenter en faisant un empilement
esthétique sous forme d'une pyramide à base carrée.
Au sommet (1er étage), il y a une pomme, au-dessous (étage 2), il y a 4 pommes, au-dessous (3ème étage), il y a 9 pommes, et ainsi de suite.
Pour visualiser :
-
Combien y-a-t-il de pommes à l'étage $i$ ?
-
Compléter le script ci-dessous afin qu'il permette de calculer le nombre total de pommes pour réaliser une pyramide à 10 étages.
n = 10
nb_pommes = ......
for ..................
nb_pommes = ..............
-
Combien de pommes faut-il pour construire une telle pyramide à 10 étages ?
Plusieurs légendes sont associées au jeu d'échecs. L'une d'elles situe la scène en Inde. Un roi s'ennuyant promit une
récompense à qui saurait fortement le distraire. Le brahmane Sissa lui présenta le jeu d'échecs.
Le roi pour le remercier pour ce jeu si distrayant lui demanda ce que le brahmane désirait en échange de cette découverte.
Le sage Sissa demanda au roi de déposer un grain de riz sur la première case, deux grains sur la deuxième, quatre
sur la troisième case et ainsi de suite en faisant en sorte de doubler le nombre de grains de riz en
passant d'une case à l'autre. Un échiquier ne comportant que 64 cases, le roi trouva cette demande modeste.
-
Combien de grains de riz sont présent sur la ième case de l'échiquier ?
-
Proposer un script en langage Python qui détermine le nombre de grains de riz présents sur un échiquier entièrement complété.
-
Dans sa publication de juin 2018, le département américain de l’agriculture (USDA) a évalué l’offre mondiale de riz à 631,2 millions
de tonnes pour la campagne 2017-2018. De plus, il est estimé qu'en moyenne, 1000 grains de riz pèsent 32 grammes.
Que penser de la demande de Sissa ?
-
Proposer un code qui affiche toutes les manières possibles d’obtenir un euro avec des pièces de 2 centimes et de 5 centimes.
-
Améliorer le code afin qu'il affiche le nombre de possibilités différentes d'obtenir ainsi un euro.
Exercices de renforcement
Sur la notion de boucle répétitive Pour
Voici un algotihme écrit en pseudo-langage :
Saisir X # correspond en langage Python à : input("X=")
Y ← 0 # correspond en langage Python à : Y = 1
Pour i allant de 1 à 5 faire # ici le comteur est noté i
Y ← Y+X # correspond en langage Python à : Y = Y+X
Fin_Pour
Afficher(Y) # correspond en langage Python à : print(Y)
-
Quel calcul est répété dans la boucle répétitive Pour ?
-
Combien de fois l’instruction Pour permet de répéter ce calcul ?
-
-
Reproduire et compléter le tableau ci-dessous pour en déduire la valeur de Y affichée en fin de programme.
|
Avant le début de la boucle
|
Fin de la première itération
|
Fin de la deuxième itération
|
Fin de la troisième itération
|
Fin de la quatrième itération
|
Fin de la dernière itération
|
X vaut |
... |
... |
... |
... |
... |
... |
i vaut |
... |
... |
... |
... |
... |
... |
Y vaut |
... |
... |
... |
... |
... |
... |
-
Quelle est la valeur de Y qui sera affichée ?
-
Quelle est la valeur de Y affichée si initialement X prend la valeur 6.
-
Plus généralement, exprimer en fonction de la lettre X l'expression de Y qui sera affichée.
Pour accéder à une correction : lien direct.
Un lac subit l'invasion d'une algue proliférante. On admet que la masse d'algues, en kilogrammes, N années après aujourd'hui est notée Q, valeur
qui est obtenu par l'algorithme suivant, écrit en pseudo-code :
Entrer N
Q ← 100
Pour i allant de 1 à N faire
Q ← Q×1.1
Fin Pour
Afficher Q
-
Compléter le tableau pour en déduire la masse d'algues proliférantes dans 5 ans.
|
Avant le début de la boucle
|
Fin de la première itération
|
Fin de la deuxième itération
|
Fin de la troisième itération
|
Fin de la quatrième itération
|
Fin de la cinquième itération
|
N vaut |
... |
... |
... |
... |
... |
... |
Q vaut |
... |
... |
... |
... |
... |
... |
i vaut |
... |
... |
... |
... |
... |
... |
-
Comment modifier le programme de sorte que la masse d'algues soit affichée chaque année ?
Pour accéder à une correction : lien direct.
Sur la boucle répétitive implémentée en Python : for
Écrire un programme qui demande à l'utilisateur de saisir un entier naturel $n$ non nul et qui affiche la valeur de $1^2+2^2+...+n^2$.
Pour accéder au code de la correction : lien
Éléonore Wouétel fait des économies. Elle a placé en début d'année 1000€ sur un compte rémunéré en banque.
Elle pense que durant chacune des huit années suivantes, elle pourra déposer sur ce compte 200€.
De plus, la banque lui verse, à la fin de chaque année, 1% d'intérêt, c'est à dire qu'elle rajoute sur le compte 1% de la somme
présente sur le compte en début d'année.
Proposer un algorithme qui affiche la somme qu'Élénore aura sur son compte au bout de huit années de placement.
Pour accéder au code de la correction : lien
Proposer une fonction nommée nb_voyelles
qui prend en arguments une chaîne de caractères et qui renvoie le nombre de voyelles
(minuscules non accentuées) de cette chaîne. Tester ensuite par exemple en exécutant nb_voyelles("Ah oui ! Vive l'été !"")
.
Vous pouvez utiliser le mot-clé or
; exemple : elt=='e' or elt='i'
signifie que l'on teste si "elt est un 'e'
ou un 'i' ".
Pour accéder au code de la correction : lien