Aller au menu - Aller au contenu

Icône Les boucles

Mise à jour : 22/01/2012
Difficulté : Facile Facile Creative Commons BY-NC-SA
163 458 visites depuis 7 jours , dont 4 648 sur ce chapitre , classé 2/777
Après avoir vu comment réaliser des conditions en C, nous allons apprendre à réaliser des boucles :)

Qu'est-ce qu'une boucle ?
C'est une technique permettant de répéter les mêmes instructions plusieurs fois. Cela nous sera bien utile par la suite, notamment pour le premier TP qui vous attend après ce chapitre ;)

Relaxez-vous : ce chapitre sera simple. Nous avons vu ce qu'étaient les conditions et les booléens dans le chapitre précédent, c'était un gros morceau à avaler. Maintenant ça va couler de source, et le TP ne devrait pas vous poser trop de problèmes :)
Enfin, profitez-en, parce qu'ensuite nous ne tarderons pas à entrer dans la partie II du tutoriel, et là vous aurez intérêt à être sacrément armés :pirate:
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Qu'est-ce qu'une boucle ?

Tout comme pour les conditions, il y a plusieurs façons de réaliser des boucles. Au bout du compte, cela revient à faire la même chose : répéter les mêmes instructions un certain nombre de fois.
Nous allons voir 3 types de boucles courantes en C :

  • while
  • do... while
  • for

Dans tous les cas, le schéma est le même :

Image utilisateur


Voici ce qu'il se passe dans l'ordre :
  1. L'ordinateur lit les instructions de haut en bas (comme d'habitude)
  2. Puis, une fois arrivé à la fin de la boucle, il repart à la première instruction
  3. Il recommence alors à lire les instructions de haut en bas...
  4. ... Et il repart au début de la boucle.

Le problème dans ce système c'est que si on ne l'arrête pas, l'ordinateur est capable de répéter les instructions à l'infini ! Il est pas du genre à se plaindre vous savez, il fait ce qu'on lui dit de faire :p

Et c'est là qu'on retrouve... des conditions !
Quand on crée une boucle, on indique toujours une condition. Cette condition signifiera "Répète la boucle tant que cette condition est vraie.".

Il y a plusieurs manières de s'y prendre comme je vous l'ai dit. Voyons voir sans plus tarder comment on réalise une boucle de type while en C :)

La boucle while

Voici comment on construit une boucle while :

Code : C
1
2
3
4
while (/* Condition */)
{
    // Instructions à répéter
}


C'est aussi simple que cela :D
While signifie "Tant que". On dit donc à l'ordinateur "Tant que la condition est vraie : répète les instructions entre accolades".

Je vous propose de faire un test simple : on va demander à l'utilisateur de taper le nombre 47. Tant qu'il n'a pas tapé le nombre 47, on recommence à lui demander le nombre. Le programme ne pourra s'arrêter que si l'utilisateur tape le nombre 47 (je sais je sais, je suis diabolique :-° ) :

Code : C
1
2
3
4
5
6
7
int nombreEntre = 0;

while (nombreEntre != 47)
{
    printf("Tapez le nombre 47 ! ");
    scanf("%d", &nombreEntre);
}


Voici maintenant le test que j'ai fait. Notez que j'ai fait exprès de me planter 2-3 fois avant de taper le bon nombre :D

Code : Console
Tapez le nombre 47 ! 10

Tapez le nombre 47 ! 27

Tapez le nombre 47 ! 40

Tapez le nombre 47 ! 47


Le programme s'est arrêté après avoir tapé le nombre 47.
Cette boucle while se répète donc tant que l'utilisateur n'a pas tapé 47, c'est assez simple.

Maintenant, essayons de faire quelque chose d'un peu plus intéressant : on veut que notre boucle se répète un certain nombre de fois.
On va pour cela créer une variable "compteur" qui vaudra 0 au début du programme et que l'on va incrémenter au fur et à mesure. Vous vous souvenez de l'incrémentation ? Ca consiste à ajouter 1 à la variable en faisant "variable++;".

Regardez attentivement ce bout de code et, surtout, essayez de le comprendre :

Code : C
1
2
3
4
5
6
7
int compteur = 0;

while (compteur < 10)
{
    printf("Salut les Zeros !\n");
    compteur++;
}


Résultat :

Code : Console
Salut les Zeros !

Salut les Zeros !

Salut les Zeros !

Salut les Zeros !

Salut les Zeros !

Salut les Zeros !

Salut les Zeros !

Salut les Zeros !

Salut les Zeros !

Salut les Zeros !


Ce code répète 10 fois l'affichage de "Salut les Zeros !".

Comment ça marche exactement ?


  1. Au départ, on a une variable compteur initialisée à 0. Elle vaut donc 0 au début du programme.
  2. La boucle while ordonne la répétition TANT QUE compteur est inférieur à 10. Comme compteur vaut 0 au départ, on rentre dans la boucle.
  3. On affiche la phrase "Salut les Zeros !" via un printf.
  4. On incrémente la valeur de la variable compteur, grâce à l'instruction "compteur++;". Compteur valait 0, il vaut maintenant 1.
  5. On arrive à la fin de la boucle (accolade fermante), on repart donc au début, au niveau du while. On refait le test du while : "Est-ce que compteur est toujours inférieur à 10 ?". Ben oui, compteur vaut 1 :p Donc on recommence les instructions de la boucle.

Et ainsi de suite... Compteur va valoir progressivement 0, 1, 2, 3, ..., 8, 9, et 10. Lorsque compteur vaut 10, la condition "compteur < 10" est fausse. Comme l'instruction est fausse, on sort de la boucle.

On pourrait voir d'ailleurs que la variable compteur augmente au fur et à mesure dans la boucle, en l'affichant dans le printf :

Code : C
1
2
3
4
5
6
7
int compteur = 0;

while (compteur < 10)
{
    printf("La variable compteur vaut %d\n", compteur);
    compteur++;
}


Code : Console
La variable compteur vaut 0

La variable compteur vaut 1

La variable compteur vaut 2

La variable compteur vaut 3

La variable compteur vaut 4

La variable compteur vaut 5

La variable compteur vaut 6

La variable compteur vaut 7

La variable compteur vaut 8

La variable compteur vaut 9



Voilà, si vous avez compris ça, vous avez tout compris ;)
Vous pouvez vous amuser à augmenter la limite du nombre de boucles ("< 100" au lieu de "< 10"). Cela m'aurait été d'ailleurs très pratique plus jeune pour rédiger les punitions que je devais réécrire 100 fois :-°


Attention aux boucles infinies



Lorsque vous créez une boucle, assurez-vous toujours qu'elle peut s'arrêter à un moment ! Si la condition est toujours vraie, votre programme ne s'arrêtera jamais !
Voici un exemple de boucle infinie :

Code : C
1
2
3
4
while (1)
{
    printf("Boucle infinie\n");
}


Souvenez-vous des booléens : 1 = vrai, 0 = faux. Ici, la condition est toujours vraie, donc ce programme affichera "Boucle infinie" sans arrêt !

Pour arrêter un tel programme sous Windows, vous n'avez pas d'autre choix que de fermer la console en cliquant sur la croix en haut à droite. Sous Linux faites Ctrl + C.


Faites donc très attention : évitez à tout prix de tomber dans une boucle infinie.

Notez toutefois que les boucles infinies peuvent s'avérer utiles, notamment, nous le verrons plus tard, lorsque nous réaliserons des jeux.

La boucle do... while

Ce type de boucle est très similaire à while, bien qu'un peu moins utilisé en général.
La seule chose qui change en fait par rapport à while, c'est la position de la condition. Au lieu d'être au début de la boucle, la condition est à la fin :

Code : C
1
2
3
4
5
6
7
int compteur = 0;

do
{
    printf("Salut les Zeros !\n");
    compteur++;
} while (compteur < 10);


Qu'est-ce que ça change ?
C'est très simple : la boucle while pourrait très bien ne jamais être exécutée si la condition est fausse dès le départ. Par exemple, si on avait initialisé le compteur à 50, la condition aurait été fausse dès le début et on ne serait jamais rentré dans la boucle.
Pour la boucle do... while, c'est différent : cette boucle s'exécutera toujours au moins une fois. En effet, le test se fait à la fin comme vous pouvez le voir. Si on initialise compteur à 50, la boucle s'exécutera une fois.

Il est donc parfois utile de faire des boucles de ce type, pour s'assurer que l'on rentre au moins une fois dans la boucle. C'est quand même plus rare ;)

Il y a une particularité dans la boucle do... while qu'on a tendance à oublier quand on débute : il y a un point-virgule tout à la fin ! N'oubliez pas d'en mettre un après le while, ou sinon votre programme plantera à la compilation :p

La boucle for

En théorie, la boucle while permet de réaliser toutes les boucles que l'on veut.
Toutefois, tout comme le switch pour les conditions, il est dans certains cas utiles d'avoir un autre système de boucle plus "condensé", plus rapide à écrire.

Les boucles for sont très très utilisées en programmation. Je n'ai pas de statistiques sous la main, mais sachez que vous utiliserez certainement autant de for que de while, donc il vous faudra savoir manipuler ces deux types de boucles.


Comme je vous le disais, les boucles for sont juste une autre façon de faire une boucle while.
Voici un exemple de boucle while que nous avons vu tout à l'heure :

Code : C
1
2
3
4
5
6
7
int compteur = 0;

while (compteur < 10)
{
    printf("Salut les Zeros !\n");
    compteur++;
}


Voici maintenant l'équivalent en boucle for :

Code : C
1
2
3
4
5
6
int compteur;

for (compteur = 0 ; compteur < 10 ; compteur++)
{
    printf("Salut les Zeros !\n");
}


Quelles différences ?

  • Vous noterez qu'on n'a pas initialisé la variable compteur à 0 dès sa déclaration (mais on aurait pu le faire)
  • Il y a beaucoup de choses entre les parenthèses après le for (nous allons détailler ça après)
  • Il n'y a plus de compteur++; dans la boucle

Intéressons-nous à ce qui se trouve entre les parenthèses, car c'est là que réside tout l'intérêt de la boucle for. Il y a 3 instructions condensées, séparée chacune par un point-virgule :

  • La première est l'initialisation : cette première instruction est utilisée pour préparer notre variable compteur. Dans notre cas, on initialise la variable à 0.
  • La seconde est la condition : comme pour la boucle while, c'est la condition qui dit si la boucle doit être répétée ou pas. Tant que la condition est vraie, la boucle for continue.
  • Enfin, il y a l'incrémentation : cette dernière instruction est exécutée à la fin de chaque tour de boucle pour mettre à jour la variable compteur. La quasi-totalité du temps on fera une incrémentation, mais on peut aussi faire une décrémentation (variable--;) ou encore n'importe quelle autre opération (variable += 2; pour avancer de 2 en 2 par exemple)

Bref, comme vous le voyez la boucle for n'est rien d'autre qu'un condensé ;)
Sachez vous en servir, vous en aurez besoin plus d'une fois !

Q.C.M.

Laquelle de ces boucles n'existe pas en C ?
Combien de fois le message "Salut" sera-t-il affiché ?


Code : C
1
2
3
4
5
6
7
int compteur = 15;

do
{
    printf("Salut\n");
    compteur++;
} while (compteur < 15);
Combien de fois le message "Salut" sera-t-il affiché ici ?


Code : C
1
2
3
4
5
6
int compteur = 14;

while (compteur < 15)
{
    printf("Salut\n");
}
Laquelle de ces boucles for pourrait afficher les messages suivants dans la console ?

Code : Console
Ligne n°1

Ligne n°3

Ligne n°5

Ligne n°7

Statistiques de réponses au QCM

Dans le prochain chapitre, nous allons souffler un peu en faisant un TP. Les TP, vous allez le voir, sont des chapitres où vous n'apprenez rien de théorique, vous ne faites que de l'application pratique de ce que vous avez appris :)
Ce sera l'occasion de s'entraîner à réutiliser tout ce que vous avez assimilé jusqu'ici !


Bon allez, et pour terminer ce chapitre sur une touche d'humour, voici une petite blague de programmeurs que vous pouvez maintenant comprendre :D

Image utilisateur


Le texte du printf est "I will not throw paper airplanes in class", ce qui, pour ceux d'entre vous qui ne comprendraient pas l'anglais, signifie "Je ne jetterai plus d'avions en papier en classe".
"Nice try", répond le professeur, c'est-à-dire : "Bien essayé." ;)
Chapitre précédent Sommaire Chapitre suivant

Partager

213 commentaires pour "Les boucles"
Note moyenne : 3.89 / 4 (2861 votes)
Pseudo Commentaire
Hors ligne torpix # Posté le 29/11/2011 à 18:49:18

Terspy73
tu as tout d'abord oublié d'inclure ton programme dans la fonction main (int main())
ensuite, tu n'a declaré comme variable ni choix , ni nombreMystere
A la fin de ta derniere phrase , tu a oublié un point virgule.
Retest ca devrait marcher
Hors ligne torpix # Posté le 29/11/2011 à 18:49:55

desole du double post, connexion merdique c'est pour ca
Hors ligne lapinbleu2 # Posté le 19/12/2011 à 11:02:16
Avatar

bonjour à tous !!
j'ai commencé à lire le tuto sur la programmation qui est fort intéressant..
mais avant tout j'aimerais savoir s'il est possible de programmer des votes toutes les deux heures sur des forums.. et répondre aux différents sujets en faisant un copié collé de la récap des points (preuve de vote) ? en résumé, ce pourrait être ma boucle..
par la suite, je pourrais si c'est toujours possible, programmer les articles et certains coms de mon blog..
je suis novice dans ce domaine et je voudrais entrer dans ce monde à ptits pas..
bonne journée et bon début de semaine à tous !!
Hors ligne MickeySansMousse # Posté le 30/12/2011 à 23:51:13
Avatar

Salut a tous

pour l'instant je lit tranquillement le tuto mais de fois quand j'utilise code::block il arrive quand recopiant les exemples du tuto... benh code::block y m'dit qu'y a des erreurs. J'aimerais savoir si c'est normal ou sinon ce que je peux faire ??
merci d'avance;)
Hors ligne pololo522 # Posté le 24/01/2012 à 23:22:48

Jai fait un petit jeu de BaseBall, il suffit de rentrer les statisque d'un joueur et vous allez voir ce qu'il pourrait frapper :) si vous avez des suggestion n'hesitez pas
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
    int AB = 0, B1 = 0, B2 = 0, B3 = 0, HR = 0, nombreMystere = 0, B1A = 0, B2A = 0, B3A = 0, HRA = 0, Rejouer = 1;
    const int MAX = 100, MIN = 1;

    // Génération du nombre aléatoire

 {
        // On demande le nombre
        printf("AB ? Nombre de presence au baton");
        scanf("%d", &AB);
        printf("B1 ? Premier but ? ");
        scanf("%d", &B1);
        printf("B2 ? Deuxieme but ? ");
        scanf("%d", &B2);
        printf("B3 ? Troisieme but ? ");
        scanf("%d", &B3);
        printf("HR ? Coup de circuit ? ");
        scanf("%d", &HR);
B1A= (B1*100)/AB;
B2A= (B2*100)/AB+B1A;
B3A= (B3*100)/AB+B2A;
HRA= (HR*100)/AB+B3A;
while ( Rejouer == 1)
{
{
    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;

    /* La boucle du programme. Elle se répète tant que l'utilisateur
    n'a pas trouvé le nombre mystère */



        // On compare le nombre entré avec le nombre mystère

        if (nombreMystere <= B1A )
            printf("Premier BUT !\n\n");
        else if (nombreMystere <= B2A )
            printf("Deuxieme BUT !\n\n");
        else if (nombreMystere <= B3A )
            printf("Troisieme BUT ! Tu cours vite ! \n\n");
        else if (nombreMystere <= HRA )
            printf("HOME RUN !!!!! HOOOOOMMMEEEEE RUNNN!!!! \n\n");
        else
            printf ("Stike Out\n\n");
            printf ("Un autre lancer ? 1=oui 0=non \n");
            scanf("%d", &Rejouer);
    }}
}
    return 0;
}

Voir tous les commentaires