Les boucles imbriquées
Impossible d'accéder à la ressource audio ou vidéo à l'adresse :
La ressource n'est plus disponible ou vous n'êtes pas autorisé à y accéder. Veuillez vérifier votre accès puis recharger la vidéo.
Objectif
Comprendre l'imbrication de plusieurs structures itératives.
Mise en situation
Imaginons un programme qui se charge de modifier tout les pixels d'un écran. Pour cela il effectue une boucle sur chaque pixel, l'un après l'autre, pour lui donner la valeur désirée. Comme vous le savez, un écran est constitué de lignes et de colonnes de pixels. On peut donc dire que notre programme va parcourir l'ensemble des lignes de notre écran, et pour chacune de ces lignes, parcourir l'ensemble des colonnes. Nous avons donc là en fait 2 boucles, l'une imbriquée dans l'autre. Nous allons voir qu'une imbrication de boucle n'est pas compliquée à réaliser, mais que cela nécessite un peu de vigilance.
Imbrication
Une boucle peut en contenir une autre, et plus précisément, être imbriquée dans une autre.
Il faut être particulièrement vigilant aux variables qui sont modifiées pendant les itérations d'une boucle imbriquée car celles-ci sont susceptibles d'avoir des répercussions sur l'autre boucle.
En particulier, on veillera à ne pas modifier le compteur de la boucle externe dans la boucle imbriquée.
Exemple : Double compteur
Deux compteurs différents sont déclarés.
Pour chaque itération de la boucle externe, la boucle imbriquée (ou interne) réalise 11 itérations. Le compteur de la boucle imbriquée est remis à zéro à chaque nouvelle itération de la boucle externe.
/** JavaScript: affiche les tables de mutliplication de 0 à 10 */
for (let i = 0; i <= 10; i++) {
for (let j = 0; j <= 10; j++) {
console.log(i, '*', j, '=', i * j)
}
}
"""Python: affiche les tables de multiplication de 0 à 10."""
for i in range(11):
for j in range(11):
print(i, '*', j, '=', i * j)
Imbrication mixte
L'imbrication est possible pour tous les types de boucle. On peut même imbriquer des boucles de types différents, comme une boucle for
dans une boucle while
.
Exemple :
Le programme boucle tant que le jeu continue. À chaque tour, on pioche un nombre aléatoire et on demande sa table de multiplication de 0 à 9.
"""Python."""
import random
end = False
score = 0
maximumScore = 0
# Continue tant que l'utilisateur répond 'o'
while not end:
# Calcule un nombre aléatoire
randomNumber = random.randint(0, 9)
print('Table de', randomNumber)
# Demande la table de multiplication du nombre aléatoire
for i in range (10):
answer = input('{0}*{1} = ? '.format(randomNumber, i))
# Compte le nombre total de questions
maximumScore = maximumScore + 1
# 1 point pour chaque bonne réponse
if answer == str(randomNumber*i):
score = score + 1
print('Vous avez {0}/{1}'.format(score, maximumScore))
end = input('Continuer le test ? (o/n)') != 'o'
/** JavaScript */
let end = false
let score = 0
let maximumScore = 0
// Continue tant que l'utilisateur répond 'o'
while (!end) {
// Calcul un nombre aléatoire
const randomNumber = Math.floor(Math.random() * 9) + 1
console.log('Table de ' + randomNumber)
// Demande la table de multiplication du nombre aléatoire
for (let i = 0; i < 10; i++) {
const answer = Number(prompt(randomNumber + '*' + i + ' ?'))
// Compte le nombre total de questions
maximumScore = maximumScore + 1
// 1 point pour chaque bonne réponse
if (answer === randomNumber * i) {
score = score + 1
}
}
console.log('Vous avez ' + score + '/' + maximumScore)
end = prompt('Continuer le test ? (o/n)') !== 'o'
}
À retenir
Les boucles imbriquées permettent d'associer des itérations à d'autres et doivent être manipulées avec prudence.
Impossible d'accéder à la ressource audio ou vidéo à l'adresse :
La ressource n'est plus disponible ou vous n'êtes pas autorisé à y accéder. Veuillez vérifier votre accès puis recharger la vidéo.