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

1 Structures alternative et répétitive Comparaison de données à l’aide des opérateurs relationnels. Opérateurs logiques : « et » logique, « ou » logique.

Présentations similaires


Présentation au sujet: "1 Structures alternative et répétitive Comparaison de données à l’aide des opérateurs relationnels. Opérateurs logiques : « et » logique, « ou » logique."— Transcription de la présentation:

1 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 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 Structure de répétition : 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. while, do/while et for. Choix d’une instruction dépendamment d’une condition. Répétition d’instructions au moment où une condition est satisfaite.

3 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éeDescription > >= < <= == != > ≥ <  =  supérieur supérieur ou égal inférieur inférieur ou égal égal différent

4 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) { instruction 1 instruction 2... instruction n } But : Exécuter le bloc d’instructions si l’expression logique est vraie. Exemple : if (i < 5) { int j; j = i * i; } Respecter les règles d’indentation. pas de ;

5 5 Structure de sélection if : exemple simple #include 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 6 Structure de sélection if / else Syntaxe III : if (expression logique) instruction 1 else instruction 2 ou encore if (expression logique) { instruction 11 instruction instruction 1m } else { instruction 21 instruction instruction 2m } But : Si l’expression logique est vraie, exécuter le bloc d’instructions 1. Autrement, c’est le bloc d’instructions 2. Exemple : if (a <= b) { min = a; max = b; } else { max = a; min = b; } pas de ;

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

8 8 Structure de sélection if / else : exemple simple #include 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; return 0; } if ((annee % 4) == 0)cout << "oui." << endl; elsecout << "non." << endl; return 0; }

9 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. Exemple : CoteNote A≥ 90 B[80, 90) C[70, 80) D[60, 70) E< 60 #include 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; }

10 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 void main() { int A, B, C, MIN, MAX; cout > A >> B >> C; if (A <= B) if (A <= C) { MIN = A; if (B >= C) MAX = B; elseMAX = C; } else// C < A <= B { MIN = C; MAX = B; }

11 11 Structure de sélection if ou if / else imbriquée else// B < A if (B <= C) { MIN = B; if (A >= C) MAX = A; elseMAX = 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 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 void main() { int A, B, C; int MIN, MAX; cout << "Entrez les 3 entiers : "; cin >> A >> B >> C; if (A <= B)MIN = A; elseMIN = B; if (MIN > C) MIN = C; if (A <= B)MAX = B; elseMAX = A; if (MAX < C) MAX = C; cout << "La plus petite valeur est : " << MIN << endl; cout << "La plus grande valeur est : " << MAX << endl; }

13 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; ou bien if ( N > 0) if ( A > B) MAX = A; else MAX = B; 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 14 L’opérateur conditionnel Cet opérateur ternaire (le seul!) est une alternative au if-else. Syntaxe III : expression logique ? expression 1 : expression 2 But : Si l’expression logique est vraie, la valeur de expression 1 est retournée. Autrement, la valeur de expression 2 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 = 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 15 Structure de répétition while Nous disposons de 3 structures de répétition : while, do-while et for interchangeables. Syntaxe : while (expression logique) instruction ou encore while (expression logique) { instruction 1 instruction 2... instruction m } 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. On pourrait utiliser une seule des trois mais il est préférable de choisir celle la mieux adaptée à chaque cas. Au début de l’exécution, si l’expression logique est fausse, on passe à l’instruction qui suit la boucle while. Note :

16 16 Structure de répétition while Exemple : // Impression des entiers de 1 à 10. int i = 1; while (i <= 10) cout << i++; 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. Note : Exemple : // Plus petite puissance de 2 plus grande que int produit = 2; while (produit <= 1000) produit = 2 * produit; cout << produit; 1024 Exemple : // Calcul de m n où m et n sont des entiers positifs. int i = 1, resultat = 1; while (i <= n) { resultat *= m; i = i + 1; } O(n)

17 17 Calcul de m n Exemple : // Calcul de m n 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--;} } n = 13 rbirbi 1m13 mm12 mm26mm26 mm43mm43 m5m42m5m42 m5m81m5m81 m 13 m 8 0 Tiré de C. Horstmann & T. Budd, La Bible C++. John Wiley & Sons, Inc. Pp

18 18 Calcul de m n : 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. b i = m n (*) (i)Cela est vrai la première fois parce que b = m et i = n. (ii)Supposons que (*) est vrai au début de la boucle. Nous avons donc : r vieux = b vieux i vieux = m n 2 cas : 1. i est pair La boucle effectue les transformations suivantes : r neuf = r vieux b neuf =b 2 vieux i neuf = i vieux / 2 i.e. r neuf. b neuf i neuf = r vieux (b vieux ) 2 i vieux / 2 = r vieux b vieux i vieux = m n

19 19 Calcul de m n : preuve 2. i est impair La boucle effectue les transformations suivantes : r neuf = r vieux b vieux b neuf =b vieux i neuf = i vieux - 1 i.e. r neuf. b neuf i neuf = r vieux b vieux b vieux i vieux - 1 = r vieux b vieux i vieux = 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. b i = r. b 0 = r = m n. Cette fonction calcule réellement la n iè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 20 Calcul de la moyenne des notes d’une classe Exemple : #include 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 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 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 > une_note; while (une_note != sentinelle) { somme_des_notes += une_note; Nombre_d_eleves += 1; cout > une_note; } 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 22 Calcul du n ième nombre de Catalan Parenthèses 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? 2 lettres3 lettres4 lettres5 lettres aba ( bc )( (ab ) c ) d... ( ab ) c(ab ) ( cd ) ( a ( bc ) ) d a ( (bc) d ) a ( b (cd ) ) => Nombres de Catalan Polygone convexe :# de façons de diviser un polygone convexe à n + 2 côtés en triangles. n = 2Le 2 ième nombre de Catalan est 2.

23 23 Calcul du n ième nombre de Catalan Cat(n) = (2n)!, n ≥ 0. (n+1)! n! #include void main() { int n, num, den; cout > 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 24 Calcul du n iè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 void main() { int n; float resultat = 2.0f; cout > 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 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 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 26 Confusion entre = et == = 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 Pièges subtils : la syntaxe est correcte mais … 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 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 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  à 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 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 } ou, de façon plus concise, int compteur = 0; while ( ++compteur <= 10) cout << compteur << endl; 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 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 (expression 1 ; expression logique 2 ; expression 3 ) instruction ou encore for (expression 1 ; expression logique 2 ; expression 3 ) { instruction 1 instruction 2... instruction m } But : Expression 1 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 logique 2 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. Expression 3 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 30 Structure de répétition for La structure de répétition for est équivalente à : expression 1 ; while (expression logique 2 ) { instruction expression 3 ; } Lorsque la variable de contrôle est déclarée dans expression 1, 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 expression 1, expression logique 2 et expression 3 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 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 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 expression 1 et expression 3, 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. expression 2 omise  la condition de répétition est toujours vraie  une boucle infinie.

32 32 Structure de répétition for La variable de contrôle est initialisée ailleurs dans le programme  l’expression 1 est omise. L’incrémentation est calculée par des instructions dans le corps du for  l’expression 3 est omise. L’expression 3 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 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 34 Affichage de la table des produits pour n variant de 0 à 10 #include 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 << '-'; cout << endl; for (int i = 0; i <= 10; i++) { cout << setw(4) << i << " | "; for (int j = 0; j <= 10; j++) cout << setw(4) << i * j; cout << endl; }

35 35 Affichage d’un cercle centré à l’origine #include 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; } Le rayon du cercle est un entier positif.

36 36 Calcul d’une somme #include 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; } Il s’agit de calculer la somme suivante : n  f(i)où f(i) =2i si i est pair i=1i-1 sinon.

37 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 constante 1 : instruction 1,1 instruction 1,2... Instruction 1,m 1 case constante 2 : instruction 2,1 instruction 2,2... Instruction 2,m 2... case constante n : instruction n,1 instruction n,2... Instruction n,m n default: instruction n+1,1 instruction n+1,2... Instruction n+1,m n } 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. étiquette optionnelle

38 38 Structure de sélection multiple switch Note : 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 1 iè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 1 iè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; L’usage d’une constante plus d’une fois est une erreur de syntaxe.

39 39 Exemple : décompte des lettres représentant les notes d’examen #include void main() { char cote = ' ';// une cote intacomptage = 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 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 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 42 Exemple : Simulation d’une calculatrice simple #include 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 << " + "<

43 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 { instruction 1 instruction 2... instruction m } while (expression logique); But : Exécuter l’instruction ou le bloc d’instructions au moins une fois et aussi longtemps que l’expression logique est vraie. Les accolades ne sont pas nécessaires mais souhaitables pour une meilleure lisibilité.

44 44 Structure de répétition do-while #include 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 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 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 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 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 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. enum booleen { faux = 0, vrai = 1 }; 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 }; Pour stocker la valeur d’une condition afin de l’utiliser ailleurs, vous devez recourir à une variable booléenne de type bool. Exemple :bool V = true;... if (V) cout << "La condition est verifiee."; Attention :Ne pas écrire if (V == true) cout << "La condition est verifiee.";

48 48 Utilisation de variables booléennes #include void main() { bool lecture_inachevee = true; char cote = ' ';// une cote intacomptage = 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 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 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 : int somme = 0, n = 0, x; while (true) { cin >> x; if (x <= 0) break; n += 1; somme += x; } cout << somme / (float) n; 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; ou encore

51 51 Utilisation d’opérateurs logiques Jusqu’à présent, nous n’avons étudié que des conditions simples telles que compteur 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 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 52 Utilisation d’opérateurs logiques #include 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"; } Exemple : 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 53 Tables de vérité U V U && V U || V false true false vraie true false true Exemple : ou 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 Vous étiez veuf avant le 1 er janv. 92 et ne vous êtes pas remarié. et 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 Vous avez un enfant à charge. - Cet enfant habitait chez vous tout au long de vous avez payé plus de la ½ de ses frais d’entretien.

54 54 Calcul de la racine carrée de n #include 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 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 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 "1 Structures alternative et répétitive Comparaison de données à l’aide des opérateurs relationnels. Opérateurs logiques : « et » logique, « ou » logique."

Présentations similaires


Annonces Google