Chapitre 2 : Boucles, adresses et pointeurs, fonctions A) Les 3 boucles en C :
Chapitre 2 : Boucles, adresses et pointeurs, fonctions A) Les 3 boucles en C : 1) Boucle do ... while ... (Répéter .... Tant que) : 1.a) Syntaxe : do instruction à répéter while (condition de continuer à répéter (boucler) encore); 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). 1.b) Fonctionnement : Étape 1 : effectuer (d'abord) l'instruction à répéter Étape 2 : vérifier (après) la condition de continuer : a) si la condition est vraie, on revient à l'étape 1 b) si non (la condition est fausse), on termine la boucle Attention : Contrairement au langage PASCAL, la condition de cette boucle est la condition pour continuer à répéter encore. En Pascal, c'est la condition d'arrêter la boucle. 1.c) Domaines d'utilisation : On utilise la boucle do ... while ... quand on ne sait pas à l'avance, le nombre de fois qu'on doit répéter le même traitement. Les exemples suivants permettent de voir quelques Chapitre 2 : Boucles de répétitions et fonctions Page 27 applications possibles avec cette boucle. 1. Répéter le même traitement en mode conversationnel : É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 jusqu'à ce que l'usager décide de quitter. Solution : int age ; char sexe, reponse ; /* Oui ou Non l'usager veut continuer */ do { printf("\nEntrez le sexe et l'âge "); scanf("%c%d", &sexe, &age); printf("C'est un "); if (age <= 11) printf("enfant "); else if (age < 18 ) printf("adolescent ") ; else printf("adulte "); if ( toupper(sexe) == 'F' ) /* to upper : en majuscule*/ printf("de sexe féminin\n"); else printf("de sexe masculin\n"); printf("\nVoulez-vous continuer ? (O/N) "); fflush(stdin); reponse = toupper (getchar()); } while ( reponse == 'O' ); Chapitre 2 : Boucles de répétitions et fonctions Page 28 2. Validation de données : Écrire un bloc d'instructions permettant de saisir et valider l'âge d'une personne (un entier situé entre 1 et 125). Solution : const int MAXI = 125 ; int age, valide ; /* Oui ou non l'âge est valide */ do { printf("Entrez l'âge entre 1 et %d ", MAXI); scanf("%d", &age); valide = (age >= 1 && age <= MAXI) ; if ( !valide ) printf("age lu est hors intervalle, retapez S.V.P.\n"); } while (!valide); Attention : La validation d'un type (entier ou non, réel ou non) sera présentée au chapitre 3 (chaînes des caractères). 3. Calcul scientifique : Exemple 1 : Écrire un bloc d'instructions permettant de calculer et d'afficher la somme suivante : somme = 10 + 15 + 20 + 25 + ... + 50 Solution : const int BORNE1 = 10 , BORNE2 = 50 , LE_PAS = 5 ; int terme, somme ; somme = 0 ; terme = BORNE1 ; Chapitre 2 : Boucles de répétitions et fonctions Page 29 do { somme += terme ; terme += LE_PAS; } while (terme <= BORNE2); printf("La somme calculée est : %d\n", somme); Exemple 2 : Écrire un programme permettant d'estimer la valeur de PI (3.141....) selon la formule suivante : PI ----- = 1 - 1/3 + 1/5 - 1/7 + 1/9 + .... 1/9999 4 Solution : /* Fichier PI.A95 */ #include <stdio.h> void main() { const int LIMITE = 9999 , LE_PAS = 2 ; int denominateur = 1 ; /* premier dénominateur vaut 1 */ float piSur4 = 0.0, signe = 1.0 ; do { piSur4 += signe / denominateur ; signe = -signe ; /* changer de signe */ denominateur += LE_PAS ; } while ( denominateur <= LIMITE ) ; printf("La valeur estimée de PI est %12.6f\n",4 * piSur4); printf("\nAppuyez sur Entrée "); getchar(); } Exécution : La valeur estimée de PI est 3.141397 Appuyez sur Entrée Chapitre 2 : Boucles de répétitions et fonctions Page 30 Attention : On utilise souvent cette boucle pour estimer une racine de l'équation f(x) = 0, pour la recherche séquentielle d'un élément dans un tableau (plus tard dans le cours), etc .... 1.d) Exercices : Exercice 1 : Écrire un programme permettant de saisir et de valider si un entier lu est positif ou non. Ensuite, on affiche l'entier tel que lu et à l'envers (ici 4327). Solution : /* Fichier : Envers1.C */ #include <stdio.h> void main() { int n ; /* Saisie et valider : */ do { printf("Entrez un entier positif "); scanf("%d", &n); if ( n < 0 ) printf("n = %d est négatif\n", n); } while (n < 0); printf("L'entier lu : %d\n", n); printf("A l'envers : "); do { printf("%d", n % 10); n /= 10 ; } while ( n > 0 ); printf("\n\nAppuyez sur Entrée "); fflush(stdin); getchar(); } Chapitre 2 : Boucles de répétitions et fonctions Page 31 Exécution : Entrez un entier positif -8742 n = -8742 est négatif Entrez un entier positif 5329 L'entier lu : 5329 A l'envers : 9235 Appuyez sur Entrée Exercice 2 : Écrire un programme permettant de saisir un entier positif (exemple 5426). Il calcule l'envers du nombre lu (ici 6245) et affiche ces deux valeurs. Solution : /* Fichier Envers2.C */ #include <stdio.h> void main() { int n , envers ; printf("Entrez un entier positif "); scanf("%d", &n); printf("L'entier lu n = %d\n", n); /* Calcul de l'envers : */ envers = 0 ; do { envers = 10 * envers + n % 10 ; n /= 10 ; } while ( n > 0 ) ; printf("A l'envers : %d", envers); printf("\n\nAppuyez sur Entrée "); fflush(stdin); getchar(); } Chapitre 2 : Boucles de répétitions et fonctions Page 32 Exécution : Entrez un entier positif 1234 L'entier lu n = 1234 A l'envers : 4321 Appuyez sur Entrée Exercice 3 : Écrire un programme permettant de saisir les informations d'un placement : - le capital (un réel) - le taux d'intérêt (composé) annuel en % - la durée du placement en nombre de mois. Le programme calcule et affiche le capital à la fin du terme. Il fonctionne aussi pour plusieurs clients jusqu'à ce que l'usager décide de quitter. Exercice 4 : Écrire un programme permettant de saisir et de valider d'un entier positif (exemple n = 624). Le programme calcule et affiche à l'écran la somme des chiffres qui forment l'entier lu (ici, la somme des chiffres est 12 = 6 + 2 + 4). Exercice 5 (scientifique) : Écrire un programme permettant de trouver toutes les racines de l'équation f(x) = 0, où : 3 f(x) = x - 19x + 30 ( Théorème en mathématique : Si f est continue dans l'intervalle ]a, b[ (exemple :]0, 2.5[) et f(a) * f(b) < 0, alors : il y a au moins une racine de f(x) = 0 dans ]a, b[ ) 2) Boucle while ... : 2.a) Syntaxe : while (condition) instruction Chapitre 2 : Boucles de répétitions et fonctions Page 33 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). Il n'y a pas de "do" (faire) comme le PASCAL. 2.b) Fonctionnement : Étape 1 : vérifier d'abord la condition Étape 2 : si la condition vaut vraie alors a) on effectue l'instruction à répéter b) on revient à l'étape 1 si non, on quitte la boucle 2.c) Domaines d'utilisation : On utilise la boucle while ... quand on ne sait pas à l'avance le nombre de fois qu'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. 1. La lecture d'un fichier : Supposons qu'on dispose du fichier nommé "Entiers.Dta" qui contient un entier par ligne, 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érieur à 10. Notes sur la lecture d'un fichier texte : . Déclarer : FILE * aLire ; . Ouverture pour la lecture : aLire = fopen("Entiers.Dta", "r"); où "r" vient de "for reading" (pour lire). . Test non fin de fichier : while ( !feof(aLire) ) . Lecture : fscanf(aLire, .......) ; . Fermeture : fclose(aLire) ; Chapitre 2 : Boucles de répétitions et fonctions Page 34 Solution : /* Fichier : WHILE1.A95 */ #include <stdio.h> void main() { const int BORNE = 10 ; int n , nbFois = 0 ; FILE * aLire ; /* déclaration du fichier */ aLire = fopen("Entiers.Dta", "r"); printf("Les entiers lus dans le fichier :\n\n"); /* La lecture, ligne par ligne : */ while ( !feof(aLire) ) /* Tant que non fin du fichier */ { fscanf(aLire , "%d\n", &n); printf("%5d\n", n); if ( n > BORNE ) nbFois = nbFois + 1 ; } fclose(aLire); /* Fermeture du fichier (fclose) */ printf("Le nombre d'entiers uploads/Litterature/ copie-de-secours-de-chapitre2.pdf
Documents similaires
-
13
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Mai 24, 2022
- Catégorie Literature / Litté...
- Langue French
- Taille du fichier 0.2483MB