En programmation, il est souvent nécessaire d'exécuter à plusieurs reprises une instruction ou un groupe d'instructions, par exemple tant qu'une condition n'est pas vérifiée.
Supposons que vous vouliez afficher à dix reprises le mot « Bonjour ». Comment vous y prendriez-vous ? La première idée qui vient à l'esprit consiste à répéter dix fois l'instruction d'affichage
NSLog :
Code : Objective-C | NSLog(@"Bonjour");
NSLog(@"Bonjour");
NSLog(@"Bonjour");
NSLog(@"Bonjour");
NSLog(@"Bonjour");
NSLog(@"Bonjour");
NSLog(@"Bonjour");
NSLog(@"Bonjour");
NSLog(@"Bonjour");
NSLog(@"Bonjour");
|
Imaginez maintenant que vous vouliez répéter 100 fois l'affichage du mot « Bonjour ». Allez-vous écrire cent fois la même instruction ? Heureusement non ! Il existe plusieurs solutions bien plus élégantes : vous utiliserez pour cela une boucle
for,
while ou
do while.
Dans tous les cas, la procédure est la même. Regardez la figure suivante, elle représente le fonctionnement d'une boucle.
Voici ce qui se passe:
- l'ordinateur lit les instructions de haut en bas ;
- arrivé à la fin de la boucle, il retourne à la première instruction ;
- il lit de nouveau les instructions de haut en bas ;
- il repart à la première instruction ;
- etc
Malheureusement il y a un problème : la boucle est infinie! Si on ne l'arrête pas, l'ordinateur va lire les instructions
ad vitam æternam. Heureusement, les conditions vont nous aider. Lorsqu'on crée une boucle, on indique une condition pour sortir de la boucle.
La boucle for
La boucle
for est là pour vous éviter une luxation du poignet. Voici sa syntaxe :
Code : Objective-C | for (début; fin; incrément)
{
//Une ou plusieurs instructions
}
|
Trois paramètres sont passés à l'instruction
for :
- début représente la valeur initiale du compteur de boucle ;
- fin représente la condition qui permet de décider si la boucle se poursuit ou se termine ;
- incrément modifie la valeur du compteur de boucle à la fin de chaque tour de boucle.
Tout ceci vous semble peut-être obscur. Rassurez-vous, un petit exemple va vite clarifier les choses. Considérez le code suivant :
Code : Objective-C | int compteur;
for (compteur = 0; compteur < 100; compteur++)
{
NSLog(@"Bonjour");
}
|
Lors de la première exécution de la boucle, la variable entière
compteur est initialisée à
0. La condition
compteur < 100 est alors vérifiée, puisque
0 < 100. L'instruction
NSLog est exécutée, l'ordinateur repart au début de la boucle.
Lors de la deuxième exécution de la boucle, le compteur est incrémenté de
1 (
compteur++). Il a donc pour valeur
1. La condition étant vérifiée (
1 < 100), l'instruction
NSLog est de nouveau exécutée.
Ainsi de suite jusqu'à ce que
compteur soit égal à
100. Dans ce cas, la boucle
for prend fin et le programme continue de s'exécuter. Si vous faites le compte, l'instruction
NSLog aura été exécutée … 100 fois, ce qui est exactement l'effet recherché.
Etant donné qu'une seule instruction est exécutée dans la boucle
for, les accolades ne sont pas obligatoires. Dans notre exemple, vous auriez donc tout aussi bien pu écrire :
Code : Objective-C | for (compteur = 0; compteur < 100; compteur++)
NSLog(@"Bonjour");
|
Que diriez-vous d'un peu de pratique?
Toujours dans votre projet test, cliquez sur
ViewController.m dans le volet de navigation. Repérez la méthode
viewDidLoad et complétez-la comme suit :
Code : Objective-C | - (void)viewDidLoad
{
[super viewDidLoad];
int compteur;
for (compteur = 0; compteur < 100; compteur++)
NSLog(@"Bonjour");
}
|
Exécutez l'application en cliquant sur
Run. Très rapidement, cent lignes contenant le mot "Bonjour" sont affichées dans le volet de déboguage :
Code : Console | Attaching to process 2440.
2011-11-18 15:22:32.967 test[2440:f803] Bonjour
...
2011-11-18 15:22:33.048 test[2440:f803] Bonjour |
La boucle while
La boucle
while est une variante de l'instruction
for. Elle exécute une ou plusieurs instructions tant qu'une condition est vérifiée. Voici sa syntaxe :
Code : Objective-C | while(condition)
{
//Une ou plusieurs instructions
}
|
Voyons comment résoudre notre problème précédent avec une boucle
while.
Code : Objective-C | int compteur = 0;
while (compteur < 100)
{
NSLog(@"Bonjour");
compteur++;
}
|
La première instruction initialise à
0 la variable
compteur.
La boucle
while se poursuit jusqu'à ce que la variable
compteur soit supérieure ou égale à
100 (
while (compteur < 100)). Lors de l'entrée dans la boucle,
compteur vaut
0.
Les instructions entre les accolades sont donc exécutées: la première affiche le texte « Bonjour », la deuxième incrémente d'un la variable
compteur, qui vaut alors
1.
Après l'incrémentation, la condition
compteur < 100 est toujours vérifiée, puisque
compteur vaut
1. Les instructions à l'intérieur des accolades sont donc exécutées une nouvelle fois.
Ainsi de suite jusqu'à ce que
compteur soit égal à
100.
N'hésitez pas à tester le fonctionnement de la boucle
while. Dans votre projet
test, repérez la méthode
viewDidLoad et complétez-la comme suit :
Code : Objective-C | - (void)viewDidLoad
{
[super viewDidLoad];
int compteur = 0;
while (compteur < 100)
{
NSLog(@"Bonjour");
compteur++;
}
}
|
Exécutez l'application en cliquant sur
Run pour constater que cent lignes contenant le mot "Bonjour" sont affichées dans le volet de débogage.
Vous pouvez vous amuser à modifier la condition initiale du compteur (ligne 4) et la limite supérieure du compteur (ligne 5). Relancez l'application pour voir l'effet résultant.
Attention à ne pas créer une boucle infinie, ou simplement trop grosse : répéter un mot 100 fois est facile pour votre ordinateur ; le répéter 100 000 000 devient déjà plus difficile pour lui. Et bien souvent il plante.
La boucle do while
L'instruction
do while est une variante de l'instruction
while. Mais ici, la condition est testée après l'exécution des instructions entre accolades. Dans tous les cas, les instructions entre les accolades seront donc exécutées au moins une fois. Voici la syntaxe de cette instruction :
Code : Objective-C | do
{
//Une ou plusieurs instructions
} while (condition);
|
Si on voulait adapter notre exemple précédent, voici comment il faudrait faire avec une boucle
do while :
Code : Objective-C | int compteur = 0;
do
{
NSLog(@"Bonjour");
compteur++;
} while (compteur < 100);
|
La première instruction initialise la variable
compteur à
0. Les instructions entre les accolades sont alors exécutées une première fois : le mot « Bonjour » est affiché avec la fonction
NSLog() et la variable
compteur est incrémentée de
1.
La condition à la suite du
while est alors examinée. Après la première exécution des instructions entre les accolades,
compteur vaut
1. Il est donc bien inférieur à
100 et la boucle se poursuit. Ainsi de suite jusqu'à ce que
compteur devienne égal à
100.