3.2 - while

Boucle while (condition) … (Tant que …)

Syntaxe

while (condition)
   instruction;

while while

L’instruction à répéter peut être simple (une seule action), structurée (une autre instruction de contrôle) ou composée (c’est le cas le plus fréquent).

Exemples pour illustrer la syntaxe :

int somme = 0, int n = 1;

/* instruction à répéter est composée */
while ( n <= 10 ) {
   somme += n;
   n++;
}
printf("somme = 1 + 2 + 3 + ... + 10 = %d\n", somme);
int n = 5;

/* instruction à répéter est structurée */
while (n <= 10)
   if (n == 10)
      printf("Fin");
   else
      n++;
int n = 5;

/* instruction à répéter est simple */
while (n <= 10)
   n++;

Fonctionnement

Étape 1 : vérifier d’abord la condition

Étape 2 : si la condition est vrai alors

  • on effectue l’instruction à répéter on revient à l’étape 1

sinon (la condition est faux),

  • on quitte la boucle

Conclusion :

Avec la boucle while …, il est possible, si la première évaluation est fausse, de ne jamais exécuter l’instruction à répéter.

Domaines d’utilisation

On utilise la boucle while ... quand on ne sait pas à l’avance le nombre de fois que l’on doit répéter le même traitement. On l’utilise surtout pour la lecture d’un fichier, la recherche d’un élément dans un tableau, les calculs scientifiques.

La lecture d’un fichier (non évaluée pour IFT 1810)

Supposons qu’on dispose du fichier nommé “entiers.dta” qui contient un entier par ligne, par exemple :

65
-12
28
37
etc .

Écrire un programme permettant de lire le fichier, d’afficher son contenu, de compter et d’afficher le nombre d’entiers lus dont la valeur est supérieure à 10.

Notes sur la lecture d’un fichier texte :

  • Déclaration FILE *aLire;

  • Ouverture du fichier en mode de lecture aLire = fopen("entiers.dta","r");

  • Test pas fin de fichier while (!feof(aLire))

  • Lecture fscanf(aLire,...);

  • Fermeture fclose(aLire);

Solution

#include <stdio.h>
void main()
{
   const int BORNE = 10;
   int n, nbFois = 0;

   FILE * aLire;  /* déclaration du fichier */

   /* Ouvrir le fichier en mode de lecture: "r" (de "reading") pour lire */
   aLire = fopen("entiers.dta", "r");

   printf("Les entiers lus dans le fichier :\n\n");

   /* La lecture, ligne par ligne  */
   while (!feof(aLire)){            /* Tant que pas fin du fichier */
      fscanf(aLire, "%d\n", &n);
      printf("%3d\n", n);

      if (n > BORNE)
         nbFois++;
   }
   /* Fermeture du fichier (fclose) */
   fclose(aLire);

   printf("Le nombre d'entiers supérieurs à %d est : %d\n", BORNE, nbFois);
}

Exécution

Les entiers lus dans le fichier :

 20
-12
 15
-30
 29
-50
 40

Le nombre d'entiers supérieurs à 10 est : 4

Quelques exercices de calcul :

Exercice 1

Écrire un programme permettant de saisir et de valider un entier positif (exemple 624). Le programme calcule et affiche à l’écran la somme des chiffres qui forment l’entier lu (ici, la somme des chiffres est 12 soit le résultat de l’addition de 6 + 2 + 4).

Solution

#include <stdio.h>
void main()
{
   int n, valide, somChiffre;

   /* saisir et valider n */
   valide = 0; /* ce n'est pas valide */
   while (!valide){
      printf("Entrez un entier superieur a zero : ");
      scanf("%d", &n);

      valide = n > 0;
      if (!valide)
         printf("Valeur negative, retapez, S.V.P.\n\n");
   }
   printf("L'entier lu est %d\n", n);
   printf("La somme des chiffres de %d est ", n);

   /* Calcul de la somme des chiffres */
   somChiffre = 0;
   while (n){ /* c'est-à-dire while (n != 0), ici while (n > 0) */
      somChiffre += n % 10; /* on ajoute le dernier chiffre n /= 10; */
   }

   printf("%3d\n", somChiffre);
}

Exécution

Entrez un entier superieur a zero : –5678
Valeur negative, retapez, S.V.P.

Entrez un entier superieur a zero : 8736
L'entier lu est 8736
La somme des chiffres de 8736 est  24

Exercice 2

Écrire un bloc d’instructions permettant de calculer et d’afficher la somme suivante :

Solution

const int BORNE1 =   1, BORNE2 = 999;
float denominateur = BORNE1, somme = 0;

while (denominateur <= BORNE2){
   somme += 1 / denominateur;
   denominateur += 2;
}

printf("La somme demandee : %10.6f\n", somme);

Exercice 3

Écrire un bloc d’instructions utilisant la boucle while qui permet d’estimer la valeur de PI selon la formule suivante :

Au prochain chapitre, on revient sur la boucle while.

Autres exemples

Exemple 1

/* while1.c

   Ce programme permet de calculer et d'afficher
   la somme 1 + 1/3 + 1/5 + 1/7 + . . . + 1/49
   en utilisant la boucle while

   Exercices :
     - refaire avec la boucle do ... while
     - éventuellement, quand vous aurez vu la boucle for (voir plus loin), 
       revenez ici à cet exemple pour le récrire mais avec la boucle for
 */
#include <stdio.h>
void main()
{
   /* déclarer les deux bornes et le pas entre les deux dénominateurs */
   const int BORNE1 = 1,
             BORNE2 = 49,
             LE_PAS = 2;

   float somme, denominateur;

   /* calcul de la somme : 1 + 1/3 + 1/5 + 1/7 + ... + 1/49 */
   somme = 0.0;
   denominateur = BORNE1;

   while (denominateur <= BORNE2){
      somme += 1 / denominateur;
      denominateur += LE_PAS;
   }
   printf("La somme de 1 + 1/2 + ... + 1/%d = %7.3f\n", BORNE2, somme);
}

Exécution

La somme de 1 + 1/2 + ... + 1/49 =   2.591

Exemple 2

/* while2.c

   Ce programme permet de :
    - calculer la somme des chiffres d'un nombre
    - calculer l'envers d'un nombre
   On affiche les informations nécessaires

   Exercice : SIMULEZ les instructions pour comprendre
   le fonctionnement de la boucle while
 */

#include <stdio.h>

void main()
{

   int nombre = 573,
       somChif,
       envers;

   printf("La somme des chiffres de %d ", nombre);
   somChif = 0;
   while (nombre > 0){
      somChif += nombre % 10;
      nombre /= 10;
   }
   printf("est %d\n\n", somChif);

   nombre = 627;
   printf("Le nombre %d a l'envers ", nombre);

   envers = 0;

   while (nombre > 0){
      envers = envers * 10 + nombre % 10;
      nombre /= 10;
   }

   printf("est %d\n\n", envers);
}

Exécution

La somme des chiffres de 573 est 15

Le nombre 627 a l'envers est 726

Exemple 3 (exercice de simulation pour préparer l’intra)

/* Fichier while3.c
   Exercice de SIMULATION :
   Simulez sur papier ce programme.
   
   Exécutez le programme pour comparer avec vos simulations
 */

#include <stdio.h>

void main()
{
   int a = 10, b = 10;

   while (a == b){
      printf("%3d%3d", a, b);

      if (b % 2 == 0){
         b = a * 3 % 9;
         a = a - 7;
      } else
         b = b * ( a + 2);
   }

   printf("\n%3d%3d\n", a, b);

   a = 10;
   b = 10;

   while (a = b){
      printf("%3d%3d", a, b);

      if (b % 2 == 0)
         b = b - 10;
      else
         b = b - 5;
   }
   printf("\n%3d%3d\n", a, b);
}

Exécution

Résultat de simulation à comparer avec le vôtre
 10 10  3  3
  3 15
 10 10
  0  0