La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Structures alternative et répétitive

Présentations similaires


Présentation au sujet: "Structures alternative et répétitive"— Transcription de la présentation:

1 Structures alternative et répétitive
Comparaison de données à l’aide des opérateurs relationnels. Opérateurs logiques : « et » logique, « ou » logique et la négation. Les blocs. La structure alternative : clause « if » avec ou sans « else ». Les opérateurs conditionnels. La structure répétitive : la clause « while », la clause « do … while » et la clause « for ». Présence de sentinelles. Structures imbriquées.

2 Structures de contrôle
Jusqu’à maintenant, les instructions d’un programme ont été exécutées les unes à la suite des autres, dans l’ordre où elles sont écrites. Structure en séquence : exécution séquentielle des opérations L’ordre d’exécution des instructions des algorithmes n’est pas toujours séquentielle et C (C++) offre différentes possibilités pour les décrire : Structure de sélection Choix d’une instruction dépendamment d’une condition. Trois types de structures de sélection (unique, double ou multiple) : structure if : effectue une action si une condition est vraie (true) ou l’omet si elle est fausse (false). structure if/else : effectue une action si une condition est vraie (true) ou une autre action si elle est fausse (false). structure switch : effectue une action parmi plusieurs, selon la valeur d’une expression. Structure de répétition : Répétition d’instructions au moment où une condition est satisfaite. while, do/while et for.

3 Opérateurs relationnels
Les structures alternative et répétitive renferment toutes une condition à vérifier. Celle-ci compare deux valeurs à l’aide d’opérateurs relationnels. C++ Notation utilisée Description > > supérieur >= supérieur ou égal < < inférieur <= inférieur ou égal == = égal != différent

4 Structure de sélection if
Syntaxe I : if (expression logique) instruction But : Exécuter l’instruction si l’expression logique est vraie. Exemple : If (i >= 0) i = i + k; Lorsque la condition est vérifiée, il se peut que plusieurs instructions doivent être exécutées au lieu d’une seule. Il s’agit alors de les regrouper en un seul bloc d’instructions, en les plaçant entre accolades { }. Syntaxe II : if (expression logique) { instruction1 instruction2 . . . instructionn } Respecter les règles d’indentation. But : Exécuter le bloc d’instructions si l’expression logique est vraie. Exemple : if (i < 5) { int j; j = i * i; } pas de ;

5 Structure de sélection if : exemple simple
#include <iostream.h> int main() { int note; // Note d'un étudiant. cout << "Note d'un etudiant dans un cours sur 100 : "; cin >> note; if(note < 0) cout << "*** erreur : la note de l'etudiant est non negative. ***" << endl; return 1; } if(note < 60) cout << "L'etudiant a un echec." << endl; if(note >= 60) cout << "L'etudiant a reussi." << endl; return 0;

6 Structure de sélection if / else
Syntaxe III : if (expression logique) instruction1 else instruction2 ou encore if (expression logique) { instruction11 instruction12 . . . instruction1m } else instruction21 instruction22 instruction2m Exemple : if (a <= b) { min = a; max = b; } else { max = a; min = b; But : Si l’expression logique est vraie, exécuter le bloc d’instructions 1. Autrement, c’est le bloc d’instructions 2. pas de ;

7 Structure de sélection if / else : exemple simple
Une année est bissextile tous les 400 ans; les siècles ne sont pas bissextiles et une année sur 4 est bissextile Lire une année n. 1. Si n possède comme facteur 400 alors 2. Écrire que n est une année bissextile. 2.1 L’algorithme prend fin. 2.2 Si n possède comme facteur 100 alors 3. Écrire que n n’est pas une année bissextile. 3.1 L’algorithme prend fin. 3.2 Si n possède comme facteur 4 alors écrire que n est une année bissextile. sinon écrire que n n’est pas une année bissextile. 4. L’algorithme prend fin. 5.

8 Structure de sélection if / else : exemple simple
#include <iostream.h> int main() { int annee; cout << "Entrez l'annee desiree : "; cin >> annee; if ((annee % 400) == 0) cout << "oui." << endl; return 0; } if ((annee % 100) == 0) cout << "non." << endl; if ((annee % 4) == 0) cout << "oui." << endl; else cout << "non." << endl;

9 Structure de sélection if ou if / else imbriquée
Dans les structures de sélection précédentes, la partie « instruction » peut renfermer d’autres structures de sélection, ce qui donne des structures if ou if-else imbriquées. #include <iostream.h> void main() { int note; cout << "Entrez la note obtenue : "; cin >> note; if (note >= 90) cout << "A"; else if (note >= 80) cout << "B"; else if (note >= 70) cout << "C"; else if (note >= 60) cout << "D"; else cout << "E"; cout << endl; } Exemple : Cote Note A ≥ 90 B [80, 90) C [70, 80) D [60, 70) E < 60

10 Structure de sélection if ou if / else imbriquée
Exemple : Lire 3 entiers A, B et C et afficher le minimum et le maximum. #include <iostream.h> void main() { int A, B, C, MIN, MAX; cout << "Entrez les 3 entiers : "; cin >> A >> B >> C; if (A <= B) if (A <= C) MIN = A; if (B >= C) MAX = B; else MAX = C; } else // C < A <= B MIN = C; MAX = B;

11 Structure de sélection if ou if / else imbriquée
else // B < A if (B <= C) { MIN = B; if (A >= C) MAX = A; else MAX = C; } else // C < B < A MIN = C; MAX = A; cout << "La plus petite valeur est : " << MIN << endl; cout << "La plus grande valeur est : " << MAX << endl; Note : Dans une structure imbriquée, c’est souvent plus rapide que plusieurs structures simples dans le cas d’une sortie hâtive. À cette fin, il est préférable de tester les conditions les plus susceptibles d’être vraies au début.

12 Structure de sélection if ou if / else imbriquée
Exemple : Lire 3 entiers A, B et C et afficher le minimum et le maximum. #include <iostream.h> void main() { int A, B, C; int MIN, MAX; cout << "Entrez les 3 entiers : "; cin >> A >> B >> C; if (A <= B) MIN = A; else MIN = B; if (MIN > C) MIN = C; if (A <= B) MAX = B; else MAX = A; if (MAX < C) MAX = C; cout << "La plus petite valeur est : " << MIN << endl; cout << "La plus grande valeur est : " << MAX << endl; }

13 Structure de sélection if ou if / else imbriquée
Ambiguïtés possibles : if ( N > 0) if ( A > B) MAX = A; else MAX = B; if ( N > 0) if ( A > B) MAX = A; else MAX = B; ou bien Règle : une partie else est toujours liée au dernier if qui ne possède pas de partie else. Pour éviter des confusions ou encore pour forcer une interprétation possible, il est recommandé d’utiliser des accolades. if ( N > 0) { if ( A > B) MAX = A; } else MAX = B; if ( N > 0) { if ( A > B) MAX = A; else MAX = B; }

14 L’opérateur conditionnel
Cet opérateur ternaire (le seul!) est une alternative au if-else. Syntaxe III : expression logique ? expression1 : expression2 But : Si l’expression logique est vraie, la valeur de expression1 est retournée. Autrement, la valeur de expression2 est retournée comme résultat. Exemple : min = a <= b ? a : b; max = a >= b ? a : b; Note : Cet opérateur a un faible niveau de préséance; les parenthèses peuvent donc être nécessaires. cout << (a <= b ? a : b); cout << (a >= b ? a : b); Utilisé à outrance, cet opérateur peut nuire à la lisibilité du programme. Une expression possède une valeur mais une instruction n’en possède pas. Toute expression peut devenir une instruction grâce à l’ajout d’un ;. Ex. : y = x est une expression de valeur x et y = x; est une instruction. Pourquoi y = if (x > 0) x; else –x; n’est pas valide ?

15 Structure de répétition while
Nous disposons de 3 structures de répétition : while, do-while et for interchangeables. On pourrait utiliser une seule des trois mais il est préférable de choisir celle la mieux adaptée à chaque cas. Syntaxe : while (expression logique) instruction ou encore while (expression logique) { instruction1 instruction2 . . . instructionm } But : Tant et aussi longtemps que l’expression logique est vraie, exécuter l’instruction ou le bloc d’instructions. Autrement, on sort de la boucle. Au début de l’exécution, si l’expression logique est fausse, on passe à l’instruction qui suit la boucle while. Note :

16 Structure de répétition while
Exemple : // Impression des entiers de 1 à 10. int i = 1; while (i <= 10) cout << i++; Note : Omettre d’inclure dans le corps d’une structure while une action qui permette à la condition du while de devenir fausse provoque habituellement une erreur (boucle infinie).  fermez la fenêtre ou appuyez sur Ctrl+C pour terminer. Exemple : // Plus petite puissance de 2 plus grande que 1000. int produit = 2; while (produit <= 1000) produit = 2 * produit; cout << produit; 1024 Exemple : // Calcul de mn où m et n sont des entiers positifs. int i = 1, resultat = 1; while (i <= n) { resultat *= m; i = i + 1; } O(n)

17 Calcul de mn Exemple : // Calcul de mn où m et n sont des entiers positifs. int r = 1, b = m; i = n; while (i > 0) { if (i%2 == 0) { b = b  b; i = i / 2; } else { r = r *b; i--; } } Tiré de C. Horstmann & T. Budd, La Bible C++. John Wiley & Sons, Inc. Pp n = 13 r b i 1 m 13 m m 12 m m2 6 m m4 3 m5 m4 2 m5 m8 1 m13 m8 0

18 Calcul de mn : preuve La fonction précédente calcule toujours la valeur correcte. Démontrons que si le programme atteint le haut de la boucle, il est vrai que r . bi = mn (*) Cela est vrai la première fois parce que b = m et i = n. Supposons que (*) est vrai au début de la boucle. Nous avons donc : rvieux = bvieuxivieux = mn 2 cas : 1. i est pair La boucle effectue les transformations suivantes : rneuf = rvieux bneuf =b2vieux ineuf = ivieux / 2 i.e. rneuf . bneufineuf = rvieux (bvieux)2 i vieux / 2 = rvieux bvieuxivieux = m n

19 Calcul de mn : preuve 2. i est impair
La boucle effectue les transformations suivantes : rneuf = rvieux bvieux bneuf =bvieux ineuf = ivieux - 1 i.e. rneuf . bneufineuf = rvieux bvieux bvieuxi vieux - 1 = rvieux bvieuxivieux = m n Dans chaque cas, les nouvelles valeurs de r, b et i respectent l’invariant de boucle (*). Ceci est vrai notamment lorsque la boucle prend fin à i = 0. r . bi = r . b0 = r = mn. Cette fonction calcule réellement la nième puissance de m. Note : La condition (*) porte le nom d’invariant de boucle parce qu’elle est vraie à l’entrée et à la sortie de la boucle et au début de chaque itération.

20 Calcul de la moyenne des notes d’une classe
Exemple : #include <iostream.h> void main() { // Calcul de la moyenne des notes d'une classe. const Nombre_d_eleves = 10; int somme_des_notes = 0, une_note; int i = 1; while (i <= Nombre_d_eleves) cout << "Entrez la " << i << " ieme note : " ; cin >> une_note; somme_des_notes += une_note; i = i + 1; } cout << endl << "La moyenne de la classe est : " << somme_des_notes / (float) Nombre_d_eleves << endl;

21 Présence d’une sentinelle
Exemple : On ne connaît pas à priori le nombre d’élèves dans la classe. Pour que le programme sache qu’il a lu la dernière note, on introduit une valeur sentinelle (-1 par ex.) qui ne peut coïncider avec une note. #include <iostream.h> void main() { // Calcul de la moyenne des notes d'une classe. const short int sentinelle = -1; int Nombre_d_eleves = 0, somme_des_notes = 0, une_note; cout << "Entrez une note ou -1 pour terminer : "; cin >> une_note; while (une_note != sentinelle) somme_des_notes += une_note; Nombre_d_eleves += 1; } if (Nombre_d_eleves != 0) cout << endl << "La moyenne de la classe est : " << somme_des_notes / (float) Nombre_d_eleves << endl; else cout << "On doit entrer au moins une note." << endl;

22 Calcul du nième nombre de Catalan
Parenthèses 2 lettres 3 lettres 4 lettres 5 lettres ab a ( bc ) ( (ab ) c ) d ... ( ab ) c (ab ) ( cd ) ( a ( bc ) ) d a ( (bc) d ) a ( b (cd ) ) 1 2 5 14 => Nombres de Catalan Combien de façons différentes avons-nous de placer des parenthèses autour d'une suite de n+1 lettres, en plaçant à chaque fois 2 lettres (au moins) dans les parenthèses? Polygone convexe : # de façons de diviser un polygone convexe à n + 2 côtés en triangles. n = 2 Le 2ième nombre de Catalan est 2.

23 Calcul du nième nombre de Catalan
Cat(n) = (2n)! , n ≥ 0. (n+1)! n! #include <iostream.h> void main() { int n, num, den; cout << "Entrez la valeur de n : "; cin >> n; int i = den = 1; while (i <= n) den = den * i; i++; } num = den; den = den * den * (n + 1); i = n + 1; while (i <= 2 * n) num = num * i; i++; cout << "Le " << n << " ieme nombre de Catalan est : " << num / den;

24 Calcul du nième nombre de Catalan
Cat(n) = (2n)! , n ≥ 0. (n+1)! n! Ce programme ne fonctionne pas pour des valeurs de n ≥ 7. Pourquoi ? Solution : Cat(n) = (1 + n/2) (1 + n/3) … (1 + n / (n-1)) 2 #include <iostream.h> void main() { int n; float resultat = 2.0f; cout << "Entrez la valeur de n : "; cin >> n; int i = 2; while (i <= n - 1) resultat *= (1.0f + n / (float) i); i++; } cout << "Le " << n << " ieme nombre de Catalan est : " << resultat << endl;

25 Expressions logiques vs expressions
Dans les structures alternative ou répétitive, si l’expression logique est remplacée par une expression (variable de type numérique ou une expression quelconque fournissant un résultat numérique), on teste si l’expression est différente de 0 ou non. Exemple : #include <iostream.h> void main() { // Affichage des entiers de 1 à 10. int i = 1; while (i - 11) cout << i++; // Affichage des entiers de 10 à 1. int j = 10; while (j) cout << j--; }

26 Confusion entre = et == Confusion entre = et ==
Pièges subtils : la syntaxe est correcte mais … = désigne l’opérateur d’affectation tandis que == représente l’opérateur de comparaison d’égalité. if (i = 0) cout << "confusion" << endl; // N’affiche la chaîne. if (i = 5) cout << "confusion" << endl; // Affiche la chaîne. expression y == x * x * z – 0.5; // un test est effectué mais sans action par contre. Éviter d’imbriquer des instructions d’affectation dans des conditions même si c’est licite. if ((d = b * b – 4 * a * c) >= 0) r = sqrt(d);

27 Comparaison de nombres à virgule flottante
Dans la plupart des cas, il faut éviter de comparer exactement des nombres réels comme par exemple, #include <iostream.h> #include <math.h> void main() { double r = sqrt(2); if (r * r != 2) cout << "mauvais test" << endl; } Mieux vaut vérifier qu’ils sont suffisamment proches i.e. que leur différence est inférieure à un certain seuil : |x – y|  . Il est classique de fixer  à 10-14 lors de la comparaison de nombres double. Ce test peut être insuffisant : imaginez x et y de très grands nombres de l’ordre de quelques millions. Pour pallier à ce problème, il faut tester : x – y  . max(|x|, |y|) Un problème surgit lorsque x ou y est égal à 0 (l’expression vaut 1).

28 Structure de répétition for
La répétition contrôlée par compteur exige : Le nom d’une variable de contrôle ou compteur de boucle, la valeur initiale de la variable de contrôle, la condition qui vérifie la valeur finale de la variable de contrôle, l’incrémentation ou la décrémentation par laquelle la variable de contrôle est modifiée chaque fois qu’elle traverse la boucle. int compteur = 1; // initialisation du compteur while ( compteur <= 10) // condition de répétition { cout << compteur << endl; ++compteur; // incrémentation } int compteur = 0; while ( ++compteur <= 10) cout << compteur << endl; ou, de façon plus concise, Une variable de contrôle ne doit pas contenir une valeur réelle car cela peut produire des résultats imprécis et des tests de fin de boucle inexacts. Autrement, on ne doit pas utiliser de tests d’égalité : for (float taux = 5; taux != 10; taux = taux + 0.1) …;

29 Structure de répétition for
La répétition contrôlée par compteur est gérée complètement par la structure de répétition for. Syntaxe : for (expression1; expression logique2; expression3) instruction ou encore for (expression1; expression logique2; expression3) { instruction1 instruction2 . . . instructionm } But : Expression1 est évaluée 1 fois avant le passage de la boucle; elle est utilisée pour définir et initialiser les données de la boucle. Expression logique2 est évaluée avant chaque passage de la boucle; elle est utilisée pour décider si la boucle est répétée ou non. Expression3 est évaluée à la fin de chaque passage de la boucle; elle est utilisée pour mettre à jour les données de la boucle. Ex. : for (i = 1; i <= 10; i++) cout << i << endl;

30 Structure de répétition for
La structure de répétition for est équivalente à : expression1; while (expression logique2) { instruction expression3; } Lorsque la variable de contrôle est déclarée dans expression1, l’utilisation de cette variable après l’instruction for peut constituer une erreur de syntaxe (la variable de contrôle étant considéré comme hors de portée). Ex. : for (int i = 1; i <= 10; i++) cout << i << endl; i = 0; // À éviter : dépend du compilateur. Il peut arriver que expression1, expression logique2 et expression3 dans l’instruction for soient des listes d’expressions séparées par des virgules. La virgule garantit l’évaluation de la gauche vers la droite des expressions; La virgule a la préséance la moins élevée de tous les opérateurs du C++.

31 Structure de répétition for
La valeur et le type d’une liste d’expressions séparées par une virgule représentent la valeur et le type de l’expression la plus à droite dans la liste. Ces listes d’expressions séparées par une virgule permettent d’utiliser de multiples expressions d’initialisation et d’incrémentation. Ex. : #include <iostream.h> void main() { for (int i = 1, j = 1; i <= 5, j <= 10; i++, j+= i) cout << "(" << i << " , " << j << ")" << endl; } (1 , 1) (2 , 3) (3 , 6) (4 , 10) Dans expression1 et expression3, ne placez que les expressions impliquant les variables de contrôle. Les autres variables devraient apparaître soit avant la boucle, soit dans le corps de la boucle (si elles s’exécutent une fois par répétition). Éviter de placer des expressions dont les valeurs ne changent pas à l’intérieur des boucles. Les 3 expressions de la boucle for sont facultatives. expression2 omise  la condition de répétition est toujours vraie  une boucle infinie.

32 Structure de répétition for
La variable de contrôle est initialisée ailleurs dans le programme  l’expression1 est omise. L’incrémentation est calculée par des instructions dans le corps du for  l’expression3 est omise. L’expression3 de la structure for se comporte comme une instruction autonome; par conséquent, les expressions compteur = compteur + 1 compteur += 1 ++compteur compteur++ se valent toutes. Les 2 points-virgules sont obligatoires dans la structure for. En plaçant un ; immédiatement à droite de la parenthèse droite d’un en-tête de la structure for, le bloc d’instructions devient une instruction vide. Cela peut être utilisé pour créer un délai (ralentir un programme).

33 Structure de répétition for
Les 3 expressions d’une boucle for peuvent contenir des expressions arithmétiques : int x = 2, y = 10; for (int j = x * 10; j <= 2 * x * y; j += y / x) cout << j; L’incrément d’une structure for peut être négatif. for (int i = 10; i >= 0; i--) j = i * i; Si la condition de répétition de boucle est fausse au départ, le corps de la structure for n’est pas effectué. for (int j = 0; j < 0; j--) cout << j; // aucune opération effectuée.

34 Affichage de la table des produits pour n variant de 0 à 10
#include <iostream.h> #include <iomanip.h> void main() { cout << "X*Y | "; for (int k = 0; k <= 10; k++) cout << setw(4) << k; cout << endl; for (k = 1; k <= 51; k++) cout << '-'; for (int i = 0; i <= 10; i++) cout << setw(4) << i << " | "; for (int j = 0; j <= 10; j++) cout << setw(4) << i * j; }

35 Affichage d’un cercle centré à l’origine
Le rayon du cercle est un entier positif. #include <iostream.h> #include <math.h> void main() { int rayon; cout << "Entrez le rayon du cercle : "; cin >> rayon; for (int y = -rayon; y <= rayon; y++) int x = (int) (sqrt(rayon * rayon - y * y) + 0.5); for (int i = 1; i <= rayon - x; i++) cout << ' '; cout << '*'; for (int j = 1 - x; j <= x - 1; j++) cout << ' '; cout << '*' << endl; }

36 Calcul d’une somme Il s’agit de calculer la somme suivante : n
f(i) où f(i) = 2i si i est pair i=1 i-1 sinon. #include <iostream.h> void main() { int n, terme, somme = 0; cout << "Entrez le parametre n : "; cin >> n; for (int i = 1; i <= n; i++) if ((i % 2) == 0) terme = 2 * i; else terme = i - 1; somme += terme; } cout << "La sommation est : " << somme << endl;

37 Structure de sélection multiple switch
Permet de choisir une action parmi plusieurs selon la valeur d’une expression. La structure switch peut offrir plus de 2 alternatives possibles contrairement au if-else. Syntaxe : switch (expression) { case constante1: instruction1,1 instruction1, Instruction1,m1 case constante2: instruction2,1 instruction2, Instruction2,m2 . . . case constanten: instructionn,1 instructionn, Instructionn,mn default: instructionn+1,1 instructionn+1, Instructionn+1,mn } étiquette optionnelle But : Cela consiste d’abord à évaluer l’expression; si la valeur de cette expression correspond à l’une des constantes, la suite d’instructions correspondante est exécutée. Autrement, la suite d’instructions par défaut est exécutée.

38 Structure de sélection multiple switch
Note : L’usage d’une constante plus d’une fois est une erreur de syntaxe. Si pour une constante donnée, plusieurs instructions doivent être exécutées, il n’est pas nécessaire de les mettre entre accolades. Pour chaque constante donnée, la dernière instruction devraient être la clause break; Indique de procéder avec la 1ière instruction suivant la structure switch. Si la clause break; est absente, les instructions de toutes les étiquettes case restantes seront exécutées chaque fois qu’une correspondance se produira dans la structure. Si l’étiquette default est omise et la valeur de l’expression ne coïncide pas avec l’une des constantes énumérées, aucune action n’est prise. On poursuit avec la 1ière instruction suivant la structure switch. Lorsque plusieurs étiquettes case sont inscrites ensemble, la même série d’actions se produit pour chacune des étiquettes case. case 'D' : case 'd' : lettreD += 1; break;

39 Exemple : décompte des lettres représentant les notes d’examen
#include <iostream.h> void main() { char cote = ' '; // une cote int acomptage = 0, // nombre de A bcomptage = 0, // nombre de B ccomptage = 0, // nombre de C dcomptage = 0, // nombre de D ecomptage = 0; // nombre de E cout << "Entrez les cotes des étudiants (# pour terminer): "   << endl;

40 Exemple : décompte des lettres représentant les notes d’examen
while (cote != '#') { cin >> cote; switch (cote) case 'A': case 'a': ++acomptage; break; case 'B': case 'b': ++bcomptage; break; case 'C': case 'c': ++ccomptage; break; case 'D': case 'd': ++dcomptage; break; case 'E': case 'e': ++ecomptage; break; case '#': break; default: cout << "Caractere inadmissible." << endl << "Entrez une nouvelle cote." << endl; }

41 Exemple : décompte des lettres représentant les notes d’examen
cout << "Les totaux pour chaque cote :" << endl << " A : " << acomptage << endl << " B : " << bcomptage << endl << " C : " << ccomptage << endl << " D : " << dcomptage << endl << " E : " << ecomptage << endl; }

42 Exemple : Simulation d’une calculatrice simple
#include <iostream.h> void main() { int x, y; char op; cout << "Entrez deux entiers : "; cin >> x >> y; cout << "Entrez un opérateur : "; cin >> op; switch (op) case '+' : cout << x << " + "<<y<< " = " << x+y << endl; break; case '-' : cout << x << " - " << y << " = " << x-y << endl; break; case '*' : cout << x << " * " << y << " = " << x*y << endl; break; case '/' : cout << x << " / " << y << " = " << x/y << endl; break; case '%' : cout << x << " % "<<y<< " = " <<x%y<< endl; break; }

43 Structure de répétition do-while
La structure do/while est semblable à la structure while, avec la différence suivante : while évalue la condition avant d’exécuter le bloc d’instructions tandis que do-while évalue la condition après avoir exécuté le bloc d’instructions (le bloc d’instructions est exécuté au moins une fois). Syntaxe : do instruction while (expression logique); ou encore do { instruction1 instruction2 . . . instructionm } while (expression logique); Les accolades ne sont pas nécessaires mais souhaitables pour une meilleure lisibilité. But : Exécuter l’instruction ou le bloc d’instructions au moins une fois et aussi longtemps que l’expression logique est vraie.

44 Structure de répétition do-while
#include <iostream.h> void main() { int un_entier = 0, total = 0; do total += un_entier; cout << "Entrez un nombre entier positif: "; cin >> un_entier; } while (un_entier >= 0); cout << "Total des entiers positifs: " << total << endl; }

45 Instruction break break
Lorsque exécutée dans une structure while, for, do/while ou switch, elle provoque la sortie immédiate de cette structure. L’exécution du programme se poursuit avec la première instruction suivant cette structure. On utilise souvent l’instruction break pour sortir d’une boucle plus tôt. Exemple : #include <iostream.h> void main() { int k; for (int i = 1; i <= 10; i++) cin >> k; if (k <= 0) break; for (int j = 1; j<= k; j++) cout << "*"; cout << endl; }

46 Instruction continue continue
Lorsque exécutée dans une structure while, for, ou do/while, elle ignore les instructions restantes dans le corps de cette structure et procède à l’itération suivante de la boucle. while et do/while : La condition est évaluée immédiatement après l’exécution de l’instruction continue. for : L’expression d’incrémentation est exécutée puis, la condition est évaluée. Exemple : #include <iostream.h> void main() { int k; for (int i = 1; i <= 10; i++) cin >> k; if (k == 0) break; if (k < 0) continue; for (int j = 1; j<= k; j++) cout << "*"; cout << endl; }

47 Utilisation de variables booléennes
Dans les structures alternative et répétitive que nous avons vues, on retrouve des expressions logiques à évaluer dont le résultat est vrai ou faux. Pour stocker la valeur d’une condition afin de l’utiliser ailleurs, vous devez recourir à une variable booléenne de type bool. En C,  de type booléen mais on peut le définir. En C++, le type bool existe et correspond à : enum bool { false = 0, true = 1 }; enum booleen { faux = 0, vrai = 1 }; Exemple : bool V = true; . . . if (V) cout << "La condition est verifiee."; Attention : Ne pas écrire if (V == true) cout << "La condition est verifiee.";

48 Utilisation de variables booléennes
#include <iostream.h> void main() { bool lecture_inachevee = true; char cote = ' '; // une cote int acomptage = 0, // nombre de A bcomptage = 0, // nombre de B ccomptage = 0, // nombre de C dcomptage = 0, // nombre de D ecomptage = 0; // nombre de E cout << "Entrez les cotes des etudiants (# pour terminer): " << endl;

49 Utilisation de variables booléennes
while (lecture_inachevee) { cin >> cote; switch (cote) case 'A': case 'a': ++acomptage; break; case 'B': case 'b': ++bcomptage; break; case 'C': case 'c': ++ccomptage; break; case 'D': case 'd': ++dcomptage; break; case 'E': case 'e': ++ecomptage; break; case '#': lecture_inachevee = false; break; default: cout << "Caractere inadmissible." << endl << "Entrez une nouvelle cote." << endl; }

50 Utilisation de variables booléennes
cout << "Les totaux pour chaque cote :" << endl << " A : " << acomptage << endl << " B : " << bcomptage << endl << " C : " << ccomptage << endl << " D : " << dcomptage << endl << " E : " << ecomptage << endl; } Exemple : bool v = true; int somme = 0, n = 0, x; while (v) { cin >> x; if (x <= 0) v = false; else n += 1; somme += x; } cout << somme / (float) n; int somme = 0, n = 0, x; while (true) { cin >> x; if (x <= 0) break; n += 1; somme += x; } cout << somme / (float) n; ou encore

51 Utilisation d’opérateurs logiques
Jusqu’à présent, nous n’avons étudié que des conditions simples telles que compteur <= 10, total > 1000 ou nombre != sentinelle et nous les avons exprimées à l’aide des opérateurs relationnels <, <=, >, >=, == et !=. C++ offre des opérateurs logiques : && (ET logique) || (OU logique) ! (NON logique) pour former des conditions plus complexes par une combinaison de conditions simples. Exemple : #include <iostream.h> void main() { enum sexe {homme = 0, femme = 1}; enum sexe S = femme; int age = 35; if (S == femme && age >= 18) cout << "femme adulte" << endl; }

52 Utilisation d’opérateurs logiques
Exemple : #include <iostream.h> void main() { int annee; bool bissextile = false; cout << "Entrez l'annee desiree : "; cin >> annee; bissextile = ((annee % 400) == 0); bissextile = bissextile || (((annee % 100) != 0) && ((annee % 4) == 0)); if (bissextile) cout << "oui"; else cout << "non"; } parenthèses redondantes Note : Dans les expressions utilisant l’opérateur && (resp. ||), si les conditions sont indépendantes, placez la condition la plus susceptible d’être fausse (resp. vraie) à l’extrême gauche pour réduire le temps d’exécution.

53 Tables de vérité U V U && V U || V false false false false false true
vraie true false false true true true true true Exemple : Les instructions pour la déclaration de revenus 1992 disent que vous pouvez vous déclarer comme célibataire si une quelconque des conditions suivantes est vraie : - Vous ne vous êtes jamais marié. - Vous êtes légalement divorcé ou séparé au 31 déc. 92. - Vous étiez veuf avant le 1er janv. 92 et ne vous êtes pas remarié. ou Vous pouvez employer le statut marié, si toutes les conditions suivantes sont satisfaites : - Votre épouse est décédée en 90 ou en 91 et vous ne vous êtes pas remarié en 92. - Vous avez un enfant à charge. - Cet enfant habitait chez vous tout au long de 92. - vous avez payé plus de la ½ de ses frais d’entretien. et

54 Calcul de la racine carrée de n
#include <iostream.h> #include <iomanip.h> void main() { int n, // l'entier n à évaluer. m; // le nombre de décimales à obtenir après le point. cout << "Entrez l'entier n a evaluer : "; cin >> n; int entier_a_evaluer = n; cout << "Entrez le nombre de decimales apres le point : "; cin >> m; int DECIMALE = 0, // le # de décimales obtenu jusqu'à maintenant. P = 1; // la puissance de 100 la plus élevée <= n. while (P * 100 <= n) P *= 100; int BLOC = n / P; n -= (n / P) * P;

55 Calcul de la racine carrée de n
for (int RESULTAT = 9; RESULTAT >= 0; RESULTAT--) if( RESULTAT*RESULTAT <= BLOC) break; BLOC -= RESULTAT * RESULTAT; while (DECIMALE <= m) { int DOUBLER = RESULTAT * 2; P /= 100; if ( P != 0 ) BLOC = BLOC * n / P; n -= (n /P) * P; } else BLOC = BLOC * 100; for (int CHIFFRE = 9; CHIFFRE >= 0; CHIFFRE--) if(CHIFFRE*CHIFFRE + CHIFFRE*DOUBLER * 10 <= BLOC) break; BLOC -= CHIFFRE * CHIFFRE + CHIFFRE * DOUBLER * 10; RESULTAT = RESULTAT * 10 + CHIFFRE; if (P == 0) DECIMALE = DECIMALE + 1;

56 Calcul de la racine carrée de n
P = 1; for (int i = 1; i <= DECIMALE; i++) P *= 10; float R = RESULTAT / P + (RESULTAT % P) * (1.0f / P); // Calcul du nombre de chiffres de la partie entière du résultat obtenu. int k = 1, S = 9; while (S < RESULTAT / P) { k += 1; S = S * ; } // Affichage du résultat. cout << "La racine carree de " << entier_a_evaluer << " a " << m << " decimales est : " << setprecision(m + k) << R;


Télécharger ppt "Structures alternative et répétitive"

Présentations similaires


Annonces Google