Wiki CraftStudio
Advertisement

Les boucles sont un autre type de structure basique dans les langages de programmation comme le sont les conditions que nous avons déjà vu. D'ailleurs les boucles utilisent les conditions, je vous invite donc à relire le chapitre les concernant avant de continuer avec celui-ci.

D'une manière générale, une boucle permet de lire plusieurs fois un segment de code. Ce comportement est notamment mis à profil avec les tableaux afin que toutes les valeurs du tableaux soient exposées à ce même segment de code.

While[]

while [condition] do
    [segment de code]
end

While en anglais signifie "tant que". La boucle lit et continue de lire le segment de code écrit entre les mots clés do et end tant que la condition est vraie. Lorsque le programme arrive au mot-clé while, il évalue la condition. Si elle est vraie, il rentre dans la boucle, lit le code jusqu'au mot clé end puis reviens au mot clé while puis réévalue la condition et ainsi de suite... Le programme ne s’arrêtera pas de boucler tant que la condition reste vraie. Lorsqu'elle deviens fausse, le programme termine de lire le segment de code, puis continue à la suite de la boucle lorsqu'il se rend compte que la condition est devenue fausse.


Exemple :

print( "Début de la boucle" )

i = 1
while i <= 10 do -- "tant que la valeur de i est inférieure ou égale à 10"
   print(i)
   i = i + 1
end

print( "Fin de la boucle" )

-- ce code vous affiche :
-- Début de la boucle
-- 1
-- 2
-- ...
-- 9
-- 10
-- Fin de la boucle

Ici la condition de la boucle est que la variable i soit strictement inférieure à 11. Mais elle est incrémentée dans la boucle, c'est à dire que quelque soit sa valeur, on lui ajoute 1 à chaque tour. i devient égale à 11 à la fin du tour où elle a débuté avec la valeur 10. À ce moment là, la condition de la boucle n'est plus vrai et le programme continue de lire le script à la suite de la boucle.

Repeat[]

repeat
   [segment de code]
until [condition]

Repeat Until signifie "répète jusqu'à ce que". C'est un peu l'inverse d'une boucle While. Avec cette boucle, le segment de code est lut toujours au moins une fois et jusqu'à ce que la condition soit vraie. C'est à dire que à l'inverse de la boucle While le programme va boucler tant que la condition est fausse. L'autre point important avec cette boucle c'est que comme la condition est située après le segment de code, celui-ci sera toujours lu au moins une fois, même si la condition est vraie avant même de commencer à lire la boucle.

print( "Début de la boucle" )

i = 1
repeat
   print(i)
   i = i + 1
until i > 10 -- vous noterez que  i > 10  est l'inverse  i <= 10 (la condition utilisée plus haut avec while)

print( "Fin de la boucle" )
-- ce code vous affiche la même chose qu'avec la boucle while

Break, casser une boucle[]

Il est possible de sortir d'une boucle et de la stopper à n'importe quel moment grâce au mot clé break. Lorsque le programme le lit, il s’arrête immédiatement de lire la boucle, sans finir le segment de code ni réévaluer la condition.

print( "Début de la boucle" )

i = 1 
while i < 11 do
   print(i)
   if i == 5 then
       break
   end
   i = i + 1
end

print( "Fin de la boucle" )
-- ce code vous affiche :
-- Début de la boucle
-- 1
-- 2
-- 3
-- 4
-- 5
-- Fin de la boucle

Break fonctione avec toutes les boucles : While, Repeat et la dernière boucle, For.

For[]

For numérique[]

Dans les exemples ci-dessus, nous avons créé et incrémenté manuellement une variable puis nous avons vérifié sa valeur pour déterminer si la boucle devait continuer à être lue. Cette version de la boucle For permet de faire exactement ça, mais de manière plus condensée.

for variable = [début], [fin] do
   [segment de code]
end

-- ou bien :
for variable = [début], [fin], [pas] do
   [segment de code]
end

[début], [fin] et [pas] sont à remplacer par des nombres. Le pas est la valeur qui est ajoutée à la variable à chaque fin de tour de boucle. Si il n'est pas indiqué, il vaut par défaut +1.


Exemple :

for i = 1, 10 do
   print( i )
end
-- vous affiche :
-- 1
-- 2
-- ...
-- 9
-- 10

for i = 1, 10, 2 do
   print( i )
end
-- vous affiche :
-- 1
-- 3
-- 5
-- 7
-- 9

La valeur de début peut être supérieure à la valeur de fin, mais dans ce cas le pas doit obligatoirement être indiqué et être négatif (afin que la boucle compte à rebours).

for i = 10, 1, -2 do
    print( i )
end
-- vous affiche :
-- 10
-- 8
-- 6
-- 4
-- 2

Les boucles For numériques peuvent déjà être utilisées pour parcourir des tableaux numérotés assez facilement. Il y a juste deux "trucs" à se rappeler du chapitre sur les tableaux. D'une part que la taille d'un tableau, qui correspond justement au dernier l'index de celui-ci se récupère en faisant précéder le nom du tableau d'un croisillon. Et d'autre part, qu'il est possible d'écrire une variable entre les crochets lors de la lecture dans le tableau; c'est alors la valeur de la variable qui est utilisée comme clé.

tableau = { "un", "deux", "trois" }

for i = 1, #tableau do -- ici, #tableau vaut 3
   print( tableau[i] ) 
   -- i va successivement prendre la valeur 1 puis 2 puis 3
   -- donc on va successivement afficher la valeur de tableau[1] puis tableau[2] puis tableau[3]
end
-- vous affiche :
-- un
-- deux
-- trois

Vous pouvez rajouter des valeurs dans le tableau et vous verrez qu'elles s'afficheront sans devoir modifier quoi que ce soit au code de la boucle.

L'inconvénient est que ce type de boucle ne peut pas (ou pas correctement) afficher le contenu des tableaux lorsque les clés ne sont pas numériques (ou sont numériques mais pas continguës).

C'est précisément à cela que sert la boucle For spécialisée dans les tableaux.

For pour les tableaux[]

Là encore il y aura deux utilisations légèrement différentes, l'une pour les tableaux numérotés dont les clés sont contiguës, et l'autre pour n'importe quels tableaux.

for cle, valeur in ipairs( [tableauNumérique] ) do
   [code]
end

-- ou bien
for cle, valeur in pairs( [tableau] ) do
   [code]
end

La différence entre les deux est l'utilisation des itérateurs ipairs() ou pairs(). Sachez juste que ce sont des fonctions qui vont "présenter" le contenus du tableau à la boucle. Le tableau à parcourir doit être placé entre les parenthèses. Les variables cle et valeur peuvent être nommées autrement mais la boucle s'attend à trouver deux variables séparées par une virgule entre les mots clés for et in.

Le fonctionnement de la boucle est très simple : à chaque tour, les variables cle et valeur sont remplies respectivement avec la clé et la valeur de l'entrée (de la "ligne") du tableau qui est actuellement lue par la boucle.

ipairs()[]

C'est l'itérateur spécialisé pour les tableaux numérotés. Le résultat est exactement le même qu'avec la boucle for numérique comme dans le dernier exemple.

t = { "un", "deux", "trois" }

for cle, valeur in ipairs(t) do
   print( cle, valeur ) 
   -- souvenez vous que la fonction print() peut afficher plusieurs valeurs à la fois
   -- dans l'appel (ci-dessus), les variables sont séparées par des virgules
   -- dans la fenètre "Runtime Report", les valeurs seront séparées par un point d'interrogation.
end
-- vous affiche :
-- 1?un
-- 2?deux
-- 3?trois

Mais ici aussi, la boucle s’arrête lorsqu'elle rencontre la première clé qui n'est pas associée à une valeur, même si d'autre clés supérieure existent. La seule différence à l'usage entre cette boucle et le dernier exemple de boucle numérique est la manière dont on accède à la clé et à la valeur.

-- les deux boucles ci-dessous parcourent les tableaux exactement de la même manière

for i = 1, #tableau do
   print( i, tableau[i] ) 
end

for cle, valeur in ipairs(tableau) do
   print( cle, valeur )
end

pairs()[]

Cet itérateur fait dans la simplicité : il parcourt toutes les clés du tableau, quelque soit leur type.

Exemple :

tableau = { [{}] = "tableau", "un", deux = "deux", [3] = "trois",  }

for cle, valeur in pairs(tableau) do
   print( cle, valeur )
end
-- vous affiche quelque chose comme :
-- 1?un
-- 3?trois
-- table: 051329D0?tableau
-- deux?deux

Conclusion[]

Les boucles permettent de lire plusieurs fois un segment de code selon une condition. La boucle For est particulièrement adaptée pour parcourir un tableau et exposer toutes ses entrées (quelque soit leur nombre) au même segment de code.

Récapitulatif des boucles :

-- while et repeat

while [tant que condition est vraie] do
   [code]
end

repeat
   [code]
until [tant que condition est fausse]


-- boucle For numérotée pour itérer facilement sur un nombre

for variable = [début], [fin], [pas] do
   [code]
end

-- ou bien (spécifier le pas est optionnel) :
for variable = [début], [fin] do -- le pas est ici égal à +1
   [code]
end

-- utilisation pour parcourir un tableau numéroté :
for variable = 1, #tableau do
   -- 'variable' est la clé
   -- 'tableau[variable]' est la valeur
end


-- boucle For avec itérateur pour parcourir un tableau :

-- ipairs() pour les tableaux numérotés
for cle, valeur in ipairs( [tableauNuméroté] ) do
   [code]
end

-- pairs() pour parcourir n'importe quelle clé
for cle, valeur in pairs( [tableau] ) do
   [code]
end
Advertisement