Vous êtes sur la page 1sur 16

Les boucles

Par AnnaStretter et nico.pyright

www.siteduzero.com

Dernire mise jour le 30/09/2011

Sommaire

1/15

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

www.siteduzero.com

Les boucles

2/15

Les boucles
Nous les avons voqus rapidement un peu plus tt en parlant des tableaux et des listes. Dans ce chapitre nous allons dcrire plus prcisment les boucles. Elles sont souvent utilises pour parcourir des lments numrables, comme le sont les tableaux ou les listes. Elles peuvent galement tre utilises pour effectuer la mme action tant quune condition nest pas ralise. Sommaire du chapitre :

Informations sur le tutoriel


Auteur : nico.pyright Difficult : Licence :

La boucle For La boucle Foreach La boucle While Les instructions break et continue Q.C.M.

La boucle For
La premire instruction que nous avons aperue est la boucle for. Elle permet de rpter un bout de code tant quune condition est vraie. Souvent cette condition est un compteur. Nous pouvons par exemple afficher un message 50 fois avec le code suivant : Code : C# int compteur; for (compteur = 0; compteur < 50; compteur++) { Console.WriteLine("Bonjour C#"); }

Ce qui donne :

www.siteduzero.com

Les boucles

3/15

Nous dfinissons ici un entier compteur . Il est initialis 0 en dbut de boucle (compteur = 0). Aprs chaque excution du bloc de code du for, cest--dire chaque itration, il va afficher Bonjour C# . la fin de chaque itration, la variable compteur est incrmente (compteur++) et nous recommenons lopration tant que la condition compteur < 50 est vraie. Bien sr, la variable compteur est accessible dans la boucle et change de valeur chaque itration. Code : C# int compteur; for (compteur = 0; compteur < 50; compteur++) { Console.WriteLine("Bonjour C# " + compteur); }

Ce qui donne :

www.siteduzero.com

Les boucles

4/15

Ce prcdent code affichera la valeur de la variable aprs chaque bonjour, donc de 0 49. En effet, quand compteur passe 50, la condition nest plus vraie et on passe aux instructions suivantes. En gnral, on utilise la boucle for pour parcourir un tableau. Ainsi, nous pourrons utiliser le compteur comme indice pour accder aux lments du tableau : Code : C# string[] jours = new string[] { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" }; int indice; for (indice = 0; indice < 7; indice++) { Console.WriteLine(jours[indice]); }

Dans cette boucle, comme la premire itration indice vaut 0, nous afficherons llment du tableau la position 0, savoir Lundi . litration suivante, indice passe 1, nous affichons llment du tableau la position 1, savoir Mardi , et ainsi de suite. Ce qui donne :

www.siteduzero.com

Les boucles

5/15

Attention ce que lindice ne dpasse pas la taille du tableau, sinon laccs un indice en dehors des limites du tableau provoquera une erreur lexcution. Pour viter ceci, on utilise en gnral la taille du tableau comme condition de fin : Code : C# string[] jours = new string[] { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" }; int indice; for (indice = 0; indice < jours.Length; indice++) { Console.WriteLine(jours[indice]); }

Ici jours.Length renvoie la taille du tableau, savoir 7. Il est trs courant de boucler sur un tableau en passant tous les lments un par un, mais il est possible de changer les conditions de dpart, les conditions de fin, et llment qui influe sur la condition de fin. Ainsi, lexemple suivant : Code : C# int[] chiffres = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; for (int i = 9; i > 0; i -= 2) { Console.WriteLine(chiffres[i]); }

Permet de parcourir le tableau de 2 en 2 en commenant par la fin.

www.siteduzero.com

Les boucles
Ce qui nous donne :

6/15

Vous avez pu voir que dans cet exemple, nous avons dfini lentier i directement dans linstruction for, cest une commodit qui nous permet davoir la variable i qui nexiste qu lintrieur de la boucle, car sa porte correspond aux accolades qui dlimitent le for. Attention, il est possible de faire un peu tout et nimporte quoi dans ces boucles. Aussi il peut arriver que lon se retrouve avec des bugs, comme des boucles infinies. Par exemple, le code suivant : Code : C# for (int indice = 0; indice < 7; indice--) { Console.WriteLine("Test" + indice); }

est une boucle infinie. En effet, on modifie la variable indice en la dcrmentant. Sauf que la condition de sortie de la boucle est valable pour un indice qui dpasse ou gale la valeur 7, ce qui narrivera jamais. Si on excute lapplication avec ce code, la console va afficher linfini le mot Test avec son indice. La seule solution pour quitter le programme sera de fermer brutalement lapplication. Lautre solution est dattendre que le programme se termine... Mais tu viens de dire que la boucle tait infinie ?

Oui cest vrai, mais en fait, ici on se heurte un cas limite du C#. Cest cause de la variable indice. indice est un entier que lon dcrmente. Au dbut il vaut zro, puis -1, puis -2, etc Lorsque la variable indice arrive la limite infrieure que le type int est capable de grer, cest--dire -2147483648 alors il y a ce quon appelle un dpassement de capacit . Sans rentrer dans les dtails, il ne peut pas stocker un entier plus petit et donc

www.siteduzero.com

Les boucles
il boucle et repart lentier le plus grand, cest--dire 2147483647. Donc pour rsumer, lindice fait : 0 -1 -2 ... -2147483647 -2147483648 +2147483647

7/15

Et comme l, il se retrouve suprieur 7, la boucle se termine.

Donc, techniquement, ce nest pas une boucle infinie, mais bon, on a attendu tellement longtemps pour atteindre ce cas limite que cest tout comme. Et surtout, nous tombons sur un cas imprvu. Ici, a se termine plutt bien , mais a aurait pu finir en crash de lapplication. Dans tous les cas, il faut absolument matriser ses conditions de sortie de boucle pour viter la boucle infinie, un des cauchemars du dveloppeur !

La boucle Foreach
Comme il est trs courant dutiliser les boucles pour parcourir un tableau ou une liste, le C# dispose dun oprateur particulier : foreach que lon peut traduire par pour chaque : pour chaque lment du tableau faire Code : C# string[] jours = new string[] { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" }; foreach (string jour in jours) {

www.siteduzero.com

Les boucles
} Console.WriteLine(jour);

8/15

Cette boucle va nous permettre de parcourir tous les lments du tableau jours . chaque itration, la boucle va crer une chaine de caractres jour qui contiendra llment courant du tableau. noter que la variable jour aura une porte gale au bloc foreach. Nous pourrons ainsi utiliser cette valeur dans le corps de la boucle et pourquoi pas lafficher comme dans lexemple prcdent. Ce qui produira :

Linstruction foreach fonctionne aussi avec les listes, par exemple le code suivant : Code : C# List<string> jours = new List<string> { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" }; foreach (string jour in jours) { Console.WriteLine(jour); }

nous permettra dafficher tous les jours de la semaine contenus dans la liste des jours. Attention, la boucle foreach est une boucle permettant la consultation du contenu sur lequel on boucle. Cela veut dire la variable qui est cre par la boucle, contenant le contenu de l'itration en cours est en lecture seule. Par exemple, le code suivant : Code : C# List<string> jours = new List<string> { "Lundi", "Mardi",

www.siteduzero.com

Les boucles
"Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" }; foreach (string jour in jours) { jour = "pas de jour !"; }

9/15

provoquera l'erreur de compilation suivante : Citation : Compilateur Impossible d'assigner 'jour', car il s'agit d'un 'variable d'itration foreach'

Notez d'ailleurs que l'quipe de Visual C# express a quelques progrs faire

...

Si nous souhaitons utiliser une boucle pour changer la valeur de notre liste ou de notre tableau, il faudra passer par une boucle for : Code : C# List<string> jours = new List<string> { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" }; for (int i = 0; i < jours.Count; i++ ) { jours[i] = "pas de jour !"; }

Il vous arrivera aussi surement un jour (a arrive tous les dveloppeurs) de vouloir modifier une liste en elle mme lors d'une boucle foreach. C'est--dire lui rajouter un lment, le supprimer, etc ... C'est galement impossible car partir du moment o l'on rentre dans la boucle foreach, la liste devient non-modifiable. Prenons l'exemple combien classique de la recherche d'une valeur dans une liste pour la supprimer. Nous serions tent de faire : Code : C# List<string> jours = new List<string> { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" }; foreach (string jour in jours) { if (jour == "Mercredi") jours.Remove(jour); }

ce qui semblerait tout fait correct et en plus, ne provoque pas d'erreur de compilation. Sauf que si vous excutez l'application, vous aurez l'erreur suivante :

www.siteduzero.com

Les boucles

10/15

qui nous plante notre application. Le programme nous indique que la collection a t modifie et que l'opration d'numration peut ne pas s'excuter . Il est donc impossible de faire notre suppression ainsi. Comment tu ferais toi ?

Et bien, plusieurs solutions existent. Celle qui vient en premier l'esprit est d'utiliser une boucle for par exemple : Code : C# for (int i = 0 ; i < jours.Count ; i++) { if (jours[i]== "Mercredi") jours.Remove(jours[i]); }

Nous n'tudierons pas les autres solutions car elles font appels des notions que nous verrons en dtail plus tard. Aprs avoir lu ceci, vous pourriez avoir l'impression que la boucle foreach n'est pas souple et difficilement exploitable, autant utiliser autre chose ... Vous verrez l'utilisation que non, elle est en fait trs pratique. Il faut simplement connatre ses limites. Voil qui est chose faite. Nous avons vu que linstruction foreach permettait de boucler sur tous les lments dun tableau ou dune liste. En fait, il est possible de parcourir tous les types qui sont numrables. Nous verrons plus loin ce qui caractrise un type numrable, car pour linstant, cest un secret ! Chuuut .

La boucle While
La boucle while est en gnral moins utilise que for ou foreach. Cest la boucle qui va nous permettre de faire quelque chose tant quune condition nest pas vrifie. Elle ressemble de loin la boucle for, mais la boucle for se spcialise dans le parcours de tableau tandis que la boucle while est plus gnrique.

www.siteduzero.com

Les boucles
Par exemple : Code : C# int i = 0; while (i < 50) { Console.WriteLine("Bonjour C#"); i++; }

11/15

Permet dcrire Bonjour C# 50 fois de suite. Ici, la condition du while est value en dbut de boucle. Dans lexemple suivant : Code : C# int i = 0; do { Console.WriteLine("Bonjour C#"); i++; } while (i < 50);

La condition de sortie de boucle est value la fin de la boucle. Lutilisation du mot cl do permet dindiquer le dbut de la boucle. Concrtement cela veut dire que dans le premier exemple, le code lintrieur de la boucle peut ne jamais tre excut, si par exemple lentier i est initialis 50. A contrario, on passera au moins une fois dans le corps de la boucle du second exemple, mme si lentier i est initialis 50 car la condition de sortie de boucle est value la fin. Les conditions de sorties de boucles ne portent pas forcment sur un compteur ou un indice, nimporte quelle expression peut tre value. Par exemple : Code : C# string[] jours = new string[] { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" }; int i = 0; bool trouve = false; while (!trouve) { string valeur = jours[i]; if (valeur == "Jeudi") { trouve = true; } else { i++; } } Console.WriteLine("Trouv l'indice " + i);

www.siteduzero.com

Les boucles

12/15

Le code prcdant va rpter les instructions contenues dans la boucle while tant que le boolen trouve sera faux (c'est-dire quon va sarrter ds que le boolen sera vrai). Nous analysons la valeur lindice i, si la valeur est celle cherche, alors nous passons le boolen vrai et nous pourrons sortir de la boucle. Sinon, nous incrmentons lindice pour passer au suivant. Attention encore aux valeurs de sorties de la boucle. Si nous ne trouvons pas la chaine recherche, alors i continuera sincrmenter ; le boolen ne passera jamais vrai, nous resterons bloqu dans la boucle et nous risquons datteindre un indice qui nexiste pas dans le tableau. Il serait plus prudent que la condition porte galement sur la taille du tableau, par exemple : Code : C# string[] jours = new string[] { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" }; int i = 0; bool trouve = false; while (i < jours.Length && !trouve) { string valeur = jours[i]; if (valeur == "Jeudi") { trouve = true; } else { i++; } } if (!trouve) Console.WriteLine("Valeur non trouve"); else Console.WriteLine("Trouv l'indice " + i);

Ainsi, si lindice est suprieur la taille du tableau, nous sortons de la boucle et nous liminons le risque de boucle infinie. Une erreur classique est que la condition ne devienne jamais vraie cause dune erreur de programmation. Par exemple, si joublie dincrmenter la variable i, alors chaque passage de la boucle janalyserai toujours la premire valeur du tableau et je natteindrai jamais la taille maximale du tableau, condition qui me permettrait de sortir de la boucle. Je ne le rpterai jamais assez : bien faire attention aux conditions de sortie dune boucle.

Les instructions break et continue


Il est possible de sortir prmaturment dune condition grce linstruction break. Ds quelle est rencontre, elle sort du bloc de code de la boucle. Lexcution du programme continue alors avec les instructions situes aprs la boucle. Par exemple : Code : C# int i = 0; while (true) { if (i >= 50) { break; } Console.WriteLine("Bonjour C#");

www.siteduzero.com

Les boucles
} i++;

13/15

Le code prcdent pourrait potentiellement produire une boucle infinie. En effet, la condition de sortie du while est toujours vraie. Mais lutilisation du mot cl break nous permettra de sortir de la boucle ds que i atteindra la valeur 50. Certes ici, il suffirait que la condition de sortie porte sur lvaluation de lentier i. Mais il peut arriver des cas o il pourra tre judicieux dutiliser un break (surtout lors d'un dmnagement !). Cest le cas pour lexemple suivant. Imaginons que nous voulions vrifier la prsence dune valeur dans une liste. Pour la trouver, on peut parcourir les lments de la liste et une fois trouve, on peut sarrter. En effet, il sera inutile de continuer parcourir le reste des lments : Code : C# List<string> jours = new List<string> { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" }; bool trouve = false; foreach (string jour in jours) { if (jour == "Jeudi") { trouve = true; break; } }

Nous nous conomisons ici danalyser les 3 derniers lments de la liste. Il est galement possible de passer litration suivante dune boucle grce lutilisation du mot-cl continue. Prenons lexemple suivant : Code : C# for (int i = 0; i < 20; i++) { if (i % 2 == 0) { continue; } Console.WriteLine(i); }

Ici, loprateur % est appel modulo . Il permet dobtenir le reste de la division. Lopration i % 2 renverra donc 0 quand i sera pair. Ainsi, ds quun nombre pair est trouv, nous passons litration suivante grce au mot cl continue. Ce qui fait que nous n'allons afficher que les nombres impairs. Ce qui donne :

www.siteduzero.com

Les boucles

14/15

Bien sr, il aurait t possible dinverser la condition du if pour ne faire le Console.WriteLine() que dans le cas o i % 2 != 0. vous de choisir lcriture que vous prfrez en fonction des cas que vous rencontrerez.

Q.C.M.
Quest-ce quune boucle infinie ?
Des cheveux trs entortills Une rptition dinstruction dont la condition de sortie nest jamais vrifie Un bug alatoire 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; for (double d = 0; d <= 1; d += 0.2) { i++; } Console.WriteLine(i);

1 2 3 4 5 6 7 8

www.siteduzero.com

Les boucles
Que se passe-t-il dans le code suivant ? Code : C# int[] tableau = new int[] { 1, 2, 3, 4 }; for (int i = 0; i <= tableau.Length; i++) { Console.WriteLine(tableau[i]); }

15/15

On affiche 1, 2, 3 On affiche 1, 2, 3, 4 Il y a une erreur lexcution

Que voit-on affich la fin de ce programme : Code : C# for (int i = 0; i < 10; i++) { if (i % 2 == 0) continue; if (i == 5) break; Console.WriteLine(i); }

1, 2, 3, 4, 5, 6, 7, 8, 9 1, 3, 5, 7, 9 1, 3, 5 1, 3

Correction !
Statistiques de rponses au QCM

www.siteduzero.com

Vous aimerez peut-être aussi