You are on page 1of 16

Les boucles

Par AnnaStretter et nico.pyright

www.siteduzero.com

Dernière mise à jour le 30/09/2011

.. 14 www... 0 Les boucles .........siteduzero.........................................................................................................................................................................................................................................................................Sommaire 1/15 Sommaire Sommaire . 12 Q........................................................................................................................................................................................................................................................................................................................................................................................................ 7 La boucle While ..............................com .................................. 2 La boucle For .................................................C............................................................................. 1 Informations sur le tutoriel ............................................................................................................................................M.................. ........................................................................................................... 2 Informations sur le tutoriel ........... 10 Les instructions break et continue ........................................................................................................................................................ 2 La boucle Foreach ....................................

compteur < 50.WriteLine("Bonjour C#").com . La boucle For La première instruction que nous avons aperçue est la boucle for. Nous pouvons par exemple afficher un message 50 fois avec le code suivant : Code : C# int compteur. } Ce qui donne : www.C. Sommaire du chapitre : Informations sur le tutoriel Auteur : nico. compteur++) { Console.Les boucles 2/15 Les boucles Nous les avons évoqués rapidement un peu plus tôt en parlant des tableaux et des listes. Souvent cette condition est un compteur. comme le sont les tableaux ou les listes. Elle permet de répéter un bout de code tant qu’une condition est vraie.M. Elles peuvent également être utilisées pour effectuer la même action tant qu’une condition n’est pas réalisée. Dans ce chapitre nous allons décrire plus précisément les boucles. Elles sont souvent utilisées pour parcourir des éléments énumérables. for (compteur = 0.pyright Difficulté : Licence : La boucle For La boucle Foreach La boucle While Les instructions break et continue Q.siteduzero.

c’est-à-dire à chaque itération. } Ce qui donne : www.Les boucles 3/15 Nous définissons ici un entier « compteur ». for (compteur = 0.siteduzero. Bien sûr.WriteLine("Bonjour C# " + compteur). il va afficher « Bonjour C# ». la variable compteur est incrémentée (compteur++) et nous recommençons l’opération tant que la condition « compteur < 50 » est vraie. compteur < 50. À la fin de chaque itération. la variable compteur est accessible dans la boucle et change de valeur à chaque itération. Il est initialisé à 0 en début de boucle (compteur = 0). compteur++) { Console.com . Après chaque exécution du bloc de code du for. Code : C# int compteur.

et ainsi de suite. À l’itération suivante. nous afficherons l’élément du tableau à la position 0. int indice. indice passe à 1. En effet. for (indice = 0. En général.com . Ainsi. "Jeudi". nous affichons l’élément du tableau à la position 1. à savoir « Lundi ». à savoir « Mardi ». on utilise la boucle for pour parcourir un tableau.Les boucles 4/15 Ce précédent code affichera la valeur de la variable après chaque bonjour. "Mercredi". la condition n’est plus vraie et on passe aux instructions suivantes. indice < 7. "Vendredi". "Mardi". "Samedi". } Dans cette boucle. comme à la première itération indice vaut 0. "Dimanche" }. Ce qui donne : www. nous pourrons utiliser le compteur comme indice pour accéder aux éléments du tableau : Code : C# string[] jours = new string[] { "Lundi". quand compteur passe à 50. donc de 0 à 49.siteduzero.WriteLine(jours[indice]). indice++) { Console.

5. "Samedi". for (int i = 9. "Mercredi". 1. les conditions de fin.siteduzero. l’exemple suivant : Code : C# int[] chiffres = new int[] { 0. for (indice = 0. Pour éviter ceci. à savoir 7. Il est très courant de boucler sur un tableau en passant tous les éléments un par un. i > 0.WriteLine(chiffres[i]). 3. indice++) { Console. } Permet de parcourir le tableau de 2 en 2 en commençant par la fin. "Jeudi". 7.Length. Ainsi.Les boucles 5/15 Attention à ce que l’indice ne dépasse pas la taille du tableau. 4. "Dimanche" }. on utilise en général la taille du tableau comme condition de fin : Code : C# string[] jours = new string[] { "Lundi". sinon l’accès à un indice en dehors des limites du tableau provoquera une erreur à l’exécution.Length renvoie la taille du tableau. www. mais il est possible de changer les conditions de départ. 8. } Ici jours. et l’élément qui influe sur la condition de fin. i -= 2) { Console.com . indice < jours. int indice. 6. 9 }. "Mardi". "Vendredi". 2.WriteLine(jours[indice]).

ici on se heurte à un cas limite du C#.. la console va afficher à l’infini le mot « Test » avec son indice. puis -2. puis -1.com . c’est-à-dire -2147483648 alors il y a ce qu’on appelle un dépassement de capacité . C’est à cause de la variable indice. indice est un entier que l’on décrémente.Les boucles Ce qui nous donne : 6/15 Vous avez pu voir que dans cet exemple. car sa portée correspond aux accolades qui délimitent le for. En effet. etc … Lorsque la variable indice arrive à la limite inférieure que le type int est capable de gérer. ce qui n’arrivera jamais. le code suivant : Code : C# for (int indice = 0. L’autre solution est d’attendre que le programme se termine. Sauf que la condition de sortie de la boucle est valable pour un indice qui dépasse ou égale la valeur 7. Par exemple. comme des boucles infinies. Si on exécute l’application avec ce code. indice--) { Console. mais en fait.siteduzero. Au début il vaut zéro. Sans rentrer dans les détails.. Aussi il peut arriver que l’on se retrouve avec des bugs. La seule solution pour quitter le programme sera de fermer brutalement l’application. } est une boucle infinie. il est possible de faire un peu tout et n’importe quoi dans ces boucles. on modifie la variable indice en la décrémentant. il ne peut pas stocker un entier plus petit et donc www.WriteLine("Test" + indice). nous avons défini l’entier i directement dans l’instruction for. Mais tu viens de dire que la boucle était infinie ? Oui c’est vrai. c’est une commodité qui nous permet d’avoir la variable i qui n’existe qu’à l’intérieur de la boucle. indice < 7. Attention.

Dans tous les cas. -2147483647 -2147483648 +2147483647 7/15 Et comme là.. Donc pour résumer. "Dimanche" }.siteduzero.Les boucles il boucle et repart à l’entier le plus grand. le C# dispose d’un opérateur particulier : foreach que l’on peut traduire par « pour chaque » : pour chaque élément du tableau faire … Code : C# string[] jours = new string[] { "Lundi". "Jeudi". un des cauchemars du développeur ! La boucle Foreach Comme il est très courant d’utiliser les boucles pour parcourir un tableau ou une liste. "Mardi".com . l’indice fait : 0 -1 -2 . mais ça aurait pu finir en crash de l’application. ce n’est pas une boucle infinie. nous tombons sur un cas imprévu. mais bon. c’est-à-dire 2147483647. "Mercredi". Ici. on a attendu tellement longtemps pour atteindre ce cas limite que c’est tout comme. Et surtout. la boucle se termine. ça se termine « plutôt bien ». "Vendredi". Donc. il se retrouve supérieur à 7. techniquement. foreach (string jour in jours) { www. "Samedi".. il faut absolument maîtriser ses conditions de sortie de boucle pour éviter la boucle infinie.

contenant le contenu de l'itération en cours est en lecture seule. le code suivant : Code : C# List<string> jours = new List<string> { "Lundi". "Dimanche" }. Ce qui produira : L’instruction foreach fonctionne aussi avec les listes.WriteLine(jour). "Mardi".com .Les boucles } Console.WriteLine(jour). www. foreach (string jour in jours) { Console. À noter que la variable « jour » aura une portée égale au bloc foreach. "Jeudi". Cela veut dire la variable qui est créée par la boucle. la boucle va créer une chaine de caractères « jour » qui contiendra l’élément courant du tableau. Par exemple. "Samedi". } nous permettra d’afficher tous les jours de la semaine contenus dans la liste des jours. Nous pourrons ainsi utiliser cette valeur dans le corps de la boucle et pourquoi pas l’afficher comme dans l’exemple précédent. 8/15 Cette boucle va nous permettre de parcourir tous les éléments du tableau « jours ». "Mardi".siteduzero. Attention. "Vendredi". par exemple le code suivant : Code : C# List<string> jours = new List<string> { "Lundi". À chaque itération. la boucle foreach est une boucle permettant la consultation du contenu sur lequel on boucle. "Mercredi".

} Il vous arrivera aussi surement un jour (ça arrive à tous les développeurs) de vouloir modifier une liste en elle même lors d'une boucle foreach. "Jeudi". la liste devient non-modifiable. foreach (string jour in jours) { jour = "pas de jour !". "Dimanche" }. } ce qui semblerait tout à fait correct et en plus.Remove(jour). } 9/15 provoquera l'erreur de compilation suivante : Citation : Compilateur Impossible d'assigner à 'jour'. Prenons l'exemple ô combien classique de la recherche d'une valeur dans une liste pour la supprimer.com . "Samedi".Count. vous aurez l'erreur suivante : www.. ne provoque pas d'erreur de compilation.. "Vendredi". "Vendredi". le supprimer. "Dimanche" }. "Mardi". etc . "Dimanche" }.. "Vendredi". i < jours. foreach (string jour in jours) { if (jour == "Mercredi") jours. "Samedi". Si nous souhaitons utiliser une boucle pour changer la valeur de notre liste ou de notre tableau.siteduzero. "Mercredi". il faudra passer par une boucle for : Code : C# List<string> jours = new List<string> { "Lundi". "Jeudi". "Jeudi". Nous serions tenté de faire : Code : C# List<string> jours = new List<string> { "Lundi".Les boucles "Mercredi". "Mercredi". i++ ) { jours[i] = "pas de jour !". C'est également impossible car à partir du moment où l'on rentre dans la boucle foreach.. "Samedi". Sauf que si vous exécutez l'application. "Mardi". C'est-à-dire lui rajouter un élément. car il s'agit d'un 'variable d'itération foreach' Notez d'ailleurs que l'équipe de Visual C# express a quelques progrès à faire . for (int i = 0.

En fait. elle est en fait très pratique. il est possible de parcourir tous les types qui sont énumérables. car pour l’instant. vous pourriez avoir l'impression que la boucle foreach n'est pas souple et difficilement exploitable. Nous avons vu que l’instruction foreach permettait de boucler sur tous les éléments d’un tableau ou d’une liste.Les boucles 10/15 qui nous plante notre application. i++) { if (jours[i]== "Mercredi") jours. Voilà qui est chose faite. plusieurs solutions existent. autant utiliser autre chose . Après avoir lu ceci. } Nous n'étudierons pas les autres solutions car elles font appels à des notions que nous verrons en détail plus tard. La boucle While La boucle while est en général moins utilisée que for ou foreach.. i < jours. Le programme nous indique que « la collection a été modifiée » et que « l'opération d'énumération peut ne pas s'exécuter ». Comment tu ferais toi ? Et bien.Remove(jours[i]).Count . Il faut simplement connaître ses limites. Elle ressemble de loin à la boucle for. Vous verrez à l'utilisation que non. Il est donc impossible de faire notre suppression ainsi. mais la boucle for se spécialise dans le parcours de tableau tandis que la boucle while est plus générique. C’est la boucle qui va nous permettre de faire quelque chose tant qu’une condition n’est pas vérifiée. Celle qui vient en premier à l'esprit est d'utiliser une boucle for par exemple : Code : C# for (int i = 0 .com .. Nous verrons plus loin ce qui caractérise un type énumérable. c’est un secret ! Chuuut .siteduzero. www.

le code à l’intérieur de la boucle peut ne jamais être exécuté. "Vendredi".WriteLine("Trouvé à l'indice " + i). L’utilisation du mot clé do permet d’indiquer le début de la boucle. i++. Dans l’exemple suivant : Code : C# int i = 0.Les boucles Par exemple : Code : C# int i = 0. Par exemple : Code : C# string[] jours = new string[] { "Lundi".WriteLine("Bonjour C#"). "Mardi". } } Console. la condition du while est évaluée en début de boucle.siteduzero.com . i++. "Samedi".WriteLine("Bonjour C#"). n’importe quelle expression peut être évaluée. Les conditions de sorties de boucles ne portent pas forcément sur un compteur ou un indice. "Jeudi". } while (i < 50). si par exemple l’entier i est initialisé à 50. Ici. on passera au moins une fois dans le corps de la boucle du second exemple. do { Console. même si l’entier i est initialisé à 50 car la condition de sortie de boucle est évaluée à la fin. } else { i++. La condition de sortie de boucle est évaluée à la fin de la boucle. www. bool trouve = false. int i = 0. if (valeur == "Jeudi") { trouve = true. "Dimanche" }. while (i < 50) { Console. "Mercredi". } 11/15 Permet d’écrire « Bonjour C# » 50 fois de suite. while (!trouve) { string valeur = jours[i]. A contrario. Concrètement cela veut dire que dans le premier exemple.

par exemple : Code : C# string[] jours = new string[] { "Lundi". bool trouve = false. www. while (i < jours. si j’oublie d’incrémenter la variable i. while (true) { if (i >= 50) { break.Les boucles 12/15 Le code précédant va répéter les instructions contenues dans la boucle while tant que le booléen « trouve » sera faux (c'est-àdire qu’on va s’arrêter dès que le booléen sera vrai). Par exemple : Code : C# int i = 0. "Mercredi". alors à chaque passage de la boucle j’analyserai toujours la première valeur du tableau et je n’atteindrai jamais la taille maximale du tableau. Par exemple. L’exécution du programme continue alors avec les instructions situées après la boucle. Si nous ne trouvons pas la chaine recherchée. condition qui me permettrait de sortir de la boucle. Nous analysons la valeur à l’indice i. if (valeur == "Jeudi") { trouve = true. } else { i++.siteduzero. "Dimanche" }. "Jeudi".WriteLine("Bonjour C#"). } } if (!trouve) Console. Sinon. "Samedi". nous resterons bloqué dans la boucle et nous risquons d’atteindre un indice qui n’existe pas dans le tableau. Ainsi.com . alors nous passons le booléen à vrai et nous pourrons sortir de la boucle. "Mardi". nous incrémentons l’indice pour passer au suivant. nous sortons de la boucle et nous éliminons le risque de boucle infinie. Attention encore aux valeurs de sorties de la boucle. si la valeur est celle cherchée. Je ne le répèterai jamais assez : bien faire attention aux conditions de sortie d’une boucle. si l’indice est supérieur à la taille du tableau. Il serait plus prudent que la condition porte également sur la taille du tableau. else Console. Dès qu’elle est rencontrée.Length && !trouve) { string valeur = jours[i]. Une erreur classique est que la condition ne devienne jamais vraie à cause d’une erreur de programmation. Les instructions break et continue Il est possible de sortir prématurément d’une condition grâce à l’instruction break.WriteLine("Trouvé à l'indice " + i). le booléen ne passera jamais à vrai.WriteLine("Valeur non trouvée"). alors i continuera à s’incrémenter . int i = 0. elle sort du bloc de code de la boucle. "Vendredi". } Console.

dès qu’un nombre pair est trouvé. Il est également possible de passer à l’itération suivante d’une boucle grâce à l’utilisation du mot-clé continue. break.WriteLine(i). bool trouve = false. nous passons à l’itération suivante grâce au mot clé continue. i++) { if (i % 2 == 0) { continue. Il permet d’obtenir le reste de la division. Prenons l’exemple suivant : Code : C# for (int i = 0. il suffirait que la condition de sortie porte sur l’évaluation de l’entier i. "Mardi". Pour la trouver.com . C’est le cas pour l’exemple suivant. i < 20. Ce qui fait que nous n'allons afficher que les nombres impairs. "Samedi". 13/15 Le code précédent pourrait potentiellement produire une boucle infinie. "Jeudi".siteduzero.Les boucles } i++. foreach (string jour in jours) { if (jour == "Jeudi") { trouve = true. Certes ici. } Ici. } Console. Mais il peut arriver des cas où il pourra être judicieux d’utiliser un break (surtout lors d'un déménagement !). on peut s’arrêter. L’opération i % 2 renverra donc 0 quand i sera pair. il sera inutile de continuer à parcourir le reste des éléments : Code : C# List<string> jours = new List<string> { "Lundi". la condition de sortie du while est toujours vraie. on peut parcourir les éléments de la liste et une fois trouvée. Ainsi. "Dimanche" }. Ce qui donne : www. Imaginons que nous voulions vérifier la présence d’une valeur dans une liste. "Mercredi". } } Nous nous économisons ici d’analyser les 3 derniers éléments de la liste. En effet. "Vendredi". l’opérateur % est appelé « modulo ». En effet. Mais l’utilisation du mot clé break nous permettra de sortir de la boucle dès que i atteindra la valeur 50.

for (double d = 0. À vous de choisir l’écriture que vous préférez en fonction des cas que vous rencontrerez.WriteLine() que dans le cas où i % 2 != 0.2) { i++.M.WriteLine(i). Q. il aurait été possible d’inverser la condition du if pour ne faire le Console. d <= 1. 1 2 3 4 5 6 7 8 www.siteduzero.Les boucles 14/15 Bien sûr. Qu’est-ce qu’une boucle infinie ? Des cheveux très entortillés Une répétition d’instruction dont la condition de sortie n’est jamais vérifiée Un bug aléatoire obtenu par effet de bord Puis-je parcourir un tableau avec une boucle while? Oui Non Que vaut la variable i à la sortie de la boucle ? Code : C# int i = 0.C.com . d += 0. } Console.

3. 2. 4 }. 3. 3 Correction ! Statistiques de réponses au QCM www. i++) { if (i % 2 == 0) continue.siteduzero. 7. 2. 8. } 15/15 On affiche 1. 3.WriteLine(i). 2. 5. 9 1. 7. 3. i < 10. 6.WriteLine(tableau[i]). 4 Il y a une erreur à l’exécution Que voit-on affiché à la fin de ce programme : Code : C# for (int i = 0. i++) { Console. } 1. 4. 3.Length. 3 On affiche 1. 5. 5 1. if (i == 5) break. 9 1. i <= tableau. for (int i = 0. 2.Les boucles Que se passe-t-il dans le code suivant ? Code : C# int[] tableau = new int[] { 1.com . Console.