04 - Boucles
Exercice 0 : QCM – vérification des prérequis
Pour chaque question, une seule réponse est correcte.
1. Que produit list(range(3, 7)) ?
- A.
[3, 4, 5, 6, 7] - B.
[3, 4, 5, 6] - C.
[4, 5, 6] - D.
[3, 4, 5]
Correction
Réponse : B. range(3, 7) génère les entiers de 3 (inclus) à 7 (exclu), soit 3, 4, 5, 6.
- A est faux : la borne supérieure est exclue (erreur fréquente : oublier que
ranges’arrête avant la borne). - C est faux : la borne inférieure est incluse.
- D est faux : il manque
6;range(3, 7)produit quatre valeurs, pas trois.
2. Combien de fois la boucle suivante s’exécute-t-elle ?
for i in range(5):
print(i)
- A. 4 fois
- B. 5 fois
- C. 6 fois
- D. Cela dépend de la valeur de
i
Correction
Réponse : B. range(5) produit les valeurs 0, 1, 2, 3, 4, soit cinq itérations.
- A est faux : c’est l’erreur qui consiste à commencer à compter à 1 (la boucle commence à 0).
- C est faux :
range(5)ne produit pas la valeur5. - D est faux :
iest la variable de boucle, elle prend successivement chaque valeur derange(5).
3. Quelle est la différence entre for et while ?
- A.
forest plus rapide quewhile - B.
fors’utilise quand on connaît le nombre d’itérations,whilequand on ne le connaît pas à l’avance - C.
whilene peut pas faire de boucles infinies - D.
foretwhilesont strictement équivalents et interchangeables dans tous les cas
Correction
Réponse : B. On utilise for lorsqu’on sait combien de fois on veut itérer (parcourir une liste, un range, etc.) et while lorsque le nombre de répétitions dépend d’une condition vérifiée à chaque tour.
- A est faux : la vitesse dépend du contenu de la boucle, pas du mot-clé.
- C est faux :
while True:crée une boucle infinie. - D est faux : bien que l’on puisse souvent réécrire l’une avec l’autre,
whileest nécessaire quand le nombre d’itérations n’est pas connu à l’avance.
4. Que vaut s après l’exécution du code suivant ?
s = 0
for i in range(1, 4):
s = s + i
- A.
3 - B.
6 - C.
10 - D.
4
Correction
Réponse : B. range(1, 4) produit 1, 2, 3. La variable s accumule la somme : 0 + 1 = 1, puis 1 + 2 = 3, puis 3 + 3 = 6.
- A est faux : c’est la valeur du dernier
i, pas de la somme. - C est faux : c’est la somme
1 + 2 + 3 + 4, comme sirange(1, 4)incluait4(erreur de borne). - D est faux : c’est
1 + 3, comme si on avait sautéi = 2.
Exercice 1
Combien de points sont affichés à l’exécution des deux programmes ci-dessous ? Expliquer.
Programme 1
for i in range(0, 10):
print(".", end="")
for j in range(0, 10):
print(".", end="")
print()
Programme 2
for i in range(0, 10):
for j in range(0, 10):
print(".", end="")
print()
Correction
Programme 1 : affiche 20 points.
Les deux boucles for sont consécutives (l’une après l’autre). La première affiche 10 points, la seconde affiche 10 points. Total : \(10 + 10 = 20\).
Programme 2 : affiche 100 points.
Les deux boucles sont imbriquées : pour chaque valeur de i (10 valeurs), la boucle interne sur j affiche 10 points. Total : \(10 \times 10 = 100\).
Point clé : l’indentation de la seconde boucle détermine si elle est consécutive (même niveau) ou imbriquée (décalée à droite).
Exercice 2
Modifier le programme ci-dessous afin de permettre à l’utilisateur de rejouer s’il le souhaite.
a, b = 4, 7
print("À vous de jouer")
x = int(input())
y = int(input())
if x == a and y == b:
print("Coulé")
else:
if x == a or y == b:
print("En vue")
else:
print("À l'eau")
Correction
a, b = 4, 7
trouve = False
while not trouve:
print("À vous de jouer")
x = int(input("x : "))
y = int(input("y : "))
if x == a and y == b:
print("Coulé !")
trouve = True
else:
if x == a or y == b:
print("En vue")
else:
print("À l'eau")
On utilise une boucle while dont la condition est « tant que le joueur n’a pas trouvé ». La variable booléenne trouve passe à True lorsque la bonne case est touchée, ce qui met fin à la boucle.
Variante : on peut aussi utiliser while True: avec un break dans le cas « Coulé ».
Exercice 3
Écrire un programme permettant d’afficher toutes les tables de multiplication de 0 à 10.
Correction
for i in range(11):
print(f"--- Table de {i} ---")
for j in range(11):
print(f"{i} x {j} = {i * j}")
print()
La boucle externe parcourt les tables (de 0 à 10), la boucle interne parcourt les multiplicateurs (de 0 à 10). C’est un exemple classique de boucles imbriquées.
Exercice 4
Écrire un programme permettant d’afficher les carrés et les cubes des 20 premiers entiers naturels non nuls.
Correction
for n in range(1, 21):
print(f"{n} : carré = {n**2}, cube = {n**3}")
range(1, 21) produit les entiers de 1 à 20. L’opérateur ** calcule la puissance.
Exercice 5
Écrire un programme qui affiche une table de conversion des sommes d’argent exprimées en euros et en dollars. La progression des valeurs sera géométrique comme dans l’exemple ci-dessous :
1 euros(s) = 1,1183 dollar(s)
2 euros(s) = 2,2366 dollar(s)
4 euros(s) = 4,4732 dollar(s)
8 euros(s) = 8,9464 dollar(s)
On s’arrêtera à 16 384 euros.
Correction
taux = 1.1183
euros = 1
while euros <= 16384:
dollars = euros * taux
print(f"{euros} euro(s) = {dollars:.4f} dollar(s)")
euros = euros * 2
On utilise une boucle while car la progression est géométrique (on double euros à chaque tour). Le formatage :.4f affiche quatre décimales. La boucle s’arrête quand euros dépasse 16 384.
Trace des premières valeurs : 1, 2, 4, 8, 16, 32, …, 16384 (soit 15 lignes, car \(2^{14} = 16,384\)).
Exercice 6
Écrire un programme qui affiche une suite de 12 nombres dont chaque terme est égal au triple du précédent.
Correction
n = 1
for i in range(12):
print(n)
n = n * 3
On part de n = 1 et on multiplie par 3 à chaque itération. Les 12 valeurs affichées sont : 1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147.
Exercice 7
Écrire un programme qui calcule les 50 premiers termes de la table de multiplication par 13 et qui n’affiche que ceux qui sont multiples de 7.
Correction
for i in range(1, 51):
produit = 13 * i
if produit % 7 == 0:
print(f"13 x {i} = {produit}")
On parcourt les 50 premiers multiples de 13 et on filtre ceux divisibles par 7. Un nombre est multiple de 13 et de 7 s’il est multiple de \(13 \times 7 = 91\). On obtient donc : 91, 182, 273, 364, 455, 546, 637 (soit les multiples de 91 jusqu’à \(13 \times 50 = 650\)).
Exercice 8
Écrire un programme qui affiche la suite de symboles suivante :
****************************
Correction
for i in range(1, 8):
print("*" * i)
L’opérateur * appliqué à une chaîne la répète : "*" * 3 donne "***". La boucle va de 1 à 7 (inclus).
Variante avec boucle imbriquée :
for i in range(1, 8):
for j in range(i):
print("*", end="")
print()
Exercice 9
Écrire un programme qui recueille au clavier les températures de sept journées successives et calcule la température moyenne de la semaine.
Correction
somme = 0
for jour in range(1, 8):
temp = float(input(f"Température du jour {jour} : "))
somme = somme + temp
moyenne = somme / 7
print(f"Température moyenne de la semaine : {moyenne:.1f} °C")
On accumule les sept températures dans somme, puis on divise par 7. Le schéma « accumulateur dans une boucle » est un motif fondamental en programmation.
Exercice 10
- Écrire un programme permettant d’afficher les valeurs approchées de
exp(−4),exp(−3),exp(−2),exp(−1),exp(0),exp(1),exp(2),exp(3),exp(4).
- Écrire un programme permettant de tabuler la fonction exponentielle sur l’intervalle
[−20 ; 20]avec un pas égal à 2.
- Écrire un programme permettant de tabuler la fonction exponentielle sur l’intervalle
[0 ; 3]avec un pas de un dixième. On pourra imbriquer deux bouclesfor.
- Écrire un programme répondant à la question précédente, avec une boucle
while. Quelle curiosité remarque-t-on ?
Correction
1.
import math
for i in range(-4, 5):
print(f"exp({i}) = {math.exp(i):.6f}")
2.
import math
for x in range(-20, 21, 2):
print(f"exp({x}) = {math.exp(x):.6f}")
Le troisième argument de range est le pas : range(-20, 21, 2) donne \(-20, -18, \ldots, 18, 20\).
3.
import math
for entier in range(0, 31):
x = entier / 10
print(f"exp({x:.1f}) = {math.exp(x):.6f}")
Puisque range ne gère que des entiers, on parcourt les entiers de 0 à 30 et on divise par 10 pour obtenir le pas de 0,1.
4.
import math
x = 0.0
while x <= 3.0:
print(f"exp({x:.1f}) = {math.exp(x):.6f}")
x = x + 0.1
Curiosité : à cause des erreurs d’arrondi sur les flottants, x ne vaut jamais exactement 3.0 après 30 additions de 0.1. On peut observer que la dernière valeur affichée est 2.9 ou 3.0 selon les cas, car 0.1 n’est pas représentable exactement en binaire. C’est un piège classique des boucles while avec des flottants.
Exercice 11
Dans un conte américain, huit petits canetons s’appellent respectivement : Jack, Kack, Lack, Mack, Nack, Oack, Pack et Qack. Écrire un script en trois lignes qui génère tous ces noms à partir des deux chaînes de caractères suivantes :
debuts = 'JKLMNOPQ'fin = 'ack'
Correction
debuts = "JKLMNOPQ"
fin = "ack"
for lettre in debuts:
print(lettre + fin)
On parcourt chaque caractère de la chaîne debuts et on le concatène avec fin. L’opérateur + entre deux chaînes réalise la concaténation.
Affichage : Jack, Kack, Lack, Mack, Nack, Oack, Pack, Qack.
Exercice 12 : compte à rebours
Écrire un programme qui demande un entier positif n à l’utilisateur, puis affiche un compte à rebours de n à 0 avec une boucle while. Exemple : pour 5, afficher 5, 4, 3, 2, 1, 0.
Correction
n = int(input("Entrez un entier positif : "))
while n >= 0:
print(n, end=" ")
n = n - 1
Exercice 13 : somme des entiers
Écrire un programme qui calcule la somme des entiers de 1 à n (n saisi par l’utilisateur) avec une boucle while. Pour n = 5, la somme vaut $1 + 2 + 3 + 4 + 5 = 15$.
Correction
n = int(input("Entrez un entier positif : "))
somme = 0
i = 1
while i <= n:
somme = somme + i
i = i + 1
print(f"La somme des entiers de 1 à {n} est {somme}")
On initialise somme à 0 et i à 1 avant la boucle ; à chaque tour, on ajoute i puis on l’incrémente.
Exercice 14 : devine le nombre
Écrire un jeu où l’ordinateur choisit un nombre au hasard entre 1 et 100 (random.randint(1, 100), après import random) et où l’utilisateur doit le deviner. À chaque essai, le programme indique si le nombre cherché est plus grand ou plus petit, et s’arrête quand il est trouvé.
Correction
import random
nombre_secret = random.randint(1, 100)
proposition = 0
while proposition != nombre_secret:
proposition = int(input("Devinez le nombre (entre 1 et 100) : "))
if proposition < nombre_secret:
print("C'est plus grand !")
elif proposition > nombre_secret:
print("C'est plus petit !")
else:
print("Bravo, vous avez trouvé !")
Améliorations possibles : compter les tentatives, en limiter le nombre, vérifier que la saisie est bien entre 1 et 100.
Exercice 15 : suite de Fibonacci
La suite de Fibonacci commence par 0 et 1, puis chaque terme est la somme des deux précédents : 0, 1, 1, 2, 3, 5, 8, 13, 21, 34… Afficher ses n premiers termes (n saisi par l’utilisateur) avec une boucle while. On aura besoin de deux variables pour les deux derniers termes et d’un compteur.
Correction
n = int(input("Combien de termes ? "))
a = 0
b = 1
compteur = 0
while compteur < n:
print(a)
nouveau = a + b
a = b
b = nouveau
compteur = compteur + 1
Les trois lignes de décalage se remplacent par une affectation simultanée : a, b = b, a + b.
Exercice 16 : validation de mot de passe
Écrire un programme qui demande un mot de passe. Le mot de passe correct est "NSI2026". Le programme redemande le mot de passe tant qu’il est incorrect, avec au plus trois tentatives, puis affiche « Accès autorisé » ou « Accès refusé ».
Correction
mot_de_passe_correct = "NSI2026"
tentatives_restantes = 3
mot_de_passe = ""
while mot_de_passe != mot_de_passe_correct and tentatives_restantes > 0:
mot_de_passe = input("Entrez le mot de passe : ")
if mot_de_passe == mot_de_passe_correct:
print("Accès autorisé")
else:
tentatives_restantes = tentatives_restantes - 1
if tentatives_restantes > 0:
print(f"Mot de passe incorrect, il reste {tentatives_restantes} tentative(s).")
else:
print("Accès refusé")
La condition du while combine deux conditions avec and : le mot de passe est incorrect et il reste des tentatives.
Exercice 17 : jeu du plus ou moins à deux joueurs
Écrire un jeu où le joueur 1 choisit un nombre secret entre 1 et 50, puis où le joueur 2 doit le deviner en sept tentatives au plus. Après chaque proposition, le programme indique « plus grand » ou « plus petit », compte les tentatives et affiche à la fin un message de victoire ou de défaite.
Correction
nombre_secret = int(input("Joueur 1, entrez le nombre secret (1 à 50) : "))
print("\n" * 50) # fait défiler l'écran pour cacher le nombre
tentatives_max = 7
tentatives = 0
proposition = 0
while proposition != nombre_secret and tentatives < tentatives_max:
print(f"Il reste {tentatives_max - tentatives} tentative(s)")
proposition = int(input("Joueur 2, votre proposition : "))
tentatives = tentatives + 1
if proposition < nombre_secret:
print("C'est plus grand !")
elif proposition > nombre_secret:
print("C'est plus petit !")
else:
print(f"Bravo joueur 2, trouvé en {tentatives} tentative(s) !")
if proposition != nombre_secret:
print(f"Perdu ! Le nombre secret était {nombre_secret}. Victoire du joueur 1.")