Sous-sections

6.2 Structures de contröle

Les structures de contröle sont les tests, les boucles et l'aiguillage.

6.2.1 Les tests : syntaxe

 
     if (expression)
        partie-alors
     [else
        partie-sinon]

La partie-alors et la partie-sinon peuvent être indifféremment une instruction élémentaire ou composée.

La partie-alors sera exécutée si la valeur de l'expression entre parenthèses est non nulle. Sinon, si le test comporte une partie-sinon c'est celle-ci qui sera exécutée.

Si plusieurs tests sont imbriqués, chaque partie-sinon est reliée au if le plus proche qui n'est pas déjà associé à une partie-sinon.

Exemple

 
if (x > 0)                   if (x > 0)
  ecrire("positif");           ecrire("positif");
else if (x < 0)       <==>   else
   ecrire("négatif");         {
else                           if (x < 0)
   ecrire("nul");                 ecrire("négatif");
                              else
                                 ecrire("nul"); 
                              }

6.2.2 Les boucles "tant-que" : syntaxe

 
     while (expression)
        corps-de-boucle

     do
        corps-de-boucle
     while (expression);

La partie corps-de-boucle peut être soit une instruction élémentaire soit une instruction composée.

Dans la boucle while le test de continuation s'effectue avant d'entamer le corps-de-boucle qui, de ce fait, peut ne jamais s'exécuter.

Par contre dans la boucle do-while ce test est effectué après le corps-de-boucle, lequel sera alors exécuté au moins une fois.

Exemple

 
#include <stdio.h>
main()
{
   int chiffre = 0;
   printf("Boucle \"while\"\n\n");
   while (chiffre) {
      printf(" %d", chiffre++);
      if (!(chiffre%5))
        printf("\n");
   }
   printf("Boucle \"do-while\"\n\n");
   do {
      printf(" %3d", ++chiffre);
      if (!(chiffre%5))
        printf("\n");
      if (chiffre == 100)
        chiffre = 0;
   }
   while (chiffre);
}

6.2.3 La boucle "pour"

syntaxe
 
 
     for ([expr1]; [expr2]; [expr3])
         corps-de-boucle

L'expression expr1 est évaluée une seule fois, au début de l'exécution de la boucle.

L'expression expr2 est évaluée et testée avant chaque passage dans la boucle.

L'expression expr3 est évaluée après chaque passage.

Ces 3 expressions jouent respectivement le röle :

Exemple

 
main()
{
  int   tab[] = {1, 2, 9, 10, 7, 8, 11};
  int   i, j;
  char  buffer[] = "Voici une chaine"
                   " qui se termine "
                   "par un blanc ";
  char *p;
  int   t[4][3];
  for (i=0; i < sizeof tab / sizeof tab[0]; i++)
  printf("tab[%d] = %d\n", i, tab[i]);
  for (p=buffer; *p; p++) ;
  *--p = '\0';
  printf("buffer : %s$\n", buffer);
  for (i=0; i < 4; i++)
      for (j=0; j < 3; j++)
         t[i][j] = i + j;
}

6.2.4 L'aiguillage

L'instruction switch définit un aiguillage qui permet d'effectuer un branchement à une étiquette de cas en fonction de la valeur d'une expression.

Syntaxe

 
     switch (expression)
     {
        case etiq1 :
        [ liste d'instructions ]
        case etiq2 :
        [ liste d'instructions ]
              ...
        case etiqn :
        [ liste d'instructions ]
     [ default:
        [ liste d'instructions ]]
     }

Les étiquettes de cas (etiq1, etiq2, ..., etiqn) doivent être des expressions constantes.

Une fois le branchement à l'étiquette de cas correspondante effectué, l'exécution se poursuit, par défaut, jusqu'à la fin du bloc switch. L'instruction d'échappement break; permet de forcer la sortie du bloc.

L'expression indiquée au niveau du switch doit être de type entier.

Exemple

 
#include <stdio.h>
main()
{
  char *buffer = "\nCeci est une chaine\n"
                 "de caracteres\tsur\n\n"
                 "plusieurs     lignes.\n";
  int   NbCar  = 0, NbEsp = 0, NbLignes = 0;
  for (; *buffer; buffer++, NbCar++)
    switch (*buffer) {
      case '\n': NbLignes++;
                 break;
      case '\t':
      case ' ' : NbEsp++;
      default  : break;
    }
  printf("NbCar = %d, NbEsp = %d, NbLignes = %d\n",
          NbCar, NbEsp, NbLignes);
}

6.2.5 Instructions d'échappement

Ces instructions permettent de rompre le déroulement séquentiel d'une suite d'instructions.

6.2.5.1 Instruction continue;

Le röle de l'instruction continue; est de forcer le passage à l'itération suivante de la boucle la plus proche.

Exemple

 
#include <stdio.h>
main()
{
  char *buffer = "\nCeci est une chaine\n"
                 "de caracteres\tsur\n\n"
                 "plusieurs     lignes.\n";
  int   NbCar  = 0, NbEsp = 0, NbLignes = 0;
  for (; *buffer; buffer++) {
    switch (*buffer) {
      case '\n': NbLignes++;
                 break;
      case '\t': continue;
      case ' ' : NbEsp++;
      default  : break;
    }
    NbCar++;
  }
  printf("NbCar = %d, NbEsp = %d, NbLignes = %d\n",
          NbCar, NbEsp, NbLignes);
}

6.2.5.2 Instruction break;

L'instruction break; permet de quitter la boucle ou l'aiguillage le plus proche.

Exemple

 
#include <stdio.h>
main()
{
   char  buffer[] = "Wolfgang Amadeus Mozart\n"
                    " est un musicien divin.\n";
   char *p;
   for (p=buffer; *p; p++)
     if (*p == '\n')
     {
       *p = '\0';
       break;
     }
   printf("Nom : %s\n", buffer);
}

6.2.5.3 Instruction return;

Syntaxe

 
     return [expression];

Cette instruction permet de sortir de la fonction qui la contient :

Exemple

 #include <stdio.h>
void main()
{
   char c;
   char majus(char c);
   printf("%c\n", majus(c));
   return;
}
char majus(char c)
{ return c >= 'a' && c <= 'z' ? c + 'A' - 'a' : c; }

6.2.5.4 Instruction go to;

Cette instruction sert à effectuer un transfert inconditionnel vers une autre partie du programme.

Syntaxe

 
     goto etiquette;

Etiquette fait référence à une instruction étiquetée. On utilisera cette instruction avec parcimonie car elle nuit à l'écriture de programme structuré. Elle peut à la rigueur être utilisée lorsque l'on désire sortir de plusieurs boucles imbriquées, ce que ne permet pas l'instruction break;.

Exemple

 
#include <stdio.h>
main()
{
   int tab[][4] = {1, 2, 8, 9, 10, 12, 1, 9, 5};
   int i, j;
  for (i=0; i < sizeof tab / sizeof tab[0]; i++)
      for (j=0; j < 4; j++)
             if (tab[i][j] == 10)
                        goto trouve;
   fprintf(stderr, "Elément non trouvé.\n");
   return 1;
trouve:
   printf("L'élément tab[%d][%d]"
          " est égal à 10.\n", i, j);
}

6.2.5.5 instruction exit

Un programme peut être interrompu au moyen de la fonction exit.

Syntaxe

 
     exit(expression);

L'argument de cette fonction doit être un entier indiquant le code de terminaison du processus.

Exemple

 
#include <stdio.h>
main()
{
   int tab[][4] = {1, 2, 8, 9, 10, 12, 1, 9, 5};
   int i, j;
   for (i=0; i < sizeof tab / sizeof tab[0]; i++)
       for (j=0; j < 4; j++)
           if (tab[i][j] == 10) {
             printf("L'élément tab[%d][%d]"
             " est égal à 10.\n", i, j);
             return 0;
            }
   fprintf(stderr, "Elément non trouvé.\n");
   exit(1);
}


Pr. Marc BUFFAT
buffat@ufrmeca.univ-lyon1.fr
2004-12-01