Les boucles

Avec les blocs conditionnels, vous avez appris la notion de 'bloc'.

Et justement ça tombe bien, puisque nous allons encore voir des blocs : les blocs while et for.


Une boucle, c'est tout simplement un bout de code que vous décidez d'exécuter un certain nombre de fois. Et ce nombre de fois peut être soit déterminé à l'avance, soit totalement inconnu. Selon ces deux choses, vous allez alors choisir parmi boucle for ou while.


Commençons donc avec les boucles while.

En anglais, while signifie Tant que. Ainsi, une boucle while sert à exécuter une partie de code tant qu'une condition est vraie.


Voici comment s'écrit une boucle while :


while (condition) do

    instructions

end


Je vais vous expliquer un peu plus en détail comment fonctionne une boucle while.

Lorsque l'exécution du programme arrive sur la boucle while, la condition est testée une première fois, et on ne rentre dans la boucle que si la condition est vraie.

Ensuite, arrivé à la fin du code situé à l'intérieur de la boucle, l'exécution du programme retourne en haut de la boucle pour tester la condition. Si celle ci est vraie alors on fait un nouveau tour de boucle, sinon, on quitte la boucle.


Passons aux boucles for.


Maintenant que vous avez bien compris les boucles while, vous verrez, les boucles for, c'est facile.


Voici comment s'écrit une boucle for :


for (i, debut, max) do

    instructions

end


Et si maintenant je vous disais qu'une boucle for est une boucle while et que cette boucle est tout simplement une simplification d'écriture pour le programme suivant :


i = debut

while (i < max) do

    instructions

    i = i + 1

end


Une boucle for s'utilise donc dès lors que vous savez combien de fois que vous voulez exécuter votre boucle.


Pour afficher tous les nombres entre 1 et 10 compris, il suffit d'écrire :


for (i, 1, 11) do

    print(i)

end

J'ai dit qu'une boucle for était comme une boucle while, mais en réalité, il y a deux petites subtilités. Tout d'abord, lorsque l'on écrit une boucle for, la variable servant d'indice de la boucle est transformée en variable locale à la boucle. L'ancienne valeur de la variable servant d'indice est sauvegardée, et restaurée une fois que la boucle est terminée.

Cela signifie que dans le programme suivant :

i = 18

for (i, 2, 7) do

    print(i)

end

print(i)

La valeur finale de i, dans le dernier print, est 18.

Ensuite, deuxième subtilité, on ne peut pas modifier l'indice d'une boucle for, ou du moins, si vous le modifiez, sa vraie valeur est restaurée à chaque nouveau tour. Exemple :

for (i, 1, 5) do

    print(i)

    i = 2

end

Ce programme a pour sortie :

1

2

3

4

C'est tout ! Un peu de pratique, et ça coulera tout seul.

Petite précision tout de même.

Vous l'avez vu, une boucle for se termine forcément, dès que le max est atteint.

Pour les boucles while, c'est plus compliqué. C'est pourquoi il faut toujours faire attention à ce que la condition de fin soit atteinte à un moment où à un autre.


Il faut typiquement éviter d'écrire quelque chose ressemblant à :

i=0

while (i != 11) do

    i = i + 2

end


Enfin, avant de nous quitter pour voir les définitions de fonctions, je vais vous parler de trois instructions : break, continue et pass.


Les deux premiers ne sont utilisables que dans des boucles, le troisième, lui, l'est partout.


L'instruction break dans une boucle va tout simplement sortir de la boucle. Si vous êtes dans plusieurs boucles imbriquées, vous quitterez seulement la plus intérieure.


L'instruction continue va faire sauter le programme directement au début de la boucle au moment de la vérification de la condition.


Ainsi, si vous mettez la condition de sortie de boucle à False et que vous utilisez continue dans une boucle while, cela équivaudra à un break.


Le bloc pass, maintenant. C'est littéralement un bloc qui ne sert à rien. Lorsque vous utilisez pass, c'est comme si vous disiez à l'interpréteur "Là, ne fais rien du tout".


Exemple :


if (False) then

    pass

else

    print("C'est normal")

end


Rendez vous aux les définitions de fonctions !