print · rss · source

< Branchements conditionnels | TutoCFrench | Les fonctions >


Les itérations

Notions :

  • while
  • for
  • break
  • continue

Répéter une série d'instructions avec while

L'instruction while permet d'exécuter un bloc d'instructions tant qu'une condition est vraie :

while (condition)
instruction;

Par exemple, pour afficher les entiers de 0 à 9 :

i = 0;
while (i<10) {
    printf("%d\n", i);
    i++;
}

L'instruction for

L'instruction for permet, tout comme l'instruction while, d'exécuter un bloc d'instructions tant qu'une condition est vraie mais en plus elle permet de définir explicitement une initialisation et une opération :

for ( instruction d'initialisation ; condition ; opération )
instruction;

Concrètement, cela permet une écriture beaucoup plus concise qu'avec while. Par exemple, pour afficher les entiers de 0 à 9 :

for (i=0; i<10; i++)
    printf("%d\n", i);

Voici ce qui se passe :

  1. Juste avant d'entrer dans la boucle, l'initialisation i=0 est effectuée
  2. ensuite la condition i<10 est testée. Si elle est vrai, ce qui est le cas pour i ayant des valeurs de 1 à 9, l'instructions du corps de la boucle, ici printf("..."); est effectuée. Sinon, la boucle est terminée
  3. L'opération i++ est effectuée
  4. Le programme reboucle à l'étape 2

Il est possible de procéder à plusieurs initialisations et à plusieurs opérations en les séparant par des virgules. On peut aussi procéder à plusieurs tests en utilisant les connecteurs logiques && ou || :

for (i=0, j=1; i<10 && j<100; i++, j=j*2)
    printf("%d %d\n", i, j);

L'instruction do... while

C'est une variante de la boucle while vue précédement :

do
instruction;
while(condition);

Par exemple, pour afficher les entiers de 0 à 9 :

i = 0;
do {
    printf("%d\n", i);
    i++;
} while (i<10);

Les instructions break et continue

L'instruction break permet de sortir d'une itération :

i=0;
while (1) { /* la condition est toujours vraie */
    printf("%d\n", i);
    i++;
    if (i>10)
        break;
}

L'instruction continue est rarement utilisée, elle permet de passer directement à l'itération suivante.

Les pièges infernaux des boucles

Certaines erreurs sont très courantes quand on débute la programmation en C et particulièrement quand on commence à utiliser les boucles. Voici un certain nombre de pièges à éviter.

Oublier d'initialiser les variables :
Ici, i n'est pas initialisé, ce qui rend le déroulement de l'itération imprévisible :

/* oups ! on a oublie d'initialiser 'i' */
while (i<10) {
    printf("hello world !\n");
    i++;
}

Utiliser une condition toujours vraie (ou fausse) :
Ici, la condition ne sera jamais vraie, donc la boucle ne sera jamais exécutée :

i=0;
while (i>10) {    /* on a mis '>' ou lieu de '<' */
    printf("hello world !\n");
    i++;
}

Oublier d'incrémenter les variables :
Une erreur très fréquente est d'oublier d'incrémenter i, il en résulte une boucle infinie :

i = 0;
while (i<10) {
    printf("%d\n", i);
}

Les ; en trop :
Attention aux ; en trop. La boucle suivante ne fait rien pendant 10 fois puis affiche la phrase "hello world !" une seule fois :

for (i=0; i<10; i++);
    printf("hello world !\n");

Confondre ; et , :
A l'intérieur du for, on sépare les parties d'initialisation, de test et d'opération par des ;. Attention donc à ne pas confondre avec les , :

for (i=0, i<10, i++)    /* ERREUR : des ',' au lieu des ';' */
    printf("hello world !\n");

Exercices

1. "simple.c" : afficher 5 fois la lettre 'x'
2. "boucle1.c" : afficher les nombres de 10 à 1
3. "boucle2.c" : affichier les nombre de 20 à 1 en comptant de trois en trois
4. "mult.c" : afficher les tables de multiplication de 1 à 9
5. "puis.c" : programme qui saisit deux nombres entiers non signés et calcule le premier à la puissance du second
6. "calc.c" : faire une mini calculette 4 opérations qui prend 2 opérandes, 1 opérateur, et affiche le résultat :

$ calc
> 3 4 +
7
> 5 6 *
30

Note : pour la saisie, vous pouvez vous baser sur la syntaxe suivante :

scanf("%d %d %c", &a, &b, &c);

7. "premier.c" : saisir un nombre et indiquer si il est premier
8. "bits.c" : afficher un nombre entier en binaire

Solutions

simple.c

#include <stdio.h>

int main()
{
    int i;

    for (i=0; i<5; i++)
         printf("x");
    printf("\n");

    return 0;
}

boucle1.c

#include <stdio.h>

int main()
{
    int i;

    for (i=10; i>0; i--)
         printf("%d\n", i);

    return 0;
}

boucle2.c

#include <stdio.h>

int main()
{
    int i;

    for(i=20; i>0; i=i-3)
         printf("%d\n", i);

    return 0;
}

mult.c

#include <stdio.h>

int main()
{
    int i, j;

    for (i=1; i<=9; i++) {
        printf("-- Table des %d --\n", i);
        for (j=0; j<=10; j++)
                printf("%d x %d = %d\n", i, j, i*j);
        printf("\n");
    }

    return 0;
}

puis.c

#include <stdio.h>

int main()
{
    int i, n, exp, total;

    printf("> ");
    scanf("%d", &n);   /* saisie de n */

    printf("> ");
    scanf("%d", &exp); /* saisie de l'exposant */

    total = 1;
    for (i=0; i<exp; i++) 
        total *= n;

    printf("%d\n", total);

    return 0;
}

puis.c dans un style de programmation plus concis

#include <stdio.h>

int main()
{
    int n, exp, total;

    printf("> ");
    scanf("%d %d", &n, &exp); 

    total = 1;
    while(exp--)
        total *= n;

    printf("%d\n", total);

    return 0;
}

calc.c

#include <stdio.h>

int main()
{
    char op;
    int a, b, tot;

    while(1) {
        printf("> ");
        scanf("%d %d %c", &a, &b, &op); 

        switch (op) {
            case '+' :
                tot = a + b;
                break;
            case '-' :
                tot = a - b;
                break;
            case '/' :
                tot = a / b;
                break;
            case '*' :
                tot = a * b;
                break;
            default :
                printf("opérateur inconnu\n");
                return 1;
        }

        printf("%d\n", tot);
    }

    return 0;
}

premier.c

#include <stdio.h>

int main()
{
    int i, n;

    printf("> ");
    scanf("%d", &n);

    i = 2;
    while (i<n) {
        if (n%i == 0) {
                printf("%d est divisible par %d\n", n, i);
                return 0;
        }
        i++;
    }

    printf("%d est premier\n", n);
    return 0;
}

bits.c

#include <stdio.h>

int main()
{
    int n, i;

    scanf("%d", &n);

    for (i=31; i>=0; i--) 
        (n & (1 << i)) ?  printf("1") : printf("0");
    printf("\n");

    return 0;
}

< Branchements conditionnels | TutoCFrench | Les fonctions >

print · rss · source
Page last modified on February 07, 2008, at 04:29 PM