3.2 - while
Boucle while (condition) … (Tant que …)
Syntaxe
while (condition)
instruction;
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