4. Les structures de tests P. Costamagna – ISEN N1
A. Structure d’un test simple Instruction permettant de rompre l’ordre séquentiel d’un programme. Langage intermédiaire Si booléen Alors instructions (1) ... Finsi instructions (2) Exécuté si le booléen est vrai variable condition Exécuté dans tous les cas P. Costamagna
B. Qu’est ce qu’une condition ? = Comparaison constituée d’une valeur, d’un opérateur de comparaison, d’une 2nde valeur. Exemple "t" < "w" "Maman" > "Papa" "maman" > "Papa" VRAI FAUX P. Costamagna
B. Qu’est ce qu’une condition ?(suite1) Exemple Soit la condition " Truc est compris entre 5 et 8 ". On peut être tenté de la traduire par : 5 < Truc < 8. Une telle expression, qui a du sens en mathématiques, ne veut rien dire en programmation. Il n’y a pas une, mais deux conditions reliées par un opérateur logique. Cette condition revient à dire: Truc est supérieur à 5 ET Truc est inférieur à 8 et s’écrira donc en langage C (TRUC > 5) && (TRUC < 8) P. Costamagna
B. Qu’est ce qu’une condition ?(suite2) Langage C Pas de ; if (expression) { instructions (1) } instructions (2) Exercice Ecrire en langage intermédiaire puis en langage C, un algorithme qui transforme un entier en un naturel (entier positif). P. Costamagna
B. Solution de l’exercice Langage intermédiaire Langage C Liste des variables N de type entier contenant l’entier lu Début Affiche (« Donner un entier ») Lis et Place dans N Si N < 0 alors Place -N dans N Finsi Affiche (« Naturel correspondant : ») Affiche (N) Fin void main() { int N ; ecrisChaine (« Saisir un entier ») ; N=lisEntier () ; if (N < 0) N = -N ; sautDeLigne(); ecrisChaine («Naturel correspondant: » ); ecrisEntier(N) ; } P. Costamagna
C. Structure d’un test alternatif Langage intermédiaire Si booléen Alors instructions (1) ... Sinon instructions (2) FinSi instructions (3) Exécuté si le booléen est vrai Exécuté si le booléen est faux Exécuté dans tous les cas P. Costamagna
C. Structure d’un test alternatif (suite1) Langage C Exercice if (expression) { instructions (1) } else instructions (2) instructions (3) Ecrire en langage intermédiaire puis en langage C, un algorithme qui teste une température d’eau et indique s’il s’agit de glace (<=0) ou de liquide. P. Costamagna
C. Solution de l’exercice Langage intermédiaire Langage C Liste des variables TEMP de type réel correspondant à la température de l’eau à tester Début Affiche (« Donner une température ») Lis et Place dans TEMP Si TEMP < = 0 alors Affiche (« c’est de la glace ») Sinon Affiche (« c’est du liquide ») Finsi Fin void main() { float TEMP ; ecrisChaine (« Donner une température ») ; TEMP = lisFlottant () ; sautDeLigne(); if (TEMP <= 0) ecrisChaine (« C’est de la glace »); else ecrisChaine (« C’est du liquide »); } P. Costamagna
D. Les tests imbriqués Les instructions placées dans les blocs d’instructions peuvent être quelconques. Elles peuvent en particulier contenir d’autres tests. On a alors des tests en cascade, ce qui permet de disposer de plus de 2 alternatives. Exemple if (expression1 ) { ……. if (expression2 ) } else ……. Exécuté si l’expression1 est vraie Exécuté si l’expression1 et l’expression2 sont vraies Exécuté si l’expression1 est vraie et l’expression2 est fausse Exécuté si l’expression1 est fausse Exécuté dans tous les cas P. Costamagna
E. Quelques erreurs à éviter Oubli des accolades pour délimiter un bloc: ….. if ( a < b ) ecrisChaine (« Ordonné »); max = b; else ecrisChaine (« Non ordonné »); 1. 2. 3. 4. 5. Si l’expression est vraie, l’instruction 2 est exécutée,puis le programme continue en séquence avec l’instruction 3. Il fallait écrire: if ( a < b ) { ecrisChaine (« Ordonné »); max = b; } else ecrisChaine (« Non ordonné »); 1. 2. 3. 4. 5. 6. P. Costamagna
E. Quelques erreurs à éviter (suite1) Moins de else que de if, attention aux ambiguïtés: Un else se rapporte toujours au dernier if rencontré. ….. if ( a < b ) if ( b < c ) ecrisChaine (« Ordonné »); else ecrisChaine (« Non ordonné »); 1. 2. 3. 4. 5. On préfèrera l’écriture: if ( a < b ) if ( b < c ) ecrisChaine (« Ordonné »); else ecrisChaine (« Non ordonné »); P. Costamagna
E. Quelques erreurs à éviter (suite2) Un point-virgule mal placé: ….. if ( a < b ) ; { ecrisChaine (« Ordonné »); max = b; } else ecrisChaine (« Non ordonné »); 1. 2. 3. 4. 5. 6. 7. Un ; marque la fin d’une instruction en langage C. L’instruction 1 correspond alors à une instruction vide. P. Costamagna
E. Quelques erreurs à éviter (suite3) Une affectation au lieu d’une comparaison: Ne pas confondre == (comparaison) et = (affectation). ….. if ( a = 3 ) ecrisChaine (« a est égal à trois »); Lorsque le compilateur va évaluer l'expression a=3, il va d'abord affecter 3 à a, et le résultat de cette affectation sera toujours vrai. Il faut donc écrire: if ( a == 3 ) ecrisChaine (« a est égal à trois »); P. Costamagna
F. Exercice Ecrire en langage intermédiaire puis en langage C, un algorithme qui effectue la résolution d’une équation du 1er degré (ax + b = 0) P. Costamagna
G. Solution de l’exercice Langage intermédiaire Langage C Liste des variables A, B de type réel correspondant aux coefficients de l’équation SOL de type réel correspondant à la solution (si elle existe) Début Affiche (« Saisir les coefficients ») Lis et Place dans A Lis et Place dans B Si (A != 0) alors Place - B / A dans SOL Affiche (« La solution est », SOL) Sinon Si (B == 0) alors Affiche (« Infinité de solutions ») Affiche (« Pas de solution ») FinSi Fin void main() { float A, B, SOL ; ecrisChaine (« Saisir les coefficients ») ; A=lisFlottant () ; B =lisFlottant ( ) ; sautDeLigne( ) ; if (a != 0) SOL = -B / A ; ecrisChaine (« La solution est : ») ; ecrisFlottant (SOL) ; } else if (B == 0) ecrisChaine (« Infinité de solutions ») ; ecrisChaine (« Pas de solution ») ; P. Costamagna