56
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.

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

Embed Size (px)

Citation preview

Page 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

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.

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

2

Structures de contrôle

Jusqu’à maintenant, les instructions d’un programme ont été exécutéesles 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 toujourssé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 lavaleur 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 conditionest satisfaite.

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

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

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

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 seulbloc d’instructions, en les plaçant entre accolades { }.

Syntaxe II : if (expression logique){

instruction1

instruction2

. . .instructionn

}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èglesd’indentation.

pas de ;

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

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;

}

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

6

Structure de sélection if / else

Syntaxe III : if (expression logique) instruction1 else instruction2

ou encoreif (expression logique){

instruction11

instruction12

. . .instruction1m

}else{

instruction21

instruction22

. . .instruction2m

}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 ;

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

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 4alors é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 etune année sur 4 est bissextile

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

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;return 0;

}if ((annee % 4) == 0) cout << "oui." << endl;

else cout << "non." << endl;return 0;

}

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

9

Structure de sélection if ou if / else imbriquée

Dans les structures de sélection précédentes, la partie « instruction » peutrenfermer d’autres structures de sélection, ce qui donne des structures if ouif-else imbriquées.

Exemple :

Cote NoteA ≥ 90B [80, 90)C [70, 80)D [60, 70)E < 60

#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;

}

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

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;

}

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

11

Structure de sélection if ou if / else imbriquée

else // B < Aif (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 plusieursstructures simples dans le cas d’une sortie hâtive.

À cette fin, il est préférable de tester les conditions les plus susceptiblesd’être vraies au début.

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

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;

}

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

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 bienif ( 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èdepas 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;

}

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

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èsespeuvent 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 ?

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

15

Structure de répétition while

Nous disposons de 3 structures de répétition : while, do-while et forinterchangeables.

Syntaxe : while (expression logique) instructionou encore

while (expression logique){

instruction1

instruction2

. . .instructionm

}

But : Tant et aussi longtemps que l’expression logique est vraie, exécuterl’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 cellela 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 :

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

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

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

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--; }

}

n = 13r b i1 m 13

m m 12

m m2 6

m m4 3

m5 m4 2

m5 m8 1

m13m8 0

Tiré de C. Horstmann & T. Budd, La Bible C++. John Wiley & Sons, Inc. Pp 144-145.

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

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 quer . bi = mn (*)

(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 : rvieux = bvieux

ivieux = mn

2 cas :

1. i est pair

La boucle effectue les transformations suivantes :

rneuf = rvieux

bneuf =b2vieux

ineuf = ivieux / 2

i.e. rneuf . bneuf

ineuf = rvieux (bvieux)2 i

vieux / 2

= rvieux bvieux

ivieux = m n

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

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 . bneuf

ineuf = rvieux bvieux bvieux

i vieux

- 1 = rvieux bvieux

ivieux = m n

Dans chaque cas, les nouvelles valeurs de r, b et i respectent l’invariant deboucle (*). 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.

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

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;

}

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

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 unevaleur 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;cout << "Entrez une note ou -1 pour terminer : "; cin >> 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;}

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

22

Calcul du nième nombre de Catalan

Parenthèses

Combien de façons différentes avons-nous de placer des parenthèsesautour d'une suite de n+1 lettres,en plaçant à chaque fois 2 lettres (au moins) dans les 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

Polygone convexe : # de façons de diviser un polygone convexe à n + 2 côtésen triangles.

n = 2 Le 2ième nombre de Catalan est 2.

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

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;

}

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

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;

}

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

25

Expressions logiques vs expressions

Dans les structures alternative ou répétitive, si l’expression logique estremplacé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--;

}

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

26

Confusion entre = et ==

Confusion entre = et ==

= désigne l’opérateur d’affectation tandis que == représente l’opérateurde 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 + 2.4 * z – 0.5; // un test est effectué mais sans action par contre.

Éviter d’imbriquer des instructions d’affectation dans des conditions mêmesi c’est licite.

if ((d = b * b – 4 * a * c) >= 0) r = sqrt(d);

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

27

Comparaison de nombres à virgule flottante

Dans la plupart des cas, il faut éviter de comparer exactement des nombresré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érenceest 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 del’ordre de quelques millions. Pour pallier à ce problème, il faut tester :

x – y .max(|x|, |y|)

Un problème surgit lorsque x ou yest égal à 0 (l’expression vaut 1).

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

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 compteurwhile ( 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 peutproduire 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) …;

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

29

Structure de répétition for

La répétition contrôlée par compteur est gérée complètement par la structurede répétition for.

Syntaxe : for (expression1; expression logique2; expression3) instructionou 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;

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

30

Structure de répétition for

La structure de répétition for est équivalente à :

expression1;while (expression logique2){

instructionexpression3;

}

Lorsque la variable de contrôle est déclarée dans expression1, l’utilisationde 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 dansl’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++.

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

31

Structure de répétition for

La valeur et le type d’une liste d’expressions séparées par une virgulerepré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 demultiples 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 impliquantles variables de contrôle. Les autres variables devraient apparaître soitavant la boucle, soit dans le corps de la boucle (si elles s’exécutent une foispar répétition). Éviter de placer des expressions dont les valeurs ne changentpas à 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.

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

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 instructionautonome; par conséquent, les expressions

compteur = compteur + 1compteur += 1++compteurcompteur++

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êtede la structure for, le bloc d’instructions devient une instruction vide.

Cela peut être utilisé pour créer un délai (ralentir un programme).

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

33

Structure de répétition for

Les 3 expressions d’une boucle for peuvent contenir des expressionsarithmé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 lastructure for n’est pas effectué.

for (int j = 0; j < 0; j--) cout << j; // aucune opération effectuée.

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

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 << '-';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;

}}

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

35

Affichage d’un cercle centré à l’origine

#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;

}}

Le rayon du cercle est un entier positif.

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

36

Calcul d’une somme

#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;}

Il s’agit de calculer la somme suivante :n f(i) où f(i) = 2i si i est pairi=1 i-1 sinon.

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

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 contrairementau if-else.

Syntaxe :

switch (expression){

case constante1: instruction1,1 instruction1,2 . . . Instruction1,m1

case constante2: instruction2,1 instruction2,2 . . . Instruction2,m2

. . .case constanten: instructionn,1 instructionn,2 . . . Instructionn,mn

default: instructionn+1,1 instructionn+1,2 . . . Instructionn+1,mn

}But :

Cela consiste d’abord à évaluer l’expression; si la valeur de cette expressioncorrespond à l’une des constantes, la suite d’instructions correspondante estexécutée. Autrement, la suite d’instructions par défaut est exécutée.

étiquette optionnelle

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

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 laclause 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 caserestantes seront exécutées chaque fois qu’une correspondance se produiradans la structure.

Si l’étiquette default est omise et la valeur de l’expression ne coïncide pasavec 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éried’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.

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

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 Abcomptage = 0, // nombre de Bccomptage = 0, // nombre de Cdcomptage = 0, // nombre de Decomptage = 0; // nombre de E

cout << "Entrez les cotes des étudiants (# pour terminer): "   << endl;

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

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;}

}

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

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;

}

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

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;

}}

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

43

Structure de répétition do-while

La structure do/while est semblable à la structure while, avec la différencesuivante :

while évalue la condition avant d’exécuter le bloc d’instructionstandis 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);

But : Exécuter l’instruction ou le bloc d’instructions au moins une fois et aussilongtemps que l’expression logique est vraie.

Les accolades ne sont pasnécessaires mais souhaitablespour une meilleure lisibilité.

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

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;}

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

45

Instruction break

break

Lorsque exécutée dans une structure while, for, do/while ou switch, elleprovoque la sortie immédiate de cette structure. L’exécution du programmese 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;

}}

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

46

Instruction continue

continue

Lorsque exécutée dans une structure while, for, ou do/while, elle ignore lesinstructions 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èsl’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;

}}

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

47

Utilisation de variables booléennes

Dans les structures alternative et répétitive quenous avons vues, on retrouve des expressionslogiques à é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 del’utiliser ailleurs, vous devez recourir à unevariable 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.";

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

48

Utilisation de variables booléennes

#include <iostream.h>void main(){

bool lecture_inachevee = true;

char cote = ' '; // une cote

int acomptage = 0, // nombre de Abcomptage = 0, // nombre de Bccomptage = 0, // nombre de Cdcomptage = 0, // nombre de Decomptage = 0; // nombre de E

cout << "Entrez les cotes des etudiants (# pour terminer): "<< endl;

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

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;}

}

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

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

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

51

Utilisation d’opérateurs logiques

Jusqu’à présent, nous n’avons étudié que des conditions simples telles quecompteur <= 10, total > 1000 ou nombre != sentinelle et nous les avonsexprimé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 deconditions 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;

}

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

52

Utilisation d’opérateurs logiques

#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";

}

Exemple :

parenthèsesredondantes

Note : Dans les expressions utilisant l’opérateur && (resp. ||), si les conditionssont 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.

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

53

Tables de vérité

U V U && V U || V

false false false false

false true false vraie

true false false true

true true true true

Exemple :

ou Les instructions pour la déclaration de revenus 1992 disent que vous pouvezvous déclarer comme célibataire si une quelconque des conditions suivantesest 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é.

et Vous pouvez employer le statut marié, si toutes les conditions suivantes sontsatisfaites : - 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.

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

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;

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

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 * 100 + 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;

}

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

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 * 10 + 9;

}

// Affichage du résultat.

cout << "La racine carree de " << entier_a_evaluer << " a " << m << " decimales est : " << setprecision(m + k) << R;

}