Td corrigé CHAPITRE 3 : Les boucles de répétition - Département d ... pdf

CHAPITRE 3 : Les boucles de répétition - Département d ...

6 févr. 2004 ... Corrigé examen B6 mai 2005 .... Stratégie MRU : Most Recently Used : désigne le mode de remplacement des pages dans la mémoire cache.




part of the document



CHAPITRE 3 : Les boucles de répétition

Une boucle permet de répéter un même traitement, une ou plusieurs fois. Le langage C offre trois sortes de boucles :

do ... while (Répéter ...),
while ... (Tant que ...) et
for ... (Pour ...)

A)Boucle do ... while ... (Répéter .... Tant que)
1) Syntaxe



do
instruction
while (condition);





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 */
do {
somme += n;
n++;
} while (n = 18)
printf("C'est un adulte");
else
age += 5;
} while (age < 18);

int age;

/* instruction à répéter est composée */
do {
printf("age = %d\n", age);

if (age >= 18)
printf("C'est un adulte");
else
age += 5;
} while (age < 18);

2) Fonctionnement

Étape 1 : Effectuer (d'abord) l'instruction à répéter.

Étape 2 : Vérifier (après) la condition:

si la condition est vrai, on revient à l'étape 1;

si non (la condition est faux), on quitte la boucle.

Conclusion :

Avec la boucle do ... while, on effectue au moins une fois l'instruction à répéter.

3) Domaines d'utilisation

On utilise la boucle do ... while quand on ne sait pas à l'avance le nombre de fois que l'on doit répéter le même traitement. Les exemples suivants permettent de voir quelques applications possibles avec cette boucle.

Répéter le même traitement en mode conversationnel

C'est le cas le plus fréquent pour le premier travail pratique en IFT 1810.

Exemple :

Écrire un bloc d'instructions permettant de saisir l'âge et le sexe d'une personne. Ensuite, on affiche un message du genre :
C'est un enfant de sexe masculin.
On répète le même traitement tant que l'usager décide de continuer.

Solution :

int age;
char sexe,
reponse; /* Oui ou Non l'usager veut continuer */

do {
printf("\nEntrez le sexe et l'age ");
fflush(stdin); /* vider la memoire temporaire */
scanf("%c%d", &sexe, &age);

printf("C'est un ");

if (age = MIN_ANC && anciennete = 0
rand() % BORNE donne un nombre aléatoire entre 0 et 999
rand % BORNE + 1 donne un nombre aléatoire entre 1 et 1000 */

aDeviner = rand() % BORNE + 1 ;

printf("On a un nombre cache entre 1 et %d, vous avez "
"le droit à un maximum %d essais\n", BORNE, MAX_ESSAIS);
printf("On y va!\n");

nbEssai = 0;

do {
/* saisir le nombre deviné par l'usager */
nbEssai++;
printf("Essai # %2d : quel est le nombre ? ", nbEssai);
scanf("%d", &nombre);

/* quand le nombre deviné est égal au nombre caché, on a trouvé */
trouve = nombre == aDeviner;

if (trouve)
printf("Bravo, vous avez trouve le nombre cache %d apres %d essai(s)\n",
aDeviner, nbEssai);
else if (nombre < aDeviner)
printf("%d est inferieur au nombre cache\n", nombre);
else
printf("%d est superieur au nombre cache\n", nombre);
} while (!trouve && nbEssai < MAX_ESSAIS);

/* après avoir fait 10 essais et non trouvé */
if (!trouve){
printf("\nLe nombre cache est : %d\n", aDeviner);
printf("Bonne chance a la prochaine fois\n");
}

printf("\n\nVoulez-vous jouer encore ? (o/n) ");
scanf(" %c", &reponse);

} while (toupper(reponse) == 'O');

return 0 ;

}

Exécution
On a un nombre cache entre 1 et 1000, vous avez le droit à un maximum de 10 essais
On y va!
Essai # 1 : quel est le nombre ? 600
600 est superieur au nombre cache
Essai # 2 : quel est le nombre ? 500
500 est superieur au nombre cache
Essai # 3 : quel est le nombre ? 400
400 est superieur au nombre cache
Essai # 4 : quel est le nombre ? 300
300 est superieur au nombre cache
Essai # 5 : quel est le nombre ? 200
200 est inferieur au nombre cache
Essai # 6 : quel est le nombre ? 210
210 est inferieur au nombre cache
Essai # 7 : quel est le nombre ? 220
220 est inferieur au nombre cache
Essai # 8 : quel est le nombre ? 240
240 est inferieur au nombre cache
Essai # 9 : quel est le nombre ? 260
260 est superieur au nombre cache
Essai # 10 : quel est le nombre ? 250
250 est superieur au nombre cache

Le nombre cache est : 241
Bonne chance a la prochaine fois

Voulez-vous jouer encore ? (o/n) o
On a un nombre cache entre 1 et 1000, vous avez le droit à un maximum 10 essais
On y va!
Essai # 1 : quel est le nombre ? 500
500 est superieur au nombre cache
Essai # 2 : quel est le nombre ? 250
250 est inferieur au nombre cache
Essai # 3 : quel est le nombre ? 350
350 est inferieur au nombre cache
Essai # 4 : quel est le nombre ? 425
425 est superieur au nombre cache
Essai # 5 : quel est le nombre ? 370
370 est inferieur au nombre cache
Essai # 6 : quel est le nombre ? 400
400 est superieur au nombre cache
Essai # 7 : quel est le nombre ? 385
385 est inferieur au nombre cache
Essai # 8 : quel est le nombre ? 390
390 est superieur au nombre cache
Essai # 9 : quel est le nombre ? 387
Bravo, vous avez trouve le nombre cache 387 apres 9 essai(s)


Voulez-vous jouer encore ? (o/n) n


5) Simulation

Exemple 1

Soient j et k, deux variables déclarées de type int. Quelle est la valeur affichée à l'écran par le segment de programme suivant?

int k = 1, j = 10;

do {
if (k >= 3)
j++;
else
j--;
k++;
printf("%3d%3d\n", j, k);
} while (j 0);

printf("Fin");

B)Boucle while (condition) ... (Tant que ...)

1) 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 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 :

 EMBED Equation.3 

Solution

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

while (denominateur 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

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

C) Boucle for ... :
1) Syntaxe

for (; ; )
instruction
l'instruction à répéter peut être simple, composée ou structurée.
l'expr. 1 initialisation est une expression d'initialisation;
l'expr. 2 condition de boucle est une expression logique, une condition pour continuer la répétition et celle-ci est évaluée avant chaque itération de la boucle;
l'expr. 3 de boucle est une expression d'incrémentation ou de décrémentation qui s'exécute à chaque itération de la boucle.


Illustration de la syntaxe :

for (i = 1; i bon candidat pour la boucle for
*
* Révision : recalculer avec do ... while, while ....
*/

#include

void main()
{
#define NB_FOIS 10
#define BORNE1 3
#define BORNE2 51
#define LE_PAS 2

int i, /* pour la boucle for */
somme, /* pour somme = 3 + 5 + ... + 51 */
valeur; /* somme des valeurs */

/* afficher 10 fois Bonsoir */

for (i = 1; i