Chapitre2L’ordinateurprenddesdécisions2.1 ProgrammesmaladroitsetprogrammesimpossiblesDans les programmes que nous avons vus jusqu’à présent, l’ordinateur utilisait la puissancede son processeur ou la fidélité de sa mémoire pour afficher les résultats d’un calcul ou unedonnée qu’il avait pu mémoriser. Examinons le schéma du programme :– lire les données– calculer le résultat (étape qui saute s’il s’agit de simplement restituer/réutiliser une don-née– afficher des 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 letraitement 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 ladifférence, ou un autre programme qui effectue tous les types d’opération. Nous devons alorschanger de programme pour chaque type de calcul ou accepter que l’ordinateur nous donnedes 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éepar un utilisateur ignorant du problème ou simplement distrait.Voyons à quoi ressemblerait un programme de division.1 Variables Flottantes fDividende, ...
2.1 Programmesmaladroits et programmes impossibles Dans les programmes que nous avons vus jusqu’À prsent, l’ordinateur utilisait la puissance de son processeur ou la fidlit de sa mmoire pour afficher les rsultats d’un calcul ou une donne qu’il avait pu mmoriser. Examinons le schma du programme : – lireles donnes – calculerle rsultat (tape qui saute s’il s’agit de simplement restituer/rutiliser une don-ne – afficherdes donnes (identiques ou nouvelles) Ce schma ne peut subir la moindre variation. Il serait pourtant intressant de pouvoir in-troduire des variantes. Soit parce que nous voulons choisir le traitement, soit parce que le traitement prvu n’est pas adapt. Dans nos exercices, nous avons vu les deux possibilits. Nous avons t oblig d’crire plusieurs programmes pour pouvoir calculer la somme ou la diffrence, ou un autre programme qui effectue tous les types d’opration. Nous devons alors changer de programme pour chaque type de calcul ou accepter que l’ordinateur nous donne des rsultats qui ne nous intressent pas en lui faisant effectuer toutes les oprations. Il reste encore un cas plus gnant, c’est lorsqu’on dcide de faire raliser des divisions À l’ordinateur. Celui-ci n’a aucun moyen d’empcher une division par zro qui lui serait impose par un utilisateur ignorant du problme ou simplement distrait. Voyons À quoi ressemblerait un programme de division. 1Variables Flottantes fDividende, fDiviseur 2Variable Flottante fQuotient 3 4Dbut du traitement 5des donnes/ Lecture/ * * 6Afficher "Donnez le dividende de l’opration " 7Lire fDividende 8Afficher "Donnez le diviseur de l’opration " 9Lire fDiviseur 10/ Calcul / * * 11fQuotient <- fDividende / fDiviseur 12/ Affichagedu rsultat/ * * 13Afficher "Le quotient vaut : " & fQuotient 14Fin du traitement D’une manire vidente, l’instruction de la ligne 11 pose problme. Excute 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 rsultat qui s’afficheinf. Donnez le dividende de l’opration12 Donnez le diviseur de l’opration0 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’opration (diffrent 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 ralise. Voici ce que devient le programme : Variables Flottantes fDividende, fDiviseur Variable Flottante fQuotient
Dbut du traitement Afficher "Donnez le dividende de l’opration " Lire fDividende Afficher "Donnez le diviseur de l’opration " Lire fDiviseur / Onne calcule le quotient que si le diviseur n’est pas nul/ * * Si fDiviseur Diffrent 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 raliseront que si la condition est fausse : / Onne calcule le quotient que si le diviseur n’est pas nul/ * * Si fDiviseur Diffrent 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’excution de la version finale du programme : jacques@naxos:~/testpmp>./division Donnez le dividende de l’opration555 Donnez le diviseur de l’opration5 Le quotient vaut : 111.000000 jacques@naxos:~/testpmp>./division Donnez le dividende de l’opration555 Donnez le diviseur de l’opration0 Une division par 0 est impossible
2.2 Alternativessimples Nous venons de voir un moyen efficace de produire des rsultats adapts aux circonstances.
2.2. ALTERNATIVESSIMPLES
25
2.2.1 TraitementsubordonnÉ À une condition Lorsqu’une srie d’instructions ne doivent se raliser que sous certaines conditions, on les met entre parenthses au moyen des commandesSietFin de si. Il faut bien sÛr exprimer la condition de ralisation. Cette condition sera, dans la majorit des cas, le rsultat d’une comparaison. Comme en mathmatique, nous disposerons de six oprateurs de comparaison. 1 Pour chacun d’eux, je propose une version en franÇais et une version abrge.
Oprateur Ègal À
Diffèrent de Infèrieur À Supèrieur À InfOuEgal SupOuEgal
La condition s’exprime aprs le motSi. Pour bien sparer l’expression de la condition et les instructions qu’elle contrÔle, nous plaÇons le motAlors. Les instructions À effectuer viennent aprs (par clart, nous les dcalons lgrement vers la droite). Il faut videmment indiquer la dernire instruction dpendant de la condition, puisque les instructions suivantes s’excuteront toujours. On place ainsi la commandeFin de Si. Lire fQuotient ✞ ☎ Si Alors fDiviseur Diffrent 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’excution d’une srie d’in-structions, on se trouve devant une alternative : il est alors possible de dfinir deux sries d’instructions. La premire srie sera effectue 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 sparer ces deux sries 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 Diffrent de 0 ✝ ✆ fQuotient <- fDividende / fDiviseur Afficher "Le quotient vaut : " Afficher fQuotient 1. Onnotera l’utilisation de?=et!=pour marquer l’galit et l’ingalit. J’utiliserai personnellement la variante franÇaise, par souci de clart. Pour des raisons techniques, j’ai prfr viter l’emploi de=, qui risque de poser de gros problmes en C. Pour rappel, les signes>ou<sont toujours orients 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 À raliser si la condition est vraie et celles À effectuer si la condition est fausse. La version de l’instruction conditionnelle sans traitement alternatif peut se rduire au cas complexe en spcifiant que le deuxime traitement se rduit À 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 caractriser 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 À zro La structure alternative que nous venons d’envisager ne permet pas de considrer trois cas, puisque la condition est unique. Nous aurons donc le choix entre trois solutions, selon la con-2 dition envisage: 1. lenombre est plus grand que 0 : le nombre sera positif ou non positif (nul ou ngatif) 2. lenombre est plus petit que 0 : le nombre sera ngatif ou non ngatif (nul ou positif) 3. lenombre est gal À 0 : le nombre sera nul ou non nul (positif ou ngatif). Arbitrairement, nous choisirons la troisime solution. Variable Entire iNombre Dbut 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 amliorer ce programme, nous voudrions pouvoir distinguer les cas oÙ le nombre est positif de ceux oÙ il est ngatif. Nous allons remplacer l’impression du deuxime 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 ngatif." 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 ngatif, il est forcment positif.
Si iNombre Ègale 0 Alors Afficher "Ce nombre est nul." Sinon Si iNombre < 0 Alors Afficher "Ce nombre est ngatif." Sinon Afficher "Ce nombre est positif." Fin de Si Fin de Si
En thorie, nous pouvons imbriquer nos instructions conditionnelles autant que nous voulons. Dans la pratique, nous devons tenir compte des limitations de l’esprit humain et considrer 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 prvus. Ainsi, le programme ci-dessous pourrait s’crire d’une manire plus lisible de la faÇon suivante :
1Si iNombre == 0 Alors 2Afficher "Ce nombre est nul." 3Sinon // Nombre diffrent de 0 4Si iNombre < 0 Alors
28
CHAPITRE 2.L’ORDINATEUR PREND DES DéCISIONS
5Afficher "Ce nombre est ngatif." 6Sinon // Nombre suprieur À 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 lie À l’excution de la deuxime branche d’une alternative esttoujours implicite et correspond À la ngation de la condition originale. Depuis des annes, quand je demande «quel est la ngation de la condition A > B? »,il s’lve toujours une voix pour dire « A < B ». Si Mohamed n’est pas plus grand que Rmy, cela ne signfie pas ncessairement qu’il est plus petit. Ils peuvent avoir la mme taille. Rappelons donc des vidences :
Vocabulaire
Condition A == B A < B A > B
Ngation 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 entrs au clavier. II-2.Ècrire un programme qui affiche dans l’ordre croissant deux nombres entiers entrs au clavier. II-3.Les factures concernant les rparations 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 rcentes, un taux de TVA de 21%. Ècrire un programme qui calcule le prix total d’une facture dont on connat le montant hors TVA et l’áge du bátiment. II-4.Modifier le programme prcdent en simplifiant la procdure d’encodage. Il n’est en effet pas ncessaire 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 donnes, si c’est possible. Si vous tes vraiment allergique À l’algbre, vous pouvez vous limiter À crire les expressions correspondant aux diffrentes formules.
2.3. ALTERNATIVESCOMPLEXES
29
Une quation du second degr possde la forme canonique suivante : 2 ax−bx+c= 0 En calculer les racines revient À chercher la ou les valeurs de x qui rendent cette galit vraie. 2 2 Par exemple, l’quationx−5x+6 = 0a pour racines les valeurs 3 et 2 parce que3−5.3+6 = 2 0et2−5.2 + 6 = 0. Rappelons qu’une telle quation se rsout en calculant pralablement la valeur deδqui vaut 2 b−4ac. Trois cas peuvent se prsenter : √ √ −b+δ−b−δ –δetest positif et dans ce cas, l’quation admet deux solutions : 2a2a −b –δest nul et l’quation possde une racine double 2a –δest ngatif et l’quation n’admet pas de racines relles Les expressions ci-dessus peuvent tre encodes sans trop de problmes, À condition de se rappeler que les produits et les divisions ncessitent parfois l’usage de parenthses. Ne pas oublier d’crire tous les oprateurs. A titre d’exemple, les quations suivantes ont des solutions relles : 2 22 2 x+x−2 = 0x−8x+ 7 = 0x−5x+ 6 = 0x−8x+ +16 = 0