Les boucles imbriquées

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.

ExempleDouble 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.

1
/** JavaScript: affiche les tables de mutliplication de 0 à 10 */
2
for (let i = 0; i <= 10; i++) {
3
  for (let j = 0; j <= 10; j++) {
4
    console.log(i, '*', j, '=', i * j)
5
  }
6
}
1
"""Python: affiche les tables de multiplication de 0 à 10."""
2
for i in range(11):
3
  for j in range(11):
4
    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.

1
"""Python."""
2
import random
3
4
end = False
5
score = 0
6
maximumScore = 0
7
8
# Continue tant que l'utilisateur répond 'o'
9
while not end:
10
  # Calcule un nombre aléatoire
11
  randomNumber = random.randint(0, 9)
12
  print('Table de', randomNumber)
13
  # Demande la table de multiplication du nombre aléatoire
14
  for i in range (10):
15
    answer = input('{0}*{1} = ? '.format(randomNumber, i))
16
    # Compte le nombre total de questions
17
    maximumScore = maximumScore + 1 
18
    # 1 point pour chaque bonne réponse
19
    if answer == str(randomNumber*i):
20
      score = score + 1 
21
22
  print('Vous avez {0}/{1}'.format(score, maximumScore))
23
  end = input('Continuer le test ? (o/n)') != 'o'
1
/** JavaScript */
2
let end = false
3
let score = 0
4
let maximumScore = 0
5
6
// Continue tant que l'utilisateur répond 'o'
7
while (!end) {
8
  // Calcul un nombre aléatoire
9
  const randomNumber = Math.floor(Math.random() * 9) + 1
10
  console.log('Table de ' + randomNumber)
11
  // Demande la table de multiplication du nombre aléatoire
12
  for (let i = 0; i < 10; i++) {
13
    const answer = Number(prompt(randomNumber + '*' + i + ' ?'))
14
    // Compte le nombre total de questions
15
    maximumScore = maximumScore + 1
16
    // 1 point pour chaque bonne réponse
17
    if (answer === randomNumber * i) {
18
      score = score + 1
19
    }
20
  }
21
  console.log('Vous avez ' + score + '/' + maximumScore)
22
  end = prompt('Continuer le test ? (o/n)') !== 'o'
23
}

À retenir

Les boucles imbriquées permettent d'associer des itérations à d'autres et doivent être manipulées avec prudence.