next up previous contents
Next: Boucle while Up: Boucles itératives Previous: Boucles itératives

  
Boucle loop

La boucle de syntaxe la plus simple est:

loop
sequence_instructions
end loop;

Sémantique: Les instructions de la séquence sont repétées indéfinimment à moins que l'une d'entre elles ne provoque la sortie de la boucle. On lit: ``repéter sequence_instructions''.

Exemple:

Reprenons l'exemple de la la somme des entiers naturels 1 + 2 + 3 + .... Nous avons changé les noms des variables: i et somme correspondent ici aux compteur et somme_courante utilisés plus haut.

  i, somme : integer := 0;
begin
  loop
     i := i + 1;
     somme := somme + i;
  end loop;
end;

A chaque tour de boucle on calcule une nouvelle valeur pour i. Elle est ajoutée à la variable somme, qui détient ainsi la somme de toutes les valeurs succésives prises par i. Notez que i et somme sont initialisées à zéro, qui est l'élément neutre de l'addition. Le tableau suivant décrit l'évolution des variables pour les premières itérations. Chaque colonne correspond à une itération (identifiée par son numéro), et aux valeurs des variables au cours de celle-ci. L'itération 0 décrit l'état des variables avant l'exécution de la boucle.

itérations 0 1 2 3 4 ...
i 0 1 2 3 4 ...
somme 0 1 3 6 10 ...

Dans le tableau suivant, on détaille, pour ces mêmes itérations, le calcul accumulé dans la variable somme:

itérations 0 1 2 3 4 ...
i 0 1 2 3 4 ...
somme 0 0+1 0+1+2 0+1+2+3 0+1+2+3+4 ...

La boucle de notre exemple ne s'arrête jamais. Dans la pratique, on aura rarement envie d'écrire des boucles infinies. Une manière de finir une boucle est donnée par l'instruction

  exit

Exécutée à l'intérieur d'une boucle, celle-ci est terminée sur le champ, et le controle du programme passe à l'instruction immédiatement après la fin de la boucle (après le end loop). Dans l'exemple précédent, supposons que l'on décide d'arrêter la boucle lorsque le terme n a été ajouté à la somme. On suppose que n est un identificateur entier positif déclaré auparavant. On peut alors ajouter, en début de boucle, une instruction de sortie qui teste si i à déjà atteint la valeur n:

  n : constant integer:= ...;
  i, somme : integer := 0;
begin
  loop
      if i = n then exit; end if;
      i := i + 1;
    somme := somme + i;
  end loop;
end;

On peut écrire plus simplément cet instruction avec la syntaxe:

exit when condition_sortie

et l'on obtient alors la boucle:

-- Boucle loop_1
 loop     
    exit when i = n;
    i := i + 1;
    somme := somme + i;
 end loop;

L'instruction exit peut apparaître plusieurs fois et n'importe où dans une boucle: aussi bien au début, qu'au milieu ou juste avant la fin.

Propriétés à la sortie d'un loop

Afin de décrire le comportément de n'importe quelle boucle, on s'intéresse, non seulement à ce qu'elle fait pendant son exécution, mais aussi à l'état du programme après qu'elle soit finie. Cet état dépend en partie du corps de la boucle, mais aussi de ses conditions d'arrêt. Dans le cas d'une boucle loop, les conditions de sortie peuvent être multiples:

loop
   A; ..;
   exit when C1;
   B;...;
   exit when C2;
   ....
   exit when Cn
end loop;

Si on ne peut rien dire de manière générale quant à l'état produit par les instructions A; B; .. du corps, on sait on revanche que juste après la sortie de la boucle la propriété

C1 or C2 or .. or Cn

est vraie. Cela signifie, tout simplement, que pour qu'elle ait finie, cette boucle a dû exécuter l'une des instructions exit, donc, au moins une des conditions de sortie C1, C2, .., Cn est devenue vraie.


next up previous contents
Next: Boucle while Up: Boucles itératives Previous: Boucles itératives
Maria-Viginia Aponte
2001-11-21