La lecture en ligne est gratuite
Le téléchargement nécessite un accès à la bibliothèque YouScribe
Tout savoir sur nos offres

Partagez cette publication

Vous aimerez aussi

Chapitre 2
L’ordinateur prend des dÉcisions
2.1 Programmesmaladroits et programmes impossibles Dans les programmes que nous avons vus jusqu’À prsent, l’ordinateur utilisait la puissance de son processeur ou la fidlit de sa mmoire pour afficher les rsultats d’un calcul ou une donne qu’il avait pu mmoriser. Examinons le schma du programme : – lireles donnes – calculerle rsultat (tape qui saute s’il s’agit de simplement restituer/rutiliser une don-ne – afficherdes donnes (identiques ou nouvelles) Ce schma ne peut subir la moindre variation. Il serait pourtant intressant de pouvoir in-troduire des variantes. Soit parce que nous voulons choisir le traitement, soit parce que le traitement prvu n’est pas adapt. Dans nos exercices, nous avons vu les deux possibilits. Nous avons t oblig d’crire plusieurs programmes pour pouvoir calculer la somme ou la diffrence, ou un autre programme qui effectue tous les types d’opration. Nous devons alors changer de programme pour chaque type de calcul ou accepter que l’ordinateur nous donne des rsultats qui ne nous intressent pas en lui faisant effectuer toutes les oprations. Il reste encore un cas plus gnant, c’est lorsqu’on dcide de faire raliser des divisions À l’ordinateur. Celui-ci n’a aucun moyen d’empcher une division par zro qui lui serait impose par un utilisateur ignorant du problme ou simplement distrait. Voyons À quoi ressemblerait un programme de division. 1Variables Flottantes fDividende, fDiviseur 2Variable Flottante fQuotient 3 4Dbut du traitement 5des donnes/ Lecture/ * * 6Afficher "Donnez le dividende de l’opration " 7Lire fDividende 8Afficher "Donnez le diviseur de l’opration " 9Lire fDiviseur 10/ Calcul / * * 11fQuotient <- fDividende / fDiviseur 12/ Affichagedu rsultat/ * * 13Afficher "Le quotient vaut : " & fQuotient 14Fin du traitement D’une manire vidente, l’instruction de la ligne 11 pose problme. Excute par le pro-cesseur, cette instruction provoque un plantage du programme lorsque le diviseur est nul. Cer-23
24
CHAPITRE 2.L’ORDINATEUR PREND DES DéCISIONS
tains compilateurs, dont GNU CC, produisent un rsultat qui s’afficheinf. Donnez le dividende de l’opration12 Donnez le diviseur de l’opration0 Le quotient vaut : inf Il existe bien sÛr la solution d’afficher une mise en garde pour l’utilisateur, mais rien ne dit qu’il en tiendra compte : Afficher "Donnez le diviseur de l’opration (diffrent de 0)" Lire fDiviseur Une meilleure solution consiste À tester si le diviseur n’est pas nul et À ne poursuivre le traitement que si cette condition se ralise. Voici ce que devient le programme : Variables Flottantes fDividende, fDiviseur Variable Flottante fQuotient
Dbut du traitement Afficher "Donnez le dividende de l’opration " Lire fDividende Afficher "Donnez le diviseur de l’opration " Lire fDiviseur / Onne calcule le quotient que si le diviseur n’est pas nul/ * * Si fDiviseur Diffrent de 0 Alors fQuotient <- fDividende / fDiviseur Afficher "Le quotient vaut : " & fQuotient Fin de si Fin du traitement On peut regrettez que dans ce cas le programme se contente de ne rien faire. Il est possible de programmer d’autres instructions qui ne se raliseront que si la condition est fausse : / Onne calcule le quotient que si le diviseur n’est pas nul/ * * Si fDiviseur Diffrent de 0 Alors fQuotient <- fDividende / fDiviseur Afficher "Le quotient vaut : " & fQuotient / Sile diviseur est nul, on signale que la division est impossible/ * * Sinon Afficher "Une division par 0 est impossible" Fin de si Voici un exemple d’excution de la version finale du programme : jacques@naxos:~/testpmp>./division Donnez le dividende de l’opration555 Donnez le diviseur de l’opration5 Le quotient vaut : 111.000000 jacques@naxos:~/testpmp>./division Donnez le dividende de l’opration555 Donnez le diviseur de l’opration0 Une division par 0 est impossible
2.2 Alternativessimples Nous venons de voir un moyen efficace de produire des rsultats adapts aux circonstances.
2.2. ALTERNATIVESSIMPLES
25
2.2.1 TraitementsubordonnÉ À une condition Lorsqu’une srie d’instructions ne doivent se raliser que sous certaines conditions, on les met entre parenthses au moyen des commandesSietFin de si. Il faut bien sÛr exprimer la condition de ralisation. Cette condition sera, dans la majorit des cas, le rsultat d’une comparaison. Comme en mathmatique, nous disposerons de six oprateurs de comparaison. 1 Pour chacun d’eux, je propose une version en franÇais et une version abrge.
Oprateur Ègal À
Diffèrent de Infèrieur À Supèrieur À InfOuEgal SupOuEgal
?= == != < > <= >=
Exemple fDeltaÈgal À0
fDeltaDiffèrent de0 fDeltaInfèrieur À0 fDeltaSupèrieur À0 fDeltaInfOuEgal0 fDeltaSupOuEgal0
La condition s’exprime aprs le motSi. Pour bien sparer l’expression de la condition et les instructions qu’elle contrÔle, nous plaÇons le motAlors. Les instructions À effectuer viennent aprs (par clart, nous les dcalons lgrement vers la droite). Il faut videmment indiquer la dernire instruction dpendant de la condition, puisque les instructions suivantes s’excuteront toujours. On place ainsi la commandeFin de Si. Lire fQuotient ✞ ☎ Si Alors fDiviseur Diffrent de 0 ✝ ✆ fQuotient <- fDividende / fDiviseur Afficher "Le quotient vaut : " Afficher fQuotient Fin de si / Suitedu programme/ * *
2.2.2 Traitementsalternatifs Lorsque la condition ne se limite pas À autoriser ou interdire l’excution d’une srie d’in-structions, on se trouve devant une alternative : il est alors possible de dfinir deux sries d’instructions. La premire srie sera effectue si la condition est vraie. La seconde ne le sera que si la condition est fausse. Dans ce cas, il faut bien prendre soin de sparer ces deux sries d’instructions. C’est le rÔle du motsinon. Les instructions À effectuer quand la condition est vraie se trouvent ainsi entreAlorsetSinon. Les instructions À effectuer quand la condition est fausse figurent entreSinonetFin de Si. ✞ ☎ Si Alors fDiviseur Diffrent de 0 ✝ ✆ fQuotient <- fDividende / fDiviseur Afficher "Le quotient vaut : " Afficher fQuotient 1. Onnotera l’utilisation de?=et!=pour marquer l’galit et l’ingalit. J’utiliserai personnellement la variante franÇaise, par souci de clart. Pour des raisons techniques, j’ai prfr viter l’emploi de=, qui risque de poser de gros problmes en C. Pour rappel, les signes>ou<sont toujours orients du cÔt du plus grand.
26
CHAPITRE 2.L’ORDINATEUR PREND DES DéCISIONS
Sinon Afficher "Une division par 0 est impossible" Fin de si
2.3 Alternativescomplexes L’ordinateur travaille avec une logique binaire, c’est pour cela que l’instruction condition-nelle comporte deux parties : les instructions À raliser si la condition est vraie et celles À effectuer si la condition est fausse. La version de l’instruction conditionnelle sans traitement alternatif peut se rduire au cas complexe en spcifiant que le deuxime traitement se rduit À ne rien faire. On peut cependant facilement trouver des cas oÙ il existe trois traitements alternatifs. Si on veut examiner un nombre entier, il est possible de le caractriser au moyen de trois adjectifs : positifsi le nombre est plus grand que 0 negatifsi le nombre est plus petit que 0 nuls’il est gal À zro La structure alternative que nous venons d’envisager ne permet pas de considrer trois cas, puisque la condition est unique. Nous aurons donc le choix entre trois solutions, selon la con-2 dition envisage: 1. lenombre est plus grand que 0 : le nombre sera positif ou non positif (nul ou ngatif) 2. lenombre est plus petit que 0 : le nombre sera ngatif ou non ngatif (nul ou positif) 3. lenombre est gal À 0 : le nombre sera nul ou non nul (positif ou ngatif). Arbitrairement, nous choisirons la troisime solution. Variable Entire iNombre Dbut du Traitement Afficher "Veuillez entrer un nombre " Lire iNombre 2. Onpourrait encore envisager trois autres tests, puisque nous disposons de six comparateurs, mais ces trois autres ne correspondent À rien d’intuitif.
2.3. ALTERNATIVESCOMPLEXES
Si iNombre Ègale 0 Alors Afficher "Ce nombre est nul." Sinon Afficher "Ce nombre n’est pas nul." Fin de Si
Fin du Traitement
27
Pour amliorer ce programme, nous voudrions pouvoir distinguer les cas oÙ le nombre est positif de ceux oÙ il est ngatif. Nous allons remplacer l’impression du deuxime message par un traitement plus complexe.
Si iNombre Ègale 0 Alors Afficher "Ce nombre est nul." Sinon Si iNombre < 0 Alors Afficher "Ce nombre est ngatif." Fin de Si Si iNombre > 0 Alors Afficher "Ce nombre est positif." Fin de Si Fin de Si
On peut simplifier ces deux instructions. En effet, quand le nombre n’est pas nul, s’il n’est pas ngatif, il est forcment positif.
Si iNombre Ègale 0 Alors Afficher "Ce nombre est nul." Sinon Si iNombre < 0 Alors Afficher "Ce nombre est ngatif." Sinon Afficher "Ce nombre est positif." Fin de Si Fin de Si
En thorie, nous pouvons imbriquer nos instructions conditionnelles autant que nous voulons. Dans la pratique, nous devons tenir compte des limitations de l’esprit humain et considrer qu’au-delÀ de quatre imbrications, nous ne sommes plus vraiment capables de suivre.
Commentaires et notions de logique Lors de l’utilisation de plusieurs alternatives, il peut tre utile de placer des commen-taires pour bien marquer les cas prvus. Ainsi, le programme ci-dessous pourrait s’crire d’une manire plus lisible de la faÇon suivante :
1Si iNombre == 0 Alors 2Afficher "Ce nombre est nul." 3Sinon // Nombre diffrent de 0 4Si iNombre < 0 Alors
28
CHAPITRE 2.L’ORDINATEUR PREND DES DéCISIONS
5Afficher "Ce nombre est ngatif." 6Sinon // Nombre suprieur À 0 7Afficher "Ce nombre est positif." 8Fin de Si 9Fin de Si
Notons bien que les commentaires de la ligne 3 et de la ligne 6 ne sont pas des conditions. La condition lie À l’excution de la deuxime branche d’une alternative esttoujours implicite et correspond À la ngation de la condition originale. Depuis des annes, quand je demande «quel est la ngation de la condition A > B? »,il s’lve toujours une voix pour dire « A < B ». Si Mohamed n’est pas plus grand que Rmy, cela ne signfie pas ncessairement qu’il est plus petit. Ils peuvent avoir la mme taille. Rappelons donc des vidences :
Vocabulaire
Condition A == B A < B A > B
Ngation A !=B A >= B A <= A
ALTERNATIVE, CONDITION, EXPLICITE, FAUX, IMBRICATION, IMPLICITE, OPÈRA-TEURS DE COMPARAISON, VRAI
Exercices
II-1.Ècrire un programme qui affiche le plus grand de deux nombres entrs au clavier. II-2.Ècrire un programme qui affiche dans l’ordre croissant deux nombres entiers entrs au clavier. II-3.Les factures concernant les rparations dans des habitations se voient appli-quer un taux de TVA variable : – dansles maisons de plus de 15 ans, on applique un taux de TVA de 6%, – dansles maisons rcentes, un taux de TVA de 21%. Ècrire un programme qui calcule le prix total d’une facture dont on connat le montant hors TVA et l’áge du bátiment. II-4.Modifier le programme prcdent en simplifiant la procdure d’encodage. Il n’est en effet pas ncessaire d’encoder l’áge exact (parfois inconnu dans le cas d’un vieux bátiment). II-5.Ècrire un programme qui calcule les racines d’une quation donnes, si c’est possible. Si vous tes vraiment allergique À l’algbre, vous pouvez vous limiter À crire les expressions correspondant aux diffrentes formules.
2.3. ALTERNATIVESCOMPLEXES
29
Une quation du second degr possde la forme canonique suivante : 2 axbx+c= 0 En calculer les racines revient À chercher la ou les valeurs de x qui rendent cette galit vraie. 2 2 Par exemple, l’quationx5x+6 = 0a pour racines les valeurs 3 et 2 parce que35.3+6 = 2 0et25.2 + 6 = 0. Rappelons qu’une telle quation se rsout en calculant pralablement la valeur deδqui vaut 2 b4ac. Trois cas peuvent se prsenter : √ √ b+δbδ δetest positif et dans ce cas, l’quation admet deux solutions : 2a2a b δest nul et l’quation possde une racine double 2a δest ngatif et l’quation n’admet pas de racines relles Les expressions ci-dessus peuvent tre encodes sans trop de problmes, À condition de se rappeler que les produits et les divisions ncessitent parfois l’usage de parenthses. Ne pas oublier d’crire tous les oprateurs. A titre d’exemple, les quations suivantes ont des solutions relles : 2 22 2 x+x2 = 0x8x+ 7 = 0x5x+ 6 = 0x8x+ +16 = 0