Vous êtes sur la page 1sur 248

2008

ALGORITHMIQUEETPROGRAMMATION POURNONMATHEUX

COURSCOMPLET
avecexercices,corrigsetcitationsphilosophiques

Christophe Darmangeat
Universit Paris 7 http://www.pise.info/algo/index.htm 28/12/2008

L'ALGORITHME
Prambule : le Codage Pourquoi les ordinateurs sont-ils binaires ? La base dcimale La base binaire Le codage hexadcimal Introduction l'algorithmique Qu'est-ce que l'algomachin ? Faut-il tre matheux ?... L'ADN, les Shadoks et les ordinateurs Algorithmique et programmation Avec quelles conventions crit-on ? 1. Les Variables 1.1. A quoi servent les variables ? 1.2. Dclaration des variables 1.2.1 Types numriques classiques 1.2.2 Autres types numriques 1.2.3 Type alphanumrique 1.2.4 Type boolen 1.3. L'instruction d'affectation 1.3.1 Syntaxe et signification 1.3.2 Ordre des instructions Exercices Corrigs 8 8 10 12 15 18 18 19 20 21 22 23 23 24 24 26 26 27 28 28 30 32 35

1.4. Expressions et oprateurs 1.4.1 Oprateurs numriques : 1.4.2 Oprateur alphanumrique : & 1.4.3 Oprateurs logiques (ou boolens) : Exercices Corrigs 1.5. Deux remarques pour terminer 2. Lecture et Ecriture 2.1 De quoi parle-t-on ? 2.2 Les instructions de lecture-criture Exercices Corrigs 3. Les Tests 3.1 De quoi s'agit-il ? 3.2 Structure d'un test 3.3 Qu'est-ce qu'une condition ? Exercices Corrigs 3.4 Conditions composes Exercices Corrigs 3.5 Test imbriqus Exercices Corrigs 3.6 De l'aiguillage la gare de tri 3.7Variables boolennes 3

38 39 39 40 41 42 43 44 44 45 46 47 49 49 50 51 53 54 55 58 59 60 62 63 65 67

4. Encore de la Logique 4.1 Faut-il mettre un Et ? un OU ? Exercices Corrigs 4.2 Au del de la logique : le style Exercices Corrigs 5. Les Boucles 5.1 A quoi cela sert-il donc ? Exercices Corrigs 5.2 Boucler en comptant... 5.3 Des boucles dans des boucles 5.4 Et encore une btise ne pas faire ! Exercices Corrigs 6. Les Tableaux 6.1 Utilit des tableaux 6.2 Notation et utilisation algorithmique Exercices Corrigs 6.3 Tableaux dynamiques Exercices Corrigs

68 68 71 73 76 78 80 89 89 94 95 97 99 101 102 105 111 111 112 115 118 121 122 124

7. Techniques Ruses 7.1 Le tri par slection 7.2 Un exemple de flag 7.3 Le tri bulles 7.4 La recherche dichotomique Exercices Corrigs 8. Tableaux Multidimensionnels 8.1 Pourquoi plusieurs dimensions ? 8.2 Tableaux 2 dimensions Exercices Corrigs 8.3 Tableaux n dimensions 9. Fonctions Prdfinies 9.1 Structure gnrale des fonctions Exercices Corrigs 9.2 Les fonctions de texte Exercices Corrigs 9.3 Trois fonctions numriques classiques Exercices Corrigs 9.4 Les fonctions de conversion

129 129 131 135 137 139 141 146 146 147 149 152 159 160 160 162 163 164 166 168 172 174 177 181

10. Fichiers 10.1 Organisation des fichiers 10.2 Structure des enregistrements 10.3 Types d'accs 10.4 Instructions Exercices Corrigs 10.5 Stratgies de traitement 10.6 Donnes structures 10.6.1 Donnes structures simples 10.6.2 Tableaux de donnes structures 10.7 Rcapitulatif gnral Exercices Corrigs 11. Procdures et Fonctions 11.1 Fonctions personnalises 11.1.1 De quoi s'agit-il ? 11.1.2 Passage d'arguments 11.1.3 Deux mots sur l'analyse fonctionnelle Exercices Corrigs 11.2 Sous-procdures 11.2.1 Gnralits 11.2.2 Le problme des arguments 11.2.3 Comment a marche tout a ? 11.3 Variables publiques et prives 6

182 182 184 185 187 191 192 194 195 195 197 198 200 202 212 212 212 215 216 218 219 221 221 222 223 227

11.4 Peut-on tout faire ? 11.5 Algorithmes fonctionnels Corrigs 12. Notions Complmentaires 12.1 Programmation structure 12.2 Interprtation et compilation 12.3 La programmation rcursive Liens

228 229 236 242 242 244 245 248

Prambule : Le Codage
Linformation nest pas le savoir. Le savoir nest pas la sagesse. La sagesse nest pas la beaut. La beaut nest pas lamour. Lamour nest pas la musique, et la musique, cest ce quil y a de mieux. - Frank Zappa Les ordinateurs sont comme les dieux de lAncien Testament : avec beaucoup de rgles, et sans piti. - Joseph Campbell Compter en octal, cest comme compter en dcimal, si on nutilise pas ses pouces - Tom Lehrer Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres - Anonyme

Cest bien connu, les ordinateurs sont comme le gros rock qui tche : ils sont binaires. Mais ce qui est moins connu, cest ce que ce qualificatif de binaire recouvre exactement, et ce quil implique. Aussi, avant de nous plonger dans les arcanes de lalgorithmique proprement dite, ferons-nous un dtour par la notion de codage binaire. Contrairement aux apparences, nous ne sommes pas loigns de notre sujet principal. Tout au contraire, ce que nous allons voir prsent constitue un ensemble de notions indispensables lcriture de programmes. Car pour parler une machine, mieux vaut connatre son vocabulaire 1. Pourquoi les ordinateurs sont-ils binaires ? De nos jours, les ordinateurs sont ces machines merveilleuses capables de traiter du texte, dafficher des tableaux de matre, de jouer de la musique ou de projeter des vidos. On nen est pas encore tout fait HAL, lordinateur de 2001 Odysse de

lEspace, lintelligence si dveloppe quil a peur de mourir pardon, dtre


dbranch. Mais lordinateur parat tre une machine capable de tout faire. Pourtant, les ordinateurs ont beau sembler repousser toujours plus loin les limites de leur champ daction, il ne faut pas oublier quen ralit, ces fiers--bras ne sont toujours capables que dune seule chose : faire des calculs, et uniquement cela. Eh oui, ces gros malins dordinateurs sont rests au fond ce quils ont t depuis leur invention : de vulgaires calculatrices amliores !

Lorsquun ordinateur traite du texte, du son, de limage, de la vido, il traite en ralit des nombres. En fait, dire cela, cest dj lui faire trop dhonneur. Car mme le simple nombre 3 reste hors de porte de lintelligence dun ordinateur, ce qui le situe largement en dessous de lattachant chimpanz Bonobo, qui sait, entre autres choses, faire des blagues ses congnres et jouer au Pac-Man. Un ordinateur manipule exclusivement des informations binaires, dont on ne peut mme pas dire sans tre tendancieux quil sagit de nombres. Mais quest-ce quune information binaire ? Cest une information qui ne peut avoir que deux tats : par exemple, ouvert - ferm, libre occup, militaire civil, assis couch, blanc noir, vrai faux, etc. Si lon pense des dispositifs physiques permettant de stocker ce genre dinformation, on pourrait citer : charg non charg, haut bas, trou non trou. Je ne donne pas ces derniers exemples au hasard : ce sont prcisment ceux dont se sert un ordinateur pour stocker lensemble des informations quil va devoir manipuler. En deux mots, la mmoire vive (la RAM ) est forme de millions de composants lectroniques qui peuvent retenir ou relcher une charge lectrique. La surface dun disque dur, dune bande ou dune disquette est recouverte de particules mtalliques qui peuvent, grce un aimant, tre orientes dans un sens ou dans lautre. Et sur un CDROM, on trouve un long sillon troit irrgulirement perc de trous. Toutefois, la coutume veut quon symbolise une information binaire, quel que soit son support physique, sous la forme de 1 et de 0. Il faut bien comprendre que ce nest l quune reprsentation, une image commode, que lon utilise pour parler de toute information binaire. Dans la ralit physique, il ny a pas plus de 1 et de 0 qui se promnent dans les ordinateurs quil ny a crit, en lettres gantes, Ocan Atlantique sur la mer quelque part entre la Bretagne et les Antilles. Le 1 et le 0 dont parlent les informaticiens sont des signes, ni plus, ni moins, pour dsigner une information, indpendamment de son support physique. Les informaticiens seraient-ils des gens tordus, possdant un got immodr pour labstraction, ou pour les jeux intellectuels alambiqus ? Non, pas davantage en tout cas que le reste de leurs contemporains non-informaticiens. En fait, chacun dentre nous pratique ce genre dabstraction tous les jours, sans pour autant trouver cela bizarre ou difficile. Simplement, nous le faisons dans la vie quotidienne sans y penser. Et force de ne pas y penser, nous ne remarquons mme plus quel mcanisme subtil dabstraction est ncessaire pour pratiquer ce sport.

Lorsque nous disons que 4+3=7 (ce qui reste, normalement, dans le domaine de comptence mathmatique de tous ceux qui lisent ce cours !), nous manions de pures abstractions, reprsentes par de non moins purs symboles ! Un tre humain dil y a quelques millnaires se serait demand longtemps quest-ce que cest que quatre ou trois , sans savoir quatre ou trois quoi ? . Mine de rien, le fait mme de concevoir des nombres, cest--dire de pouvoir considrer, dans un ensemble, la quantit indpendamment de tout le reste, cest dj une abstraction trs hardie, qui a mis trs longtemps avant de simposer tous comme une vidence. Et le fait de faire des additions sans devoir prciser des additions de quoi ? , est un pas supplmentaire qui a t encore plus difficile franchir. Le concept de nombre, de quantit pure, a donc constitu un immense progrs (que les ordinateurs nont quant eux, je le rpte, toujours pas accompli). Mais si concevoir les nombres, cest bien, possder un systme de notation performant de ces nombres, cest encore mieux. Et l aussi, lhumanit a mis un certain temps (et essay un certain nombre de pistes qui se sont rvles tre des impasses) avant de parvenir au systme actuel, le plus rationnel. Ceux qui ne sont pas convaincus des progrs raliss en ce domaine peuvent toujours essayer de rsoudre une multiplication comme 587 x 644 en chiffres romains, on leur souhaite bon courage ! 2. La numrotation de position en base dcimale Lhumanit actuelle, pour reprsenter nimporte quel nombre, utilise un systme de numrotation de position, base dcimale. Quest-ce qui se cache derrire cet obscur jargon ? Commenons par la numrotation de position. Pour reprsenter un nombre, aussi grand soit-il, nous disposons dun alphabet spcialis : une srie de 10 signes qui sappellent les chiffres. Et lorsque nous crivons un nombre en mettant certains de ces chiffres les uns derrire les autres, lordre dans lequel nous mettons les chiffres est capital. Ainsi, par exemple, 2 569 nest pas du tout le mme nombre que 9 562. Et pourquoi ? Quel opration, quel dcodage mental effectuons-nous lorsque nous lisons une suite de chiffres reprsentant un nombre ? Le problme, cest que nous sommes tellement habitus faire ce dcodage de faon instinctive que gnralement nous nen connaissons plus les rgles. Mais ce nest pas trs compliqu de les reconstituer Et cest l que nous mettons le doigt en plein dans la deuxime caractristique de notre systme de notation numrique : son caractre dcimal.

10

Lorsque jcris 9562, de quel nombre est-ce que je parle ? Dcomposons la lecture chiffre par chiffre, de gauche droite : 9562, cest 9000 + 500 + 60 + 2. Allons plus loin, mme si cela parat un peu bbte : 9000, cest 9 x 1000, parce que le 9 est le quatrime chiffre en partant de la droite 500, cest 5 x 100, parce que le 5 est le troisime chiffre en partant de la droite 60, cest 6 x 10, parce que le 6 est le deuxime chiffre en partant de la droite 2, cest 2 x 1, parce que le 2 est le premier chiffre en partant de la droite On peut encore crire ce mme nombre dune manire lgrement diffrente. Au lieu de : 9 562 = 9 x 1 000 + 5 x 100 + 6 x 10 + 2, On crit que : 9 562 = (9 x 10 x 10 x 10) + (5 x 10 x 10) + (6 x 10) + (2) Arrivs ce stade de la comptition, je prie les allergiques de mexcuser, mais il nous faut employer un petit peu de jargon mathmatique. Ce nest pas grand-chose, et on touche au but. Alors, courage ! En fait, ce jargon se rsume au fait que les matheux notent la ligne ci-dessus laide du symbole de puissance . Cela donne : 9 562 = 9 x 103 + 5 x 102 + 6 x 101 + 2 x 100 Et voil, nous y sommes. Nous avons dgag le mcanisme gnral de la reprsentation par numrotation de position en base dcimale. Alors, nous en savons assez pour conclure sur les consquences du choix de la base dcimale. Il y en a deux, qui nen forment en fin de compte quune seule : parce que nous sommes en base dcimale, nous utilisons un alphabet numrique de dix symboles. Nous nous servons de dix chiffres, pas un de plus, pas un de moins. toujours parce nous sommes en base dcimale, la position dun de ces dix chiffres dans un nombre dsigne la puissance de dix par laquelle ce chiffre doit tre multipli pour reconstituer le nombre. Si je trouve un 7 en cinquime position partir de la droite, ce 7 ne reprsente pas 7 mais 7 fois 104, soit 70 000.

11

Un dernier mot concernant le choix de la base dix. Pourquoi celle-l et pas une autre ? Aprs tout, la base dix ntait pas le seul choix possible. Les babyloniens, qui furent de brillants mathmaticiens, avaient en leur temps adopt la base 60 (dite sexagsimale). Cette base 60 impliquait certes dutiliser un assez lourd alphabet numrique de 60 chiffres. Mais ctait somme toute un inconvnient mineur, et en retour, elle possdait certains avantages non ngligeables. 60 tant un nombre divisible par beaucoup dautres (cest pour cette raison quil avait t choisi), on pouvait, rien quen regardant le dernier chiffre, savoir si un nombre tait divisible par 2, 3, 4, 5, 6, 10, 12, 15, 20 et 30. Alors quen base 10, nous ne pouvons immdiatement rpondre la mme question que pour les diviseurs 2 et 5. La base sexagsimale a certes disparu en tant que systme de notation des nombres. Mais Babylone nous a laiss en hritage sa base sexagsimale dans la division du cercle en soixante parties (pour compter le temps en minutes et secondes), et celle en 6 x 60 parties (pour les degrs de la gomtrie et de lastronomie). Alors, pourquoi avons-nous adopt la base dcimale, moins pratique bien des gards ? Nul doute que cela tienne au dispositif matriel grce auquel tout tre humain normalement constitu stocke spontanment une information numrique : ses doigts ! Profitons-en pour remarquer que le professeur Shadoko avait invent exactement le mme systme, la seule diffrence tant qu'il avait choisi la base 4 (normal, les shadoks n'avaient que 4 mots). Regardez donc cette video - ou comment faire rigoler les gens en ne disant (presque) que des choses vraies : http://www.youtube.com/watch?v=X9l8u4SjRcI&eurl=http://aigespc57.cicrp.jussieu.fr/ algo/codage.htm&feature=player_embedded J'ajoute que c'est l'ensemble des videos des shadoks, et en particulier celles traitant de la logique et des mathmatiques, qui vaut son pesant de cacahutes interstellaires. Mais hlas cela nous loignerait un peu trop de notre propos (c'est pas grave, on y reviendra la prochaine pause). 3. La numrotation de position en base binaire Les ordinateurs, eux, comme on la vu, ont un dispositif physique fait pour stocker (de multiples faons) des informations binaires. Alors, lorsquon reprsente une information stocke par un ordinateur, le plus simple est dutiliser un systme de reprsentation deux chiffres : les fameux 0 et 1. Mais une fois de plus, je me permets dinsister, le choix du 0 et du 1 est une pure convention, et on aurait pu choisir nimporte quelle autre paire de symboles leur place.

12

Dans un ordinateur, le dispositif qui permet de stocker de linformation est donc rudimentaire, bien plus rudimentaire que les mains humaines. Avec des mains humaines, on peut coder dix choses diffrentes (en fait bien plus, si lon fait des acrobaties avec ses doigts, mais cartons ce cas). Avec un emplacement dinformation dordinateur, on est limit deux choses diffrentes seulement. Avec une telle information binaire, on ne va pas loin. Voil pourquoi, ds leur invention, les ordinateurs ont t conus pour manier ces informations par paquets de 0 et de 1. Et la taille de ces paquets a t fixe 8 informations binaires.

Une information binaire (symbolise couramment par 0 ou 1) sappelle un bit (en anglais... bit). Un groupe de huit bits sappelle un octet (en anglais, byte) Donc, mfiance avec le byte (en abrg, B majuscule), qui vaut un octet, c'est--dire huit bits (en abrg, b minuscule).
Dans combien dtats diffrents un octet peut-il se trouver ? Le calcul est assez facile (mais il faut nanmoins savoir le refaire). Chaque bit de loctet peut occuper deux tats. Il y a donc dans un octet : 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 = 28 = 256 possibilits Cela signifie quun octet peut servir coder 256 nombres diffrents : ce peut tre la srie des nombres entiers de 1 256, ou de 0 255, ou de 127 +128. Cest une pure affaire de convention, de choix de codage. Mais ce qui nest pas affaire de choix, cest le nombre de possibilits : elles sont 256, pas une de plus, pas une de moins, cause de ce quest, par dfinition, un octet. Si lon veut coder des nombres plus grands que 256, ou des nombres ngatifs, ou des nombres dcimaux, on va donc tre contraint de mobiliser plus dun octet. Ce nest pas un problme, et cest trs souvent que les ordinateurs procdent ainsi. En effet, avec deux octets, on a 256 x 256 = 65 536 possibilits. En utilisant trois octets, on passe 256 x 256 x 256 = 16 777 216 possibilits. Et ainsi de suite, je ne mattarderai pas davantage sur les diffrentes manires de coder les nombres avec des octets. On abordera de nouveau brivement le sujet un peu plus loin. Cela implique galement quun octet peut servir coder autre chose quun nombre : loctet est trs souvent employ pour coder du texte. Il y a 26 lettres dans lalphabet. Mme en comptant diffremment les minuscules et les majuscules, et mme en y 13

ajoutant les chiffres et les signes de ponctuation, on arrive un total infrieur 256. Cela veut dire que pour coder convenablement un texte, le choix dun caractre par octet est un choix pertinent. Se pose alors le problme de savoir quel caractre doit tre reprsent par quel tat de loctet. Si ce choix tait librement laiss chaque informaticien, ou chaque fabricant dordinateur, la communication entre deux ordinateurs serait un vritable casse-tte. Loctet 10001001 serait par exemple traduit par une machine comme un T majuscule, et par une autre comme une parenthse fermante ! Aussi, il existe un standard international de codage des caractres et des signes de ponctuation. Ce standard stipule quel tat de loctet correspond quel signe du clavier. Il sappelle lASCII (pour

American Standard Code for Information Interchange). Et fort heureusement, lASCII


est un standard universellement reconnu et appliqu par les fabricants dordinateurs et de logiciels. Bien sr, se pose le problme des signes propres telle ou telle langue (comme les lettres accentues en franais, par exemple). LASCII a par le problme en rservant certains codes doctets pour ces caractres spciaux chaque langue. En ce qui concerne les langues utilisant un alphabet non latin, un standard particulier de codage a t mis au point. Quant aux langues non alphabtiques (comme le chinois), elles payent un lourd tribut linformatique pour navoir pas su voluer vers le systme alphabtique Revenons-en au codage des nombres sur un octet. Nous avons vu quun octet pouvait coder 256 nombres diffrents, par exemple (cest le choix le plus spontan) la srie des entiers de 0 255. Comment faire pour, partir dun octet, reconstituer le nombre dans la base dcimale qui nous est plus familire ? Ce nest pas sorcier ; il suffit dappliquer, si on les a bien compris, les principes de la numrotation de position, en gardant lesprit que l, la base nest pas dcimale, mais binaire. Prenons un octet au hasard : 11010011 D'aprs les principes vus plus haut, ce nombre reprsente en base dix, en partant de la gauche : 1 x 27 + 1 x 26 + 0 x 25 + 1 x 24 + 0 x 23 + 0 x 22 + 1 x 21 + 1 x 20 = 1 x 128 + 1 x 64 + 1 x 16 + 1 x 2 + 1 x 1 = 128 + 64 + 16 + 2 + 1 = 211 Et voil ! Ce nest pas plus compliqu que cela !

14

Inversement, comment traduire un nombre dcimal en codage binaire ? Il suffit de rechercher dans notre nombre les puissances successives de deux. Prenons, par exemple, 186. Dans 186, on trouve 1 x 128, soit 1 x 27. Je retranche 128 de 186 et jobtiens 58. Dans 58, on trouve 0 x 64, soit 0 x 26. Je ne retranche donc rien. Dans 58, on trouve 1 x 32, soit 1 x 25. Je retranche 32 de 58 et jobtiens 26. Dans 26, on trouve 1 x 16, soit 1 x 24. Je retranche 16 de 26 et jobtiens 10. Dans 10, on trouve 1 x 8, soit 1 x 23. Je retranche 8 de 10 et jobtiens 2. Dans 2, on trouve 0 x 4, soit 0 x 22. Je ne retranche donc rien. Dans 2, on trouve 1 x 2, soit 1 x 21. Je retranche 2 de 2 et jobtiens 0. Dans 0, on trouve 0 x 1, soit 0 x 20. Je ne retranche donc rien. Il ne me reste plus qu reporter ces diffrents rsultats (dans lordre !) pour reconstituer loctet. Jcris alors quen binaire, 186 est reprsent par : 10111010 Cest bon ? Alors on passe la suite. 4. Le codage hexadcimal Pour en finir avec ce prambule (sinon, cela deviendrait de la gourmandise) , on va voquer un dernier type de codage, qui constitue une alternative pratique au codage binaire. Il sagit du codage hexadcimal, autrement dit en base seize. Pourquoi ce choix bizarre ? Tout dabord, parce que le codage binaire, ce nest tout de mme pas trs conomique, ni trs lisible. Pas trs conomique : pour reprsenter un nombre entre 1 et 256, il faut utiliser systmatiquement huit chiffres. Pas trs lisible : parce que dinterminables suites de 1 et de 0, on a dj vu plus folichon. Alors, une alternative toute naturelle, ctait de reprsenter loctet non comme huit bits (ce que nous avons fait jusque l), mais comme deux paquets de 4 bits (les quatre de gauche, et les quatre de droite). Voyons voir cela de plus prs. Avec 4 bits, nous pouvons coder 2 x 2 x 2 x 2 = 16 nombres diffrents. En base seize, 16 nombres diffrents se reprsentent avec un seul chiffre (de mme quen base 10, dix nombres se reprsentent avec un seul chiffre). Quels symboles choisir pour les chiffres ? Pour les dix premiers, on na pas t chercher bien loin : on a recycl les dix chiffres de la base dcimale. Les dix premiers nombres de 15

la base seize scrivent donc tout btement 0, 1, 2, 3, 4, 5, 6, 7, 8, et 9. L, il nous manque encore 6 chiffres, pour reprsenter les nombres que nous crivons en dcimal 10, 11, 12, 13, 14, 15 et 16. Plutt quinventer de nouveaux symboles (ce quon aurait trs bien pu faire), on a recycl les premires lettres de lalphabet. Ainsi, par convention, A vaut 10, B vaut 11, etc. jusqu F qui vaut 15. Or, on saperoit que cette base hexadcimale permet une reprsentation trs simple des octets du binaire. Prenons un octet au hasard : 10011110 Pour convertir ce nombre en hexadcimal, il y a deux mthodes : lune consiste faire un grand dtour, en repassant par la base dcimale. Cest un peu plus long, mais on y arrive. Lautre mthode consiste faire le voyage direct du binaire vers lhexadcimal. Avec lhabitude, cest nettement plus rapide !

Premire mthode :
On retombe sur un raisonnement dj abord. Cet octet reprsente en base dix : 1 x 27 + 0 x 26 + 0 x 25 + 1 x 24 + 1 x 23 + 1 x 22 + 1 x 21 + 0 x 20 = 1 x 128 + 1 x 16 + 1 x 8 + 1 x 4 + 1 x 2 + 0 x 1 = 128 + 16 + 8 + 4 + 2 = 158 De l, il faut repartir vers la base hexadcimale. Dans 158, on trouve 9 x 16, cest--dire 9 x 161. Je retranche 144 de 158 et jobtiens 14. Dans 14, on trouve 14 x 1, cest--dire 14 x 160. On y est. Le nombre scrit donc en hexadcimal : 9E

Deuxime mthode :
Divisons 1 0 0 1 1 1 1 0 en 1 0 0 1 (partie gauche) et 1 1 1 0 (partie droite). 1 0 0 1, cest 8 + 1, donc 9 1 1 1 0, cest 8 + 4 + 2 donc 14 Le nombre scrit donc en hexadcimal : 9E. Cest la mme conclusion quavec la premire mthode. Encore heureux !

16

Le codage hexadcimal est trs souvent utilis quand on a besoin de reprsenter les octets individuellement, car dans ce codage, tout octet correspond seulement deux signes. Allez, assez bavard, on passe aux choses srieuses : les arcanes de lalgorithmique

17

Introduction a lAlgorithmique
Un langage de programmation est une convention pour donner des ordres un ordinateur. Ce nest pas cens tre obscur, bizarre et plein de piges subtils. Ca, ce sont les caractristiques de la magie. - Dave Small C'est illogique, Capitaine - Mr Spock

Lalgorithmique est un terme dorigine arabe, comme algbre, amiral ou znith. Ce nest pas une excuse pour massacrer son orthographe, ou sa prononciation. Ainsi, lalgo nest pas rythmique , la diffrence du bon rockn roll. Lalgo nest pas non plus lagglo . Alors, ne confondez pas lalgorithmique avec lagglo rythmique, qui consiste poser des parpaings en cadence. 1. Quest-ce que lalgomachin ? Avez-vous dj ouvert un livre de recettes de cuisine ? Avez vous dj dchiffr un mode demploi traduit directement du coren pour faire fonctionner un magntoscope ou un rpondeur tlphonique rticent ? Si oui, sans le savoir, vous avez dj excut des algorithmes. Plus fort : avez-vous dj indiqu un chemin un touriste gar ? Avez vous fait chercher un objet quelquun par tlphone ? Ecrit une lettre anonyme stipulant comment procder une remise de ranon ? Si oui, vous avez dj fabriqu et fait excuter des algorithmes. Comme quoi, lalgorithmique nest pas un savoir sotrique rserv quelques rares initis touchs par la grce divine, mais une aptitude partage par la totalit de lhumanit. Donc, pas dexcuses

Un algorithme, cest une suite dinstructions, qui une fois excute correctement, conduit un rsultat donn. Si lalgorithme est juste, le rsultat est le rsultat voulu,
et le touriste se retrouve l o il voulait aller. Si lalgorithme est faux, le rsultat est, disons, alatoire, et dcidment, cette saloperie de rpondeur ne veut rien savoir. Compltons toutefois cette dfinition. Aprs tout, en effet, si lalgorithme, comme on vient de le dire, nest quune suite dinstructions menant celui qui lexcute rsoudre un problme, pourquoi ne pas donner comme instruction unique : rsous le problme , et 18

laisser linterlocuteur se dbrouiller avec a ? A ce tarif, nimporte qui serait champion dalgorithmique sans faire aucun effort. Pas de a Lisette, ce serait trop facile. Le malheur (ou le bonheur, tout dpend du point de vue) est que justement, si le touriste vous demande son chemin, cest quil ne le connat pas. Donc, si on nest pas un goujat intgral, il ne sert rien de lui dire de le trouver tout seul. De mme les modes demploi contiennent gnralement (mais pas toujours) un peu plus dinformations que dbrouillez vous pour que a marche . Pour fonctionner, un algorithme doit donc contenir uniquement des instructions

comprhensibles par celui qui devra lexcuter. Cest dailleurs lun des points dlicats
pour les rdacteurs de modes demploi : les rfrences culturelles, ou lexicales, des utilisateurs, tant variables, un mme mode demploi peut tre trs clair pour certains et parfaitement abscons pour dautres. En informatique, heureusement, il ny a pas ce problme : les choses auxquelles ont doit donner des instructions sont les ordinateurs, et ceux-ci ont le bon got dtre tous strictement aussi idiots les uns que les autres. 2. Faut-il tre matheux pour tre bon en algorithmique ? Je consacre quelques lignes cette question, car cette opinion aussi fortement affirme que faiblement fonde sert rgulirement dexcuse : moi, de toute faon, je suis mauvais(e) en algo, jai jamais rien pig aux maths . Faut-il tre bon en maths pour expliquer correctement son chemin quelquun ? Je vous laisse juge. La matrise de lalgorithmique requiert deux qualits, trs complmentaires dailleurs : il faut avoir une certaine intuition, car aucune recette ne permet de savoir a priori quelles instructions permettront dobtenir le rsultat voulu. Cest l, si lon y tient, quintervient la forme dintelligence requise pour lalgorithmique. Alors, cest certain, il y a des gens qui possdent au dpart davantage cette intuition que les autres. Cependant, et jinsiste sur ce point, les rflexes, cela sacquiert. Et ce quon appelle lintuition nest finalement que de lexprience tellement rpte que le raisonnement, au dpart laborieux, finit par devenir spontan .

19

il faut tre mthodique et rigoureux. En effet, chaque fois quon crit une srie dinstructions quon croit justes, il faut systmatiquement se mettre mentalement la place de la machine qui va les excuter, arm d'un papier et d'un crayon, afin de vrifier si le rsultat obtenu est bien celui que lon voulait. Cette opration ne requiert pas la moindre once dintelligence. Mais elle reste nanmoins indispensable, si lon ne veut pas crire laveuglette. Et petit petit, force de pratique, vous verrez que vous pourrez faire de plus en plus souvent lconomie de cette dernire tape : lexprience fera que vous verrez le rsultat produit par vos instructions, au fur et mesure que vous les crirez. Naturellement, cet apprentissage est long, et demande des heures de travail patient. Aussi, dans un premier temps, vitez de sauter les tapes : la vrification mthodique,

pas pas, de chacun de vos algorithmes reprsente plus de la moiti du travail accomplir... et le gage de vos progrs.
3. LADN, les Shadoks, et les ordinateurs Quel rapport me direz-vous ? Eh bien le point commun est : quatre mots de vocabulaire. Lunivers lexical Shadok, cest bien connu, se limite aux termes Ga , Bu , Zo , et Meu . Ce qui leur a tout de mme permis de formuler quelques fortes maximes, telles que : Mieux vaut pomper et quil ne se passe rien, plutt quarrter de pomper et

risquer quil se passe quelque chose de pire (pour dautres fortes maximes Shadok,
nhsitez pas visiter leur site Internet, il y en a toute une collection qui vaut le dtour). LADN, qui est en quelque sorte le programme gntique, lalgorithme la base de construction des tres vivants, est une chane construite partir de quatre lments invariables. Ce nest que le nombre de ces lments, ainsi que lordre dans lequel ils sont arrangs, qui vont dterminer si on obtient une puce ou un lphant. Et tous autant que nous sommes, splendides russites de la Nature, avons t construits par un programme constitu uniquement de ces quatre briques, ce qui devrait nous inciter la modestie.

20

Enfin, les ordinateurs, quels quils soient, ne sont fondamentalement capables de comprendre que quatre catgories d'ordres (en programmation, on n'emploiera pas le terme d'ordre, mais plutt celui d'instructions). Ces quatre familles d'instructions sont : laffectation de variables la lecture / criture les tests les boucles Un algorithme informatique se ramne donc toujours au bout du compte la combinaison de ces quatre petites briques de base. Il peut y en avoir quelques unes, quelques dizaines, et jusqu plusieurs centaines de milliers dans certains programmes de gestion. Rassurez-vous, dans le cadre de ce cours, nous nirons pas jusque l (cependant, la taille dun algorithme ne conditionne pas en soi sa complexit : de longs algorithmes peuvent tre finalement assez simples, et de petits trs compliqus). 4. Algorithmique et programmation Pourquoi apprendre lalgorithmique pour apprendre programmer ? En quoi a-t-on besoin dun langage spcial, distinct des langages de programmation comprhensibles par les ordinateurs ? Parce que lalgorithmique exprime les instructions rsolvant un problme donn

indpendamment des particularits de tel ou tel langage. Pour prendre une image, si
un programme tait une dissertation, lalgorithmique serait le plan, une fois mis de ct la rdaction et lorthographe. Or, vous savez quil vaut mieux faire dabord le plan et rdiger ensuite que linverse Apprendre lalgorithmique, cest apprendre manier la structure logique dun programme informatique. Cette dimension est prsente quelle que soit le langage de programmation ; mais lorsquon programme dans un langage (en C, en Visual Basic, etc.) on doit en plus se colleter les problmes de syntaxe, ou de types dinstructions, propres ce langage. Apprendre lalgorithmique de manire spare, cest donc srier les difficults pour mieux les vaincre. A cela, il faut ajouter que des gnrations de programmeurs, souvent autodidactes (mais pas toujours, hlas !), ayant directement appris programmer dans tel ou tel langage, ne font pas mentalement clairement la diffrence entre ce qui relve de la structure logique gnrale de toute programmation (les rgles fondamentales de lalgorithmique) 21

et ce qui relve du langage particulier quils ont appris. Ces programmeurs, non seulement ont beaucoup plus de mal passer ensuite un langage diffrent, mais encore crivent bien souvent des programmes qui mme sils sont justes, restent laborieux. Car on nignore pas impunment les rgles fondamentales de lalgorithmique Alors, autant lapprendre en tant que telle ! Bon, maintenant que jai bien fait larticle pour vendre ma marchandise, on va presque pouvoir passer au vif du sujet 5. Avec quelles conventions crit-on un algorithme ? Historiquement, plusieurs types de notations ont reprsent des algorithmes. Il y a eu notamment une reprsentation graphique, avec des carrs, des losanges, etc. quon appelait des organigrammes. Aujourdhui, cette reprsentation est quasiment abandonne, pour deux raisons. Dabord, parce que ds que lalgorithme commence grossir un peu, ce nest plus pratique du tout du tout. Ensuite parce que cette reprsentation favorise le glissement vers un certain type de programmation, dite non structure (nous dfinirons ce terme plus tard), que lon tente au contraire dviter. Cest pourquoi on utilise gnralement une srie de conventions appele pseudocode , qui ressemble un langage de programmation authentique dont on aurait vacu la plupart des problmes de syntaxe. Ce pseudo-code est susceptible de varier lgrement dun livre (ou dun enseignant) un autre. Cest bien normal : le pseudo-code, encore une fois, est purement conventionnel ; aucune machine nest cense le reconnatre. Donc, chaque cuisinier peut faire sa sauce sa guise, avec ses petites pices bien lui, sans que cela prte consquence. Comme je nai pas moins de petites manies que la majorit de mes semblables, le pseudocode que vous dcouvrirez dans les pages qui suivent possde quelques spcificits mineures qui ne doivent qu mes nvroses personnelles. Rassurez-vous cependant, celles-ci restent dans les limites tout fait acceptables. En tout cas, personnellement, je les accepte trs bien.

22

Partie 1 Les Variables


Nattribuez Bonaparte A lorigine de toute erreur attribue lordinateur, vous trouverez au moins deux erreurs humaines. Dont celle consistant attribuer lerreur lordinateur. - Anonyme jamais la malveillance ce qui sexplique trs bien par lincomptence. - Napolon

1.1 A quoi servent les variables ?


Dans un programme informatique, on va avoir en permanence besoin de stocker provisoirement des valeurs. Il peut sagir de donnes issues du disque dur, fournies par lutilisateur (frappes au clavier), ou que sais-je encore. Il peut aussi sagir de rsultats obtenus par le programme, intermdiaires ou dfinitifs. Ces donnes peuvent tre de plusieurs types (on en reparlera) : elles peuvent tre des nombres, du texte, etc. Toujours est-il que ds que lon a besoin de stocker une information au cours dun programme, on utilise une variable. Pour employer une image, une variable est une bote, que le programme (lordinateur) va reprer par une tiquette. Pour avoir accs au contenu de la bote, il suffit de la dsigner par son tiquette. En ralit, dans la mmoire vive de lordinateur, il ny a bien sr pas une vraie bote, et pas davantage de vraie tiquette colle dessus (javais bien prvenu que la bote et ltiquette, ctait une image). Dans lordinateur, physiquement, il y a un emplacement de mmoire, repr par une adresse binaire. Si on programmait dans un langage directement comprhensible par la machine, on devrait se fader de dsigner nos donnes par de superbes 10011001 et autres 01001001 (enchant !). Mauvaise nouvelle : de tels langages existent ! Ils portent le doux nom dassembleur. Bonne nouvelle : ce ne sont pas les seuls langages disponibles. Les langages informatiques plus volus (ce sont ceux que presque tout le monde emploie) se chargent prcisment, entre autres rles, dpargner au programmeur la gestion fastidieuse des emplacements mmoire et de leurs adresses. Et, comme vous commencez le comprendre, il est beaucoup plus facile demployer les tiquettes de son choix, que de devoir manier des adresses binaires. 23

1.2 Dclaration des variables


La premire chose faire avant de pouvoir utiliser une variable est de crer la bote et

de lui coller une tiquette. Ceci se fait tout au dbut de lalgorithme, avant mme les
instructions proprement dites. Cest ce quon appelle la dclaration des variables. Cest un genre de dclaration certes moins romantique quune dclaration damour, mais dun autre ct moins dsagrable quune dclaration dimpts. Le nom de la variable (ltiquette de la bote) obit des impratifs changeant selon les langages. Toutefois, une rgle absolue est quun nom de variable peut comporter des lettres et des chiffres, mais quil exclut la plupart des signes de ponctuation, en particulier les espaces. Un nom de variable correct commence galement imprativement par une lettre. Quant au nombre maximal de signes pour un nom de variable, il dpend du langage utilis. En pseudo-code algorithmique, on est bien sr libre du nombre de signes pour un nom de variable, mme si pour des raisons purement pratiques, et au grand dsespoir de Stphane Bern, on vite gnralement les noms rallonge. Lorsquon dclare une variable, il ne suffit pas de crer une bote (rserver un emplacement mmoire) ; encore doit-on prciser ce que lon voudra mettre dedans, car de cela dpendent la taille de la bote (de lemplacement mmoire) et le type de codage utilis.

1.2.1 Types numriques classiques


Commenons par le cas trs frquent, celui dune variable destine recevoir des nombres. Si lon rserve un octet pour coder un nombre, je rappelle pour ceux qui dormaient en lisant le chapitre prcdent quon ne pourra coder que 28 = 256 valeurs diffrentes. Cela peut signifier par exemple les nombres entiers de 1 256, ou de 0 255, ou de 127 +128 Si lon rserve deux octets, on a droit 65 536 valeurs ; avec trois octets, 16 777 216, etc. Et l se pose un autre problme : ce codage doit-il reprsenter des nombres dcimaux ? des nombres ngatifs ? Bref, le type de codage (autrement dit, le type de variable) choisi pour un nombre va dterminer : les valeurs maximales et minimales des nombres pouvant tre stocks dans la variable la prcision de ces nombres (dans le cas de nombres dcimaux).

24

Tous les langages, quels quils soient offrent un bouquet de types numriques, dont le dtail est susceptible de varier lgrement dun langage lautre. Grosso modo, on retrouve cependant les types suivants : Type Numrique Byte (octet) Entier simple Entier long Rel simple Plage 0 255 -32 768 32 767 -2 147 483 648 2 147 483 647 -3,40x1038 1,40x10
-45

-1,40x1045
38

pour

les

valeurs

ngatives

3,40x10

pour les valeurs positives pour les valeurs ngatives

Rel double

1,79x10308

-4,94x10-324

4,94x10-324 1,79x10308 pour les valeurs positives

Pourquoi ne pas dclarer toutes les variables numriques en rel double, histoire de btonner et dtre certain quil ny aura pas de problme ? En vertu du principe de lconomie de moyens. Un bon algorithme ne se contente pas de marcher ; il marche en vitant de gaspiller les ressources de la machine. Sur certains programmes de grande taille, labus de variables surdimensionnes peut entraner des ralentissements notables lexcution, voire un plantage pur et simple de lordinateur. Alors, autant prendre ds le dbut de bonnes habitudes dhygine. En algorithmique, on ne se tracassera pas trop avec les sous-types de variables numriques (sachant qu'on aura toujours assez de soucis comme a, allez). On se contentera donc de prciser qu'il s'agit d'un nombre, en gardant en tte que dans un vrai langage, il faudra tre plus prcis.

En pseudo-code, une dclaration de variables aura ainsi cette tte :


Variable g en Numrique ou encore Variables PrixHT, TauxTVA, PrixTTC en Numrique

25

1.2.2 Autres types numriques


Certains langages autorisent dautres types numriques, notamment : le type montaire (avec strictement deux chiffres aprs la virgule) le type date (jour/mois/anne). Nous nemploierons pas ces types dans ce cours ; mais je les signale, car vous ne manquerez pas de les rencontrer en programmation proprement dite.

1.2.3 Type alphanumrique


Fort heureusement, les botes que sont les variables peuvent contenir bien dautres informations que des nombres. Sans cela, on serait un peu embt ds que lon devrait stocker un nom de famille, par exemple. On dispose donc galement du type alphanumrique (galement appel type caractre,

type chane ou en anglais, le type string mais ne fantasmez pas trop vite, les string,
cest loin dtre aussi excitant que le nom le suggre. Une tudiante qui se reconnatra si elle lit ces lignes a d'ailleurs mis le doigt - si j'ose m'exprimer ainsi - sur le fait qu'il en va de mme en ce qui concerne les bytes). Dans une variable de ce type, on stocke des caractres, quil sagisse de lettres, de signes de ponctuation, despaces, ou mme de chiffres. Le nombre maximal de caractres pouvant tre stocks dans une seule variable string dpend du langage utilis. Un groupe de caractres (y compris un groupe de un, ou de zro caractres), quil soit ou non stock dans une variable, dailleurs, est donc souvent appel chane de caractres.

En pseudo-code, une chane de caractres est toujours note entre guillemets


Pourquoi diable ? Pour viter deux sources principales de possibles confusions : la confusion entre des nombres et des suites de chiffres. Par exemple, 423 peut reprsenter le nombre 423 (quatre cent vingt-trois), ou la suite de caractres 4, 2, et 3. Et ce nest pas du tout la mme chose ! Avec le premier, on peut faire des calculs, avec le second, point du tout. Ds lors, les guillemets permettent dviter toute ambigut : sil ny en a pas, 423 est quatre cent vingt trois. Sil y en a, "423" reprsente la suite des chiffres 4, 2, 3.

26

Mais ce n'est pas le pire. L'autre confusion, bien plus grave - et bien plus frquente consiste se mlanger les pinceaux entre le nom d'une variable et son contenu. Pour parler simplement, cela consiste confondre l'tiquette d'une bote et ce qu'il y a l'intrieur On reviendra sur ce point crucial dans quelques instants.

1.2.4 Type boolen


Le dernier type de variables est le type boolen : on y stocke uniquement les valeurs logiques VRAI et FAUX. On peut reprsenter ces notions abstraites de VRAI et de FAUX par tout ce qu'on veut : de l'anglais (TRUE et FALSE) ou des nombres (0 et 1). Peu importe. Ce qui compte, c'est de comprendre que le type boolen est trs conomique en termes de place mmoire occupe, puisque pour stocker une telle information binaire, un seul bit suffit. Le type boolen est trs souvent nglig par les

programmeurs, tort. Il est vrai qu'il n'est pas proprement parler indispensable, et qu'on pourrait crire peu prs nimporte quel programme en l'ignorant compltement. Pourtant, si le type boolen est mis disposition des programmeurs dans tous les langages, ce n'est pas pour rien. Le recours aux variables boolennes s'avre trs souvent un puissant instrument de lisibilit des algorithmes : il peut faciliter la vie de celui qui crit l'algorithme, comme de celui qui le relit pour le corriger. Alors, maintenant, c'est certain, en algorithmique, il y a une question de style : c'est exactement comme dans le langage courant, il y a plusieurs manires de s'exprimer pour dire sur le fond la mme chose. Nous verrons plus loin diffrents exemples de variations stylistiques autour d'une mme solution. En attendant, vous tes prvenus : l'auteur de ce cours est un adepte fervent (mais pas irraisonn) de l'utilisation des variables boolennes.

27

1.3 Linstruction daffectation


1.3.1 Syntaxe et signification
Ouf, aprs tout ce baratin prliminaire, on aborde enfin nos premires vritables manipulations dalgorithmique. Pas trop tt, certes, mais pas moyen de faire autrement ! En fait, la variable (la bote) n'est pas un outil bien sorcier manipuler. A la diffrence du couteau suisse ou du superbe robot mnager vendu sur Tl Boutique Achat, on ne peut pas faire trente-six mille choses avec une variable, mais seulement une et une seule. Cette seule chose quon puisse faire avec une variable, cest laffecter, cest--dire lui attribuer une valeur. Pour poursuivre la superbe mtaphore file dj employe, on peut remplir la bote.

En pseudo-code, l'instruction d'affectation se note avec le signe


Ainsi : Toto 24 Attribue la valeur 24 la variable Toto. Ceci, soit dit en passant, sous-entend imprativement que Toto soit une variable de type numrique. Si Toto a t dfini dans un autre type, il faut bien comprendre que cette instruction provoquera une erreur. Cest un peu comme si, en donnant un ordre quelquun, on accolait un verbe et un complment incompatibles, du genre Epluchez la casserole . Mme dote de la meilleure volont du monde, la mnagre lisant cette phrase ne pourrait quinterrompre dubitativement sa tche. Alors, un ordinateur, vous pensez bien On peut en revanche sans aucun problme attribuer une variable la valeur dune autre variable, telle quelle ou modifie. Par exemple : Tutu Toto Signifie que la valeur de Tutu est maintenant celle de Toto.

28

Notez bien que cette instruction na en rien modifi la valeur de Toto : une instruction daffectation ne modifie que ce qui est situ gauche de la flche. Tutu Toto + 4 Si Toto contenait 12, Tutu vaut maintenant 16. De mme que prcdemment, Toto vaut toujours 12. Tutu Tutu + 1 Si Tutu valait 6, il vaut maintenant 7. La valeur de Tutu est modifie, puisque Tutu est la variable situe gauche de la flche. Pour revenir prsent sur le rle des guillemets dans les chanes de caractres et sur la confusion numro 2 signale plus haut, comparons maintenant deux algorithmes suivants : Exemple n1 Dbut Riri "Loulou" Fifi "Riri" Fin Exemple n2 Dbut Riri "Loulou" Fifi Riri Fin La seule diffrence entre les deux algorithmes consiste dans la prsence ou dans labsence des guillemets lors de la seconde affectation. Et l'on voit que cela change tout ! Dans l'exemple n1, ce que l'on affecte la variable Fifi, c'est la suite de caractres R i r - i. Et la fin de lalgorithme, le contenu de la variable Fifi est donc Riri . Dans l'exemple n2, en revanche, Riri tant dpourvu de guillemets, n'est pas considr comme une suite de caractres, mais comme un nom de variable. Le sens de la ligne devient donc : affecte la variable Fifi le contenu de la variable Riri . A la fin de lalgorithme n2, la valeur de la variable Fifi est donc Loulou . Ici, loubli des guillemets conduit certes un rsultat, mais un rsultat diffrent. A noter, car cest un cas trs frquent, que gnralement, lorsquon oublie les guillemets lors dune affectation de chane, ce qui se trouve droite du signe daffectation ne 29

correspond aucune variable prcdemment dclare et affecte. Dans ce cas, loubli des guillemets se solde immdiatement par une erreur dexcution. Ceci est une simple illustration. Mais elle rsume lensemble des problmes qui surviennent lorsquon oublie la rgle des guillemets aux chanes de caractres.

1.3.2 Ordre des instructions


Il va de soi que lordre dans lequel les instructions sont crites va jouer un rle essentiel dans le rsultat final. Considrons les deux algorithmes suivants : Exemple 1 Variable A en Numrique Dbut A 34 A 12 Fin Exemple 2 Variable A en Numrique Dbut A 12 A 34 Fin Il est clair que dans le premier cas la valeur finale de A est 12, dans lautre elle est 34 . Il est tout aussi clair que ceci ne doit pas nous tonner. Lorsquon indique le chemin quelquun, dire prenez tout droit sur 1km, puis droite nenvoie pas les gens au mme endroit que si lon dit prenez droite puis tout droit pendant 1 km . Enfin, il est galement clair que si lon met de ct leur vertu pdagogique, les deux algorithmes ci-dessus sont parfaitement idiots ; tout le moins ils contiennent une incohrence. Il ny a aucun intrt affecter une variable pour laffecter diffremment juste aprs. En loccurrence, on aurait tout aussi bien atteint le mme rsultat en crivant simplement :

30

Exemple 1 Variable A en Numrique Dbut A 12 Fin Exemple 2 Variable A en Numrique Dbut A 34 Fin Tous les lments sont maintenant en votre possession pour que ce soit vous de jouer !

31

PARTIE 1
nonc des Exercices Exercice 1.1
Quelles seront les valeurs des variables A et B aprs excution des instructions suivantes ? Variables A, B en Entier Dbut A1 BA+3 A3 Fin

Exercice 1.2
Quelles seront les valeurs des variables A, B et C aprs excution des instructions suivantes ? Variables A, B, C en Entier Dbut A5 B3 CA+B A2 CBA Fin

32

Exercice 1.3
Quelles seront les valeurs des variables A et B aprs excution des instructions suivantes ? Variables A, B en Entier Dbut A5 BA+4 AA+1 BA4 Fin

Exercice 1.4
Quelles seront les valeurs des variables A, B et C aprs excution des instructions suivantes ? Variables A, B, C en Entier Dbut A3 B 10 CA+B BA+B AC Fin

33

Exercice 1.5
Quelles seront les valeurs des variables A et B aprs excution des instructions suivantes ? Variables A, B en Entier Dbut A5 B2 AB BA Fin Moralit : les deux dernires instructions permettent-elles dchanger les deux valeurs de B et A ? Si lon inverse les deux dernires instructions, cela change-t-il quelque chose ?

Exercice 1.6
Plus difficile, mais cest un classique absolu, quil faut absolument matriser : crire un algorithme permettant dchanger les valeurs de deux variables A et B, et ce quel que soit leur contenu pralable.

Exercice 1.7
Une variante du prcdent : on dispose de trois variables A, B et C. Ecrivez un algorithme transfrant B la valeur de A, C la valeur de B et A la valeur de C (toujours quels que soient les contenus pralables de ces variables).

34

PARTIE 1
Corrigs des Exercices Exercice 1.1
Aprs A1 BA+3 A3 La valeur des variables est : A=1 A=1 A = 3 B=? B=4 B = 4

Exercice 1.2
Aprs A5 B3 CA+B A2 CBA La valeur des variables est : A=5 A=5 A=5 A=2 A = 2 B=? B=3 B=3 B=3 B = 3 C=? C=? C=8 C=8 C = 1

Exercice 1.3
Aprs A5 BA+4 AA+1 BA4 La valeur des variables est : A=5 A=5 A=6 A = 6 B=? B=9 B=9 B = 2

35

Exercice 1.4
Aprs A3 B 10 CA+B BA+B AC La valeur des variables est : A=3 A=3 A=3 A=3 A = 13 B=? B = 10 B = 10 B = 13 B = 13 C=? C=? C = 13 C = 13 C = 13

Exercice 1.5
Aprs A5 B2 AB BA La valeur des variables est : A=5 A=5 A=2 A = 2 B=? B=2 B=2 B = 2

Les deux dernires instructions ne permettent donc pas dchanger les deux valeurs de B et A, puisque lune des deux valeurs (celle de A) est ici crase. Si lon inverse les deux dernires instructions, cela ne changera rien du tout, hormis le fait que cette fois cest la valeur de B qui sera crase.

Exercice 1.6
Dbut CA AB BC Fin On est oblig de passer par une variable dite temporaire (la variable C).

36

Exercice 1.7
Dbut DC CB BA AD Fin En fait, quel que soit le nombre de variables, une seule variable temporaire suffit

37

1.4 Expressions et oprateurs


Si on fait le point, on saperoit que dans une instruction daffectation, on trouve :

gauche de la flche, un nom de variable, et uniquement cela. En ce monde empli de doutes quest celui de lalgorithmique, cest une des rares rgles dor qui marche tous les coups : si on voit gauche dune flche daffectation autre chose quun nom de variable, on peut tre certain 100% quil sagit dune erreur.

droite de la flche, ce quon appelle une expression. Voil encore un mot qui est trompeur ; en effet, ce mot existe dans le langage courant, o il revt bien des significations. Mais en informatique, le terme dexpression ne dsigne quune seule chose, et qui plus est une chose trs prcise :

Une expression est un ensemble de valeurs, relies par des oprateurs, et quivalent une seule valeur
Cette dfinition vous parat peut-tre obscure. Mais rflchissez-y quelques minutes, et vous verrez quelle recouvre quelque chose dassez simple sur le fond. Par exemple, voyons quelques expressions de type numrique. Ainsi : 7 5+4 123-45+844 Toto-12+5-Riri sont toutes des expressions valides, pour peu que Toto et Riri soient bien des nombres. Car dans le cas contraire, la quatrime expression na pas de sens. En loccurrence, les oprateurs que jai employs sont laddition (+) et la soustraction (-). Revenons pour le moment sur laffectation. Une condition supplmentaire (en plus des deux prcdentes) de validit dune instruction daffectation est que :

lexpression situe droite de la flche soit du mme type que la variable situe gauche. Cest trs logique : on ne peut pas ranger convenablement des outils dans un sac provision, ni des lgumes dans une trousse outils sauf provoquer un rsultat catastrophique.

Si lun des trois points numrs ci-dessus nest pas respect, la machine sera incapable dexcuter laffectation, et dclenchera une erreur (est-il besoin de dire que si aucun de ces points nest respect, il y aura aussi erreur !) On va maintenant dtailler ce que lon entend par le terme d oprateur. 38

Un oprateur est un signe qui relie deux valeurs, pour produire un rsultat.
Les oprateurs possibles dpendent du type des valeurs qui sont en jeu. Allons-y, faisons le tour, cest un peu fastidieux, mais comme dit le sage au petit scarabe, quand cest fait, cest plus faire.

1.4.1 Oprateurs numriques :


Ce sont les quatre oprations arithmtiques tout ce quil y a de classique. + : addition - : soustraction * : multiplication / : division Mentionnons galement le ^ qui signifie puissance . 45 au carr scrira donc 45 ^ 2. Enfin, on a le droit dutiliser les parenthses, avec les mmes rgles quen mathmatiques. La multiplication et la division ont naturellement priorit sur laddition et la soustraction. Les parenthses ne sont ainsi utiles que pour modifier cette priorit naturelle. Cela signifie quen informatique, 12 * 3 + 5 et (12 * 3) + 5 valent strictement la mme chose, savoir 41. Pourquoi ds lors se fatiguer mettre des parenthses inutiles ? En revanche, 12 * (3 + 5) vaut 12 * 8 soit 96. Rien de difficile l-dedans, que du normal.

1.4.2 Oprateur alphanumrique : &


Cet oprateur permet de concatner, autrement dit dagglomrer, deux chanes de caractres. Par exemple : Variables A, B, C en Caractre Dbut A "Gloubi" B "Boulga" CA&B Fin La valeur de C la fin de lalgorithme est "GloubiBoulga" 39

1.4.3 Oprateurs logiques (ou boolens) :


Il sagit du ET, du OU, du NON et du mystrieux (mais rarissime XOR). Nous les laisserons de ct provisoirement, soyez-en srs.

40

PARTIE 1
nonc des Exercices Exercice 1.8
Que produit lalgorithme suivant ? Variables A, B, C en Caractres Dbut A "423" B "12" CA+B Fin

Exercice 1.9
Que produit lalgorithme suivant ? Variables A, B, C en Caractres Dbut A "423" B "12" CA&B Fin

41

PARTIE 1
Corrigs des Exercices Exercice 1.8
Il ne peut produire quune erreur dexcution, puisquon ne peut pas additionner des caractres.

Exercice 1.9
En revanche, on peut les concatner. A la fin de lalgorithme, C vaudra donc "42312".

42

1.5 Deux remarques pour terminer


Maintenant que nous sommes familiers des variables et que nous les manipulons les yeux ferms (mais les neurones en veil, toutefois), jattire votre attention sur la trompeuse similitude de vocabulaire entre les mathmatiques et linformatique. En mathmatiques, une variable est gnralement une inconnue, qui recouvre un nombre non prcis de valeurs. Lorsque jcris : y=3x+2 les variables x et y satisfaisant lquation existent en nombre infini (graphiquement, lensemble des solutions cette quation dessine une droite). Lorsque jcris : ax + bx + c = 0 la variable x dsigne les solutions cette quation, cest--dire zro, une ou deux valeurs la fois

En informatique, une variable possde un moment donn une valeur et une seule.
A la rigueur, elle peut ne pas avoir de valeur du tout (une fois quelle a t dclare, et tant quon ne la pas affecte. A signaler que dans certains langages, les variables non encore affectes sont considres comme valant automatiquement zro). Mais ce qui est important, cest que cette valeur justement, ne varie pas proprement parler. Du moins ne varie-t-elle que lorsquelle est lobjet dune instruction daffectation. La deuxime remarque concerne le signe de laffectation. En algorithmique, comme on la vu, cest le signe . Mais en pratique, la quasi totalit des langages emploient le signe gal. Et l, pour les dbutants, la confusion avec les maths est galement facile. En maths, A = B et B = A sont deux propositions strictement quivalentes. En informatique, absolument pas, puisque cela revient crire A B et B A, deux choses bien diffrentes. De mme, A = A + 1, qui en mathmatiques, constitue une quation sans solution, reprsente en programmation une action tout fait licite (et de surcrot extrmement courante). Donc, attention ! ! ! La meilleure des vaccinations contre cette confusion consiste bien employer le signe en pseudo-code, signe qui a le mrite de ne pas laisser place lambigut. Une fois acquis les bons rflexes avec ce signe, vous naurez plus aucune difficult passer au = des langages de programmation.

43

Partie 2 Lecture et Ecriture


Un programme est un sort jet sur un ordinateur, qui transforme tout texte saisi au clavier en message derreur. - Anonyme Un clavier Azerty en vaut deux - Anonyme

2.1 De quoi parle-t-on ?


Trifouiller des variables en mmoire vive par un chouette programme, cest vrai que cest trs marrant, et dailleurs on a tous bien rigol au chapitre prcdent. Cela dit, la fin de la foire, on peut tout de mme se demander quoi a sert. En effet. Imaginons que nous ayons fait un programme pour calculer le carr dun nombre, mettons 12. Si on a fait au plus simple, on a crit un truc du genre : Variable A en Numrique Dbut A 12^2 Fin Dune part, ce programme nous donne le carr de 12. Cest trs gentil lui. Mais si lon veut le carr dun autre nombre que 12, il faut rcrire le programme. Bof. Dautre part, le rsultat est indubitablement calcul par la machine. Mais elle le garde soigneusement pour elle, et le pauvre utilisateur qui fait excuter ce programme, lui, ne saura jamais quel est le carr de 12. Re-bof. Cest pourquoi, heureusement, il existe des dinstructions pour permettre la machine de dialoguer avec lutilisateur (et Lyce de Versailles, et ajout lestim Pierre Dac, qui en prcurseur mconnu de lalgorithmique, affirmait tout aussi profondment que rien

ne sert de penser, il faut rflchir avant ).


Dans un sens, ces instructions permettent lutilisateur de rentrer des valeurs au clavier pour quelles soient utilises par le programme. Cette opration est la lecture. Dans lautre sens, dautres instructions permettent au programme de communiquer des valeurs lutilisateur en les affichant lcran. Cette opration est lcriture.

44

Remarque essentielle : A premire vue, on peut avoir limpression que les informaticiens
taient beurrs comme des petits lus lorsquils ont baptis ces oprations ; puisque quand lutilisateur doit crire au clavier, on appelle a la lecture, et quand il doit lire sur lcran on appelle lcriture. Mais avant dagonir dinsultes une digne corporation, il faut rflchir un peu plus loin. Un algorithme, cest une suite dinstructions qui programme la machine, pas lutilisateur ! Donc quand on dit la machine de lire une valeur, cela implique que lutilisateur va devoir crire cette valeur. Et quand on demande la machine dcrire une valeur, cest pour que lutilisateur puisse la lire. Lecture et criture sont donc des termes qui comme toujours en programmation, doivent tre compris du point de vue de la machine qui sera charge de les excuter. Et l, tout devient parfaitement logique. Et toc.

2.2 Les instructions de lecture et dcriture


Tout btement, pour que lutilisateur entre la (nouvelle) valeur de Titi, on mettra : Lire Titi

Ds que le programme rencontre une instruction Lire, lexcution sinterrompt, attendant la frappe dune valeur au clavier
Ds lors, aussitt que la touche Entre (Enter) a t frappe, lexcution reprend. Dans le sens inverse, pour crire quelque chose lcran, cest aussi simple que : Ecrire Toto Avant de Lire une variable, il est trs fortement conseill dcrire des libells lcran, afin de prvenir lutilisateur de ce quil doit frapper (sinon, le pauvre utilisateur passe son temps se demander ce que lordinateur attend de lui et cest trs dsagrable !) : Ecrire "Entrez votre nom : " Lire NomFamille Lecture et Ecriture sont des instructions algorithmiques qui ne prsentent pas de difficults particulires, une fois quon a bien assimil ce problme du sens du dialogue (homme machine, ou machine homme). Et a y est, vous savez dores et dj sur cette question tout ce quil y a savoir

45

PARTIE 2
nonc des Exercices Exercice 2.1
Quel rsultat produit le programme suivant ? Variables val, double numriques Dbut Val 231 Double Val * 2 Ecrire Val Ecrire Double Fin

Exercice 2.2
Ecrire un programme qui demande un nombre lutilisateur, puis qui calcule et affiche le carr de ce nombre.

Exercice 2.3
Ecrire un programme qui lit le prix HT dun article, le nombre darticles et le taux de TVA, et qui fournit le prix total TTC correspondant. Faire en sorte que des libells apparaissent clairement.

Exercice 2.4
Ecrire un algorithme utilisant des variables de type chane de caractres, et affichant quatre variantes possibles de la clbre belle marquise, vos beaux yeux me font mourir damour . On ne se soucie pas de la ponctuation, ni des majuscules.

46

PARTIE 2
Corrigs des Exercices Exercice 2.1
On verra apparatre lcran 231, puis 462 (qui vaut 231 * 2)

Exercice 2.2
Variables nb, carr en Entier Dbut Ecrire "Entrez un nombre :" Lire nb carr nb * nb Ecrire "Son carr est : ", carr Fin En fait, on pourrait tout aussi bien conomiser la variable carr en remplaant les deux avant-dernires lignes par : Ecrire "Son carr est : ", nb*nb C'est une question de style ; dans un cas, on privilgie la lisibilit de l'algorithme, dans l'autre, on privilgie l'conomie d'une variable.

47

Exercice 2.3
Variables nb, pht, ttva, pttc en Numrique Dbut Ecrire "Entrez le prix hors taxes :" Lire pht Ecrire "Entrez le nombre darticles :" Lire nb Ecrire "Entrez le taux de TVA :" Lire ttva pttc nb * pht * (1 + ttva) Ecrire "Le prix toutes taxes est : ", pttc Fin L aussi, on pourrait squeezer une variable et une ligne en crivant directement. : Ecrire "Le prix toutes taxes est : ", nb * pht * (1 + ttva) C'est plus rapide, plus lger en mmoire, mais un peu plus difficile relire (et crire !)

Exercice 2.4
Variables t1, t2, t3, t4 en Caractre Dbut t1 "belle Marquise" t2 "vos beaux yeux" t3 "me font mourir" t4 "damour" Ecrire t1 & " " & t2 & " " & t3 & " " & t4 Ecrire t3 & " " & t2 & " " & t4 & " " & t1 Ecrire t2 & " " & t3 & " " & t1 & " " & t4 Ecrire t4 & " " & t1 & " " & t2 & " " & t3 Fin

48

Partie 3 Les Tests


Il est assez difficile de trouver une erreur dans son code quand on la cherche. Cest encore bien plus dur quand on est convaincu que le code est juste. Steve McConnell Il nexiste pas, et il nexistera jamais, de langage dans lequel il soit un tant soit peu difficile dcrire de mauvais programmes . Anonyme Si le dboguage est lart denlever les bogues, alors la programmation doit tre lart de les crer. Anonyme

Je vous avais dit que lalgorithmique, cest la combinaison de quatre structures lmentaires. Nous en avons dj vu deux, voici la troisime. Autrement dit, on a quasiment fini le programme. Mais non, je rigole.

3.1 De quoi sagit-il ?


Reprenons le cas de notre programmation algorithmique du touriste gar . Normalement, lalgorithme ressemblera quelque chose comme : Allez tout droit

jusquau prochain carrefour, puis prenez droite et ensuite la deuxime gauche, et vous y tes .
Mais en cas de doute lgitime de votre part, cela pourrait devenir : Allez tout droit

jusquau prochain carrefour et l regardez droite. Si la rue est autorise la circulation, alors prenez la et ensuite cest la deuxime gauche. Mais si en revanche elle est en sens interdit, alors continuez jusqu la prochaine droite, prenez celle-l, et ensuite la premire droite .
Ce deuxime algorithme a ceci de suprieur au premier quil prvoit, en fonction dune situation pouvant se prsenter de deux faons diffrentes, deux faons diffrentes dagir. Cela suppose que linterlocuteur (le touriste) sache analyser la condition que nous avons fixe son comportement ( la rue est-elle en sens interdit ? ) pour effectuer la srie dactions correspondante.

49

Eh bien, croyez le ou non, mais les ordinateurs possdent cette aptitude, sans laquelle dailleurs nous aurions bien du mal les programmer. Nous allons donc pouvoir parler notre ordinateur comme notre touriste, et lui donner des sries dinstructions effectuer selon que la situation se prsente dune manire ou dune autre. Cette structure logique rpond au doux nom de test. Toutefois, ceux qui tiennent absolument briller en socit parleront galement de structure alternative.

3.2 Structure dun test


Il ny a que deux formes possibles pour un test ; la premire est la plus simple, la seconde la plus complexe. Si boolen Alors Instructions Finsi Si boolen Alors Instructions 1 Sinon Instructions 2 Finsi Ceci appelle quelques explications. Un boolen est une expression dont la valeur est VRAI ou FAUX. Cela peut donc tre (il ny a que deux possibilits) :

une variable (ou une expression) de type boolen une condition

Nous reviendrons dans quelques instants sur ce quest une condition en informatique. Toujours est-il que la structure dun test est relativement claire. Dans la forme la plus simple, arriv la premire ligne (Si Alors) la machine examine la valeur du boolen. Si ce boolen a pour valeur VRAI, elle excute la srie dinstructions. Cette srie dinstructions peut tre trs brve comme trs longue, cela na aucune importance. En revanche, dans le cas o le boolen est faux, l'ordinateur saute directement aux instructions situes aprs le FinSi. Dans le cas de la structure complte, c'est peine plus compliqu. Dans le cas o le boolen est VRAI, et aprs avoir excut la srie d'instructions 1, au moment o elle arrive au mot Sinon , la machine saute directement la premire instruction situe 50

aprs le Finsi . De mme, au cas o le boolen a comme valeur Faux , la machine saute directement la premire ligne situe aprs le Sinon et excute lensemble des instructions 2 . Dans tous les cas, les instructions situes juste aprs le FinSi seront excutes normalement. En fait, la forme simplifie correspond au cas o lune des deux branches du Si est vide. Ds lors, plutt qucrire sinon ne rien faire du tout , il est plus simple de ne rien crire. Et laisser un Si... complet, avec une des deux branches vides, est considr comme une trs grosse maladresse pour un programmeur, mme si cela ne constitue pas proprement parler une faute. Exprim sous forme de pseudo-code, la programmation de notre touriste de tout lheure donnerait donc quelque chose du genre : Allez tout droit jusquau prochain carrefour Si la rue droite est autorise la circulation Alors Tournez droite Avancez Prenez la deuxime gauche Sinon Continuez jusqu la prochaine rue droite Prenez cette rue Prenez la premire droite Finsi

3.3 Quest ce quune condition ?


Une condition est une comparaison
Cette dfinition est essentielle ! Elle signifie quune condition est compose de trois lments :

une valeur un oprateur de comparaison une autre valeur

Les valeurs peuvent tre a priori de nimporte quel type (numriques, caractres). Mais si lon veut que la comparaison ait un sens, il faut que les deux valeurs de la comparaison soient du mme type !

51

Les oprateurs de comparaison sont :


gal diffrent de strictement plus petit que strictement plus grand que plus petit ou gal plus grand ou gal

Lensemble des trois lments constituant la condition constitue donc, si lon veut, une affirmation, qui a un moment donn est VRAIE ou FAUSSE. A noter que ces oprateurs de comparaison peuvent tout fait semployer avec des caractres. Ceux-ci sont cods par la machine dans lordre alphabtique (rappelez vous le code ASCII vu dans le prambule), les majuscules tant systmatiquement places avant les minuscules. Ainsi on a : t < w Maman > Papa maman > Papa VRAI FAUX VRAI

Remarque trs importante En formulant une condition dans un algorithme, il faut se mfier comme de la peste de certains raccourcis du langage courant, ou de certaines notations valides en mathmatiques, mais qui mnent des non-sens informatiques. Prenons par exemple la phrase Toto est compris entre 5 et 8 . On peut tre tent de la traduire par : 5 < Toto < 8 Or, une telle expression, qui a du sens en franais, comme en mathmatiques, ne veut rien dire en programmation. En effet, elle comprend deux oprateurs de comparaison, soit un de trop, et trois valeurs, soit l aussi une de trop. On va voir dans un instant comment traduire convenablement une telle condition.

52

PARTIE 3
nonc des Exercices Exercice 3.1
Ecrire un algorithme qui demande un nombre lutilisateur, et linforme ensuite si ce nombre est positif ou ngatif (on laisse de ct le cas o le nombre vaut zro).

53

PARTIE 3
Corrigs des Exercices Exercice 3.1
Variable n en Entier Dbut Ecrire "Entrez un nombre : " Lire n Si n > 0 Alors Ecrire "Ce nombre est positif Sinon Ecrire "Ce nombre est ngatif" Finsi Fin

54

3.4 Conditions composes


Certains problmes exigent parfois de formuler des conditions qui ne peuvent pas tre exprimes sous la forme simple expose ci-dessus. Reprenons le cas Toto est inclus entre 5 et 8 . En fait cette phrase cache non une, mais deux conditions. Car elle revient dire que Toto est suprieur 5 et Toto est infrieur 8 . Il y a donc bien l deux conditions, relies par ce quon appelle un oprateur logique, le mot ET. Comme on la voqu plus haut, linformatique met notre disposition quatre oprateurs logiques : ET, OU, NON, et XOR. Le ET a le mme sens en informatique que dans le langage courant. Pour que "Condition1 ET Condition2" soit VRAI, il faut imprativement que Condition1 soit VRAI et que Condition2 soit VRAI. Dans tous les autres cas, "Condition 1 et Condition2" sera faux. Il faut se mfier un peu plus du OU. Pour que "Condition1 OU Condition2" soit VRAI, il suffit que Condition1 soit VRAIE ou que Condition2 soit VRAIE. Le point important est que si Condition1 est VRAIE et que Condition2 est VRAIE aussi, Condition1 OU Condition2 reste VRAIE. Le OU informatique ne veut donc pas dire ou bien Le XOR (ou OU exclusif) fonctionne de la manire suivante. Pour que "Condition1 XOR Condition2" soit VRAI, il faut que soit Condition1 soit VRAI, soit que Condition2 soit VRAI. Si toutes les deux sont fausses, ou que toutes les deux sont VRAI, alors le rsultat global est considr comme FAUX. Le XOR est donc l'quivalent du "ou bien" du langage courant. Jinsiste toutefois sur le fait que le XOR est une raret, dont il nest pas strictement indispensable de sencombrer en programmation. Enfin, le NON inverse une condition : NON(Condition1)est VRAI si Condition1 est FAUX, et il sera FAUX si Condition1 est VRAI. C'est l'quivalent pour les boolens du signe "moins" que l'on place devant les nombres. Alors, vous vous demandez peut-tre quoi sert ce NON. Aprs tout, plutt qucrire NON(Prix > 20), il serait plus simple dcrire tout bonnement Prix=<20. Dans ce cas prcis, cest vident quon se complique inutilement la vie avec le NON. Mais si le NON n'est jamais indispensable, il y a tout de mme des situations dans lesquelles il s'avre bien utile.

55

On reprsente frquemment tout ceci dans des tables de vrit (C1 et C2 reprsentent deux conditions, et on envisage chaque fois les quatre cas possibles)

C1 et C2 C1 Vrai C1 Faux

C2 Vrai Vrai Faux

C2 Faux Faux Faux

C1 ou C2 C1 Vrai C1 Faux

C2 Vrai Vrai Vrai

C2 Faux Vrai Faux

C1 xor C2 C1 Vrai C1 Faux

C2 Vrai Faux Vrai

C2 Faux Vrai Faux

Non C1 C1 Vrai C1 Faux Faux Vrai

56

LE GAG DE LA JOURNE... ...Consiste formuler dans un test une condition qui ne pourra jamais tre vraie, ou jamais tre fausse. Si ce nest pas fait exprs, cest assez rigolo. Si cest fait exprs, cest encore plus drle, car une condition dont on sait davance quelle sera toujours fausse nest pas une condition. Dans tous les cas, cela veut dire quon a crit un test qui nen est pas un, et qui fonctionne comme sil ny en avait pas. Cela peut tre par exemple : Si Toto < 10 ET Toto > 15 Alors (il est trs difficile de trouver un nombre qui soit la fois infrieur 10 et suprieur 15 !) Bon, a, cest un motif immdiat pour payer une tourne gnrale, et je sens quon ne restera pas longtemps le gosier sec.

57

PARTIE 3
nonc des Exercices Exercice 3.2
Ecrire un algorithme qui demande deux nombres lutilisateur et linforme ensuite si leur produit est ngatif ou positif (on laisse de ct le cas o le produit est nul). Attention toutefois : on ne doit pas calculer le produit des deux nombres.

Exercice 3.3
Ecrire un algorithme qui demande trois noms lutilisateur et linforme ensuite sils sont rangs ou non dans lordre alphabtique.

58

PARTIE 3
Corrigs des Exercices Exercice 3.2
Variables m, n en Entier Dbut Ecrire "Entrez deux nombres : " Lire m, n Si (m > 0 ET n > 0) OU (m < 0 ET n < 0) Alors Ecrire "Leur produit est positif" Sinon Ecrire "Leur produit est ngatif" Finsi Fin

Exercice 3.3
Variables a, b, c en Caractre Dbut Ecrire "Entrez successivement trois noms : " Lire a, b, c Si a < b ET b < c Alors Ecrire "Ces noms sont classs alphabtiquement" Sinon Ecrire "Ces noms ne sont pas classs" Finsi Fin

59

3.5 Tests imbriqus


Graphiquement, on peut trs facilement reprsenter un SI comme un aiguillage de chemin de fer (ou un aiguillage de train lectrique, cest moins lourd porter). Un SI ouvre donc deux voies, correspondant deux traitements diffrents. Mais il y a des tas de situations o deux voies ne suffisent pas. Par exemple, un programme devant donner ltat de leau selon sa temprature doit pouvoir choisir entre trois rponses possibles (solide, liquide ou gazeuse). Une premire solution serait la suivante : Variable Temp en Entier Dbut Ecrire "Entrez la temprature de leau :" Lire Temp Si Temp =< 0 Alors Ecrire "Cest de la glace" FinSi Si Temp > 0 Et Temp < 100 Alors Ecrire "Cest du liquide" Finsi Si Temp > 100 Alors Ecrire "Cest de la vapeur" Finsi Fin Vous constaterez que cest un peu laborieux. Les conditions se ressemblent plus ou moins, et surtout on oblige la machine examiner trois tests successifs alors que tous portent sur une mme chose, la temprature de l'eau (la valeur de la variable Temp).

60

Il serait ainsi bien plus rationnel dimbriquer les tests de cette manire : Variable Temp en Entier Dbut Ecrire "Entrez la temprature de leau :" Lire Temp Si Temp =< 0 Alors Ecrire "Cest de la glace" Sinon Si Temp < 100 Alors Ecrire "Cest du liquide" Sinon Ecrire "Cest de la vapeur" Finsi Finsi Fin Nous avons fait des conomies : au lieu de devoir taper trois conditions, dont une compose, nous navons plus que deux conditions simples. Mais aussi, et surtout, nous avons fait des conomies sur le temps dexcution de lordinateur. Si la temprature est infrieure zro, celui-ci crit dornavant Cest de la glace et passe directement la fin, sans tre ralenti par lexamen dautres possibilits (qui sont forcment fausses). Cette deuxime version nest donc pas seulement plus simple crire et plus lisible, elle est galement plus performante lexcution. Les structures de tests imbriqus sont donc un outil indispensable la simplification et loptimisation des algorithmes.

61

PARTIE 3
nonc des Exercices Exercice 3.4
Ecrire un algorithme qui demande un nombre lutilisateur, et linforme ensuite si ce nombre est positif ou ngatif (on inclut cette fois le traitement du cas o le nombre vaut zro).

Exercice 3.5
Ecrire un algorithme qui demande deux nombres lutilisateur et linforme ensuite si le produit est ngatif ou positif (on inclut cette fois le traitement du cas o le produit peut tre nul). Attention toutefois, on ne doit pas calculer le produit !

Exercice 3.6
Ecrire un algorithme qui demande lge dun enfant lutilisateur. Ensuite, il linforme de sa catgorie :

"Poussin" de 6 7 ans "Pupille" de 8 9 ans "Minime" de 10 11 ans "Cadet" aprs 12 ans

Peut-on concevoir plusieurs algorithmes quivalents menant ce rsultat ?

62

PARTIE 3
Corrigs des Exercices Exercice 3.4
Variable n en Entier Dbut Ecrire "Entrez un nombre : " Lire n Si n < 0 Alors Ecrire "Ce nombre est ngatif" SinonSi n = 0 Alors Ecrire "Ce nombre est nul" Sinon Ecrire "Ce nombre est positif" Finsi Fin

Exercice 3.5
Variables m, n en Entier Dbut Ecrire "Entrez deux nombres : " Lire m, n Si m = 0 OU n = 0 Alors Ecrire "Le produit est nul" SinonSi (m < 0 ET n < 0) OU (m > 0 ET n > 0) Alors Ecrire "Le produit est positif" Sinon Ecrire "Le produit est ngatif" Finsi Fin Si on souhaite simplifier lcriture de la condition lourde du SinonSi, on peut toujours passer par des variables boolennes intermdiaires. Une astuce de sioux consiste galement employer un Xor (c'est l'un des rares cas dans lesquels il est pertinent)

63

Exercice 3.6
Variable age en Entier Dbut Ecrire "Entrez lge de lenfant : " Lire age Si age >= 12 Alors Ecrire "Catgorie Cadet" SinonSi age >= 10 Alors Ecrire "Catgorie Minime" SinonSi age >= 8 Alors Ecrire "Catgorie Pupille" SinonSi age >= 6 Alors Ecrire "Catgorie Poussin" Finsi Fin On peut videmment crire cet algorithme de diffrentes faons, ne serait-ce quen commenant par la catgorie la plus jeune.

64

3.6 De laiguillage la gare de tri


J'ai l'me ferroviaire : je regarde passer les vaches (Lo Ferr)
Cette citation napporte peut-tre pas grand chose cet expos, mais je laime bien, alors ctait le moment ou jamais. En effet, dans un programme, une structure SI peut tre facilement compare un aiguillage de train. La voie principale se spare en deux, le train devant rouler ou sur lune, ou sur lautre, et les deux voies se rejoignant tt ou tard pour ne plus en former quune seule, lors du FinSi. On peut schmatiser cela ainsi :

Mais dans certains cas, ce ne sont pas deux voies quil nous faut, mais trois, ou mme plus. Dans le cas de ltat de leau, il nous faut trois voies pour notre train , puisque leau peut tre solide, liquide ou gazeuse. Alors, nous navons pas eu le choix : pour deux voies, il nous fallait un aiguillage, pour trois voies il nous en faut deux, imbriqus lun dans lautre. Cette structure (telle que nous lavons programme la page prcdente) devrait tre schmatise comme suit :

Soyons bien clairs : cette structure est la seule possible du point de vue logique (mme si on peut toujours mettre le bas en haut et le haut en bas). Mais du point de vue de lcriture, le pseudo-code algorithmique admet une simplification supplmentaire.

65

Ainsi, il est possible (mais non obligatoire, que lalgorithme initial : Variable Temp en Entier Dbut Ecrire "Entrez la temprature de leau :" Lire Temp Si Temp =< 0 Alors Ecrire "C'est de la glace" Sinon Si Temp < 100 Alors Ecrire "Cest du liquide" Sinon Ecrire "Cest de la vapeur" Finsi Finsi Fin devienne : Variable Temp en Entier Dbut Ecrire "Entrez la temprature de leau :" Lire Temp Si Temp =< 0 Alors Ecrire "Cest de la glace" SinonSi Temp < 100 Alors Ecrire "Cest du liquide" Sinon Ecrire "Cest de la vapeur" Finsi Fin

Dans le cas de tests imbriqus, le Sinon et le Si peuvent tre fusionns en un SinonSi. On considre alors quil sagit dun seul bloc de test, conclu par un seul FinSi
Le SinonSi permet en quelque sorte de crer (en ralit, de simuler) des aiguillages plus de deux branches. On peut ainsi enchaner les SinonSi les uns derrire les autres pour simuler un aiguillage autant de branches que lon souhaite.

66

3.7 Variables Boolennes


Jusquici, pour crire nos des tests, nous avons utilis uniquement des conditions. Mais vous vous rappelez quil existe un type de variables (les boolennes) susceptibles de stocker les valeurs VRAI ou FAUX. En fait, on peut donc entrer des conditions dans ces variables, et tester ensuite la valeur de ces variables. Reprenons lexemple de leau. On pourrait le rcrire ainsi : Variable Temp en Entier Variables A, B en Boolen Dbut Ecrire "Entrez la temprature de leau :" Lire Temp A Temp =< 0 B Temp < 100 Si A Alors Ecrire "Cest de la glace" SinonSi B Alors Ecrire "Cest du liquide" Sinon Ecrire "Cest de la vapeur" Finsi Fin A priori, cette technique ne prsente gure dintrt : on a alourdi plutt quallg lalgorithme de dpart, en ayant recours deux variables supplmentaires.

Mais souvenons-nous : une variable boolenne na besoin que dun seul bit pour tre stocke. De ce point de vue, lalourdissement nest donc pas considrable.

dans certains cas, notamment celui de conditions composes trs lourdes (avec plein de ET et de OU tout partout) cette technique peut faciliter le travail du programmeur, en amliorant nettement la lisibilit de lalgorithme. Les variables boolennes peuvent galement savrer trs utiles pour servir de flag, technique dont on reparlera plus loin (rassurez-vous, rien voir avec le flagrant dlit des policiers).

67

Partie 4 Encore de la Logique


La programmation peut tre un plaisir ; de mme que la cryptographie. Toutefois, il faut viter de combiner les deux. - Kreitzberg et Sneidermann

4.1 Faut-il mettre un ET ? Faut-il mettre un OU ?


Une remarque pour commencer : dans le cas de conditions composes, les parenthses jouent un rle fondamental. Variables A, B, C, D, E en Boolen Variable X en Entier Dbut Lire X A X > 12 BX>2 CX<6 D (A ET B) OU C E A ET (B OU C) Ecrire D, E Fin Si X = 3, alors on remarque que D sera VRAI alors que E sera FAUX. Sil ny a dans une condition que des ET, ou que des OU, en revanche, les parenthses ne changent strictement rien.

Dans une condition compose employant la fois des oprateurs ET et des oprateurs OU, la prsence de parenthses possde une influence sur le rsultat, tout comme dans le cas dune expression numrique comportant des multiplications et des additions.
On en arrive une autre proprit des ET et des OU, bien plus intressante. Spontanment, on pense souvent que ET et OU sexcluent mutuellement, au sens o un problme donn sexprime soit avec un ET, soit avec un OU. Pourtant, ce nest pas si vident.

68

Quand faut-il ouvrir la fentre de la salle ? Uniquement si les conditions limposent, savoir : Si il fait trop chaud ET il ne pleut pas Alors Ouvrir la fentre Sinon Fermer la fentre Finsi Cette petite rgle pourrait tout aussi bien tre formule comme suit : Si il ne fait pas trop chaud OU il pleut Alors Fermer la fentre Sinon Ouvrir la fentre Finsi Ces deux formulations sont strictement quivalentes. Ce qui nous amne la conclusion suivante :

Toute structure de test requrant une condition compose faisant intervenir loprateur ET peut tre exprime de manire quivalente avec un oprateur OU, et rciproquement.
Ceci est moins surprenant quil ny parat au premier abord. Jetez pour vous en convaincre un il sur les tables de vrit, et vous noterez la symtrie entre celle du ET et celle du OU. Dans les deux tables, il y a trois cas sur quatre qui mnent un rsultat, et un sur quatre qui mne au rsultat inverse. Alors, rien dtonnant ce quune situation qui sexprime avec une des tables (un des oprateurs logiques) puisse tout aussi bien tre exprime avec lautre table (lautre oprateur logique). Toute lastuce consiste savoir effectuer correctement ce passage.

69

Bien sr, on ne peut pas se contenter de remplacer purement et simplement les ET par des OU ; ce serait un peu facile. La rgle dquivalence est la suivante (on peut la vrifier sur lexemple de la fentre) : Si A ET B Alors Instructions 1 Sinon Instructions 2 Finsi quivaut : Si NON A OU NON B Alors Instructions 2 Sinon Instructions 1 Finsi Cette rgle porte le nom de transformation de Morgan, du nom du mathmaticien anglais qui l'a formule.

70

PARTIE 4
nonc des Exercices Exercice 4.1
Formulez un algorithme quivalent lalgorithme suivant : Si Tutu > Toto + 4 OU Tata = "OK" Alors Tutu Tutu + 1 Sinon Tutu Tutu 1 Finsi

Exercice 4.2
Cet algorithme est destin prdire l'avenir, et il doit tre infaillible ! Il lira au clavier lheure et les minutes, et il affichera lheure quil sera une minute plus tard. Par exemple, si l'utilisateur tape 21 puis 32, l'algorithme doit rpondre : "Dans une minute, il sera 21 heure(s) 33". NB : on suppose que l'utilisateur entre une heure valide. Pas besoin donc de la vrifier.

Exercice 4.3
De mme que le prcdent, cet algorithme doit demander une heure et en afficher une autre. Mais cette fois, il doit grer galement les secondes, et afficher l'heure qu'il sera une seconde plus tard. Par exemple, si l'utilisateur tape 21, puis 32, puis 8, l'algorithme doit rpondre : "Dans une seconde, il sera 21 heure(s), 32 minute(s) et 9 seconde(s)". NB : l encore, on suppose que l'utilisateur entre une date valide.

71

Exercice 4.4
Un magasin de reprographie facture 0,10 E les dix premires photocopies, 0,09 E les vingt suivantes et 0,08 E au-del. Ecrivez un algorithme qui demande lutilisateur le nombre de photocopies effectues et qui affiche la facture correspondante.

Exercice 4.5
Les habitants de Zorglub paient limpt selon les rgles suivantes :

les hommes de plus de 20 ans paient limpt les femmes paient limpt si elles ont entre 18 et 35 ans les autres ne paient pas dimpt

Le programme demandera donc lge et le sexe du Zorglubien, et se prononcera donc ensuite sur le fait que lhabitant est imposable.

72

PARTIE 4
Corrigs des Exercices Exercice 4.1
Aucune difficult, il suffit dappliquer la rgle de la transformation du OU en ET vue en cours (loi de Morgan). Attention toutefois la rigueur dans la transformation des conditions en leur contraire... Si Tutu <= Toto + 4 ET Tata <> "OK" Alors Tutu Tutu 1 Sinon Tutu Tutu + 1 Finsi

Exercice 4.2
Variables h, m en Numrique Dbut Ecrire "Entrez les heures, puis les minutes : " Lire h, m mm+1 Si m = 60 Alors m0 hh+1 FinSi Si h = 24 Alors h0 FinSi Ecrire "Dans une minute il sera ", h, "heure(s) ", m, "minute(s)" Fin

73

Exercice 4.3
Variables h, m, s en Numrique Dbut Ecrire "Entrez les heures, puis les minutes, puis les secondes : " Lire h, m, s ss+1 Si s = 60 Alors s0 mm+1 FinSi Si m = 60 Alors m0 hh+1 FinSi Si h = 24 Alors h0 FinSi Ecrire "Dans une seconde il sera ", h, "h", m, "m et ", s, "s" Fin

Exercice 4.4
Variables n, p en Numrique Dbut Ecrire "Nombre de photocopies : " Lire n Si n <= 10 Alors p n * 0,1 SinonSi n <= 30 Alors p 10 * 0,1 + (n 10) * 0,09 Sinon p 10 * 0,1 + 20 * 0,09 + (n 30) * 0,08 FinSi Ecrire "Le prix total est: ", p Fin

74

Exercice 4.5
Variable sex en Caractre Variable age en Numrique Variables C1, C2 en Boolen Dbut Ecrire "Entrez le sexe (M/F) : " Lire sex Ecrire "Entrez lge: " Lire age C1 sex = "M" ET age > 20 C2 sex = "F" ET (age > 18 ET age < 35) Si C1 ou C2 Alors Ecrire "Imposable" Sinon Ecrire "Non Imposable" FinSi Fin

75

4.2 Au-del de la logique : le style


Ce titre un peu provocateur (mais nanmoins justifi) a pour but dattirer maintenant votre attention sur un fait fondamental en algorithmique, fait que plusieurs remarques prcdentes ont dj d vous faire souponner : il ny a jamais une seule manire juste de traiter les structures alternatives. Et plus gnralement, il ny a jamais une seule manire juste de traiter un problme. Entre les diffrentes possibilits, qui ne sont parfois pas meilleures les unes que les autres, le choix est une affaire de style. Cest pour cela quavec lhabitude, on reconnat le style dun programmeur aussi srement que sil sagissait de style littraire. Reprenons nos oprateurs de comparaison maintenant familiers, le ET et le OU. En fait, on saperoit que lon pourrait tout fait sen passer ! Par exemple, pour reprendre lexemple de la fentre de la salle : Si il fait trop chaud ET il ne pleut pas Alors Ouvrir la fentre Sinon Fermer la fentre Finsi Possde un parfait quivalent algorithmique sous la forme de : Si il fait trop chaud Alors Si il ne pleut pas Alors Ouvrir la fentre Sinon Fermer la fentre Finsi Sinon Fermer la fentre Finsi Dans cette dernire formulation, nous navons plus recours une condition compose (mais au prix dun test imbriqu supplmentaire) Et comme tout ce qui sexprime par un ET peut aussi tre exprim par un OU, nous en concluons que le OU peut galement tre remplac par un test imbriqu supplmentaire. On peut ainsi poser cette rgle stylistique gnrale :

76

Dans une structure alternative complexe, les conditions composes, limbrication des structures de tests et lemploi des variables boolennes ouvrent la possibilit de choix stylistiques diffrents. Lalourdissement des conditions allge les structures de tests et le nombre des boolens ncessaires ; lemploi de boolens supplmentaires permet dallger les conditions et les structures de tests, et ainsi de suite.

77

PARTIE 4
nonc des Exercices Exercice 4.6
Les lections lgislatives, en Guignolerie Septentrionale, obissent la rgle suivante :

lorsque l'un des candidats obtient plus de 50% des suffrages, il est lu ds le premier tour.

en cas de deuxime tour, peuvent participer uniquement les candidats ayant obtenu au moins 12,5% des voix au premier tour.

Vous devez crire un algorithme qui permette la saisie des scores de quatre candidats au premier tour. Cet algorithme traitera ensuite le candidat numro 1 (et uniquement lui) : il dira s'il est lu, battu, s'il se trouve en ballottage favorable (il participe au second tour en tant arriv en tte l'issue du premier tour) ou dfavorable (il participe au second tour sans avoir t en tte au premier tour).

Exercice 4.7
Une compagnie d'assurance automobile propose ses clients quatre familles de tarifs identifiables par une couleur, du moins au plus onreux : tarifs bleu, vert, orange et rouge. Le tarif dpend de la situation du conducteur :

un conducteur de moins de 25 ans et titulaire du permis depuis moins de deux ans, se voit attribuer le tarif rouge, si toutefois il n'a jamais t responsable d'accident. Sinon, la compagnie refuse de l'assurer.

un conducteur de moins de 25 ans et titulaire du permis depuis plus de deux ans, ou de plus de 25 ans mais titulaire du permis depuis moins de deux ans a le droit au tarif orange s'il n'a jamais provoqu d'accident, au tarif rouge pour un accident, sinon il est refus.

un conducteur de plus de 25 ans titulaire du permis depuis plus de deux ans bnficie du tarif vert s'il n'est l'origine d'aucun accident et du tarif orange pour un accident, du tarif rouge pour deux accidents, et refus au-del

De plus, pour encourager la fidlit des clients accepts, la compagnie propose un contrat de la couleur immdiatement la plus avantageuse s'il est entr dans la maison depuis plus d'un an. 78

Ecrire l'algorithme permettant de saisir les donnes ncessaires (sans contrle de saisie) et de traiter ce problme. Avant de se lancer corps perdu dans cet exercice, on pourra rflchir un peu et s'apercevoir qu'il est plus simple qu'il n'en a l'air (cela s'appelle faire une analyse !)

Exercice 4.8
Ecrivez un algorithme qui a prs avoir demand un numro de jour, de mois et d'anne l'utilisateur, renvoie s'il s'agit ou non d'une date valide. Cet exercice est certes dun manque doriginalit affligeant, mais aprs tout, en algorithmique comme ailleurs, il faut connatre ses classiques ! Et quand on a fait cela une fois dans sa vie, on apprcie pleinement lexistence dun type numrique date dans certains langages). Il n'est sans doute pas inutile de rappeler rapidement que le mois de fvrier compte 28 jours, sauf si lanne est bissextile, auquel cas il en compte 29. Lanne est bissextile si elle est divisible par quatre. Toutefois, les annes divisibles par 100 ne sont pas bissextiles, mais les annes divisibles par 400 le sont. Ouf ! Un dernier petit dtail : vous ne savez pas, pour linstant, exprimer correctement en pseudo-code lide quun nombre A est divisible par un nombre B. Aussi, vous vous contenterez dcrire en bons tlgraphistes que A divisible par B se dit A dp B .

79

PARTIE 4
Corrigs des Exercices Exercice 4.6
Cet exercice, du pur point de vue algorithmique, n'est pas trs mchant. En revanche, il reprsente dignement la catgorie des noncs pigs. En effet, rien de plus facile que d'crire : si le candidat a plus de 50%, il est lu, sinon s'il a plus de 12,5 %, il est au deuxime tour, sinon il est limin. H h h... mais il ne faut pas oublier que le candidat peut trs bien avoir eu 20 % mais tre tout de mme limin, tout simplement parce que l'un des autres a fait plus de 50 % et donc qu'il n'y a pas de deuxime tour !... Moralit : ne jamais se jeter sur la programmation avant d'avoir soigneusement men l'analyse du problme traiter. Variables A, B, C, D en Numrique Dbut Ecrire "Entrez les scores des quatre prtendants :" Lire A, B, C, D C1 A > 50 C2 B > 50 ou C > 50 ou D > 50 C3 A >= B et A >= C et A >= D C4 A >= 12,5 Si C1 Alors Ecrire Elu au premier tour" Sinonsi C2 ou Non(C4) Alors Ecrire Battu, limin, sorti !!! SinonSi C3 Alors Ecrire "Ballotage favorable" Sinon Ecrire "Ballotage dfavorable" FinSi Fin

80

Exercice 4.7
L encore, on illustre l'utilit d'une bonne analyse. Je propose deux corrigs diffrents. Le premier suit l'nonc pas pas. C'est juste, mais c'est vraiment lourd. La deuxime version s'appuie sur une vraie comprhension d'une situation pas si embrouille qu'elle n'en a l'air. Dans les deux cas, un recours aux variables boolennes are srieusement l'criture. Donc, premier corrig, on suit le texte de l'nonc pas pas : Variables age, perm, acc, assur en Numrique Variables C1, C2, C3 en Boolen Variable situ en Caractre Dbut Ecrire "Entrez lge: " Lire age Ecrire "Entrez le nombre d'annes de permis: " Lire perm Ecrire "Entrez le nombre d'accidents: " Lire acc Ecrire "Entrez le nombre d'annes d'assurance: " Lire assur C1 age >= 25 C2 perm >= 2 C3 assur > 1 Si Non(C1) et Non(C2) Alors Si acc = 0 Alors situ "Rouge" Sinon situ "Refus" FinSi Sinonsi ((Non(C1) et C2) ou (C1 et Non(C2)) Alors Si acc = 0 Alors situ "Orange" SinonSi acc = 1 Alors situ "Rouge" Sinon situ "Refus" FinSi Sinon Si acc = 0 Alors 81

situ "Vert" SinonSi acc = 1 Alors situ "Orange" SinonSi acc = 2 Alors situ "Rouge" Sinon situ "Refus" FinSi FinSi Si C3 Alors Si situ = "Rouge" Alors situ "Orange" SinonSi situ = "Orange" Alors situ "Orange" SinonSi situ = "Vert" Alors situ "Bleu" FinSi FinSi Ecrire "Votre situation : ", situ Fin Vous trouvez cela compliqu ? Oh, certes oui, a l'est ! Et d'autant plus qu'en lisant entre les lignes, on pouvait s'apercevoir que ce galimatias de tarifs recouvre en fait une logique trs simple : un systme points. Et il suffit de comptabiliser les points pour que tout s'claire... Reprenons juste aprs l'affectation des trois variables boolennes C1, C2, et C3. On crit : P0 Si Non(C1) Alors PP+1 FinSi Si Non(C2) Alors PP+1 FinSi P P + acc Si P < 3 et C3 Alors PP1 FinSi Si P = -1 Alors situ "Bleu" SinonSi P = 0 Alors 82

situ "Vert" SinonSi P = 1 Alors situ "Orange" SinonSi P = 2 Alors situ "Rouge" Sinon situ "Refus" FinSi Ecrire "Votre situation : ", situ Fin Cool, non ?

83

Exercice 4.8
En ce qui concerne le dbut de cet algorithme, il ny a aucune difficult. Cest de la saisie bte et mme pas mchante: Variables J, M, A, JMax en Numrique Variables VJ, VM, B en Booleen Dbut Ecrire "Entrez le numro du jour" Lire J Ecrire "Entrez le numro du mois" Lire M Ecrire "Entrez l'anne" Lire A C'est videmment ensuite que les ennuis commencent La premire manire d'aborder la chose consiste se dire que fondamentalement, la structure logique de ce problme est trs simple. Si nous crons deux variables boolennes VJ et VM, reprsentant respectivement la validit du jour et du mois entrs, la fin de l'algorithme sera d'une simplicit biblique (lanne est valide par dfinition, si on vacue le dbat byzantin concernant lexistence de lanne zro) : Si VJ et VM alors Ecrire "La date est valide" Sinon Ecrire "La date n'est pas valide" FinSi Toute la difficult consiste affecter correctement les variables VJ et VM, selon les valeurs des variables J, M et A. Dans l'absolu, VJ et VM pourraient tre les objets d'une affectation monstrueuse, avec des conditions atrocement composes. Mais franchement, crire ces conditions en une seule fois est un travail de bndictin sans grand intrt. Pour viter d'en arriver une telle extrmit, on peut srier la difficult en crant deux variables supplmentaires : B : variable boolenne qui indique s'il s'agit d'une anne bissextile

JMax : variable numrique qui indiquera le dernier jour valable pour le mois entr. Avec tout cela, on peut y aller et en ressortir vivant. On commence par initialiser nos variables boolennes, puis on traite les annes, puis les mois, puis les jours.

84

On note "dp" la condition "divisible par" : B A dp 400 ou (non(A dp 100) et A dp 4) Jmax 0 VM M >= 1 et M =< 12 Si VM Alors Si M = 2 et B Alors JMax 29 SinonSi M = 2 Alors JMax 28 SinonSi M = 4 ou M = 6 ou M = 9 ou M = 11 Alors JMax 30 Sinon JMax 31 FinSi VJ J >= 1 et J =< Jmax FinSi Cette solution a le mrite de ne pas trop compliquer la structure des tests, et notamment de ne pas rpter l'criture finale l'cran. Les variables boolennes intermdiaires nous pargnent des conditions composes trop lourdes, mais celles-ci restent nanmoins srieuses. Une approche diffrente consisterait limiter les conditions composes, quitte le payer par une structure beaucoup plus exigeante de tests imbriqus. L encore, on vite de jouer les extrmistes et l'on s'autorise quelques conditions composes lorsque cela nous simplifie l'existence. On pourrait aussi dire que la solution prcdente "part de la fin" du problme (la date est elle valide ou non ?), alors que celle qui suit "part du dbut" (quelles sont les donnes entres au clavier ?) : Si M < 1 ou M > 12 Alors Ecrire "Date Invalide" SinonSi M = 2 Alors Si A dp 400 Alors Si J < 1 ou J > 29 Alors Ecrire "Date Invalide" Sinon Ecrire "Date Valide" FinSi SinonSi A dp 100 Alors Si J < 1 ou J > 28 Alors Ecrire "Date Invalide" 85

Sinon Ecrire "Date Valide" FinSi SinonSi A dp 4 Alors Si J < 1 ou J > 28 Alors Ecrire "Date Invalide" Sinon Ecrire "Date Valide" FinSi Sinon Si J < 1 ou J > 28 Alors Ecrire "Date Invalide" Sinon Ecrire "Date Valide" FinSi FinSi SinonSi M = 4 ou M = 6 ou M = 9 ou M = 11 Alors Si J < 1 ou J > 30 Alors Ecrire "Date Invalide" Sinon Ecrire "Date Valide" FinSi Sinon Si J < 1 ou J > 31 Alors Ecrire "Date Invalide" Sinon Ecrire "Date Valide" FinSi FinSi On voit que dans ce cas, l'alternative finale (Date valide ou invalide) se trouve rpte un grand nombre de fois. Ce n'est en soi ni une bonne, ni une mauvaise chose. C'est simplement une question de choix stylistique. Personnellement, j'avoue prfrer assez nettement la premire solution, qui fait ressortir beaucoup plus clairement la structure logique du problme (il n'y a qu'une seule alternative, autant que cette alternative ne soit crite qu'une seule fois). Il convient enfin de citer une solution trs simple et lgante, un peu plus difficile peuttre imaginer du premier coup, mais qui avec le recul apparat comme trs immdiate. Sur le fond, cela consiste dire qu'il y a quatre cas pour qu'une date soit valide : celui d'un jour compris entre 1 et 31 dans un mois 31 jours, celui d'un jour compris entre 1 86

et 30 dans un mois 30 jours, celui d'un jour compris entre 1 et 29 en fvrier d'une anne bissextile, et celui d'un jour de fvrier compris entre 1 et 28. Ainsi : B (A dp 4 et Non(A dp 100)) ou A dp 400 K1 (m=1 ou m=3 ou m=5 ou m=7 ou m=8 ou m=10 ou m=12) et (J>=1 et J=<31) K2 (m=4 ou m=6 ou m=9 ou m=11) et (J>=1 et J=<30) K3 m=2 et B et J>=1 et J=<29 K4 m=2 et J>=1 et J=<28 Si K1 ou K2 ou K3 ou K4 Alors Ecrire "Date valide" Sinon Ecrire "Date non valide" FinSi Fin Tout est alors rgl avec quelques variables boolennes et quelques conditions composes, en un minimum de lignes de code. La morale de ce long exercice - et non moins long corrig, c'est qu'un problme de test un peu compliqu admet une pliade de solutions justes... ...Mais que certaines sont plus astucieuses que d'autres !

87

Si vous avez compris ce qui prcde, et que l'exercice de la date ne vous pose plus aucun problme, alors vous savez tout ce qu'il y a savoir sur les tests pour affronter n'importe quelle situation. Non, ce n'est pas de la dmagogie ! Malheureusement, nous ne sommes pas tout fait au bout de nos peines ; il reste une dernire structure logique examiner, et pas des moindres

88

Partie 5 Les Boucles


Les premiers 90% du code prennent les premiers 90% du temps de dveloppement. Les 10% restants prennent les autres 90% du temps de dveloppement - Tom Cargill

Et a y est, on y est, on est arrivs, la voil, cest Broadway, la quatrime et dernire structure : a est les boucles. Si vous voulez pater vos amis, vous pouvez galement parler de structures rptitives, voire carrment de structures itratives. Ca calme, hein ? Bon, vous faites ce que vous voulez, ici on est entre nous, on parlera de boucles. Les boucles, c'est gnralement le point douloureux de l'apprenti programmeur. C'est l que a coince, car autant il est assez facile de comprendre comment fonctionnent les boucles, autant il est souvent long d'acqurir les rflexes qui permettent de les laborer judicieusement pour traiter un problme donn. On peut dire en fait que les boucles constituent la seule vraie structure logique caractristique de la programmation. Si vous avez utilis un tableur comme Excel, par exemple, vous avez sans doute pu manier des choses quivalentes aux variables (les cellules, les formules) et aux tests (la fonction SI). Mais les boucles, a, a n'a aucun quivalent. Cela n'existe que dans les langages de programmation proprement dits. Le maniement des boucles, s'il ne diffrencie certes pas l'homme de la bte (il ne faut tout de mme pas exagrer), est tout de mme ce qui spare en informatique le programmeur de l'utilisateur, mme averti. Alors, vos futures et invitables - difficults sur le sujet, il y a trois remdes : de la rigueur, de la patience, et encore de la rigueur !

5.1 A quoi cela sert-il donc ?


Prenons le cas dune saisie au clavier (une lecture), o par exemple, le programme pose une question laquelle lutilisateur doit rpondre par O (Oui) ou N (Non). Mais tt ou tard, lutilisateur, factieux ou maladroit, risque de taper autre chose que la rponse attendue. Ds lors, le programme peut planter soit par une erreur dexcution (parce que le type de rponse ne correspond pas au type de la variable attendu) soit par une erreur fonctionnelle (il se droule normalement jusquau bout, mais en produisant des rsultats fantaisistes). 89

Alors, dans tout programme un tant soit peu srieux, on met en place ce quon appelle un

contrle de saisie, afin de vrifier que les donnes entres au clavier correspondent
bien celles attendues par lalgorithme. A vue de nez, on pourrait essayer avec un SI. Voyons voir ce que a donne : Variable Rep en Caractre Dbut Ecrire "Voulez vous un caf ? (O/N)" Lire Rep Si Rep <> "O" et Rep <> "N" Alors Ecrire "Saisie erronne. Recommencez" Lire Rep FinSi Fin Cest impeccable. Du moins tant que lutilisateur a le bon got de ne se tromper quune seule fois, et dentrer une valeur correcte la deuxime demande. Si lon veut galement btonner en cas de deuxime erreur, il faudrait rajouter un SI. Et ainsi de suite, on peut rajouter des centaines de SI, et crire un algorithme aussi lourd quune blague des Grosses Ttes, on nen sortira pas, il y aura toujours moyen quun acharn flanque le programme par terre. La solution consistant aligner des SI en pagaille est donc une impasse. La seule issue est donc de flanquer une structure de boucle, qui se prsente ainsi : TantQue boolen Instructions FinTantQue Le principe est simple : le programme arrive sur la ligne du TantQue. Il examine alors la valeur du boolen (qui, je le rappelle, peut tre une variable boolenne ou, plus frquemment, une condition). Si cette valeur est VRAI, le programme excute les instructions qui suivent, jusqu ce quil rencontre la ligne FinTantQue. Il retourne ensuite sur la ligne du TantQue, procde au mme examen, et ainsi de suite. Le mange enchant ne sarrte que lorsque le boolen prend la valeur FAUX.

90

Illustration avec notre problme de contrle de saisie. Une premire approximation de la solution consiste crire : Variable Rep en Caractre Dbut Ecrire "Voulez vous un caf ? (O/N)" TantQue Rep <> "O" et Rep <> "N" Lire Rep FinTantQue Fin L, on a le squelette de lalgorithme correct. Mais de mme quun squelette ne suffit pas pour avoir un tre vivant viable, il va nous falloir ajouter quelques muscles et organes sur cet algorithme pour quil fonctionne correctement. Son principal dfaut est de provoquer une erreur chaque excution. En effet, lexpression boolenne qui figure aprs le TantQue interroge la valeur de la variable Rep. Malheureusement, cette variable, si elle a t dclare, na pas t affecte avant lentre dans la boucle. On teste donc une variable qui na pas de valeur, ce qui provoque une erreur et larrt immdiat de lexcution. Pour viter ceci, on na pas le choix : il faut que la variable Rep ait dj t affecte avant quon en arrive au premier tour de boucle. Pour cela, on peut faire une premire lecture de Rep avant la boucle. Dans ce cas, celle-ci ne servira quen cas de mauvaise saisie lors de cette premire lecture. Lalgorithme devient alors : Variable Rep en Caractre Dbut Ecrire "Voulez vous un caf ? (O/N)" Lire Rep TantQue Rep <> "O" et Rep <> "N" Lire Rep FinTantQue Fin Une autre possibilit, frquemment employe, consiste ne pas lire, mais affecter arbitrairement la variable avant la boucle. Arbitrairement ? Pas tout fait, puisque cette affectation doit avoir pour rsultat de provoquer lentre obligatoire dans la boucle. Laffectation doit donc faire en sorte que le boolen soit mis VRAI pour dclencher le premier tour de la boucle. Dans notre exemple, on peut donc affecter Rep avec nimporte quelle valeur, hormis O et N : car dans ce cas, lexcution sauterait la boucle, et Rep ne serait pas du tout lue au clavier.

91

Cela donnera par exemple : Variable Rep en Caractre Dbut Rep "X" Ecrire "Voulez vous un caf ? (O/N)" TantQue Rep <> "O" et Rep <> "N" Lire Rep FinTantQue Fin Cette manire de procder est connatre, car elle est employe trs frquemment. Il faut remarquer que les deux solutions (lecture initiale de Rep en dehors de la boucle ou affectation de Rep) rendent toutes deux lalgorithme satisfaisant, mais prsentent une diffrence assez importante dans leur structure logique. En effet, si lon choisit deffectuer une lecture pralable de Rep, la boucle ultrieure sera excute uniquement dans lhypothse dune mauvaise saisie initiale. Si lutilisateur saisit une valeur correcte la premire demande de Rep, lalgorithme passera sur la boucle sans entrer dedans. En revanche, avec la deuxime solution (celle dune affectation pralable de Rep), lentre de la boucle est force, et lexcution de celle-ci, au moins une fois, est rendue obligatoire chaque excution du programme. Du point de vue de lutilisateur, cette diffrence est tout fait mineure ; et la limite, il ne la remarquera mme pas. Mais du point de vue du programmeur, il importe de bien comprendre que les cheminements des instructions ne seront pas les mmes dans un cas et dans lautre. Pour terminer, remarquons que nous pourrions peaufiner nos solutions en ajoutant des affichages de libells qui font encore un peu dfaut. Ainsi, si lon est un programmeur zl, la premire solution (celle qui inclut deux lectures de Rep, une en dehors de la boucle, lautre lintrieur) pourrait devenir : Variable Rep en Caractre Dbut Ecrire "Voulez vous un caf ? (O/N)" Lire Rep TantQue Rep <> "O" et Rep <> "N" Ecrire "Vous devez rpondre par O ou N. Recommencez" Lire Rep FinTantQue Ecrire "Saisie accepte" Fin 92

Quant la deuxime solution, elle pourra devenir : Variable Rep en Caractre Dbut Rep "X" Ecrire "Voulez vous un caf ? (O/N)" TantQue Rep <> "O" et Rep <> "N" Lire Rep Si Rep <> "O" et Rep <> "N" Alors Ecrire "Saisie Errone, Recommencez" FinSi FinTantQue Fin Le Gag De La Journe Cest dcrire une structure TantQue dans laquelle le boolen nest jamais VRAI. Le programme ne rentre alors jamais dans la superbe boucle sur laquelle vous avez tant su ! Mais la faute symtrique est au moins aussi dsopilante. Elle consiste crire une boucle dans laquelle le boolen ne devient jamais FAUX. Lordinateur tourne alors dans la boucle comme un drat et nen sort plus. Seule solution, quitter le programme avec un dmonte-pneu ou un bton de dynamite. La boucle infinie est une des hantises les plus redoutes des programmeurs. Cest un peu comme le verre baveur, le poil gratter ou le bleu de mthylne : cest cul, mais a fait toujours rire. Cette faute de programmation grossire mais frquente ne manquera pas dgayer lambiance collective de cette formation et accessoirement dtancher la soif proverbiale de vos enseignants. Bon, eh bien vous allez pouvoir faire de chouettes algorithmes, dj rien quavec a

93

PARTIE 5
nonc des Exercices Exercice 5.1
Ecrire un algorithme qui demande lutilisateur un nombre compris entre 1 et 3 jusqu ce que la rponse convienne.

Exercice 5.2
Ecrire un algorithme qui demande un nombre compris entre 10 et 20, jusqu ce que la rponse convienne. En cas de rponse suprieure 20, on fera apparatre un message : Plus petit ! , et inversement, Plus grand ! si le nombre est infrieur 10.

Exercice 5.3
Ecrire un algorithme qui demande un nombre de dpart, et qui ensuite affiche les dix nombres suivants. Par exemple, si l'utilisateur entre le nombre 17, le programme affichera les nombres de 18 27.

94

PARTIE 5
Corrigs des Exercices Exercice 5.1
Variable N en Entier Debut N0 Ecrire "Entrez un nombre entre 1 et 3" TantQue N < 1 ou N > 3 Lire N Si N < 1 ou N > 3 Alors Ecrire "Saisie errone. Recommencez FinSi FinTantQue Fin

Exercice 5.2
Variable N en Entier Debut N0 Ecrire "Entrez un nombre entre 10 et 20" TantQue N < 10 ou N > 20 Lire N Si N < 10 Alors Ecrire "Plus grand !" SinonSi N > 20 Alors Ecrire "Plus petit !" FinSi FinTantQue Fin

95

Exercice 5.3
Variables N, i en Entier Debut Ecrire "Entrez un nombre : " Lire N Ecrire "Les 10 nombres suivants sont : " Pour i N + 1 N + 10 Ecrire i i Suivant Fin

96

5.2 Boucler en comptant, ou compter en bouclant


Dans le dernier exercice, vous avez remarqu quune boucle pouvait tre utilise pour augmenter la valeur dune variable. Cette utilisation des boucles est trs frquente, et dans ce cas, il arrive trs souvent quon ait besoin deffectuer un nombre dtermin de passages. Or, a priori, notre structure TantQue ne sait pas lavance combien de tours de boucle elle va effectuer (puisque le nombre de tours dpend de la valeur dun boolen). Cest pourquoi une autre structure de boucle est notre disposition : Variable Truc en Entier Dbut Truc 0 TantQue Truc < 15 Truc Truc + 1 Ecrire "Passage numro : ", Truc FinTantQue Fin Equivaut : Variable Truc en Entier Dbut Pour Truc 1 15 Ecrire "Passage numro : ", Truc Truc Suivant Fin Insistons : la structure Pour Suivant nest pas du tout indispensable ; on pourrait fort bien programmer toutes les situations de boucle uniquement avec un Tant Que . Le seul intrt du Pour est dpargner un peu de fatigue au programmeur, en lui vitant de grer lui-mme la progression de la variable qui lui sert de compteur (on parle dincrmentation, encore un mot qui fera forte impression sur votre entourage). Dit dune autre manire, la structure Pour Suivant est un cas particulier de TantQue : celui o le programmeur peut dnombrer lavance le nombre de tours de boucles ncessaires. Il faut noter que dans une structure Pour Suivant , la progression du compteur est laisse votre libre disposition. Dans la plupart des cas, on a besoin dune variable qui augmente de 1 chaque tour de boucle. On ne prcise alors rien linstruction Pour ; 97

celle-ci, par dfaut, comprend quil va falloir procder cette incrmentation de 1 chaque passage, en commenant par la premire valeur et en terminant par la deuxime. Mais si vous souhaitez une progression plus spciale, de 2 en 2, ou de 3 en 3, ou en arrire, de 1 en 1, ou de 10 en 10, ce nest pas un problme : il suffira de le prciser votre instruction Pour en lui rajoutant le mot Pas et la valeur de ce pas (Le pas dont nous parlons, cest le pas du marcheur, step en anglais). Naturellement, quand on stipule un pas ngatif dans une boucle, la valeur initiale du compteur doit tre suprieure sa valeur finale si lon veut que la boucle tourne ! Dans le cas contraire, on aura simplement crit une boucle dans laquelle le programme ne rentrera jamais. Nous pouvons donc maintenant donner la formulation gnrale dune structure Pour . Sa syntaxe gnrale est : Pour Compteur Initial Final Pas ValeurDuPas Instructions Compteur suivant Les structures TantQue sont employes dans les situations o lon doit procder un traitement systmatique sur les lments dun ensemble dont on ne connat pas davance la quantit, comme par exemple :

le contrle dune saisie la gestion des tours dun jeu (tant que la partie nest pas finie, on recommence) la lecture des enregistrements dun fichier de taille inconnue(cf. Partie 9)

Les structures Pour sont employes dans les situations o lon doit procder un traitement systmatique sur les lments dun ensemble dont le programmeur connat davance la quantit. Nous verrons dans les chapitres suivants des sries dlments appels tableaux (parties 7 et 8) et chanes de caractres (partie 9). Selon les cas, le balayage systmatique des lments de ces sries pourra tre effectu par un Pour ou par un TantQue : tout dpend si la quantit dlments balayer (donc le nombre de tours de boucles ncessaires) peut tre dnombre lavance par le programmeur ou non.

98

5.3 Des boucles dans des boucles ( tout est dans tout... et rciproquement )
On rigole, on rigole ! De mme que les poupes russes contiennent dautres poupes russes, de mme quune structure SI ALORS peut contenir dautres structures SI ALORS, une boucle peut tout fait contenir dautres boucles. Y a pas de raison. Variables Truc, Trac en Entier Dbut Pour Truc 1 15 Ecrire "Il est pass par ici" Pour Trac 1 6 Ecrire "Il repassera par l" Trac Suivant Truc Suivant Fin Dans cet exemple, le programme crira une fois "il est pass par ici" puis six fois de suite "il repassera par l", et ceci quinze fois en tout. A la fin, il y aura donc eu 15 x 6 = 90 passages dans la deuxime boucle (celle du milieu), donc 90 critures lcran du message il repassera par l . Notez la diffrence marquante avec cette structure : Variables Truc, Trac en Entier Dbut Pour Truc 1 15 Ecrire "Il est pass par ici" Truc Suivant Pour Trac 1 6 Ecrire "Il repassera par l" Trac Suivant Fin Ici, il y aura quinze critures conscutives de "il est pass par ici", puis six critures conscutives de "il repassera par l", et ce sera tout.

99

Des boucles peuvent donc tre imbriques (cas n1) ou successives (cas n2). Cependant, elles ne peuvent jamais, au grand jamais, tre croises. Cela naurait aucun sens logique, et de plus, bien peu de langages vous autoriseraient ne serait-ce qu crire cette structure aberrante. Variables Truc, Trac en Entier Pour Truc Instructions Pour Trac Instructions Truc Suivant instructions Trac Suivant Pourquoi imbriquer des boucles ? Pour la mme raison quon imbrique des tests. La traduction en bon franais dun test, cest un cas . Eh bien un cas (par exemple, est-ce un homme ou une femme ? ) peut trs bien se subdiviser en dautres cas ( at-il plus ou moins de 18 ans ? ). De mme, une boucle, cest un traitement systmatique, un examen dune srie dlments un par un (par exemple, prenons tous les employs de lentreprise un par un ). Eh bien, on peut imaginer que pour chaque lment ainsi considr (pour chaque employ), on doive procder un examen systmatique dautre chose ( prenons chacune des commandes que cet employ a traites ). Voil un exemple typique de boucles imbriques : on devra programmer une boucle principale (celle qui prend les employs un par un) et lintrieur, une boucle secondaire (celle qui prend les commandes de cet employ une par une). Dans la pratique de la programmation, la matrise des boucles imbriques est ncessaire, mme si elle nest pas suffisante. Tout le contraire dAlain Delon, en quelque sorte.

100

5.4 Et encore une btise ne pas faire !


Examinons lalgorithme suivant : Variable Truc en Entier Dbut Pour Truc 1 15 Truc Truc * 2 Ecrire "Passage numro : ", Truc Truc Suivant Fin Vous remarquerez que nous faisons ici grer en double la variable Truc, ces deux gestions tant contradictoires. Dune part, la ligne Pour augmente la valeur de Truc de 1 chaque passage. Dautre part la ligne Truc Truc * 2 double la valeur de Truc chaque passage. Il va sans dire que de telles manipulations perturbent compltement le droulement normal de la boucle, et sont causes, sinon de plantages, tout au moins dexcutions erratiques. Le Gag De La Journe Il consiste donc manipuler, au sein dune boucle Pour, la variable qui sert de compteur cette boucle. Cette technique est proscrire absolument sauf bien sr, si vous cherchez un prtexte pour rgaler tout le monde au bistrot. Mais dans ce cas, nayez aucune inhibition, proposez-le directement, pas besoin de prtexte.

101

PARTIE 5
nonc des Exercices Exercice 5.4
Ecrire un algorithme qui demande un nombre de dpart, et qui ensuite crit la table de multiplication de ce nombre, prsente comme suit (cas o l'utilisateur entre le nombre 7) : Table de 7 : 7x1=7 7 x 2 = 14 7 x 3 = 21 7 x 10 = 70

Exercice 5.5
Ecrire un algorithme qui demande un nombre de dpart, et qui calcule la somme des entiers jusqu ce nombre. Par exemple, si lon entre 5, le programme doit calculer : 1 + 2 + 3 + 4 + 5 = 15 NB : on souhaite afficher uniquement le rsultat, pas la dcomposition du calcul.

Exercice 5.6
Ecrire un algorithme qui demande un nombre de dpart, et qui calcule sa factorielle. NB : la factorielle de 8, note 8 !, vaut 1x2x3x4x5x6x7x8

102

Exercice 5.7
Ecrire un algorithme qui demande successivement 20 nombres lutilisateur, et qui lui dise ensuite quel tait le plus grand parmi ces 20 nombres : Entrez le nombre numro 1 : 12 Entrez le nombre numro 2 : 14 etc. Entrez le nombre numro 20 : 6 Le plus grand de ces nombres est : 14 Modifiez ensuite lalgorithme pour que le programme affiche de surcrot en quelle position avait t saisie ce nombre : Ctait le nombre numro 2

Exercice 5.8
Rcrire lalgorithme prcdent, mais cette fois-ci on ne connat pas davance combien lutilisateur souhaite saisir de nombres. La saisie des nombres sarrte lorsque lutilisateur entre un zro.

Exercice 5.9
Lire la suite des prix (en euros entiers et termine par zro) des achats dun client. Calculer la somme quil doit, lire la somme quil paye, et simuler la remise de la monnaie en affichant les textes "10 Euros", "5 Euros" et "1 Euro" autant de fois quil y a de coupures de chaque sorte rendre.

103

Exercice 5.10
crire un algorithme qui permette de connatre ses chances de gagner au tierc, quart, quint et autres impts volontaires. On demande lutilisateur le nombre de chevaux partants, et le nombre de chevaux jous. Les deux messages affichs devront tre : Dans lordre : une chance sur X de gagner Dans le dsordre : une chance sur Y de gagner X et Y nous sont donns par la formule suivante, si n est le nombre de chevaux partants et p le nombre de chevaux jous (on rappelle que le signe ! signifie "factorielle", comme dans l'exercice 5.6 ci-dessus) : X = n ! / (n - p) ! Y = n ! / (p ! * (n p) !) NB : cet algorithme peut tre crit dune manire simple, mais relativement peu performante. Ses performances peuvent tre singulirement augmentes par une petite astuce. Vous commencerez par crire la manire la plus simple, puis vous identifierez le problme, et crirez une deuxime version permettant de le rsoudre.

104

PARTIE 5
Corrigs des Exercices Exercice 5.4
Variables N, i en Entier Debut Ecrire "Entrez un nombre : " Lire N Ecrire "La table de multiplication de ce nombre est : " Pour i 1 10 Ecrire N, " x ", i, " = ", n*i i Suivant Fin

Exercice 5.5
Variables N, i, Som en Entier Debut Ecrire "Entrez un nombre : " Lire N Som 0 Pour i 1 N Som Som + i i Suivant Ecrire "La somme est : ", Som Fin

105

Exercice 5.6
Variables N, i, F en Entier Debut Ecrire "Entrez un nombre : " Lire N F1 Pour i 2 N FF*i i Suivant Ecrire "La factorielle est : ", F Fin

Exercice 5.7
Variables N, i, PG en Entier Debut PG 0 Pour i 1 20 Ecrire "Entrez un nombre : " Lire N Si i = 1 ou N > PG Alors PG N FinSi i Suivant Ecrire "Le nombre le plus grand tait : ", PG Fin En ligne 3, on peut mettre nimporte quoi dans PG, il suffit que cette variable soit affecte pour que le premier passage en ligne 7 ne provoque pas d'erreur.

106

Pour la version amliore, cela donne : Variables N, i, PG, IPG en Entier Debut PG 0 Pour i 1 20 Ecrire "Entrez un nombre : " Lire N Si i = 1 ou N > PG Alors PG N IPG i FinSi i Suivant Ecrire "Le nombre le plus grand tait : ", PG Ecrire "Il a t saisi en position numro ", IPG Fin

Exercice 5.8
Variables N, i, PG, IPG en Entier Debut N1 i0 PG 0 TantQue N <> 0 Ecrire "Entrez un nombre : " Lire N ii+1 Si i = 1 ou N > PG Alors PG N IPG i FinSi FinTantQue Ecrire "Le nombre le plus grand tait : ", PG Ecrire "Il a t saisi en position numro ", IPG Fin

107

Exercice 5.9
Variables FF, somdue, M, IPG, Reste, Nb10F, Nb5F En Entier Debut E1 somdue 0 TantQue E <> 0 Ecrire "Entrez le montant : " Lire E somdue somdue + E FinTantQue Ecrire "Vous devez :", E, " euros" Ecrire "Montant vers :" Lire M Reste M E Nb10E 0 TantQue Reste >= 10 Nb10E Nb10E + 1 Reste Reste 10 FinTantQue Nb5E 0 Si Reste >= 5 Nb5E 1 Reste Reste 5 FinSi Ecrire "Rendu de la monnaie :" Ecrire "Billets de 10 E : ", Nb10E Ecrire "Billets de 5 E : ", Nb5E Ecrire "Pices de 1 E : ", reste Fin

108

Exercice 5.10
Spontanment, on est tent d'crire l'algorithme suivant : Variables N, P, i, Num, Dno1, Dno2 en Entier Debut Ecrire "Entrez le nombre de chevaux partants : " Lire N Ecrire "Entrez le nombre de chevaux jous : " Lire P Num 1 Pour i 2 N Num Num * i i Suivant Dno1 1 Pour i 2 N-P Dno1 Dno1 * i i Suivant Dno2 1 Pour i 2 P Dno2 Dno2 * i i Suivant Ecrire "Dans lordre, une chance sur ", Num / Dno1 Ecrire "Dans le dsordre, une sur ", Num / (Dno1 * Dno2) Fin Cette version, formellement juste, comporte tout de mme deux faiblesses. La premire, et la plus grave, concerne la manire dont elle calcule le rsultat final. Celui-ci est le quotient d'un nombre par un autre ; or, ces nombres auront rapidement tendance tre trs grands. En calculant, comme on le fait ici, d'abord le numrateur, puis ensuite le dnominateur, on prend le risque de demander la machine de stocker des nombres trop grands pour qu'elle soit capable de les coder (cf. le prambule). C'est d'autant plus bte que rien ne nous oblige procder ainsi : on n'est pas oblig de passer par la division de deux trs grands nombres pour obtenir le rsultat voulu. La deuxime remarque est qu'on a programm ici trois boucles successives. Or, en y regardant bien, on peut voir qu'aprs simplification de la formule, ces trois boucles comportent le mme nombre de tours ! (si vous ne me croyez pas, crivez un exemple de calcul et biffez les nombres identiques au numrateur et au dnominateur). Ce triple calcul (ces trois boucles) peut donc tre ramen(es) un(e) seul(e).

109

Et voil le travail, qui est non seulement bien plus court, mais aussi plus performant : Variables N, P, i, O, F en Entier Debut Ecrire "Entrez le nombre de chevaux partants : " Lire N Ecrire "Entrez le nombre de chevaux jous : " Lire P A1 B1 Pour i 1 P A A * (i + N - P) BB*i i Suivant Ecrire "Dans lordre, une chance sur ", A Ecrire "Dans le dsordre, une chance sur ", A / B Fin

110

Partie 6 Les Tableaux


Si on ment un compilateur, il prendra sa revanche. - Henry Spencer.

Bonne nouvelle ! Je vous avais annonc quil y a avait en tout et pour tout quatre structures logiques dans la programmation. Eh bien, a y est, on les a toutes passes en revue. Mauvaise nouvelle, il vous reste tout de mme quelques petites choses apprendre

6.1 Utilit des tableaux


Imaginons que dans un programme, nous ayons besoin simultanment de 12 valeurs (par exemple, des notes pour calculer une moyenne). Evidemment, la seule solution dont nous disposons lheure actuelle consiste dclarer douze variables, appeles par exemple Notea, Noteb, Notec, etc. Bien sr, on peut opter pour une notation un peu simplifie, par exemple N1, N2, N3, etc. Mais cela ne change pas fondamentalement notre problme, car arriv au calcul, et aprs une succession de douze instructions Lire distinctes, cela donnera obligatoirement une atrocit du genre : Moy (N1+N2+N3+N4+N5+N6+N7+N8+N9+N10+N11+N12)/12 Ouf ! Cest tout de mme bigrement laborieux. Et pour un peu que nous soyons dans un programme de gestion avec quelques centaines ou quelques milliers de valeurs traiter, alors l cest le suicide direct. Cerise sur le gteau, si en plus on est dans une situation on lon ne peut pas savoir davance combien il y aura de valeurs traiter, l on est carrment cuits. Cest pourquoi la programmation nous permet de rassembler toutes ces variables en

une seule, au sein de laquelle chaque valeur sera dsigne par un numro. En bon
franais, cela donnerait donc quelque chose du genre la note numro 1 , la note numro 2 , la note numro 8 . Cest largement plus pratique, vous vous en doutez.

111

Un ensemble de valeurs portant le mme nom de variable et repres par un nombre, sappelle un tableau, ou encore une variable indice. Le nombre qui, au sein dun tableau, sert reprer chaque valeur sappelle surprise lindice. Chaque fois que lon doit dsigner un lment du tableau, on fait figurer le nom du tableau, suivi de lindice de llment, entre parenthses.

6.2 Notation et utilisation algorithmique


Dans notre exemple, nous crerons donc un tableau appel Note. Chaque note individuelle (chaque lment du tableau Note) sera donc dsigne Note(0), Note(1), etc. Eh oui, attention, les indices des tableaux commencent gnralement 0, et non 1. Un tableau doit tre dclar comme tel, en prcisant le nombre et le type de valeurs quil contiendra (la dclaration des tableaux est susceptible de varier d'un langage l'autre. Certains langages rclament le nombre d'lments, d'autre le plus grand indice... C'est donc une affaire de conventions). En nous calquant sur les choix les plus frquents dans les langages de programmations, nous dciderons ici arbitrairement et une bonne fois pour toutes que :

les "cases" sont numrotes partir de zro, autrement dit que le plus petit indice est zro.

lors de la dclaration d'un tableau, on prcise la plus grande valeur de l'indice (diffrente, donc, du nombre de cases du tableau, puisque si on veut 12 emplacements, le plus grand indice sera 11). Au dbut, a droute, mais vous verrez, avec le temps, on se fait tout, mme au pire.

Tableau Note(11) en Entier On peut crer des tableaux contenant des variables de tous types : tableaux de numriques, bien sr, mais aussi tableaux de caractres, tableaux de boolens, tableaux de tout ce qui existe dans un langage donn comme type de variables. Par contre, hormis dans quelques rares langages, on ne peut pas faire un mixage de types diffrents de valeurs au sein dun mme tableau.

112

Lnorme avantage des tableaux, cest quon va pouvoir les traiter en faisant des boucles. Par exemple, pour effectuer notre calcul de moyenne, cela donnera par exemple : Tableau Note(11) en Numrique Variables Moy, Som en Numrique Dbut Pour i 0 11 Ecrire "Entrez la note n", i Lire Note(i) i Suivant Som 0 Pour i 0 11 Som Som + Note(i) i Suivant Moy Som / 12 Fin NB : On a fait deux boucles successives pour plus de lisibilit, mais on aurait tout aussi bien pu nen crire quune seule dans laquelle on aurait tout fait dun seul coup.

Remarque gnrale : lindice qui sert dsigner les lments dun tableau peut tre exprim directement comme un nombre en clair, mais il peut tre aussi une variable, ou une expression calcule.
Dans un tableau, la valeur dun indice doit toujours :

tre gale au moins 0 (dans quelques rares langages, le premier lment dun
tableau porte lindice 1). Mais comme je l'ai dj crit plus haut, nous avons choisi ici de commencer la numrotation des indices zro, comme cest le cas en langage C et en Visual Basic. Donc attention, Truc(6) est le septime lment du tableau Truc !

tre un nombre entier Quel que soit le langage, llment Truc(3,1416) nexiste
jamais.

tre infrieure ou gale au nombre dlments du tableau (moins 1, si lon


commence la numrotation zro). Si le tableau Bidule a t dclar comme ayant 25 lments, la prsence dans une ligne, sous une forme ou sous une autre, de Bidule(32) dclenchera automatiquement une erreur.

Je le re-re-rpte, si lon est dans un langage o les indices commencent zro, il faut en tenir compte la dclaration : Tableau Note(13) en Numrique 113

...crera un tableau de 14 lments, le plus petit indice tant 0 et le plus grand 13. LE GAG DE LA JOURNEE Il consiste confondre, dans sa tte et / ou dans un algorithme, lindice dun lment dun tableau avec le contenu de cet lment. La troisime maison de la rue na pas forcment trois habitants, et la vingtime vingt habitants. En notation algorithmique, il ny a aucun rapport entre i et truc(i). Hol, Tavernier, prpare la cervoise !

114

PARTIE 6
nonc des Exercices Exercice 6.1
Ecrire un algorithme qui dclare et remplisse un tableau de 7 valeurs numriques en les mettant toutes zro.

Exercice 6.2
Ecrire un algorithme qui dclare et remplisse un tableau contenant les six voyelles de lalphabet latin.

Exercice 6.3
Ecrire un algorithme qui dclare un tableau de 9 notes, dont on fait ensuite saisir les valeurs par lutilisateur.

Exercice 6.4
Que produit lalgorithme suivant ? Tableau Nb(5) en Entier Variable i en Entier Dbut Pour i 0 5 Nb(i) i * i i suivant Pour i 0 5 Ecrire Nb(i) i suivant Fin Peut-on simplifier cet algorithme avec le mme rsultat ?

115

Exercice 6.5
Que produit lalgorithme suivant ? Tableau N(6) en Entier Variables i, k en Entier Dbut N(0) 1 Pour k 1 6 N(k) N(k-1) + 2 k Suivant Pour i 0 6 Ecrire N(i) i suivant Fin Peut-on simplifier cet algorithme avec le mme rsultat ?

Exercice 6.6
Que produit lalgorithme suivant ? Tableau Suite(7) en Entier Variable i en Entier Dbut Suite(0) 1 Suite(1) 1 Pour i 2 7 Suite(i) Suite(i-1) + Suite(i-2) i suivant Pour i 0 7 Ecrire Suite(i) i suivant Fin

116

Exercice 6.7
Ecrivez la fin de lalgorithme 6.3 afin que le calcul de la moyenne des notes soit effectu et affich lcran.

117

Partie 6
Corrigs des Exercices Exercice 6.1
Tableau Truc(6) en Numrique Variable i en Numrique Debut Pour i 0 6 Truc(i) 0 i Suivant Fin

Exercice 6.2
Tableau Truc(5) en Caractre Debut Truc(0) "a" Truc(1) "e" Truc(2) "i" Truc(3) "o" Truc(4) "u" Truc(5) "y" Fin

Exercice 6.3
Tableau Notes(8) en Numrique Variable i en Numrique Pour i 0 8 Ecrire "Entrez la note numro ", i + 1 Lire Notes(i) i Suivant Fin

118

Exercice 6.4
Cet algorithme remplit un tableau avec six valeurs : 0, 1, 4, 9, 16, 25. Il les crit ensuite lcran. Simplification : Tableau Nb(5) en Numrique Variable i en Numrique Dbut Pour i 0 5 Nb(i) i * i Ecrire Nb(i) i Suivant Fin

Exercice 6.5
Cet algorithme remplit un tableau avec les sept valeurs : 1, 3, 5, 7, 9, 11, 13. Il les crit ensuite lcran. Simplification : Tableau N(6) en Numrique Variables i, k en Numrique Dbut N(0) 1 Ecrire N(0) Pour k 1 6 N(k) N(k-1) + 2 Ecrire N(k) k Suivant Fin

Exercice 6.6
Cet algorithme remplit un tableau de 8 valeurs : 1, 1, 2, 3, 5, 8, 13, 21

119

Exercice 6.7
Variable S en Numrique Tableau Notes(8) en Numrique Debut s0 Pour i 0 8 Ecrire "Entrez la note n ", i + 1 Lire Notes(i) s s + Notes(i) i Suivant Ecrire "Moyenne :", s/9 Fin

120

6.3 Tableaux dynamiques


Il arrive frquemment que lon ne connaisse pas lavance le nombre dlments que devra comporter un tableau. Bien sr, une solution consisterait dclarer un tableau gigantesque (10 000 lments, pourquoi pas, au diable les varices) pour tre sr que a rentre . Mais dune part, on nen sera jamais parfaitement sr, dautre part, en raison de limmensit de la place mmoire rserve et la plupart du temps non utilise, cest un gchis prjudiciable la rapidit, voire la viabilit, de notre algorithme. Aussi, pour parer ce genre de situation, a-t-on la possibilit de dclarer le tableau sans prciser au dpart son nombre dlments. Ce nest que dans un second temps, au cours du programme, que lon va fixer ce nombre via une instruction de redimensionnement : Redim. Notez que tant quon na pas prcis le nombre dlments dun tableau, dune

manire ou dune autre, ce tableau est inutilisable. Exemple : on veut faire saisir des notes pour un calcul de moyenne, mais on ne sait pas
combien il y aura de notes saisir. Le dbut de lalgorithme sera quelque chose du genre : Tableau Notes() en Numrique Variable nb en Numrique Dbut Ecrire "Combien y a-t-il de notes saisir ?" Lire nb Redim Notes(nb-1) Cette technique na rien de sorcier, mais elle fait partie de larsenal de base de la programmation en gestion.

121

PARTIE 6
nonc des Exercices Exercice 6.8
Ecrivez un algorithme permettant lutilisateur de saisir un nombre quelconque de valeurs, qui devront tre stockes dans un tableau. Lutilisateur doit donc commencer par entrer le nombre de valeurs quil compte saisir. Il effectuera ensuite cette saisie. Enfin, une fois la saisie termine, le programme affichera le nombre de valeurs ngatives et le nombre de valeurs positives.

Exercice 6.9
Ecrivez un algorithme calculant la somme des valeurs dun tableau (on suppose que le tableau a t pralablement saisi).

Exercice 6.10
Ecrivez un algorithme constituant un tableau, partir de deux tableaux de mme longueur pralablement saisis. Le nouveau tableau sera la somme des lments des deux tableaux de dpart. Tableau 1 : 4 Tableau 2 : 7 Tableau constituer : 11 14 12 11 2 8 11 10 6 5 2 1 3 7 4 8 7 9 1 5 4 6

122

Exercice 6.11
Toujours partir de deux tableaux prcdemment saisis, crivez un algorithme qui calcule le schtroumpf des deux tableaux. Pour calculer le schtroumpf, il faut multiplier chaque lment du tableau 1 par chaque lment du tableau 2, et additionner le tout. Par exemple si l'on a : Tableau 1 : 4 Tableau 2 : 3 Le Schtroumpf sera : 3 * 4 + 3 * 8 + 3 * 7 + 3 * 12 + 6 * 4 + 6 * 8 + 6 * 7 + 6 * 12 = 279 6 8 7 12

Exercice 6.12
Ecrivez un algorithme qui permette la saisie dun nombre quelconque de valeurs, sur le principe de lex 6.8. Toutes les valeurs doivent tre ensuite augmentes de 1, et le nouveau tableau sera affich lcran.

Exercice 6.13
Ecrivez un algorithme permettant, toujours sur le mme principe, lutilisateur de saisir un nombre dtermin de valeurs. Le programme, une fois la saisie termine, renvoie la plus grande valeur en prcisant quelle position elle occupe dans le tableau. On prendra soin deffectuer la saisie dans un premier temps, et la recherche de la plus grande valeur du tableau dans un second temps.

Exercice 6.14
Toujours et encore sur le mme principe, crivez un algorithme permettant, lutilisateur de saisir les notes d'une classe. Le programme, une fois la saisie termine, renvoie le nombre de ces notes suprieures la moyenne de la classe.

123

Partie 6
Corrigs des Exercices Exercice 6.8
Variables Nb, Nbpos, Nbneg en Numrique Tableau T() en Numrique Debut Ecrire "Entrez le nombre de valeurs :" Lire Nb Redim T(Nb-1) Nbpos 0 Nbneg 0 Pour i 0 Nb 1 Ecrire "Entrez le nombre n ", i + 1 Lire T(i) Si T(i) > 0 alors Nbpos Nbpos + 1 Sinon Nbneg Nbneg + 1 Finsi i Suivant Ecrire "Nombre de valeurs positives : ", Nbpos Ecrire "Nombre de valeurs ngatives : ", Nbneg Fin

124

Exercice 6.9
Variables i, Som, N en Numrique Tableau T() en Numrique Debut (on ne programme pas la saisie du tableau, dont on suppose quil compte N lments) Redim T(N-1) Som 0 Pour i 0 N 1 Som Som + T(i) i Suivant Ecrire "Somme des lments du tableau : ", Som Fin

Exercice 6.10
Variables i, N en Numrique Tableaux T1(), T2(), T3() en Numrique Debut (on suppose que T1 et T2 comptent N lments, et quils sont dj saisis) Redim T3(N-1) Pour i 0 N 1 T3(i) T1(i) + T2(i) i Suivant Fin

125

Exercice 6.11
Variables i, j, N1, N2, S en Numrique Tableaux T1(), T2() en Numrique Debut On ne programme pas la saisie des tableaux T1 et T2. (On suppose que T1 possde N1 lments, et que T2 en possde T2) S0 Pour i 0 N1 1 Pour j 0 N2 1 S S + T1(i) * T2(j) j Suivant i Suivant Ecrire "Le schtroumpf est : ", S Fin

Exercice 6.12
Variables Nb, i en Numrique Tableau T() en Numrique Debut Ecrire "Entrez le nombre de valeurs : " Lire Nb Redim T(Nb-1) Pour i 0 Nb 1 Ecrire "Entrez le nombre n ", i + 1 Lire T(i) i Suivant Ecrire "Nouveau tableau : " Pour i 0 Nb 1 T(i) T(i) + 1 Ecrire T(i) i Suivant Fin

126

Exercice 6.13
Variables Nb, Posmaxi en Numrique Tableau T() en Numrique Ecrire "Entrez le nombre de valeurs :" Lire Nb Redim T(Nb-1) Pour i 0 Nb 1 Ecrire "Entrez le nombre n ", i + 1 Lire T(i) i Suivant Posmaxi 0 Pour i 0 Nb 1 Si T(i) > T(Posmaxi) alors Posmaxi i Finsi i Suivant Ecrire "Element le plus grand : ", T(Posmaxi) Ecrire "Position de cet lment : ", Posmaxi Fin

127

Exercice 6.14
Variables Nb, i, Som, Moy, Nbsup en Numrique Tableau T() en Numrique Debut Ecrire "Entrez le nombre de notes saisir : " Lire Nb Redim T(Nb-1) Pour i 0 Nb 1 Ecrire "Entrez le nombre n ", i + 1 Lire T(i) i Suivant Som 0 Pour i 0 Nb 1 Som Som + T(i) i Suivant Moy Som / Nb NbSup 0 Pour i 0 Nb 1 Si T(i) > Moy Alors NbSup NbSup + 1 FinSi i Suivant Ecrire NbSup, " lves dpassent la moyenne de la classe" Fin

128

Partie 7 Techniques Rusees


Informatique : alliance d'une science inexacte et d'une activit humaine faillible - Luc Fayard

Une fois nest pas coutume, ce chapitre na pas pour but de prsenter un nouveau type de donnes, un nouveau jeu dinstructions, ou que sais-je encore. Son propos est de dtailler quelques techniques de programmation qui possdent deux grands points communs :

leur connaissance est parfaitement indispensable elles sont un rien finaudes

Et que valent quelques kilos daspirine, compars lineffable bonheur procur par la comprhension suprme des arcanes de lalgorithmique ? Hein ?

7.1 Tri dun tableau : le tri par SELECtion


Premire de ces ruses de sioux, et par ailleurs tarte la crme absolue du programmeur, donc : le tri de tableau. Combien de fois au cours dune carrire (brillante) de dveloppeur a-t-on besoin de ranger des valeurs dans un ordre donn ? Cest inimaginable. Aussi, plutt quavoir rinventer chaque fois la roue, le fusil tirer dans les coins, le fil couper le roquefort et la poudre maquiller, vaut-il mieux avoir assimil une ou deux techniques solidement prouves, mme si elles paraissent un peu ardues au dpart. Il existe plusieurs stratgies possibles pour trier les lments dun tableau ; nous en verrons deux : le tri par slection, et le tri bulles. Champagne ! Commenons par le tri par slection. Admettons que le but de la manuvre soit de trier un tableau de 12 lments dans lordre croissant. La technique du tri par slection est la suivante : on met en bonne position llment numro 1, cest--dire le plus petit. Puis en met en bonne position llment suivant. Et ainsi de suite jusquau dernier. Par exemple, si lon part de :
45 122 12 3 21 78 64 53 89 28 84 46

129

On commence par rechercher, parmi les 12 valeurs, quel est le plus petit lment , et o il se trouve. On lidentifie en quatrime position (cest le nombre 3), et on lchange alors avec le premier lment (le nombre 45). Le tableau devient ainsi :
3 122 12 45 21 78 64 53 89 28 84 46

On recommence chercher le plus petit lment, mais cette fois, seulement partir du

deuxime (puisque le premier est maintenant correct, on ny touche plus). On le trouve


en troisime position (cest le nombre 12). On change donc le deuxime avec le troisime :
3 12 122 45 21 78 64 53 89 28 84 46

On recommence chercher le plus petit lment partir du troisime (puisque les deux premiers sont maintenant bien placs), et on le place correctement, en lchangeant, ce qui donnera in fine :
3 12 21 45 122 78 64 53 89 28 84 46

Et cetera, et cetera, jusqu lavant dernier. En bon franais, nous pourrions dcrire le processus de la manire suivante :

Boucle principale : prenons comme point de dpart le premier lment, puis le second, etc, jusqu lavant dernier.

Boucle secondaire : partir de ce point de dpart mouvant, recherchons jusqu la fin du tableau quel et le plus petit lment. Une fois que nous lavons trouv, nous lchangeons avec le point de dpart.

130

Cela scrit : boucle principale : le point de dpart se dcale chaque tour Pour i 0 10 on considre provisoirement que t(i) est le plus petit lment posmini i on examine tous les lments suivants Pour j i + 1 11 Si t(j) < t(posmini) Alors posmini j Finsi j suivant A cet endroit, on sait maintenant o est le plus petit lment. Il ne reste plus qu' effectuer la permutation. temp t(posmini) t(posmini) t(i) t(i) temp On a plac correctement l'lment numro i, on passe prsent au suivant. i suivant

7.2 Un exemple de flag : la recherche dans un tableau


Nous allons maintenant nous intresser au maniement habile dune variable boolenne : la technique dite du flag . Le flag, en anglais, est un petit drapeau, qui va rester baiss aussi longtemps que lvnement attendu ne se produit pas. Et, aussitt que cet vnement a lieu, le petit drapeau se lve (la variable boolenne change de valeur). Ainsi, la valeur finale de la variable boolenne permet au programmeur de savoir si lvnement a eu lieu ou non. Tout ceci peut vous sembler un peu fumeux, mais cela devrait sclairer laide dun exemple extrmement frquent : la recherche de loccurrence dune valeur dans un tableau. On en profitera au passage pour corriger une erreur particulirement frquente chez le programmeur dbutant. Soit un tableau comportant, disons, 20 valeurs. Lon doit crire un algorithme saisissant un nombre au clavier, et qui informe lutilisateur de la prsence ou de labsence de la valeur saisie dans le tableau. La premire tape, vidente, consiste crire les instructions de lecture / criture, et la boucle car il y en a manifestement une de parcours du tableau :

131

Tableau Tab(19) en Numrique Variable N en Numrique Dbut Ecrire "Entrez la valeur rechercher" Lire N Pour i 0 19 ??? i suivant Fin Il nous reste combler les points d'interrogation de la boucle Pour. videmment, il va falloir comparer N chaque lment du tableau : si les deux valeurs sont gales, alors bingo, N fait partie du tableau. Cela va se traduire, bien entendu, par un Si Alors Sinon. Et voil le programmeur raisonnant htivement qui se vautre en crivant : Tableau Tab(19) en Numrique Variable N en Numrique Dbut Ecrire "Entrez la valeur rechercher" Lire N Pour i 0 19 Si N = Tab(i) Alors Ecrire "N fait partie du tableau" Sinon Ecrire "N ne fait pas partie du tableau" FinSi i suivant Fin Et patatras, cet algorithme est une vritable catastrophe. Il suffit d'ailleurs de le faire tourner mentalement pour s'en rendre compte. De deux choses l'une : ou bien la valeur N figure dans le tableau, ou bien elle n'y figure pas. Mais dans tous les cas, l'algorithme ne doit produire qu'une seule rponse, quel que soit le

nombre d'lments que compte le tableau. Or, l'algorithme ci-dessus envoie l'cran autant de messages qu'il y a de valeurs dans le tableau, en l'occurrence pas
moins de 20 ! Il y a donc une erreur manifeste de conception : l'criture du message ne peut se trouver l'intrieur de la boucle : elle doit figurer l'extrieur. On sait si la valeur tait dans le tableau ou non uniquement lorsque le balayage du tableau est

entirement accompli.
132

Nous rcrivons donc cet algorithme en plaant le test aprs la boucle. Faute de mieux, on se contentera de faire dpendre pour le moment la rponse d'une variable boolenne que nous appellerons Trouv. Tableau Tab(19) en Numrique Variable N en Numrique Dbut Ecrire "Entrez la valeur rechercher" Lire N Pour i 0 19 ??? i suivant Si Trouv Alors Ecrire "N fait partie du tableau" Sinon Ecrire "N ne fait pas partie du tableau" FinSi Fin Il ne nous reste plus qu' grer la variable Trouv. Ceci se fait en deux tapes.

un test figurant dans la boucle, indiquant lorsque la variable Trouv doit devenir vraie ( savoir, lorsque la valeur N est rencontre dans le tableau). Et attention : le test est asymtrique. Il ne comporte pas de "sinon". On reviendra l dessus dans un instant.

last, but not least, l'affectation par dfaut de la variable Trouv, dont la valeur de dpart doit tre videmment Faux.

133

Au total, l'algorithme complet et juste ! donne : Tableau Tab(19) en Numrique Variable N en Numrique Dbut Ecrire "Entrez la valeur rechercher" Lire N Trouv Faux Pour i 0 19 Si N = Tab(i) Alors Trouv Vrai FinSi i suivant Si Trouv Alors Ecrire "N fait partie du tableau" Sinon Ecrire "N ne fait pas partie du tableau" FinSi Fin Mditons un peu sur cette affaire. La difficult est de comprendre que dans une recherche, le problme ne se formule pas de la mme manire selon qu'on le prend par un bout ou par un autre. On peut rsumer l'affaire ainsi : il suffit que N soit gal une seule valeur de Tab pour qu'elle fasse

partie du tableau. En revanche, il faut qu'elle soit diffrente de toutes les valeurs de Tab pour qu'elle n'en fasse pas partie.
Voil la raison qui nous oblige passer par une variable boolenne , un drapeau qui

peut se lever, mais jamais se rabaisser. Et cette technique de flag (que nous
pourrions lgamment surnommer gestion asymtrique de variable boolenne ) doit tre mise en uvre chaque fois que lon se trouve devant pareille situation. Autrement dit, connatre ce type de raisonnement est indispensable, et savoir le reproduire bon escient ne l'est pas moins.

134

7.3 Tri de tableau + flag = tri bulles


Et maintenant, nous en arrivons la formule magique : tri de tableau + flag = tri bulles. Lide de dpart du tri bulles consiste se dire quun tableau tri en ordre croissant, cest un tableau dans lequel tout lment est plus petit que celui qui le suit. Cette constatation percutante semble digne de M. de Lapalisse, un ancien voisin moi. Mais elle est plus profonde et plus utile - quelle nen a lair. En effet, prenons chaque lment dun tableau, et comparons-le avec llment qui le suit. Si lordre nest pas bon, on permute ces deux lments. Et on recommence jusqu ce que lon nait plus aucune permutation effectuer. Les lments les plus grands remontent ainsi peu peu vers les dernires places, ce qui explique la charmante dnomination de tri bulle . Comme quoi lalgorithmique nexclut pas un minimum syndical de sens potique. En quoi le tri bulles implique-t-il lutilisation dun flag ? Eh bien, par ce quon ne sait jamais par avance combien de remontes de bulles on doit effectuer. En fait, tout ce quon peut dire, cest quon devra effectuer le tri jusqu ce quil ny ait plus dlments qui soient mal classs. Ceci est typiquement un cas de question asymtrique : il suffit que deux lments soient mal classs pour quun tableau ne soit pas tri. En revanche, il faut que tous les lments soient bien rangs pour que le tableau soit tri. Nous baptiserons le flag Yapermute, car cette variable boolenne va nous indiquer si nous venons ou non de procder une permutation au cours du dernier balayage du tableau (dans le cas contraire, cest signe que le tableau est tri, et donc quon peut arrter la machine bulles). La boucle principale sera alors : Variable Yapermute en Boolen Dbut TantQue Yapermute FinTantQue Fin Que va-t-on faire lintrieur de la boucle ? Prendre les lments du tableau, du premier jusqu lavant-dernier, et procder un change si ncessaire.

135

Cest parti : Variable Yapermute en Boolen Dbut TantQue Yapermute Pour i 0 10 Si t(i) > t(i+1) Alors temp t(i) t(i) t(i+1) t(i+1) temp Finsi i suivant Fin Mais il ne faut pas oublier un dtail capital : la gestion de notre flag. Lide, cest que cette variable va nous signaler le fait quil y a eu au moins une permutation effectue. Il faut donc :

lui attribuer la valeur Vrai ds quune seule permutation a t faite (il suffit quil y en ait eu une seule pour quon doive tout recommencer encore une fois).

la remettre Faux chaque tour de la boucle principale (quand on recommence un nouveau tour gnral de bulles, il ny a pas encore eu dlments changs),

dernier point, il ne faut pas oublier de lancer la boucle principale, et pour cela de donner la valeur Vrai au flag au tout dpart de lalgorithme.

136

La solution complte donne donc : Variable Yapermute en Boolen Dbut Yapermut Vrai TantQue Yapermut Yapermut Faux Pour i 0 10 Si t(i) > t(i+1) alors temp t(i) t(i) t(i+1) t(i+1) temp Yapermut Vrai Finsi i suivant FinTantQue Fin Au risque de me rpter, la comprhension et la matrise du principe du flag font partie de larsenal du programmeur bien arm.

7.4 La recherche dichotomique


Je ne sais pas si on progresse vraiment en algorithmique, mais en tout cas, qu'est-ce qu'on apprend comme vocabulaire ! Blague dans le coin, nous allons terminer ce chapitre migraineux par une technique clbre de recherche, qui rvle toute son utilit lorsque le nombre d'lments est trs lev. Par exemple, imaginons que nous ayons un programme qui doive vrifier si un mot existe dans le dictionnaire. Nous pouvons supposer que le dictionnaire a t pralablement entr dans un tableau ( raison d'un mot par emplacement). Ceci peut nous mener , disons la louche, 40 000 mots. Une premire manire de vrifier si un mot se trouve dans le dictionnaire consiste examiner successivement tous les mots du dictionnaire, du premier au dernier, et les comparer avec le mot vrifier. Ca marche, mais cela risque d'tre long : si le mot ne se trouve pas dans le dictionnaire, le programme ne le saura qu'aprs 40 000 tours de boucle ! Et mme si le mot figure dans le dictionnaire, la rponse exigera tout de mme en moyenne 20 000 tours de boucle. C'est beaucoup, mme pour un ordinateur.

137

Or, il y a une autre manire de chercher, bien plus intelligente pourrait-on dire, et qui met profit le fait que dans un dictionnaire, les mots sont tris par ordre alphabtique. D'ailleurs, un tre humain qui cherche un mot dans le dictionnaire ne lit jamais tous les mots, du premier au dernier : il utilise lui aussi le fait que les mots sont tris. Pour une machine, quelle est la manire la plus rationnelle de chercher dans un dictionnaire ? C'est de comparer le mot vrifier avec le mot qui se trouve pile poil au milieu du dictionnaire. Si le mot vrifier est antrieur dans l'ordre alphabtique, on sait qu'on devra le chercher dornavant dans le premire moiti du dico. Sinon, on sait maintenant qu'on devra le chercher dans la deuxime moiti. A partir de l, on prend la moiti de dictionnaire qui nous reste, et on recommence : on compare le mot chercher avec celui qui se trouve au milieu du morceau de dictionnaire restant. On carte la mauvaise moiti, et on recommence, et ainsi de suite. A force de couper notre dictionnaire en deux, puis encore en deux, etc. on va finir par se retrouver avec des morceaux qui ne contiennent plus qu'un seul mot. Et si on n'est pas tomb sur le bon mot un moment ou un autre, c'est que le mot vrifier ne fait pas partie du dictionnaire. Regardons ce que cela donne en terme de nombre d'oprations effectuer, en choisissant le pire cas : celui o le mot est absent du dictionnaire.

Au dpart, on cherche le mot parmi 40 000. Aprs le test n1, on ne le cherche plus que parmi 20 000. Aprs le test n2, on ne le cherche plus que parmi 10 000. Aprs le test n3, on ne le cherche plus que parmi 5 000. etc. Aprs le test n15, on ne le cherche plus que parmi 2. Aprs le test n16, on ne le cherche plus que parmi 1.

Et l, on sait que le mot n'existe pas. Moralit : on a obtenu notre rponse en 16 oprations contre 40 000 prcdemment ! Il n'y a pas photo sur l'cart de performances entre la technique barbare et la technique fute. Attention, toutefois, mme si c'est vident, je le rpte avec force : la recherche dichotomique ne peut s'effectuer que sur des lments pralablement tris. Eh bien maintenant que je vous ai expliqu comment faire, vous n'avez plus qu' traduire ! Au risque de me rpter, la comprhension et la matrise du principe du flag font partie du bagage du programmeur bien outill.

138

PARTIE 7
Enonce des Exercices Exercice 7.1
Ecrivez un algorithme qui permette de saisir un nombre quelconque de valeurs, et qui les range au fur et mesure dans un tableau. Le programme, une fois la saisie termine, doit dire si les lments du tableau sont tous conscutifs ou non. Par exemple, si le tableau est : 12 13 14 15 16 17 18

ses lments sont tous conscutifs. En revanche, si le tableau est : 9 10 11 15 16 17 18

ses lments ne sont pas tous conscutifs.

Exercice 7.2
Ecrivez un algorithme qui trie un tableau dans lordre dcroissant. Vous crirez bien entendu deux versions de cet algorithme, l'une employant le tri par insertion, l'autre le tri bulles.

Exercice 7.3
Ecrivez un algorithme qui inverse lordre des lments dun tableau dont on suppose qu'il a t pralablement saisi ( les premiers seront les derniers )

139

Exercice 7.4
Ecrivez un algorithme qui permette lutilisateur de supprimer une valeur dun tableau pralablement saisi. Lutilisateur donnera lindice de la valeur quil souhaite supprimer. Attention, il ne sagit pas de remettre une valeur zro, mais bel et bien de la supprimer du tableau lui-mme ! Si le tableau de dpart tait : 12 8 4 45 64 9 2

Et que lutilisateur souhaite supprimer la valeur dindice 4, le nouveau tableau sera : 12 8 4 45 9 2

Exercice 7.5
Ecrivez l'algorithme qui recherche un mot saisi au clavier dans un dictionnaire. Le dictionnaire est suppos tre cod dans un tableau pralablement rempli et tri.

140

PARTIE 7
Corrigs des Exercices Exercice 7.1
Variables Nb, i en Entier Variable Flag en Booleen Tableau T() en Entier Debut Ecrire "Entrez le nombre de valeurs :" Lire Nb Redim T(Nb-1) Pour i 0 Nb 1 Ecrire "Entrez le nombre n ", i + 1 Lire T(i) i Suivant Flag Vrai Pour i 1 Nb 1 Si T(i) <> T(i 1) + 1 Alors Flag Faux FinSi i Suivant Si Flag Alors Ecrire "Les nombres sont conscutifs" Sinon Ecrire "Les nombres ne sont pas conscutifs" FinSi Fin Cette programmation est sans doute la plus spontane, mais elle prsente le dfaut d'examiner la totalit du tableau, mme lorsqu'on dcouvre ds le dpart deux lments non conscutifs. Aussi, dans le cas d'un grand tableau, est-elle dispendieuse en temps de traitement. Une autre manire de procder serait de sortir de la boucle ds que deux lments non conscutifs sont dtects.

141

La deuxime partie de l'algorithme deviendrait donc : i1 TantQue T(i) = T(i 1) + 1 et i < Nb 1 ii+1 FinTantQue Si T(i) = T(i 1) + 1 Alors Ecrire "Les nombres sont conscutifs" Sinon Ecrire "Les nombres ne sont pas conscutifs" FinSi

142

Exercice 7.2
On suppose que N est le nombre dlments du tableau. Tri par insertion : Pour i 0 N 2 posmaxi = i Pour j i + 1 N 1 Si t(j) > t(posmaxi) alors posmaxi j Finsi j suivant temp t(posmaxi) t(posmaxi) t(i) t(i) temp i suivant Fin Tri bulles : Yapermut Vrai TantQue Yapermut Yapermut Faux Pour i 0 N 2 Si t(i) < t(i + 1) Alors temp t(i) t(i) t(i + 1) t(i + 1) temp Yapermut Vrai Finsi i suivant FinTantQue Fin

143

Exercice 7.3
On suppose que n est le nombre dlments du tableau pralablement saisi Pour i 0 (N-1)/2 Temp T(i) T(i) T(N-1-i) T(N-1-i) Temp i suivant Fin

Exercice 7.4
Ecrire "Rang de la valeur supprimer ?" Lire S Pour i S N-2 T(i) T(i+1) i suivant Redim T(N1) Fin

Exercice 7.5
N est le nombre d'lments du tableau Dico(), contenant les mots du dictionnaire, tableau pralablement rempli. Variables Sup, Inf, Comp en Entier Variables Fini en Boolen Dbut Ecrire "Entrez le mot vrifier" Lire Mot On dfinit les bornes de la partie du tableau considrer Sup N 1 Inf 0 Fini Faux TantQue Non Fini 144

Comp dsigne l'indice de l'lment comparer. En bonne rigueur, il faudra veiller ce que Comp soit bien un nombre entier, ce qui pourra s'effectuer de diffrentes manires selon les langages. Comp (Sup + Inf)/2 Si le mot se situe avant le point de comparaison, alors la borne suprieure change, la borne infrieure ne bouge pas. Si Mot < Dico(Comp) Alors Sup Comp - 1 Sinon, c'est l'inverse Sinon Inf Comp + 1 FinSi Fini Mot = Dico(Comp) ou Sup < Inf FinTantQue Si Mot = Dico(Comp) Alors Ecrire "le mot existe" Sinon Ecrire "Il n'existe pas" Finsi Fin

145

Partie 8 Tableaux Multidimensionnels


Le vrai problme nest pas de savoir si les machines pensent, mais de savoir si les hommes pensent B.F. Skinner La question de savoir si un ordinateur peut penser n'est pas plus intressante que celle de savoir si un sous-marin peut nager - Edgar W. Dijkstra

Ceci nest pas un drglement de votre tlviseur. Nous contrlons tout, nous savons tout, et les phnomnes paranormaux que vous constatez sont dus au fait que vous tes passs dans la quatrime dimension (musique angoissante : tintintin ). Oui, enfin bon, avant dattaquer la quatrime, on va dj se coltiner la deuxime.

8.1 Pourquoi plusieurs dimensions ?


Une seule ne suffisait-elle pas dj amplement notre bonheur, me demanderez-vous ? Certes, rpondrai-je, mais vous allez voir quavec deux (et davantage encore) cest carrment le nirvana. Prenons le cas de la modlisation dun jeu de dames, et du dplacement des pions sur le damier. Je rappelle quun pion qui est sur une case blanche peut se dplacer (pour simplifier) sur les quatre cases blanches adjacentes. Avec les outils que nous avons abords jusque l, le plus simple serait videmment de modliser le damier sous la forme dun tableau. Chaque case est un emplacement du tableau, qui contient par exemple 0 si elle est vide, et 1 sil y a un pion. On attribue comme indices aux cases les numros 1 8 pour la premire ligne, 9 16 pour la deuxime ligne, et ainsi de suite jusqu 64. Arrivs ce stade, les fines mouches du genre de Cyprien L. m'criront pour faire remarquer qu'un damier, cela possde 100 cases et non 64, et qu'entre les damiers et les chiquiers, je me suis joyeusement emml les pdales. A ces fines mouches, je ferai une double rponse de prof : 1. C'tait pour voir si vous suiviez. 2. Si le prof dcide contre toute vidence que les damiers font 64 cases, c'est le prof qui a raison et l'vidence qui a tort. Rompez. 146

Reprenons. Un pion plac dans la case numro i, autrement dit la valeur 1 de Cases(i), peut bouger vers les cases contigus en diagonale. Cela va nous obliger de petites acrobaties intellectuelles : la case situe juste au-dessus de la case numro i ayant comme indice i-8, les cases valables sont celles dindice i-7 et i-9. De mme, la case situe juste en dessous ayant comme indice i+8, les cases valables sont celles dindice i+7 et i+9. Bien sr, on peut fabriquer tout un programme comme cela, mais le moins quon puisse dire est que cela ne facilite pas la clart de lalgorithme. Il serait videmment plus simple de modliser un damier par un damier !

8.2 Tableaux deux dimensions


Linformatique nous offre la possibilit de dclarer des tableaux dans lesquels les valeurs ne sont pas repres par une seule, mais par deux coordonnes. Un tel tableau se dclare ainsi : Tableau Cases(7, 7) en Numrique Cela veut dire : rserve moi un espace de mmoire pour 8 x 8 entiers, et quand jaurai besoin de lune de ces valeurs, je les reprerai par deux indices (comme la bataille navale, ou Excel, la seule diffrence tant que pour les coordonnes, on nutilise pas de lettres, juste des chiffres). Pour notre problme de dames, les choses vont srieusement sclaircir. La case qui contient le pion est dornavant Cases(i, j). Et les quatre cases disponibles sont Cases(i1, j-1), Cases(i-1, j+1), Cases(i+1, j-1) et Cases(i+1, j+1).

REMARQUE ESSENTIELLE : Il ny a aucune diffrence qualitative entre un tableau deux dimensions ( i, j ) et un tableau une dimension ( i * j ). De mme que le jeu de dames quon vient dvoquer, tout problme qui peut tre modlis dune manire peut aussi tre modlis de lautre. Simplement, lune ou lautre de ces techniques correspond plus spontanment tel ou tel problme, et facilite donc (ou complique, si on a choisi la mauvaise option) lcriture et la lisibilit de lalgorithme.

147

Une autre remarque : une question classique propos des tableaux deux dimensions
est de savoir si le premier indice reprsente les lignes ou le deuxime les colonnes, ou linverse. Je ne rpondrai pas cette question non parce que jai dcid de bouder, mais

parce quelle na aucun sens. Lignes et Colonnes sont des concepts graphiques,
visuels, qui sappliquent des objets du monde rel ; les indices des tableaux ne sont que des coordonnes logiques, pointant sur des adresses de mmoire vive. Si cela ne vous convainc pas, pensez un jeu de bataille navale classique : les lettres doivent-elles dsigner les lignes et les chiffres les colonnes ? Aucune importance ! Chaque joueur peut mme choisir une convention diffrente, aucune importance ! Lessentiel est quune fois une convention choisie, un joueur conserve la mme tout au long de la partie, bien entendu.

148

PARTIE 8
nonc des Exercices Exercice 8.1
crivez un algorithme remplissant un tableau de 6 sur 13, avec des zros.

Exercice 8.2
Quel rsultat produira cet algorithme ? Tableau X(1, 2) en Entier Variables i, j, val en Entier Dbut Val 1 Pour i 0 1 Pour j 0 2 X(i, j) Val Val Val + 1 j Suivant i Suivant Pour i 0 1 Pour j 0 2 Ecrire X(i, j) j Suivant i Suivant Fin

149

Exercice 8.3
Quel rsultat produira cet algorithme ? Tableau X(1, 2) en Entier Variables i, j, val en Entier Dbut Val 1 Pour i 0 1 Pour j 0 2 X(i, j) Val Val Val + 1 j Suivant i Suivant Pour j 0 2 Pour i 0 1 Ecrire X(i, j) i Suivant j Suivant Fin

Exercice 8.4
Quel rsultat produira cet algorithme ? Tableau T(3, 1) en Entier Variables k, m, en Entier Dbut Pour k 0 3 Pour m 0 1 T(k, m) k + m m Suivant k Suivant Pour k 0 3 Pour m 0 1 Ecrire T(k, m) m Suivant k Suivant Fin

150

Exercice 8.5
Mmes questions, en remplaant la ligne : T(k, m) k + m par T(k, m) 2 * k + (m + 1) puis par : T(k, m) (k + 1) + 4 * m

Exercice 8.6
Soit un tableau T deux dimensions (12, 8) pralablement rempli de valeurs numriques. crire un algorithme qui recherche la plus grande valeur au sein de ce tableau.

Exercice 8.7
crire un algorithme de jeu de dames trs simplifi. Lordinateur demande lutilisateur dans quelle case se trouve son pion (quelle ligne, quelle colonne). On met en place un contrle de saisie afin de vrifier la validit des valeurs entres. Ensuite, on demande lutilisateur quel mouvement il veut effectuer : 0 (en haut gauche), 1 (en haut droite), 2 (en bas gauche), 3 (en bas droite). Si le mouvement est impossible (i.e. on sort du damier ), on le signale lutilisateur et on sarrte l . Sinon, on dplace le pion et on affiche le damier rsultant, en affichant un O pour une case vide et un X pour la case o se trouve le pion.

151

PARTIE 8
Corrigs des Exercices Exercice 8.1
Tableau Truc(5, 12) en Entier Debut Pour i 0 5 Pour j 0 12 Truc(i, j) 0 j Suivant i Suivant Fin

Exercice 8.2
Cet algorithme remplit un tableau de la manire suivante: X(0, 0) = 1 X(0, 1) = 2 X(0, 2) = 3 X(1, 0) = 4 X(1, 1) = 5 X(1, 2) = 6 Il crit ensuite ces valeurs lcran, dans cet ordre.

152

Exercice 8.3
Cet algorithme remplit un tableau de la manire suivante: X(0, 0) = 1 X(1, 0) = 4 X(0, 1) = 2 X(1, 1) = 5 X(0, 2) = 3 X(1, 2) = 6 Il crit ensuite ces valeurs lcran, dans cet ordre.

Exercice 8.4
Cet algorithme remplit un tableau de la manire suivante: T(0, 0) = 0 T(0, 1) = 1 T(1, 0) = 1 T(1, 1) = 2 T(2, 0) = 2 T(2, 1) = 3 T(3, 0) = 3 T(3, 1) = 4 Il crit ensuite ces valeurs lcran, dans cet ordre.

153

Exercice 8.5
Version a : cet algorithme remplit un tableau de la manire suivante: T(0, 0) = 1 T(0, 1) = 2 T(1, 0) = 3 T(1, 1) = 4 T(2, 0) = 5 T(2, 1) = 6 T(3, 0) = 7 T(3, 1) = 8 Il crit ensuite ces valeurs lcran, dans cet ordre. Version b : cet algorithme remplit un tableau de la manire suivante: T(0, 0) = 1 T(0, 1) = 5 T(1, 0) = 2 T(1, 1) = 6 T(2, 0) = 3 T(2, 1) = 7 T(3, 0) = 4 T(3, 1) = 8 Il crit ensuite ces valeurs lcran, dans cet ordre.

154

Exercice 8.6
Variables i, j, iMax, jMax en Numrique Tableau T(12, 8) en Numrique Le principe de la recherche dans un tableau deux dimensions est strictement le mme que dans un tableau une dimension, ce qui ne doit pas nous tonner. La seule chose qui change, c'est qu'ici le balayage requiert deux boucles imbriques, au lieu d'une seule. Debut ... iMax 0 jMax 0 Pour i 0 12 Pour j 0 8 Si T(i,j) > T(iMax,jMax) Alors iMax i jMax j FinSi j Suivant i Suivant Ecrire "Le plus grand lment est ", T(iMax, jMax) Ecrire "Il se trouve aux indices ", iMax, "; ", jMax Fin

Exercice 8.7
Variables i, j , posi, posj, i2, j2 en Entier Variables Correct, MoveOK en Boolen Tableau Damier(7, 7) en Boolen Tableau Mouv(3, 1) en Entier Le damier contenant un seul pion, on choisit de le coder l'conomie, en le reprsentant par un tableau de boolens deux dimensions. Dans chacun des emplacements de ce damier, Faux signifie l'absence du pion, Vrai sa prsence.

155

Par ailleurs, on emploie une mchante astuce, pas obligatoire, mais bien pratique dans beaucoup de situations. L'ide est de faire correspondre les choix possibles de l'utilisateur avec les mouvements du pion. On entre donc dans un tableau Mouv deux dimensions, les dplacements du pion selon les quatre directions, en prenant soin que chaque ligne du tableau corresponde une saisie de lutilisateur. La premire valeur tant le dplacement en i, la seconde le dplacement en j. Ceci nous pargnera par la suite de faire quatre fois les mmes tests. Debut Choix 0 : pion en haut droite Mouv(0, 0) -1 Mouv(0, 1) -1 Choix 1 : pion en haut droite Mouv(1, 0) -1 Mouv(1, 1) 1 Choix 2 : pion en bas gauche Mouv(2, 0) 1 Mouv(2, 1) -1 Choix 3 : pion en bas droite Mouv(3, 0) 1 Mouv(3, 1) 1 Initialisation du damier; le pion nest pour le moment nulle part Pour i 0 7 Pour j 0 7 Damier(i, j) Faux j suivant i suivant Saisie de la coordonne en i ("posi") avec contrle de saisie Correct Faux TantQue Non Correct Ecrire "Entrez la ligne de votre pion: " Lire posi Si posi >= 0 et posi <= 7 Alors Correct vrai 156

Finsi Fintantque Saisie de la coordonne en j ("posj") avec contrle de saisie Correct Faux TantQue Non Correct Ecrire "Entrez la colonne de votre pion: " Lire posj Si posj >= 0 et posj <= 7 Alors Correct Vrai Finsi Fintantque Positionnement du pion sur le damier virtuel. Damier(posi, posj) Vrai Saisie du dplacement, avec contrle Ecrire "Quel dplacement ?" Ecrire " - 0: en haut gauche" Ecrire " - 1: en haut droite" Ecrire " - 2: en bas gauche" Ecrire " - 3: en bas droite" Correct Faux TantQue Non Correct Lire Dep Si Dep >= 0 et Dep <= 3 Alors Correct Vrai FinSi FinTantQue i2 et j2 sont les futures coordonnes du pion. La variable boolenne MoveOK vrifie la validit de ce futur emplacement i2 posi + Mouv(Dep, 0) j2 posj + Mouv(Dep, 1) MoveOK i2 >= 0 et i2 <= 7 et j2 >= 0 et j2 <= 7 Cas o le dplacement est valide Si MoveOK Alors Damier(posi, posj) Faux Damier(i2, j2) Vrai 157

Affichage du nouveau damier Pour i 0 7 Pour j 0 7 Si Damier(i, j) Alors Ecrire " O "; Sinon Ecrire " X "; FinSi j suivant Ecrire "" i suivant Sinon Cas o le dplacement nest pas valide Ecrire "Mouvement impossible" FinSi Fin

158

8.3 Tableaux n dimensions


Si vous avez compris le principe des tableaux deux dimensions, sur le fond, il ny a aucun problme passer au maniement de tableaux trois, quatre, ou pourquoi pas neuf dimensions. Cest exactement la mme chose. Si je dclare un tableau Titi(2, 4, 3, 3), il sagit dun espace mmoire contenant 3 x 5 x 4 x 4 = 240 valeurs. Chaque valeur y est repre par quatre coordonnes. Le principal obstacle au maniement systmatique de ces tableaux plus de trois dimensions est que le programmeur, quand il conoit son algorithme, aime bien faire des petits gribouillis, des dessins immondes, imaginer les boucles dans sa tte, etc. Or, autant il est facile dimaginer concrtement un tableau une dimension, autant cela reste faisable pour deux dimensions, autant cela devient lapanage dune minorit privilgie pour les tableaux trois dimensions (je nen fais malheureusement pas partie) et hors de porte de tout mortel au-del. Cest comme a, lesprit humain a du mal se reprsenter les choses dans lespace, et crie grce ds quil saute dans lhyperespace (oui, cest comme a que a sappelle au del de trois dimensions). Donc, pour des raisons uniquement pratiques, les tableaux plus de trois dimensions sont rarement utiliss par des programmeurs non matheux (car les matheux, de par leur formation, ont une fcheuse propension manier des espaces n dimensions comme qui rigole, mais ce sont bien les seuls, et laissons les dans leur coin, cest pas des gens comme nous).

159

Partie 9 Les Fonctions Prdfinies


Il y a deux mthodes pour crire des programmes sans erreurs. Mais il ny a que la troisime qui marche - Anonyme Certains traitements ne peuvent tre effectus par un algorithme, aussi savant soit-il. Dautres ne peuvent ltre quau prix de souffrances indicibles.

Cest par exemple le cas du calcul du sinus dun angle : pour en obtenir une valeur approche, il faudrait appliquer une formule dune complexit vous glacer le sang. Aussi, que se passe-t-il sur les petites calculatrices que vous connaissez tous ? On vous fournit quelques touches spciales, dites touches de fonctions, qui vous permettent par exemple de connatre immdiatement ce rsultat. Sur votre calculatrice, si vous voulez connatre le sinus de 35, vous taperez 35, puis la touche SIN, et vous aurez le rsultat. Tout langage de programmation propose ainsi un certain nombre de fonctions ; certaines sont indispensables, car elles permettent deffectuer des traitements qui seraient sans elles impossibles. Dautres servent soulager le programmeur, en lui pargnant de longs et pnibles - algorithmes.

9.1 Structure gnrale des fonctions


Reprenons lexemple du sinus. Les langages informatiques, qui se doivent tout de mme de savoir faire la mme chose quune calculatrice 19F90, proposent gnralement une fonction SIN. Si nous voulons stocker le sinus de 35 dans la variable A, nous crirons : A Sin(35) Une fonction est donc constitue de trois parties :

le nom proprement dit de la fonction. Ce nom ne sinvente pas ! Il doit imprativement correspondre une fonction propose par le langage. Dans notre exemple, ce nom est SIN.

deux parenthses, une ouvrante, une fermante. Ces parenthses sont toujours

obligatoires, mme lorsqu'on n'crit rien l'intrieur.

160

une liste de valeurs, indispensables la bonne excution de la fonction. Ces valeurs sappellent des arguments, ou des paramtres. Certaines fonctions exigent un seul argument, dautres deux, etc. et dautres encore aucun. A noter que mme dans le cas de ces fonctions nexigeant aucun argument, les parenthses restent obligatoires. Le nombre darguments ncessaire pour une fonction donne ne sinvente pas : il est fix par le langage. Par exemple, la fonction sinus a besoin dun argument (ce nest pas surprenant, cet argument est la valeur de langle). Si vous essayez de lexcuter en lui donnant deux arguments, ou aucun, cela dclenchera une erreur lexcution. Notez galement que les arguments doivent tre dun certain type, et quil faut respecter ces types.

Et d'entre, nous trouvons : LE GAG DE LA JOURNEE Il consiste affecter une fonction, quelle qu'elle soit. Toute criture plaant une fonction gauche d'une instruction d'affectation est aberrante, pour deux raisons symtriques. d'une part, parce que nous le savons depuis le premier

chapitre de ce cours extraordinaire, on ne peut affecter qu'une variable, l'exclusion de tout autre chose. ensuite, parce qu'une fonction a pour rle de produire,

de renvoyer, de valoir (tout cela est synonyme), un rsultat. Pas d'en recevoir un, donc. L'affectation d'une fonction sera donc considre comme l'une des pires fautes algorithmiques, et punie comme telle. Tavernier...

161

PARTIE 9
nonc des Exercices Exercice 9.1
Parmi ces affectations (considres indpendamment les unes des autres), lesquelles provoqueront des erreurs, et pourquoi ? Variables A, B, C en Numrique Variables D, E en Caractre A Sin(B) A Sin(A + B * C) B Sin(A) Sin(D) D Sin(A / B) C Cos(Sin(A)

162

PARTIE 9
Corrigs des Exercices Exercice 9.1
A Sin(B) A Sin(A + B * C) D Sin(A / B) C Cos(Sin(A) Aucun problme Aucun problme Aucun problme si B est diffrent de zro Erreur ! Il manque une parenthse fermante

B Sin(A) Sin(D) Erreur ! D est en caractre

163

9.2 Les fonctions de texte


Une catgorie privilgie de fonctions est celle qui nous permet de manipuler des chanes de caractres. Nous avons dj vu quon pouvait facilement coller deux chanes lune lautre avec loprateur de concatnation &. Mais ce que nous ne pouvions pas faire, et qui va tre maintenant possible, cest pratiquer des extractions de chanes (moins douloureuses, il faut le noter, que les extractions dentaires). Tous les langages, je dis bien tous, proposent peu ou prou les fonctions suivantes, mme si le nom et la syntaxe peuvent varier dun langage lautre :

Len(chane) : renvoie le nombre de caractres dune chane Mid(chane,n1,n2) : renvoie un extrait de la chane, commenant au caractre n1
et faisant n2 caractres de long.

Ce sont les deux seules fonctions de chanes rellement indispensables. Cependant, pour nous pargner des algorithmes fastidieux, les langages proposent galement :

Left(chane,n) : renvoie les n caractres les plus gauche dans chane. Right(chane,n) : renvoie les n caractres les plus droite dans chane Trouve(chane1,chane2) : renvoie un nombre correspondant la position de
chane2 dans chane1. Si chane2 nest pas comprise dans chane1, la fonction renvoie zro.

Exemples : Len("Bonjour, a va ?") Len("") Mid("Zorro is back", 4, 7) Mid("Zorro is back", 12, 1) Left("Et pourtant", 8) Right("Et pourtant", 4) Trouve("Un pur bonheur", "pur") Trouve("Un pur bonheur", "techno") vaut vaut vaut vaut vaut vaut vaut vaut 16 0 "ro is b" "c" "Et pourt" "t" 4 0

Il existe aussi dans tous les langages une fonction qui renvoie le caractre correspondant un code Ascii donn (fonction Asc), et Lyce de Versailles (fonction

Chr) :
Asc("N") Chr(63) vaut vaut 78 "?"

164

Jinsiste ; moins de programmer avec un langage un peu particulier, comme le C, qui traite en ralit les chanes de caractres comme des tableaux, on ne pourrait pas se passer des deux fonctions Len et Mid pour traiter les chanes. Or, si les programmes informatiques ont frquemment traiter des nombres, ils doivent tout aussi frquemment grer des sries de caractres (des chanes). Je sais bien que cela devient un refrain, mais connatre les techniques de base sur les chanes est plus quutile : cest indispensable.

165

PARTIE 9
nonc des Exercices Exercice 9.2
Ecrivez un algorithme qui demande un mot lutilisateur et qui affiche lcran le nombre de lettres de ce mot (c'est vraiment tout bte).

Exercice 9.3
Ecrivez un algorithme qui demande une phrase lutilisateur et qui affiche lcran le nombre de mots de cette phrase. On suppose que les mots ne sont spars que par des espaces (et c'est dj un petit peu moins bte).

Exercice 9.4
Ecrivez un algorithme qui demande une phrase lutilisateur et qui affiche lcran le nombre de voyelles contenues dans cette phrase. On pourra crire deux solutions. La premire dploie une condition compose bien fastidieuse. La deuxime, en utilisant la fonction Trouve, allge considrablement l'algorithme.

Exercice 9.5
Ecrivez un algorithme qui demande une phrase lutilisateur. Celui-ci entrera ensuite le rang dun caractre supprimer, et la nouvelle phrase doit tre affiche (on doit rellement supprimer le caractre dans la variable qui stocke la phrase, et pas uniquement lcran).

166

Exercice 9.6 - Cryptographie 1


Un des plus anciens systmes de cryptographie (aisment dchiffrable) consiste dcaler les lettres dun message pour le rendre illisible. Ainsi, les A deviennent des B, les B des C, etc. Ecrivez un algorithme qui demande une phrase lutilisateur et qui la code selon ce principe. Comme dans le cas prcdent, le codage doit seffectuer au niveau de la variable stockant la phrase, et pas seulement lcran.

167

PARTIE 9
Corrigs des Exercices Exercice 9.2
Vous tiez prvenus, c'est bte comme chou ! Il suffit de se servir de la fonction Len, et c'est rgl : Variable Mot en Caractre Variable Nb en Entier Debut Ecrire "Entrez un mot : " Lire Mot Nb Len(Mot) Ecrire "Ce mot compte ", Nb, " lettres" Fin

Exercice 9.3
L, on est oblig de compter par une boucle le nombre d'espaces de la phrase, et on en dduit le nombre de mots. La boucle examine les caractres de la phrase un par un, du premier au dernier, et les compare l'espace. Variable Bla en Caractre Variables Nb, i en Entier Debut Ecrire "Entrez une phrase : " Lire Bla Nb 0 Pour i 1 Len(Bla) Si Mid(Bla, i , 1) = " " Alors Nb Nb + 1 FinSi i suivant Ecrire "Cette phrase compte ", Nb + 1, " mots" Fin

168

Exercice 9.4
Solution 1 : pour chaque caractre du mot, on pose une trs douloureuse condition compose. Le moins que l'on puisse dire, c'est que ce choix ne se distingue pas par son lgance. Cela dit, il marche, donc aprs tout, pourquoi pas. Variable Bla en Caractre Variables Nb, i, j en Entier Debut Ecrire "Entrez une phrase : " Lire Bla Nb 0 Pour i 1 Len(Bla) Si Mid(Bla, i, 1) = "a" ou Mid(Bla, i, 1) = "e" ou Mid(Bla, i, 1) = "i" ou Mid(Bla, i, 1) = "o" ou Mid(Bla, i, 1) = "u" ou Mid(Bla, i, 1) = "y" Alors Nb Nb + 1 FinSi i suivant Ecrire "Cette phrase compte ", Nb, " voyelles" Fin Solution 2 : on stocke toutes les voyelles dans une chane. Grce la fonction Trouve, on dtecte immdiatement si le caractre examin est une voyelle ou non. C'est nettement plus sympathique... Variables Bla, Voy en Caractre Variables Nb, i, j en Entier Debut Ecrire "Entrez une phrase : " Lire Bla Nb 0 Voy "aeiouy" Pour i 1 Len(Bla) Si Trouve(Voy, Mid(Bla, i, 1)) <> 0 Alors Nb Nb + 1 FinSi i suivant Ecrire "Cette phrase compte ", Nb, " voyelles" Fin

169

Exercice 9.5
Il n'existe aucun moyen de supprimer directement un caractre d'une chane autrement qu'en procdant par collage. Il faut donc concatner ce qui se trouve gauche du caractre supprimer, avec ce qui se trouve sa droite. Attention aux paramtres des fonctions Mid, ils n'ont rien d'vident ! Variable Bla en Caractre Variables Nb, i, j en Entier Dbut Ecrire "Entrez une phrase : " Lire Bla Ecrire "Entrez le rang du caractre supprimer : " Lire Nb L Len(Bla) Bla Mid(Bla, 1, Nb 1) & Mid(Bla, Nb + 1, L Nb) Ecrire "La nouvelle phrase est : ", Bla Fin

170

Exercice 9.6
Sur l'ensemble des exercices de cryptographie, il y a deux grandes stratgies possibles : - soit transformer les caractres en leurs codes ASCII. L'algorithme revient donc ensuite traiter des nombres. Une fois ces nombres transforms, il faut les reconvertir en caractres. - soit en rester au niveau des caractres, et procder directement aux transformations ce niveau. C'est cette dernire option qui est choisie ici, et pour tous les exercices de cryptographie venir. Pour cet exercice, il y a une rgle gnrale : pour chaque lettre, on dtecte sa position dans l'alphabet, et on la remplace par la lettre occupant la position suivante. Seul cas particulier, la vingt-sixime lettre (le Z) doit tre code par la premire (le A), et non par la vingt-septime, qui n'existe pas ! Variables Bla, Cod, Alpha en Caractre Variables i, Pos en Entier Dbut Ecrire "Entrez la phrase coder : " Lire Bla Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Cod "" Pour i 1 Len(Bla) Let Mid(Bla, i, 1) Si Let <> "Z" Alors Pos Trouve(Alpha, Let) Cod Cod & Mid(Alpha, Pos + 1, 1) Sinon Cod Cod & "A" FinSi i Suivant Bla Cod Ecrire "La phrase code est : ", Bla Fin

171

9.3 Trois fonctions numriques classiques


Partie Entire Une fonction extrmement rpandue est celle qui permet de rcuprer la partie entire dun nombre : Aprs : A Ent(3,228) A vaut 3

Cette fonction est notamment indispensable pour effectuer le clbrissime test de parit (voir exercice dans pas longtemps). Modulo Cette fonction permet de rcuprer le reste de la division dun nombre par un deuxime nombre. Par exemple : A Mod(10,3) B Mod(12,2) C Mod(44,8) A vaut 1 car 10 = 3*3 + 1 B vaut 0 car 12 = 6*2 C vaut 4 car 44 = 5*8 + 4

Cette fonction peut paratre un peu bizarre, est rserve aux seuls matheux. Mais vous aurez l aussi loccasion de voir dans les exercices venir que ce nest pas le cas. Gnration de nombres alatoires Une autre fonction classique , car trs utile, est celle qui gnre un nombre choisi au hasard. Tous les programmes de jeu, ou presque, ont besoin de ce type doutils, quil sagisse de simuler un lancer de ds ou le dplacement chaotique du vaisseau spatial de lenfer de la mort pilot par linfme Zorglub, qui veut faire main basse sur lUnivers (heureusement vous tes l pour len empcher, ouf). Mais il ny a pas que les jeux qui ont besoin de gnrer des nombres alatoires. La modlisation (physique, gographique, conomique, etc.) a parfois recours des modles dits stochastiques (chouette, encore un nouveau mot savant !). Ce sont des modles dans lesquels les variables se dduisent les unes des autres par des relations dterministes (autrement dit des calculs), mais o lon simule la part dincertitude par une fourchette de hasard.

172

Par exemple, un modle dmographique supposera quune femme a en moyenne x enfants au cours de sa vie, mettons 1,5. Mais il supposera aussi que sur une population donne, ce chiffre peut fluctuer entre 1,35 et 1,65 (si on laisse une part dincertitude de 10%). Chaque anne, cest--dire chaque srie de calcul des valeurs du modle, on aura ainsi besoin de faire choisir la machine un nombre au hasard compris entre 1,35 et 1,65. Dans tous les langages, cette fonction existe et produit le rsultat suivant : Aprs : Toto Alea() On a : 0 =< Toto < 1

En fait, on se rend compte avec un tout petit peu de pratique que cette fonction Ala peut nous servir pour gnrer nimporte quel nombre compris dans nimporte quelle fourchette. Je sais bien que mes lecteurs ne sont gure matheux, mais l, on reste franchement en de du niveau de feu le BEPC :

si Alea gnre un nombre compris entre 0 et 1, Alea multipli par Z produit un nombre entre 0 et Z. Donc, il faut estimer la largeur de la fourchette voulue et multiplier Alea par cette largeur dsire.

ensuite, si la fourchette ne commence pas zro, il va suffire dajouter ou de retrancher quelque chose pour caler la fourchette au bon endroit.

Par exemple, si je veux gnrer un nombre entre 1,35 et 1,65 ; la fourchette mesure 0,30 de large. Donc : 0 =< Alea()*0,30 < 0,30 Il suffit ds lors dajouter 1,35 pour obtenir la fourchette voulue. Si jcris que : Toto Alea()*0,30 + 1,35 Toto aura bien une valeur comprise entre 1,35 et 1,65. Et le tour est jou ! Bon, il est grand temps que vous montriez ce que vous avez appris

173

PARTIE 9
nonc des Exercices Exercice 9.7 - Cryptographie 2 - le chiffre de Csar
Une amlioration (relative) du principe prcdent consiste oprer avec un dcalage non de 1, mais dun nombre quelconque de lettres. Ainsi, par exemple, si lon choisit un dcalage de 12, les A deviennent des M, les B des N, etc. Ralisez un algorithme sur le mme principe que le prcdent, mais qui demande en plus quel est le dcalage utiliser. Votre sens proverbial de l'lgance vous interdira bien sr une srie de vingt-six "Si...Alors"

Exercice 9.8 - Cryptographie 3


Une technique ultrieure de cryptographie consista oprer non avec un dcalage systmatique, mais par une substitution alatoire. Pour cela, on utilise un alphabet-cl, dans lequel les lettres se succdent de manire dsordonne, par exemple : HYLUJPVREAKBNDOFSQZCWMGITX Cest cette cl qui va servir ensuite coder le message. Selon notre exemple, les A deviendront des H, les B des Y, les C des L, etc. Ecrire un algorithme qui effectue ce cryptage (lalphabet-cl sera saisi par lutilisateur, et on suppose qu'il effectue une saisie correcte).

174

Exercice 9.9 - Cryptographie 4 - le chiffre de Vigenre


Un systme de cryptographie beaucoup plus difficile briser que les prcdents fut invent au XVIe sicle par le franais Vigenre. Il consistait en une combinaison de diffrents chiffres de Csar. On peut en effet crire 25 alphabets dcals par rapport lalphabet normal :

lalphabet qui commence par B et finit par YZA lalphabet qui commence par C et finit par ZAB etc.

Le codage va seffectuer sur le principe du chiffre de Csar : on remplace la lettre dorigine par la lettre occupant la mme place dans lalphabet dcal. Mais la diffrence du chiffre de Csar, un mme message va utiliser non un, mais plusieurs alphabets dcals. Pour savoir quels alphabets doivent tre utiliss, et dans quel ordre, on utilise une cl. Si cette cl est "VIGENERE" et le message "Il faut coder cette phrase", on procdera comme suit : La premire lettre du message, I, est la 9e lettre de lalphabet normal. Elle doit tre code en utilisant lalphabet commenant par la premire lettre de la cl, V. Dans cet alphabet, la 9e lettre est le D. I devient donc D. La deuxime lettre du message, L, est la 12e lettre de lalphabet normal. Elle doit tre code en utilisant lalphabet commenant par la deuxime lettre de la cl, I. Dans cet alphabet, la 12e lettre est le S. L devient donc S, etc. Quand on arrive la dernire lettre de la cl, on recommence la premire. Ecrire lalgorithme qui effectue un cryptage de Vigenre, en demandant bien sr au dpart la cl lutilisateur.

Exercice 9.10
Ecrivez un algorithme qui demande un nombre entier lutilisateur. Lordinateur affiche ensuite le message "Ce nombre est pair" ou "Ce nombre est impair" selon le cas.

175

Exercice 9.11
Ecrivez les algorithmes qui gnrent un nombre Glup alatoire tel que

0 =< Glup < 2 1 =< Glup < 1 1,35 =< Glup < 1,65 Glup mule un d six faces 10,5 =< Glup < +6,5 Glup mule la somme du jet simultan de deux ds six faces

176

PARTIE 9
Corrigs des Exercices Exercice 9.7
Cet algorithme est une gnralisation du prcdent. Mais l, comme on ne connat pas d'avance le dcalage appliquer, on ne sait pas a priori combien de "cas particuliers", savoir de dpassements au-del du Z, il va y avoir. Il faut donc trouver un moyen simple de dire que si on obtient 27, il faut en ralit prendre la lettre numro 1 de l'alphabet, que si on obtient 28, il faut en ralit prendre la numro 2, etc. Ce moyen simple existe : il faut considrer le reste de la division par 26, autrement dit le modulo. Il y a une petite ruse supplmentaire appliquer, puisque 26 doit rester 26 et ne pas devenir 0. Variable Bla, Cod, Alpha en Caractre Variables i, Pos, Dcal en Entier Dbut Ecrire "Entrez le dcalage appliquer : " Lire Dcal Ecrire "Entrez la phrase coder : " Lire Bla Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Cod "" Pour i 1 Len(Bla) Let Mid(Bla, i, 1) Pos Trouve(Alpha, Let) NouvPos Mod(Pos + Dcal, 26) Si NouvPos = 0 Alors NouvPos 26 FinSi Cod Cod & Mid(Alpha, NouvPos, 1) i Suivant Bla Cod Ecrire "La phrase code est : ", Bla Fin

177

Exercice 9.8
L, c'est assez direct. Variable Bla, Cod, Alpha en Caractre Variables i, Pos, Dcal en Entier Dbut Ecrire "Entrez lalphabet cl : " Lire Cl Ecrire "Entrez la phrase coder : " Lire Bla Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Cod "" Pour i 1 Len(Bla) Let Mid(Bla, i, 1) Pos Trouve(Alpha, Let) Cod Cod & Mid(Cl, Pos, 1) i Suivant Bla Cod Ecrire "La phrase code est : ", Bla Fin

Exercice 9.9
Le codage de Vigenre nest pas seulement plus difficile briser; il est galement un peu plus raide programmer. La difficult essentielle est de comprendre quil faut deux boucles: lune pour parcourir la phrase coder, lautre pour parcourir la cl. Mais quand on y rflchit bien, ces deux boucles ne doivent surtout pas tre imbriques. Et en ralit, quelle que soit la manire dont on l'crit, elle nen forment quune seule. Variables Alpha, Bla, Cod, Cl, Let en Caractre Variables i, Pos, PosCl, Dcal en Entier Dbut Ecrire "Entrez la cl : " Lire Cl Ecrire "Entrez la phrase coder : " Lire Bla Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Cod "" PosCl 0 Pour i 1 Len(Bla) 178

On gre la progression dans la cl. Jai effectu cela " la main" par une boucle, mais un joli emploi de la fonction Modulo aurait permis une programmation en une seule ligne! Poscl Poscl + 1 Si PosCl > Len(Cl) Alors PosCl 1 FinSi On dtermine quelle est la lettre cl et sa position dans lalphabet LetCl Mid(Cl, PosCl, 1) PosLetCl Trouve(Alpha, LetCl) On dtermine la position de la lettre coder et le dcalage appliquer. L encore, une solution alternative aurait t demployer Mod : cela nous aurait pargn le Si Let Mid(Bla, i, 1) Pos Trouve(Alpha, Let) NouvPos Pos + PosLetCl Si NouvPos > 26 Alors NouvPos NouvPos 26 FinSi Cod Cod & Mid(Alpha, NouvPos, 1) i Suivant Bla Cod Ecrire "La phrase code est : ", Bla Fin

Exercice 9.10
On en revient des choses plus simples... Variable Nb en Entier Ecrire "Entrez votre nombre : " Lire Nb Si Nb/2 = Ent(Nb/2) Alors Ecrire "Ce nombre est pair" Sinon Ecrire "Ce nombre est pair" FinSi Fin

179

Exercice 9.11
a) Glup Alea() * 2 b) Glup Alea() * 2 1 c) Glup Alea() * 0,30 + 1,35 d) Glup Ent(Alea() * 6) + 1 e) Glup Alea() * 17 10,5 f) Glup Ent(Alea()*6) + Ent(Alea()*6) + 2

180

9.4 Les fonctions de conversion


Dernire grande catgorie de fonctions, l aussi disponibles dans tous les langages, car leur rle est parfois incontournable, les fonctions dites de conversion. Rappelez-vous ce que nous avons vu dans les premires pages de ce cours : il existe diffrents types de variables, qui dterminent notamment le type de codage qui sera utilis. Prenons le chiffre 3. Si je le stocke dans une variable de type alphanumrique, il sera cod en tant que caractre, sur un octet. Si en revanche je le stocke dans une variable de type entier, il sera cod sur deux octets. Et la configuration des bits sera compltement diffrente dans les deux cas. Une conclusion vidente, et sur laquelle on a dj eu l'occasion d'insister, c'est qu'on ne peut pas faire n'importe quoi avec n'importe quoi, et qu'on ne peut pas par exemple multiplier "3" et "5", si 3 et 5 sont stocks dans des variables de type caractre. Jusque l, pas de scoop me direz-vous, juste titre vous rpondrai-je, mais attendez donc la suite. Pourquoi ne pas en tirer les consquences, et stocker convenablement les nombres dans des variables numriques, les caractres dans des variables alphanumriques, comme nous l'avons toujours fait ? Parce qu'il y a des situations o on n'a pas le choix ! Nous allons voir ds le chapitre suivant un mode de stockage (les fichiers textes) o toutes les informations, quelles qu'elles soient, sont obligatoirement stockes sous forme de caractres. Ds lors, si l'on veut pouvoir rcuprer des nombres et faire des oprations dessus, il va bien falloir tre capable de convertir ces chanes en numriques. Aussi, tous les langages proposent-ils une palette de fonctions destines oprer de telles conversions. On trouvera au moins une fonction destine convertir une chane en numrique (appelons-la Cnum en pseudo-code), et une convertissant un nombre en caractre (Ccar).

181

Partie 10 Les Fichiers


On ne peut pas davantage crer des fichiers numriques non copiables que crer de leau non humide - Bruce Schneier

Jusqu prsent, les informations utilises dans nos programmes ne pouvaient provenir que de deux sources : soit elles taient inclues dans lalgorithme lui-mme, par le programmeur, soit elles taient entres en cours de route par lutilisateur. Mais videmment, cela ne suffit pas combler les besoins rels des informaticiens. Imaginons que lon veuille crire un programme grant un carnet dadresses. Dune excution du programme lautre, lutilisateur doit pouvoir retrouver son carnet jour, avec les modifications quil y a apportes la dernire fois quil a excut le programme. Les donnes du carnet dadresse ne peuvent donc tre inclues dans lalgorithme, et encore moins tre entres au clavier chaque nouvelle excution ! Les fichiers sont l pour combler ce manque. Ils servent stocker des informations

de manire permanente, entre deux excutions dun programme. Car si les variables,
qui sont je le rappelle des adresses de mmoire vive, disparaissent chaque fin dexcution, les fichiers, eux sont stocks sur des priphriques mmoire de masse (disquette, disque dur, CD Rom).

10.1 Organisation des fichiers


Vous connaissez tous le coup des papous : chez les papous, il y a les papous papas et les

papous pas papas. Chez les papous papas, il y a les papous papas poux et les papous papas pas poux, etc. Eh bien les fichiers, c'est un peu pareil : il y a des catgories, et
dans les catgories, des sortes, et dans les sortes des espces. Essayons donc de dbroussailler un peu tout cela... Un premier grand critre, qui diffrencie les deux grandes catgories de fichiers, est le suivant : le fichier est-il ou non organis sous forme de lignes successives ? Si oui, cela signifie vraisemblablement que ce fichier contient le mme genre d'information chaque ligne. Ces lignes sont alors appeles des enregistrements. Afin d'illuminer ces propos obscurs, prenons le cas classique, celui d'un carnet d'adresses. Le fichier est destin mmoriser les coordonnes (ce sont toujours les plus mal chausses, bien sr) d'un certain nombre de personnes. Pour chacune, il faudra 182

noter le nom, le prnom, le numro de tlphone et l'email. Dans ce cas, il peut paratre plus simple de stocker une personne par ligne du fichier (par enregistrement). Dit autrement, quand on prendra une ligne, on sera sr qu'elle contient les informations concernant une personne, et uniquement cela. Un fichier ainsi cod sous forme d'enregistrements est appel un fichier texte. En fait, entre chaque enregistrement, sont stocks les octets correspondants aux caractres CR (code Ascii 13) et LF (code Ascii 10), signifiant un retour au dbut de la ligne suivante. Le plus souvent, le langage de programmation, ds lors qu'il s'agit d'un fichier texte, grera lui-mme la lecture et l'criture de ces deux caractres chaque fin de ligne : c'est autant de moins dont le programmeur aura s'occuper. Le programmeur, lui, n'aura qu' dire la machine de lire une ligne, ou d'en crire une. Ce type de fichier est couramment utilis ds lors que l'on doit stocker des informations pouvant tre assimiles une base de donnes. Le second type de fichier, vous l'aurez devin, se dfinit a contrario : il rassemble les fichiers qui ne possdent pas de structure de lignes (d'enregistrement). Les octets, quels qu'il soient, sont crits la queue leu leu. Ces fichiers sont appels des fichiers

binaires. Naturellement, leur structure diffrente implique un traitement diffrent par


le programmeur. Tous les fichiers qui ne codent pas une base de donnes sont obligatoirement des fichiers binaires : cela concerne par exemple un fichier son, une image, un programme excutable, etc. . Toutefois, on en dira quelques mots un peu plus loin, il est toujours possible d'opter pour une structure binaire mme dans le cas o le fichier reprsente une base de donnes. Autre diffrence majeure entre fichiers texte et fichiers binaires : dans un fichier texte, toutes les donnes sont crites sous forme de... texte (tonnant, non ?). Cela veut dire que les nombres y sont reprsents sous forme de suite de chiffres (des chanes de caractres). Ces nombres doivent donc tre convertis en chanes lors de l'criture dans le fichier. Inversement, lors de la lecture du fichier, on devra convertir

ces chanes en nombre si l'on veut pouvoir les utiliser dans des calculs. En revanche,
dans les fichiers binaires, les donnes sont crites l'image exact de leur codage en mmoire vive, ce qui pargne toutes ces oprations de conversion. Ceci a comme autre implication qu'un fichier texte est directement lisible, alors qu'un

fichier binaire ne l'est pas (sauf bien sr en crivant soi-mme un programme


appropri). Si l'on ouvre un fichier texte via un diteur de textes, comme le bloc-notes de Windows, on y reconnatra toutes les informations (ce sont des caractres, stocks comme tels). La mme chose avec un fichier binaire ne nous produit l'cran qu'un galimatias de scribouillis incomprhensibles.

183

10.2 Structure des enregistrements


Savoir que les fichiers peuvent tre structurs en enregistrements, c'est bien. Mais savoir comment sont leur tour structurs ces enregistrements, c'est mieux. Or, l aussi, il y a deux grandes possibilits. Ces deux grandes variantes pour structurer les donnes au sein dun fichier texte sont la dlimitation et les champs de largeur fixe. Reprenons le cas du carnet dadresses, avec dedans le nom, le prnom, le tlphone et l'email. Les donnes, sur le fichier texte, peuvent tre organises ainsi : Structure n1 "Fonfec";"Sophie";0142156487;fonfec@yahoo.fr "Ztofrais";"Mlanie";0456912347;ztofrais@free.fr "Herbien";"Jean-Philippe";0289765194;vantard@free.fr "Hergbel";"Octave";0149875231;rg@aol.fr ou ainsi : Structure n2 Fonfec Ztofrais Herbien Hergbel Sophie Mlanie Jean-Philippe Octave 0142156487fonfec@yahoo.fr 0456912347ztofrais@free.fr 0289765194vantard@free.fr 0149875231rg@aol.fr

La structure n1 est dite dlimite ; Elle utilise un caractre spcial, appel caractre

de dlimitation, qui permet de reprer quand finit un champ et quand commence le


suivant. Il va de soi que ce caractre de dlimitation doit tre strictement interdit lintrieur de chaque champ, faute de quoi la structure devient proprement illisible. La structure n2, elle, est dite champs de largeur fixe. Il ny a pas de caractre de dlimitation, mais on sait que les x premiers caractres de chaque ligne stockent le nom, les y suivants le prnom, etc. Cela impose bien entendu de ne pas saisir un renseignement plus long que le champ prvu pour laccueillir.

Lavantage de la structure n1 est son faible encombrement en place mmoire ; il ny a aucun espace perdu, et un fichier texte cod de cette manire occupe le minimum de place possible. Mais elle possde en revanche un inconvnient majeur, qui est la lenteur de la lecture. En effet, chaque fois que lon rcupre une ligne dans le fichier, il faut alors parcourir un par un tous les caractres pour reprer chaque occurrence du caractre de sparation avant de pouvoir dcouper cette ligne en diffrents champs.

184

La structure n2, linverse, gaspille de la place mmoire, puisque le fichier est un vrai gruyre plein de trous. Mais dun autre ct, la rcupration des diffrents champs est trs rapide. Lorsquon rcupre une ligne, il suffit de la dcouper en diffrentes chanes de longueur prdfinie, et le tour est jou.

A lpoque o la place mmoire cotait cher, la structure dlimite tait souvent privilgie. Mais depuis bien des annes, la quasi-totalit des logiciels et des programmeurs optent pour la structure en champs de largeur fixe. Aussi, sauf mention contraire, nous ne travaillerons quavec des fichiers btis sur cette structure. Remarque importante : lorsqu'on choisit de coder une base de donnes sous forme de champs de largeur fixe, on peut alors trs bien opter pour un fichier binaire. Les enregistrements y seront certes la queue leu leu, sans que rien ne nous signale la jointure entre chaque enregistrement. Mais si on sait combien d'octets mesure invariablement chaque champ, on sait du coup combien d'octets mesure chaque enregistrement. Et on peut donc trs facilement rcuprer les informations : si je sais que dans mon carnet d'adresse, chaque individu occupe mettons 75 octets, alors dans mon fichier binaire, je dduis que l'individu n1 occupe les octets 1 75, l'individu n2 les octets 76 150, l'individu n3 les octets 151 225, etc.

10.3 Types daccs


On vient de voir que lorganisation des donnes au sein des enregistrements du fichier pouvait seffecteur selon deux grands choix stratgiques. Mais il existe une autre ligne de partage des fichiers : le type daccs, autrement dit la manire dont la machine va pouvoir aller rechercher les informations contenues dans le fichier. On distingue :

Laccs squentiel : on ne peut accder qu la donne suivant celle quon vient de lire. On ne peut donc accder une information qu'en ayant au pralable examin celle qui la prcde. Dans le cas d'un fichier texte, cela signifie qu'on lit le fichier ligne par ligne (enregistrement par enregistrement).

Laccs direct (ou alatoire) : on peut accder directement lenregistrement de son choix, en prcisant le numro de cet enregistrement. Mais cela veut souvent dire une gestion fastidieuse des dplacements dans le fichier.

Laccs index : pour simplifier, il combine la rapidit de l'accs direct et la simplicit de l'accs squentiel (en restant toutefois plus compliqu). Il est particulirement adapt au traitement des gros fichiers, comme les bases de donnes importantes.

185

A la diffrence de la prcdente, cette typologie ne caractrise pas la structure ellemme du fichier. En fait, tout fichier peut tre utilis avec lun ou lautre des trois types daccs. Le choix du type daccs nest pas un choix qui concerne le fichier luimme, mais uniquement la manire dont il va tre trait par la machine. Cest donc dans

le programme, et seulement dans le programme, que lon choisit le type daccs souhait.
Pour conclure sur tout cela, voici un petit tableau rcapitulatif :
Fichiers Texte On les utilise pour stocker... des bases de donnes Fichiers Binaires tout, y compris des bases de donnes. Ils n'ont pas de structure apparente. lignes (enregistrements) Ce sont des octets crits la suite les uns des autres. exclusivement en tant que caractres

Ils

sont

structurs

sous

forme de...

Les donnes y sont crites...

comme en mmoire vive

Les

enregistrements

sont

au choix, avec un sparateur ou en champs de largeur fixe

en champs de largeur fixe, s'il s'agit d'un fichier codant des enregistrements

eux-mmes structurs...

Le fichier est lisible clairement Lisibilit avec n'importe quel diteur de texte

Le fichier a l'apparence d'une suite d'octets illisibles

Lecture du fichier

On ne peut lire le fichier que ligne par ligne

On peut lire les octets de son choix (y compris la totalit du fichier d'un coup)

Dans le cadre de ce cours, on se limitera volontairement au type de base : le fichier texte en accs squentiel. Pour des informations plus compltes sur la gestion des fichiers binaires et des autres types d'accs, il vous faudra... chercher ailleurs.

186

10.4 Instructions (fichiers texte en accs squentiel)


Si lon veut travailler sur un fichier, la premire chose faire est de louvrir. Cela se fait en attribuant au fichier un numro de canal. On ne peut ouvrir quun seul fichier par canal, mais quel que soit le langage, on dispose toujours de plusieurs canaux, donc pas de soucis. Limportant est que lorsquon ouvre un fichier, on stipule ce quon va en faire : lire,

crire ou ajouter.

Si on ouvre un fichier pour lecture, on pourra uniquement rcuprer les informations quil contient, sans les modifier en aucune manire.

Si on ouvre un fichier pour criture, on pourra mettre dedans toutes les informations que lon veut. Mais les informations prcdentes, si elles existent, seront intgralement crases Et on ne pourra pas accder aux informations qui existaient prcdemment.

Si on ouvre un fichier pour ajout, on ne peut ni lire, ni modifier les informations existantes. Mais on pourra, comme vous commencez vous en douter, ajouter de nouvelles lignes (je rappelle qu'au terme de lignes, on prfrera celui denregistrements.

Au premier abord, ces limitations peuvent sembler infernales. Au deuxime rabord, elles le sont effectivement. Il n'y a mme pas d'instructions qui permettent de supprimer un enregistrement d'un fichier ! Toutefois, avec un peu dhabitude, on se rend compte que malgr tout, mme si ce nest pas toujours marrant, on peut quand mme faire tout ce quon veut avec ces fichiers squentiels. Pour ouvrir un fichier texte, on crira par exemple : Ouvrir "Exemple.txt" sur 4 en Lecture Ici, "Exemple.txt" est le nom du fichier sur le disque dur, 4 est le numro de canal, et ce fichier a donc t ouvert en lecture. Vous laviez sans doute pressenti.

187

Allons plus loin : Variables Truc, Nom, Prnom, Tel, Mail en Caractres Dbut Ouvrir "Exemple.txt" sur 4 en Lecture LireFichier 4, Truc Nom Mid(Truc, 1, 20) Prnom Mid(Truc, 21, 15) Tel Mid(Truc, 36, 10) Mail Mid(Truc, 46, 20) Linstruction LireFichier rcupre donc dans la variable spcifie lenregistrement suivant dans le fichier... "suivant", oui, mais par rapport quoi ? Par rapport au dernier enregistrement lu. Cest en cela que le fichier est dit squentiel. En loccurrence, on rcupre donc la premire ligne, donc, le premier enregistrement du fichier, dans la variable Truc. Ensuite, le fichier tant organis sous forme de champs de largeur fixe, il suffit de trononner cette variable Truc en autant de morceaux quil y a de champs dans lenregistrement, et denvoyer ces tronons dans diffrentes variables. Et le tour est jou. La suite du raisonnement simpose avec une logique impitoyable : lire un fichier squentiel de bout en bout suppose de programmer une boucle. Comme on sait rarement lavance combien denregistrements comporte le fichier, la combine consiste neuf fois sur dix utiliser la fonction EOF (acronyme pour End Of File). Cette fonction renvoie la valeur Vrai si on a atteint la fin du fichier (auquel cas une lecture supplmentaire dclencherait une erreur). Lalgorithme, ultra classique, en pareil cas est donc : Variable Truc en Caractre Ouvrir "Exemple.txt" sur 5 en Lecture Dbut Tantque Non EOF(5) LireFichier 5, Truc FinTantQue Fermer 5 Fin Et neuf fois sur dix galement, si lon veut stocker au fur et mesure en mmoire vive les informations lues dans le fichier, on a recours un ou plusieurs tableaux. Et comme on ne sait pas davance combien il y aurait denregistrements dans le fichier, on ne sait pas davantage combien il doit y avoir demplacements dans les tableaux. Quimporte, les programmeurs avertis que vous tes connaissent la combine des tableaux dynamiques. 188

En rassemblant lensemble des connaissances acquises, nous pouvons donc crire le prototype du code qui effectue la lecture intgrale dun fichier squentiel, tout en recopiant lensemble des informations en mmoire vive : Tableaux Nom(), Prnom(), Tel(), Mail() en Caractre Dbut Ouvrir "Exemple.txt" sur 5 en Lecture i -1 Tantque Non EOF(5) LireFichier 5, Truc ii+1 Redim Nom(i) Redim Prnom(i) Redim Tel(i) Redim Mail(i) Nom(i) Mid(Truc, 1, 20) Prnom(i) Mid(Truc, 21, 15) Tel(i) Mid(Truc, 36, 10) Mail(i) Mid(Truc, 46, 20) FinTantQue Fermer 5 Fin Ici, on a fait le choix de recopier le fichier dans quatre tableaux distincts. On aurait pu galement tout recopier dans un seul tableau : chaque case du tableau aurait alors t occupe par une ligne complte (un enregistrement) du fichier. Cette solution nous aurait fait gagner du temps au dpart, mais elle alourdit ensuite le code, puisque chaque fois que l'on a besoin d'une information au sein d'une case du tableau, il faudra aller procder une extraction via la fonction MID. Ce qu'on gagne par un bout, on le perd donc par l'autre. Mais surtout, comme on va le voir bientt, il y a autre possibilit, bien meilleure, qui cumule les avantages sans avoir aucun des inconvnients. Nanmoins, ne nous impatientons pas, chaque chose en son temps, et revenons pour le moment la solution que nous avons employe ci-dessus. Pour une opration dcriture, ou dajout, il faut dabord imprativement, sous peine de semer la panique dans la structure du fichier, constituer une chane quivalente la nouvelle ligne du fichier. Cette chane doit donc tre calibre de la bonne manire, avec les diffrents champs qui tombent aux emplacements corrects. Le moyen le plus simple pour spargner de longs traitements est de procder avec des chanes 189

correctement dimensionnes ds leur dclaration (la plupart des langages offrent cette possibilit) : Ouvrir "Exemple.txt" sur 3 en Ajout Variable Truc en Caractre Variables Nom*20, Prnom*15, Tel*10, Mail*20 en Caractre Une telle dclaration assure que quel que soit le contenu de la variable Nom, par exemple, celle-ci comptera toujours 20 caractres. Si son contenu est plus petit, alors un nombre correct despaces sera automatiquement ajout pour combler. Si on tente dy entrer un contenu trop long, celui-ci sera automatiquement tronqu. Voyons la suite : Nom "Jokers" Prnom "Midnight" Tel "0348946532" Mail allstars@rockandroll.com Truc Nom & Prnom & Tel & Mail EcrireFichier 3, Truc Et pour finir, une fois quon en a termin avec un fichier, il ne faut pas oublier de fermer ce fichier. On libre ainsi le canal quil occupait (et accessoirement, on pourra utiliser ce canal dans la suite du programme pour un autre fichier ou pour le mme).

190

PARTIE 10
nonc des Exercices Exercice 10.1
Quel rsultat cet algorithme produit-il ? Variable Truc en Caractre Dbut Ouvrir "Exemple.txt" sur 5 en Lecture Tantque Non EOF(5) LireFichier 5, Truc Ecrire Truc FinTantQue Fermer 5 Fin

Exercice 10.2
Ecrivez lalgorithme qui produit un rsultat similaire au prcdent, mais le fichier texte "Exemple.txt" est cette fois de type dlimit (caractre de dlimitation : /). On produira l'cran un affichage o pour des raisons esthtiques, ce caractre sera remplac avec des espaces.

Exercice 10.3
On travaille avec le fichier du carnet dadresses en champs de largeur fixe. Ecrivez un algorithme qui permet lutilisateur de saisir au clavier un nouvel individu qui sera ajout ce carnet dadresses.

191

PARTIE 10
Corrigs des Exercices Exercice 10.1
Cet algorithme crit l'intgralit du fichier "Exemple.txt" l'cran

Exercice 10.2
Variable Truc en Caractre Variable i en Entier Debut Ouvrir "Exemple.txt" sur 5 en Lecture Tantque Non EOF(5) LireFichier 5, Truc Pour i 1 Len(Truc) Si Mid(Truc, i, 1) = "/" Alors Ecrire " " Sinon Ecrire Mid(Truc, i, 1) FinSi i Suivant FinTantQue Fermer 5

192

Exercice 10.3
Variables Nom * 20, Prnom * 17, Tel * 10, Mail * 20, Lig en Caractre Debut Ecrire "Entrez le nom : " Lire Nom Ecrire "Entrez le prnom : " Lire Prnom Ecrire "Entrez le tlphone : " Lire Tel Ecrire "Entrez le nom : " Lire Mail Lig Nom & Prnom & Tel & Mail Ouvrir "Adresse.txt" sur 1 pour Ajout EcrireFichier 1, Lig Fermer 1 Fin

193

10.5 Stratgies de traitement


Il existe globalement deux manires de traiter les fichiers textes :

lune consiste sen tenir au fichier proprement dit, c'est--dire modifier

directement (ou presque) les informations sur le disque dur. Cest parfois un peu
acrobatique, lorsquon veut supprimer un lment dun fichier : on programme alors une boucle avec un test, qui recopie dans un deuxime fichier tous les lments du premier fichier sauf un ; et il faut ensuite recopier intgralement le deuxime fichier la place du premier fichier Ouf.

lautre stratgie consiste, comme on la vu, passer par un ou plusieurs

tableaux. En fait, le principe fondamental de cette approche est de commencer,


avant toute autre chose, par recopier lintgralit du fichier de dpart en

mmoire vive. Ensuite, on ne manipule que cette mmoire vive (concrtement, un


ou plusieurs tableaux). Et lorsque le traitement est termin, on recopie nouveau dans l'autre sens, depuis la mmoire vive vers le fichier dorigine. Les avantages de la seconde technique sont nombreux, et 99 fois sur 100, c'est ainsi qu'il faudra procder :

la rapidit : les accs en mmoire vive sont des milliers de fois plus rapides (nanosecondes) que les accs aux mmoires de masse (millisecondes au mieux pour un disque dur). En basculant le fichier du dpart dans un tableau, on minimise le nombre ultrieur d'accs disque, tous les traitements tant ensuite effectus en mmoire.

la facilit de programmation : bien quil faille crire les instructions de recopie du fichier dans le tableau, pour peu quon doive tripoter les informations dans tous les sens, cest largement plus facile de faire cela avec un tableau quavec des fichiers.

Pourquoi, alors, demanderez-vous haletants, ne fait-on pas cela tous les coups ? Y a-til des cas o il vaut mieux en rester aux fichiers et ne pas passer par des tableaux ? La recopie dun trs gros fichier en mmoire vive exige des ressources qui peuvent atteindre des dimensions considrables. Donc, dans le cas d'immenses fichiers (trs rares, cependant), cette recopie en mmoire peut s'avrer problmatique. Toutefois, lorsque le fichier contient des donnes de type non homognes (chanes, numriques, etc.) cela risque dtre coton pour le stocker dans un tableau unique : il va falloir dclarer plusieurs tableaux, dont le maniement au final peut tre aussi lourd que celui des fichiers de dpart. 194

A moins... d'utiliser une ruse : crer des types de variables personnaliss, composs dun collage de plusieurs types existants (10 caractres, puis un numrique, puis 15 caractres, etc.). Ce type de variable s'appelle un type structur. Cette technique, bien quelle ne soit pas vraiment difficile, exige tout de mme une certaine aisance... Voil pourquoi on va maintenant en dire quelques mots.

10.6 Donnes structures


10.6.1 Donnes structures simples
Nostalgiques du Lego, cette partie va vous plaire. Comment construire des trucs pas possibles et des machins pas croyables avec juste quelques lments de base ? Vous n'allez pas tarder le savoir... Jusqu' prsent, voil comment se prsentaient nos possibilits en matire de mmoire vive : nous pouvions rserver un emplacement pour une information d'un certain type. Un tel emplacement s'appelle une variable (quand vous en avez assez de me voir radoter, vous le dites). Nous pouvions aussi rserver une srie d'emplacement numrots pour une srie d'informations de mme type. Un tel emplacement s'appelle un tableau (mme remarque). Eh bien toujours plus haut, toujours plus fort, voici maintenant que nous pouvons rserver une srie d'emplacements pour des donnes de type diffrents. Un tel emplacement s'appelle une variable structure. Son utilit, lorsqu'on traite des fichiers texte (et mme, des fichiers en gnral), saute aux yeux : car on va pouvoir calquer chacune des lignes du fichier en mmoire vive, et considrer que chaque enregistrement sera recopi dans une variable et une seule, qui lui sera adapte. Ainsi, le problme du "dcoupage" de chaque enregistrement en diffrentes variables (le nom, le prnom, le numro de tlphone, etc.) sera rsolu d'avance, puisqu'on aura une structure, un gabarit, en quelque sorte, tout prt d'avance pour accueillir et prdcouper nos enregistrements. Attention toutefois ; lorsque nous utilisions des variables de type prdfini, comme des entiers, des boolens, etc. nous n'avions qu'une seule opration effectuer : dclarer la variable en utilisant un des types existants. A prsent que nous voulons crer un nouveau type de variable (par assemblage de types existants), il va falloir faire deux choses : d'abord, crer le type. Ensuite seulement, dclarer la (les) variable(s) d'aprs ce type. Reprenons une fois de plus l'exemple du carnet d'adresses. Je sais, c'est un peu comme mes blagues, a lasse (l, pour ceux qui s'endorment, je signale qu'il y a un jeu de mots), mais c'est encore le meilleur moyen d'avoir un point de comparaison.

195

Nous allons donc, avant mme la dclaration des variables, crer un type, une structure, calque sur celle de nos enregistrements, et donc prte les accueillir : Structure Bottin Nom en Caractre * 20 Prnom en Caractre * 15 Tel en Caractre * 10 Mail en Caractre * 20 Fin Structure Ici, Bottin est le nom de ma structure. Ce mot jouera par la suite dans mon programme exactement le mme rle que les types prdfinis comme Numrique, Caractre ou Boolen. Maintenant que la structure est dfinie, je vais pouvoir, dans la section du programme o s'effectuent les dclarations, crer une ou des variables correspondant cette structure : Variable Individu en Bottin Et si cela me chantait, je pourrais remplir les diffrentes informations contenues au sein de la variable Individu de la manire suivante : Individu "Joker", "Midnight", "0348946532", "allstars@rock.com" On peut aussi avoir besoin d'accder un seul des champs de la variable structure. Dans ce cas, on emploie le point : Individu.Nom "Joker" Individu.Prnom "Midnight" Individu.Tel "0348946532" Individu.Mail "allstars@rockandroll.com" Ainsi, crire correctement une information dans le fichier est un jeu d'enfant, puisqu'on dispose d'une variable Individu au bon gabarit. Une fois remplis les diffrents champs de cette variable - ce qu'on vient de faire -, il n'y a plus qu' envoyer celle-ci directement dans le fichier. Et zou ! EcrireFichier 3, Individu De la mme manire, dans l'autre sens, lorsque j'effectue une opration de lecture dans le fichier Adresses, ma vie en sera considrablement simplifie : la structure tant faite pour cela, je peux dornavant me contenter de recopier une ligne du fichier dans une variable de type Bottin, et le tour sera jou. Pour charger l'individu suivant du fichier en mmoire vive, il me suffira donc d'crire : LireFichier 5, Individu 196

Et l, direct, j'ai bien mes quatre renseignements accessibles dans les quatre champs de la variable individu. Tout cela, videmment, parce que la structure de ma variable Individu correspond parfaitement la structure des enregistrements de mon fichier. Dans le cas contraire, pour reprendre une expression connue, on ne dcoupera pas selon les pointills, et alors, je pense que vous imaginez le carnage...

10.6.2 Tableaux de donnes structures


Et encore plus loin, encore plus vite et encore plus fort. Si partir des types simples, on peut crer des variables et des tableaux de variables, vous me voyez venir, partir des types structurs, on peut crer des variables structures... et des tableaux de

variables structures.
L, bien que pas si difficile que cela, a commence devenir vraiment balze. Parce que cela veut dire que nous disposons d'une manire de grer la mmoire vive qui va correspondre exactement la structure d'un fichier texte (d'une base de donnes). Comme les structures se correspondent parfaitement, le nombre de manipulations effectuer, autrement dit de lignes de programme crire, va tre rduit au minimum. En fait, dans notre tableau structur, les champs des emplacements du tableau correspondront aux champs du fichier texte, et les indices des emplacements du tableaux correspondront aux diffrentes lignes du fichier. Voici, titre d'illustration, l'algorithme complet de lecture du fichier Adresses et de sa recopie intgrale en mmoire vive, en employant un tableau structur. Structure Bottin Nom en Caractre * 20 Prnom en Caractre * 15 Tel en Caractre * 10 Mail en Caractre * 20 Fin Structure Tableau Mespotes() en Bottin Dbut Ouvrir "Exemple.txt" sur 3 en Lecture i -1 Tantque Non EOF(3) ii+1 Redim Mespotes(i) LireFichier 3, Mespotes(i) FinTantQue Fermer 3 Fin 197

Une fois que ceci est rgl, on a tout ce qu'il faut ! Si je voulais crire, un moment, le mail de l'individu n13 du fichier (donc le n12 du tableau) l'cran, il me suffirait de passer l'ordre : Ecrire Mespotes(12).Mail Et voil le travail. Simplissime, non ? REMARQUE FINALE SUR LES DONNES STRUCTURES Mme si le domaine de prdilection des donnes structures est la gestion de fichiers, on peut tout fait y avoir recours dans d'autres contextes, et organiser plus systmatiquement les variables d'un programme sous la forme de telles structures. En programmation dite procdurale, celle que nous tudions ici, ce type de stratgie reste relativement rare. Mais rare ne veut pas dire interdit, ou mme inutile. Et nous aurons l'occasion de voir qu'en programmation objet, ce type d'organisation des donnes devient fondamental. Mais ceci est un autre cours...

10.7 Rcapitulatif gnral


Lorsqu'on est amen travailler avec des donnes situes dans un fichier, plusieurs choix, en partie indpendants les uns des autres, doivent tre faits :

sur l'organisation en enregistrements du fichier (choix entre fichier texte ou

fichier binaire)

sur le mode d'accs aux enregistrements du fichier (direct ou squentiel) sur l'organisation des champs au sein des enregistrements (prsence de

sparateurs ou champs de largeur fixe)

sur la mthode de traitement des informations (recopie intgrale pralable du fichier en mmoire vive ou non)

sur le type de variables utilises pour cette recopie en mmoire vive (plusieurs tableaux de type simple, ou un seul tableau de type structur).

198

Chacune de ces options prsente avantages et inconvnients, et il est impossible de donner une rgle de conduite valable en toute circonstance. Il faut connatre ces techniques, et savoir choisir la bonne option selon le problme traiter. Voici une srie de (pas toujours) petits exercices sur les fichiers texte, que l'on pourra traiter en employant les types structurs (c'est en tout cas le cas dans les corrigs).

199

PARTIE 10
nonc des Exercices Exercice 10.4
Mme question, mais cette fois le carnet est suppos tre tri par ordre alphabtique. Lindividu doit donc tre insr au bon endroit dans le fichier.

Exercice 10.5
Ecrivez un algorithme qui permette de modifier un renseignement (pour simplifier, disons uniquement le nom de famille) dun membre du carnet dadresses. Il faut donc demander lutilisateur quel est le nom modifier, puis quel est le nouveau nom, et mettre jour le fichier. Si le nom recherch n'existe pas, le programme devra le signaler.

Exercice 10.6
Ecrivez un algorithme qui trie les individus du carnet dadresses par ordre alphabtique.

Exercice 10.7
Soient Toto.txt et Tata.txt deux fichiers dont les enregistrements ont la mme structure. Ecrire un algorithme qui recopie tout le fichier Toto dans le fichier Tutu, puis sa suite, tout le fichier Tata (concatnation de fichiers).

Exercice 10.8
Ecrire un algorithme qui supprime dans notre carnet d'adresses tous les individus dont le mail est invalide (pour employer un critre simple, on considrera que sont invalides les mails ne comportant aucune arobase, ou plus d'une arobase).

200

Exercice 10.9
Les enregistrements dun fichier contiennent les deux champs Nom (chane de caractres) et Montant (Entier). Chaque enregistrement correspond une vente conclue par un commercial dune socit. On veut mmoriser dans un tableau, puis afficher l'cran, le total de ventes par vendeur. Pour simplifier, on suppose que le fichier de dpart est dj tri alphabtiquement par vendeur.

201

PARTIE 10
Corrigs des Exercices Exercice 10.4
L, comme indiqu dans le cours, on passe par un tableau de strutures en mmoire vive, ce qui est la technique la plus frquemment employe. Le tri - qui est en fait un simple test - sera effectu sur le premier champ (nom). Structure Bottin Nom en Caractre * 20 Prnom en Caractre * 15 Tel en Caractre * 10 Mail en Caractre * 20 Fin Structure Tableau Mespotes() en Bottin Variables MonPote, Nouveau en Bottin Variables i, j en Numrique Debut Ecrire "Entrez le nom : " Lire Nouveau.Nom Ecrire "Entrez le prnom : " Lire Nouveau.Prnom Ecrire "Entrez le tlphone : " Lire Nouveau.Tel Ecrire "Entrez le mail : " Lire Nouveau.Mail

202

On recopie l'intgralit de "Adresses" dans MesPotes(). Et aprs tout, c'est l'occasion : quand on tombe au bon endroit, on insre subrepticement notre nouveau copain dans le tableau. Ouvrir "Adresse.txt" sur 1 pour Lecture i -1 insr Faux Tantque Non EOF(1) ii+1 Redim MesPotes(i) LireFichier 1, MonPote Si MonPote.Nom > Nouveau.Nom et Non Insr Alors MesPotes(i) Nouveau Insr Vrai ii+1 Redim MesPotes(i) FinSi MesPotes(i) MonPote FinTantQue Fermer 1 Et le tour est quasiment jou. Il ne reste plus qu' rebalancer tel quel l'intgralit du tableau MesPotes dans le fichier, en crasant l'ancienne version. Ouvrir "Adresse.txt" sur 1 pour Ecriture Pour j 0 i EcrireFichier 1, MesPotes(j) j suivant Fermer 1 Fin

203

Exercice 10.5
C'est un peu du mme tonneau que ce qu'on vient de faire, quelques variantes prs. Il y a essentiellement une petite gestion de flag pour faire bonne mesure. Structure Bottin Nom en Caractre * 20 Prnom en Caractre * 15 Tel en caractre * 10 Mail en Caractre * 20 Fin Structure Tableau Mespotes() en Bottin Variables MonPote en Bottin Variables Ancien, Nouveau en Caractre*20 Variables i, j en Numrique Variable Trouv en Boolen Debut Ecrire "Entrez le nom modifier : " Lire Ancien Ecrire "Entrez le nouveau nom : " Lire Nouveau On recopie l'intgralit de "Adresses" dans Fic, tout en recherchant le clampin. Si on le trouve, on procde la modification. Ouvrir Adresse.txt sur 1 pour Lecture i -1 Trouv Faux Tantque Non EOF(1) ii+1 Redim MesPotes(i) LireFichier 1, MonPote Si MonPote.Nom = Ancien.Nom Alors Trouv Vrai MonPote.Nom Nouveau FinSi MesPotes(i) MonPote FinTantQue Fermer 1

204

On recopie ensuite l'intgralit de Fic dans "Adresse" Ouvrir "Adresse.txt" sur 1 pour Ecriture Pour j 0 i EcrireFichier 1, MesPotes(j) j Suivant Fermer 1 Et un petit message pour finir ! Si Trouv Alors Ecrire "Modification effectue" Sinon Ecrire "Nom inconnu. Aucune modification effectue" FinSi Fin

Exercice 10.6
L, c'est un tri sur un tableau de structures, rien de plus facile. Et on est bien content de disposer des structures, autrement dit de ne se coltiner qu'un seul tableau... Structure Bottin Nom en Caractre * 20 Prnom en Caractre * 15 Tel en caractre * 10 Mail en Caractre * 20 Fin Structure Tableau Mespotes() en Bottin Variables Mini en Bottin Variables i, j en Numrique Debut On recopie l'intgralit de "Adresses" dans MesPotes... Ouvrir "Adresse.txt" sur 1 pour Lecture i -1 Tantque Non EOF(1) ii+1 Redim MesPotes(i) LireFichier 1, MesPotes(i) FinTantQue Fermer 1 205

On trie le tableau selon l'algorithme de tri par insertion dj tudi, en utilisant le champ Nom de la structure : Pour j 0 i 1 Mini MesPotes(j) posmini j Pour k j + 1 i Si MesPotes(k).Nom < Mini.Nom Alors mini MesPotes(k) posmini k Finsi k suivant MesPotes(posmini) MesPotes(j) MesPotes(j) Mini j suivant On recopie ensuite l'intgralit du tableau dans "Adresse" Ouvrir "Adresse.txt" sur 1 pour Ecriture Pour j 0 i EcrireFichier 1, MesPotes(j) j suivant Fermer 1 Fin

206

Exercice 10.7
Bon, celui-l est tellement idiot qu'on n'a mme pas besoin de passer par des tableaux en mmoire vive. Variable Lig en Caractre Dbut Ouvrir "Tutu.txt" sur 1 pour Ajout Ouvrir Toto.txt sur 2 pour Lecture Tantque Non EOF(2) LireFichier 2, Lig EcrireFichier 1, Lig FinTantQue Fermer 2 Ouvrir Tata.txt sur 3 pour Lecture Tantque Non EOF(3) LireFichier 2, Lig EcrireFichier 1, Lig FinTantQue Fermer 3 Fermer 1 Fin

Exercice 10.8
On va liminer les mauvaises entres ds la recopie : si l'enregistrement ne prsente pas un mail valide, on l'ignore, sinon on le copie dans le tableau. Structure Bottin Nom en Caractre * 20 Prnom en Caractre * 15 Tel en caractre * 10 Mail en Caractre * 20 Fin Structure Tableau Mespotes() en Bottin Variable MonPote en Bottin Variables i, j en Numrique Debut

207

On recopie "Adresses" dans MesPotes en testant le mail... Ouvrir "Adresse.txt" sur 1 pour Lecture i -1 Tantque Non EOF(1) LireFichier 1, MonPote nb 0 Pour i 1 Len(MonPote.Mail) Si Mid(MonPote.Mail, i, 1) = "@" Alors nb nb + 1 FinSi i suivant Si nb = 1 Alors ii+1 Redim MesPotes(i) MesPotes(i) MonPote FinSi FinTantQue Fermer 1 On recopie ensuite l'intgralit de Fic dans "Adresse" Ouvrir "Adresse.txt" sur 1 pour Ecriture Pour j 0 i EcrireFichier 1, MesPotes(j) j Suivant Fermer 1 Fin

208

Exercice 10.9
Une fois de plus, le passage par un tableau de structures est une stratgie commode. Attention toutefois, comme il s'agit d'un fichier texte, tout est stock en caractre. Il faudra donc convertir en numrique les caractres reprsentant les ventes, pour pouvoir effectuer les calculs demands. Pour le traitement, il y a deux possibilits. Soit on recopie le fichier l'identique dans un premier tableau, et on traite ensuite ce tableau pour faire la somme par vendeur. Soit on fait le traitement directement, ds la lecture du fichier. C'est cette option qui est choisie dans ce corrig. Structure Vendeur Nom en Caractre * 20 Montant en Numrique Fin Structure Tableau MesVendeurs() en Vendeur Variables NomPrec * 20, Lig, Nom en caractre Variables Somme, Vente en Numrique On balaye le fichier en faisant nos additions. Ds que le nom a chang (on est pass au vendeur suivant), on range le rsultat et on remet tout zro Debut Ouvrir "Ventes.txt sur 1 pour Lecture i -1 Somme 0 NomPrc "" Tantque Non EOF(1) LireFichier 1, Lig Nom Mid(Lig, 1, 20) Vente CNum(Mid(Lig, 21, 10) Si Nom = NomPrec Alors Somme Somme + Vente Sinon ii+1 Redim MesVendeurs(i) MesVendeurs(i).Nom NomPrec MesVendeurs(i).Montant Somme Somme 0 NomPrec Nom FinSi FinTantQue 209

Et n'oublions pas un petit tour de plus pour le dernier de ces messieurs ii+1 Redim MesVendeurs(i) MesVendeurs(i).Nom NomPrec MesVendeurs(i).Montant Somme Fermer 1 Pour terminer, on affiche le tableau l'cran Pour j 0 i Ecrire MesVendeurs(j) j suivant Fin

210

Et en conclusion de la conclusion, voil plusieurs remarques fondamentales : REMARQUE N1 Lorsqu'on veut rcuprer des donnes numriques inscrites dans un fichier texte, il ne faut surtout pas oublier que ces donnes se prsentent forcment sous forme de caractres. La rcupration elle-mme transmettra donc obligatoirement des donnes de type alphanumrique ; pour utiliser ces donnes des fins ultrieures de calcul, il sera donc ncessaire d'employer une fonction de conversion. Cette remarque ne s'applique videmment pas aux fichiers binaires.

REMARQUE N1bis Voil pourquoi une structure s'appliquant aux fichiers textes est forcment compose uniquement de types caractres. Une structure traitant de fichiers binaires pourrait en revanche tre compose de caractres, de numriques et de boolens.

REMARQUE N2 Plusieurs langages interdisent l'criture d'une variable structure dans un fichier texte, ne l'autorisant que pour un fichier binaire. Si l'on se trouve dans ce cas, cela signifie qu'on peut certes utiliser une structure, ou un tableau de structures, mais condition d'crire sur le fichier champ par champ, ce qui annule une partie du bnfice de la structure. Nous avons postul ici que cette interdiction n'existait pas ; en tenir compte ne changerait pas fondamentalement les algorithmes, mais alourdirait un peu le code pour les lignes traitant de l'criture dans les fichiers. 211

Partie 11 Procdures et Fonctions


Linformatique semble encore chercher la recette miracle qui permettra aux gens dcrire des programmes corrects sans avoir rflchir. Au lieu de cela, nous devons apprendre aux gens comment rflchir - Anonyme

11.1 Fonctions personnalises


11.1.1 De quoi s'agit-il ?
Une application, surtout si elle est longue, a toutes les chances de devoir procder aux mmes traitements, ou des traitements similaires, plusieurs endroits de son droulement. Par exemple, la saisie dune rponse par oui ou par non (et le contrle quelle implique), peuvent tre rpts dix fois des moments diffrents de la mme application, pour dix questions diffrentes. La manire la plus vidente, mais aussi la moins habile, de programmer ce genre de choses, c'est bien entendu de rpter le code correspondant autant de fois que ncessaire. Apparemment, on ne se casse pas la tte : quand il faut que la machine interroge l'utilisateur, on recopie les lignes de codes voulues en ne changeant que le ncessaire, et roule Raoul. Mais en procdant de cette manire, la pire qui soit, on se prpare des lendemains qui dchantent... D'abord, parce que si la structure d'un programme crit de cette manire peut paratre simple, elle est en ralit inutilement lourdingue. Elle contient des rptitions, et pour peu que le programme soit joufflu, il peut devenir parfaitement illisible. Or, le fait d'tre facilement modifiable donc lisible, y compris - et surtout - par ceux qui ne l'ont pas crit est un critre essentiel pour un programme informatique ! Ds que l'on programme non pour soi-mme, mais dans le cadre d'une organisation (entreprise ou autre), cette ncessit se fait sentir de manire aigu. L'ignorer, c'est donc forcment grave. En plus, un autre niveau, une telle structure pose des problmes considrables de maintenance : car en cas de modification du code, il va falloir traquer toutes les apparitions plus ou moins identiques de ce code pour faire convenablement la modification ! Et si l'on en oublie une, patatras, on a laiss un bug. Il faut donc opter pour une autre stratgie, qui consiste sparer ce traitement du corps du programme et regrouper les instructions qui le composent en un module 212

spar. Il ne restera alors plus qu' appeler ce groupe d'instructions (qui n'existe donc dsormais quen un exemplaire unique) chaque fois quon en a besoin. Ainsi, la lisibilit est assure ; le programme devient modulaire, et il suffit de faire une seule modification au bon endroit, pour que cette modification prenne effet dans la totalit de lapplication. Le corps du programme sappelle alors la procdure principale, et ces groupes dinstructions auxquels on a recours sappellent des fonctions et des sous-procdures (nous verrons un peu plus loin la diffrence entre ces deux termes). Reprenons un exemple de question laquelle lutilisateur doit rpondre par oui ou par non. Mauvaise Structure : ... Ecrire "Etes-vous mari ?" Rep1 "" TantQue Rep1 <> "Oui" et Rep1 <> "Non" Ecrire "Tapez Oui ou Non" Lire Rep1 FinTantQue ... Ecrire "Avez-vous des enfants ?" Rep2 "" TantQue Rep2 <> "Oui" et Rep2 <> "Non" Ecrire "Tapez Oui ou Non" Lire Rep2 FinTantQue ... On le voit bien, il y a l une rptition quasi identique du traitement accomplir. A chaque fois, on demande une rponse par Oui ou Non, avec contrle de saisie. La seule chose qui change, c'est le nom de la variable dans laquelle on range la rponse. Alors, il doit bien y avoir un truc. La solution, on vient de le voir, consiste isoler les instructions demandant une rponse par Oui ou Non, et appeler ces instructions chaque fois que ncessaire. Ainsi, on vite les rptitions inutiles, et on a dcoup notre problme en petits morceaux autonomes. Nous allons donc crer une fonction dont le rle sera de renvoyer la rponse (oui ou non) de l'utilisateur. Ce mot de "fonction", en l'occurrence, ne doit pas nous surprendre : nous avons tudi prcdemment des fonctions fournies avec le langage, et nous avons 213

vu que le but d'une fonction tait de renvoyer une valeur. Eh bien, c'est exactement la mme chose ici, sauf que c'est nous qui allons crer notre propre fonction, que nous appellerons RepOuiNon : Fonction RepOuiNon() en caractre Truc "" TantQue Truc <> "Oui" et Truc <> "Non" Ecrire "Tapez Oui ou Non" Lire Truc FinTantQue Renvoyer Truc Fin On remarque au passage lapparition dun nouveau mot-cl : Renvoyer, qui indique quelle valeur doit prendre la fonction lorsqu'elle est utilise par le programme. Cette valeur renvoye par la fonction (ici, la valeur de la variable Truc) est en quelque sorte contenue dans le nom de la fonction lui-mme, exactement comme ctait le cas dans les fonctions prdfinies. Une fonction s'crit toujours en-dehors de la procdure principale. Selon les langages, cela peut prendre diffrentes formes. Mais ce qu'il faut comprendre, c'est que ces quelques lignes de codes sont en quelque sorte des satellites, qui existent en dehors du traitement lui-mme. Simplement, elles sont sa disposition, et il pourra y faire appel chaque fois que ncessaire. Si l'on reprend notre exemple, une fois notre fonction RepOuiNon crite, le programme principal comprendra les lignes : Bonne structure : ... Ecrire "Etes-vous mari ?" Rep1 RepOuiNon() ... Ecrire "Avez-vous des enfants ?" Rep2 RepOuiNon() ... Et le tour est jou ! On a ainsi vit les rptitions inutiles, et si d'aventure, il y avait un bug dans notre contrle de saisie, il suffirait de faire une seule correction dans la fonction RepOuiNon pour que ce bug soit limin de toute l'application. Elle n'est pas belle, la vie ? Toutefois, les plus sagaces d'entre vous auront remarqu, tant dans le titre de la fonction que dans chacun des appels, la prsence de parenthses. Celles-ci, ds qu'on dclare ou qu'on appelle une fonction, sont obligatoires. Et si vous avez bien compris 214

tout ce qui prcde, vous devez avoir une petite ide de ce qu'on va pouvoir mettre dedans...

11.1.2 Passage d'arguments


Reprenons lexemple qui prcde et analysons-le. On crit un message l'cran, puis on appelle la fonction RepOuiNon pour poser une question ; puis, un peu plus loin, on crit un autre message l'cran, et on appelle de nouveau la fonction pour poser la mme question, etc. Cest une dmarche acceptable, mais qui peut encore tre amliore : puisque avant chaque question, on doit crire un message, autant que cette criture du message figure directement dans la fonction appele. Cela implique deux choses :

lorsquon appelle la fonction, on doit lui prciser quel message elle doit afficher avant de lire la rponse

la fonction doit tre prvenue quelle recevra un message, et tre capable de le rcuprer pour lafficher.

En langage algorithmique, on dira que le message devient un argument (ou un

paramtre) de la fonction. Cela n'est certes pas une dcouverte pour vous : nous avons
longuement utilis les arguments propos des fonctions prdfinies. Eh bien, quitte construire nos propres fonctions, nous pouvons donc construire nos propres arguments. Voil comment laffaire se prsente... La fonction sera dornavant dclare comme suit : Fonction RepOuiNon(Msg en Caractre) en Caractre Ecrire Msg Truc "" TantQue Truc <> "Oui" et Truc <> "Non" Ecrire "Tapez Oui ou Non" Lire Truc FinTantQue Renvoyer Truc Fin Fonction Il y a donc maintenant entre les parenthses une variable, Msg, dont on prcise le type, et qui signale la fonction quun argument doit lui tre envoy chaque appel.

215

Quant ces appels, justement, ils se simplifieront encore dans la procdure principale, pour devenir : ... Rep1 RepOuiNon("Etes-vous mari ?") ... Rep2 RepOuiNon("Avez-vous des enfants ?") ... Et voil le travail. Une remarque importante : l, on n'a pass quun seul argument en entre. Mais bien entendu, on peut en passer autant quon veut, et crer des fonctions avec deux, trois, quatre, etc. arguments ; Simplement, il faut viter d'tre gourmands, et il suffit de passer ce dont on en a besoin, ni plus, ni moins ! Dans le cas que l'on vient de voir, le passage d'un argument la fonction tait lgant, mais pas indispensable. La preuve, cela marchait dj trs bien avec la premire version. Mais on peut imaginer des situations o il faut absolument concevoir la fonction de sorte qu'on doive lui transmettre un certain nombre d'arguments si l'on veut qu'elle puisse remplir sa tche. Prenons, par exemple, toutes les fonctions qui vont effectuer des calculs. Que ceux-ci soient simples ou compliqus, il va bien falloir envoyer la fonction les valeurs grce auxquelles elle sera cens produire son rsultat (pensez tout btement une fonction sur le modle d'Excel, telle que celle qui doit calculer une somme ou une moyenne). C'est galement vrai des fonctions qui traiteront des chanes de caractres. Bref, dans 99% des cas, lorsqu'on crera une fonction, celle-ci devra comporter des arguments.

11.1.3 Deux mots sur l'analyse fonctionnelle


Comme souvent en algorithmique, si l'on s'en tient la manire dont marche l'outil, tout cela n'est en ralit pas trs compliqu. Les fonctions personnalises se dduisent trs logiquement de la manire nous nous avons dj expriment les fonctions prdfinies. Le plus difficile, mais aussi le plus important, c'est d'acqurir le rflexe de constituer

systmatiquement les fonctions adquates quand on doit traiter un problme donn,


et de flairer la bonne manire de dcouper son algorithme en diffrentes fonctions pour le rendre lger, lisible et performant.

216

Cette partie de la rflexion s'appelle d'ailleurs l'analyse fonctionnelle d'un problme, et c'est toujours par elle qu'il faut commencer : en gros, dans un premier temps, on dcoupe le traitement en modules (algorithmique fonctionnelle), et dans un deuxime temps, on crit chaque module (algorithmique classique). Cependant, avant d'en venir l, il nous faut dcouvrir deux autres outils, qui prennent le relais l o les fonctions deviennent incapables de nous aider.

217

PARTIE 11
nonc des Exercices Exercice 11.1
crivez une fonction qui renvoie la somme de cinq nombres fournis en argument.

Exercice 11.2
crivez une fonction qui renvoie le nombre de voyelles contenues dans une chane de caractres passe en argument. Au passage, notez qu'une fonction a tout fait le droit d'appeler une autre fonction.

Exercice 11.3
Rcrivez la fonction Trouve, vue prcdemment, laide des fonctions Mid et Len (comme quoi, Trouve, la diffrence de Mid et Len, nest pas une fonction indispensable dans un langage).

218

PARTIE 11
Corrigs des Exercices Exercice 11.1
Voil un dbut en douceur... Fonction Sum(a, b, c, d, e) Renvoyer a + b + c + d + e FinFonction

Exercice 11.2
Fonction NbVoyelles(Mot en Caractre) Variables i, nb en Numrique Pour i 1 Len(Mot) Si Trouve("aeiouy", Mid(Mot, i, 1)) <> 0 Alors nb nb + 1 FinSi i suivant Renvoyer nb FinFonction

219

Exercice 11.3
Fonction Trouve(a, b) Variable i en Numrique Dbut i1 TantQue i < Len(a) - Len(b) et b <> Mid(a, i, Len(b)) ii+1 FinTantQue Si b <> Mid(a, i, Len(b)) Alors Renvoyer 0 Sinon Renvoyer i FinFonction

220

11.2 Sous-Procdures
11.2.1 Gnralits
Les fonctions, c'est bien, mais dans certains cas, a ne nous rend gure service. Il peut en effet arriver que dans un programme, on ait raliser des tches rptitives, mais que ces tches n'aient pas pour rle de gnrer une valeur particulire, ou qu'elles aient pour rle d'en gnrer plus d'une la fois. Vous ne voyez pas de quoi je veux parler ? Prenons deux exemples. Premier exemple. Imaginons qu'au cours de mon application, j'aie plusieurs fois besoin d'effacer l'cran et de rafficher un bidule comme un petit logo en haut gauche. On pourrait se dire qu'il faut crer une fonction pour faire cela. Mais quelle serait la valeur renvoye par la fonction ? Aucune ! Effacer l'cran, ce n'est pas produire un rsultat stockable dans une variable, et afficher un logo non plus. Voil donc une situation ou j'ai besoin de rpter du code, mais o ce code n'a pas comme rle de produire une valeur. Deuxime exemple. Au cours de mon application, je dois plusieurs fois faire saisir un tableau d'entiers (mais chaque fois, un tableau diffrent). L encore, on serait tent d'effectuer toutes ces saisies de tableaux dans une seule fonction. Mais problme, une fonction ne peut renvoyer qu'une seule valeur la fois. Elle ne peut donc renvoyer un tableau, qui est une srie de valeurs distinctes. Alors, dans ces deux cas, faute de pouvoir traiter l'affaire par une fonction, devra-t-on en rester au code rptitif dont nous venons de dnoncer si vigoureusement les faiblesses ? Mmmmmh ? Vous vous doutez bien que non. Heureusement, tout est prvu, il y a une solution. Et celle-ci consiste utiliser des sous-procdures. En fait, les fonctions - que nous avons vues - ne sont finalement qu'un cas particulier

des sous-procdures - que nous allons voir : celui o doit tre renvoy vers la procdure appelante une valeur et une seule. Dans tous les autres cas (celui o on ne
renvoie aucune valeur, comme celui ou en en renvoie plusieurs), il faut donc avoir recours non la forme particulire et simplifie (la fonction), mais la forme gnrale (la sousprocdure). Parlons donc de ce qui est commun aux sous-procdures et aux fonctions, mais aussi de ce qui les diffrencie. Voici comment se prsente une sous-procdure : Procdure Bidule( ... ) ... Fin Procdure

221

Dans la procdure principale, lappel la sous-procdure Bidule devient quant lui : Appeler Bidule(...) tablissons un premier tat des lieux.

Alors qu'une fonction se caractrisait par les mots-cls Fonction ... Fin Fonction, une sous-procdure est identifie par les mots-cls Procdure jamais. ... Fin Procdure. Oui, je sais, c'est un peu trivial comme remarque, mais, bon, on ne sait

Lorsqu'une fonction tait appele, sa valeur (retourne) tait toujours affecte une variable (ou intgre dans le calcul d'une expression). L'appel une procdure, lui, est au contraire toujours une instruction autonome. "Excute la procdure Bidule" est un ordre qui se suffit lui-mme.

Toute fonction devait, pour cette raison, comporter l'instruction "Renvoyer". Pour la mme raison, l'instruction "Renvoyer" n'est jamais utilise dans une

sous-procdure. La fonction est une valeur calcule, qui renvoie son rsultat vers
la procdure principale. La sous-procdure, elle, est un traitement ; elle ne "vaut" rien.

Mme une fois qu'on a bien compris les trois premiers points, on n'est pas compltement au bout de nos peines.

11.2.2 Le problme des arguments


En effet, il nous reste examiner ce qui peut bien se trouver dans les parenthses, la place des points de suspension, aussi bien dans la dclaration de la sous-procdure que dans l'appel. Vous vous en doutez bien : c'est l que vont se trouver les outils qui vont permettre l'change d'informations entre la procdure principale et la sous-procdure (en fait, cette dernire phrase est trop restrictive : mieux vaudrait dire : entre la procdure appelante et la procdure appele. Car une sous-procdure peut trs bien en appeler elle-mme une autre afin de pouvoir accomplir sa tche) De mme qu'avec les fonctions, les valeurs qui circulent depuis la procdure (ou la fonction) appelante vers la sous-procdure appele se nomment des arguments, ou des

paramtres en entre de la sous-procdure. Comme on le voit, qu'il s'agisse des sousprocdure ou des fonctions, ces choses jouant exactement le mme rle (transmettre une information depuis le code donneur d'ordres jusqu'au code sous-traitant), elle portent galement le mme nom. Unique petite diffrence, on a prcis cette fois qu'il s'agissait d'arguments, ou de paramtres, en entre. Pourquoi donc ?

222

Tout simplement parce que dans une sous-procdure, on peut tre amen vouloir renvoyer des rsultats vers le programme principal ; or, l, la diffrence des fonctions, rien n'est prvu : la sous-procdure, en tant que telle, ne "renvoie" rien du tout (comme on vient de le voir, elle est d'ailleurs dpourvue de l'instruction "renvoyer"). Ces rsultats que la sous-procdure doit transmettre la procdure appelante devront donc eux aussi tre vhiculs par des paramtres. Mais cette fois, il s'agira de paramtres fonctionnant dans l'autre sens (du sous-traitant vers le donneur d'ordres) : on les appellera donc des paramtres en sortie. Ceci nous permet de reformuler en d'autres termes la vrit fondamentale apprise un peu plus haut : toute sous-procdure possdant un et un seul paramtre en sortie

peut galement tre crite sous forme d'une fonction (et entre nous, c'est une
formulation prfrable car un peu plus facile comprendre et donc retenir). Jusque l, a va ? Si oui, prenez un cachet d'aspirine et poursuivez la lecture. Si non, prenez un cachet d'aspirine et recommencez depuis le dbut. Et dans les deux cas, n'oubliez pas le grand verre d'eau pour faire passer l'aspirine. Il nous reste un dtail examiner, dtail qui comme vous vous en doutez bien, a une certaine importance : comment fait-on pour faire comprendre un langage quels sont les paramtres qui doivent fonctionner en entre et quels sont ceux qui doivent fonctionner en sortie...

11.2.3 Comment a marche tout a ?


En fait, si je dis qu'un paramtre est "en entre" ou "en sortie", j'nonce quelque chose propos de son rle dans le programme. Je dis ce que je souhaite qu'il fasse, la manire dont je veux qu'il se comporte. Mais les programmes eux-mmes n'ont cure de mes dsirs, et ce n'est pas cette classification qu'ils adoptent. C'est toute la diffrence entre dire qu'une prise lectrique sert brancher un rasoir ou une cafetire (ce qui caractrise son rle), et dire qu'elle est en 220 V ou en 110 V (ce qui caractrise son type technique, et qui est l'information qui intresse l'lectricien). A l'image des lectriciens, les langages se contrefichent de savoir quel sera le rle (entre ou sortie) d'un paramtre. Ce qu'ils exigent, c'est de connatre leur voltage... pardon, le mode de

passage de ces paramtres. Il n'en existe que deux :


le passage par valeur le passage par rfrence

...Voyons de plus prs de quoi il s'agit.

223

Reprenons l'exemple que nous avons dj utilis plus haut, celui de notre fonction RepOuiNon. Comme nous l'avons vu, rien ne nous empche de rcrire cette fonction sous la forme d'une procdure (puisqu'une fonction n'est qu'un cas particulier de sousprocdure). Nous laisserons pour l'instant de ct la question de savoir comment renvoyer la rponse (contenue dans la variable Truc) vers le programme principal. En revanche, nous allons dclarer que Msg est un paramtre dont la transmission doit se faire par valeur. Cela donnera la chose suivante : Procdure RepOuiNon(Msg en Caractre par valeur) Ecrire Msg Truc "" TantQue Truc <> "Oui" et Truc <> "Non" Ecrire "Tapez Oui ou Non" Lire Truc FinTantQue

??? Comment transmettre Truc la procdure appelante ???


Fin Procdure Quant l'appel cette sous-procdure, il pourra prendre par exemple cette forme : M "Etes-vous mari ?" Appeler RepOuiNon(M) Que va-t-il se passer ? Lorsque le programme principal arrive sur la premire ligne, il affecte la variable M avec le libell "tes-vous mari". La ligne suivante dclenche l'excution de la sousprocdure. Celle-ci cre aussitt une variable Msg. Celle-ci ayant t dclare comme un paramtre pass par valeur, Msg va tre affect avec le mme contenu que M. Cela signifie que Msg est dornavant une copie de M. Les informations qui taient contenues dans M ont t intgralement recopies (en double) dans Msg. Cette copie subsistera tout au long de l'excution de la sous-procdure RepOuiNon et sera dtruite la fin de celle-ci. Une consquence essentielle de tout cela est que si d'aventure la sous-procdure RepOuiNon contenait une instruction qui modifiait le contenu de la variable Msg, cela n'aurait aucune espce de rpercussion sur la procdure principale en gnral, et sur la variable M en particulier. La sous-procdure ne travaillant que sur une copie de la

variable qui a t fournie par le programme principal, elle est incapable, mme si on le souhaitait, de modifier la valeur de celle-ci. Dit d'une autre manire, dans une
procdure, un paramtre pass par valeur ne peut tre qu'un paramtre en entre.

224

C'est en mme temps une limite (aggrave par le fait que les informations ainsi recopies occupent dornavant deux fois plus de place en mmoire) et une scurit : quand on transmet un paramtre par valeur, on est sr et certain que mme en cas de bug dans la sous-procdure, la valeur de la variable transmise ne sera jamais modifie par erreur (c'est--dire crase) dans le programme principal. Admettons prsent que nous dclarions un second paramtre, Truc, en prcisant cette fois qu'il sera transmis par rfrence. Et adoptons pour la procdure l'criture suivante : Procdure RepOuiNon(Msg en rfrence) Ecrire Msg Truc "" TantQue Truc <> "Oui" et Truc <> "Non" Ecrire "Tapez Oui ou Non" Lire Truc FinTantQue Fin Fonction L'appel la sous-procdure deviendrait par exemple : M "Etes-vous mari ?" Appeler RepOuiNon(M, T) Ecrire "Votre rponse est ", T Dpiautons le mcanisme de cette nouvelle criture. En ce qui concerne la premire ligne, celle qui affecte la variable M, rien de nouveau sous le soleil. Toutefois, l'appel la sous-procdure provoque deux effets trs diffrents. Comme on l'a dj dit, la variable Msg est cre et immdiatement affecte avec une copie du contenu de M, puisqu'on a exig un passage par valeur. Mais en ce qui concerne Truc, il en va tout autrement. Le fait qu'il s'agisse cette fois d'un passage par rfrence fait que la variable Truc ne Caractre par valeur, Truc en Caractre par

contiendra pas la valeur de T, mais son adresse, c'est--dire sa rfrence.


Ds lors, toute modification de Truc sera immdiatement redirige, par ricochet en

quelque sorte, sur T. Truc n'est pas une variable ordinaire : elle ne contient pas de
valeur, mais seulement la rfrence une valeur, qui elle, se trouve ailleurs (dans la variable T). Il s'agit donc d'un genre de variable compltement nouveau, et diffrent de ce que nous avons vu jusque l. Ce type de variable porte un nom : on l'appelle un

pointeur. Tous les paramtres passs par rfrence sont des pointeurs, mais les
pointeurs ne se limitent pas aux paramtres passs par rfrence (mme si ce sont les seuls que nous verrons dans le cadre de ce cours). Il faut bien comprendre que ce type de variable trange est gr directement par les langages : partir du moment o une 225

variable est considre comme un pointeur, toute affectation de cette variable se traduit automatiquement par la modification de la variable sur laquelle elle pointe.
Passer un paramtre par rfrence, cela prsente donc deux avantages. Et d'une, on gagne en occupation de place mmoire, puisque le paramtre en question ne recopie pas les informations envoyes par la procdure appelante, mais qu'il se contente d'en noter l'adresse. Et de deux, cela permet d'utiliser ce paramtre tant en lecture (en

entre) qu'en criture (en sortie), puisque toute modification de la valeur du


paramtre aura pour effet de modifier la variable correspondante dans la procdure appelante. Nous pouvons rsumer tout cela par un petit tableau :

passage par valeur utilisation en entre utilisation en sortie oui non

passage par rfrence oui oui

Mais alors, demanderez-vous dans un lan de touchante navet, si le passage par rfrence prsente les deux avantages prsents il y a un instant, pourquoi ne pas s'en servir systmatiquement ? Pourquoi s'embter avec les passages par valeur, qui non seulement utilisent de la place en mmoire, mais qui de surcrot nous interdisent d'utiliser la variable comme un paramtre en sortie ? Eh bien, justement, parce qu'on ne pourra pas utiliser comme paramtre en sortie, et que cet inconvnient se rvle tre aussi, ventuellement, un avantage. Disons la chose autrement : c'est une scurit. C'est la garantie que quel que soit le bug qui pourra affecter la sous-procdure, ce bug ne viendra jamais mettre le foutoir dans les variables du programme principal qu'elle ne doit pas toucher. Voil pourquoi, lorsqu'on souhaite dfinir un paramtre dont on sait qu'il fonctionnera exclusivement en entre, il est sage de le verrouiller, en quelque sorte, en le dfinissant comme pass par valeur. Et Lyce de Versailles, ne seront dfinis comme passs par rfrence que les paramtres dont on a absolument besoin qu'ils soient utiliss en sortie.

226

11.3 Variables publiques et prives


Rsumons la situation. Nous venons de voir que nous pouvions dcouper un long traitement comportant ventuellement des redondances (notre application) en diffrents modules. Et nous avons vu que les informations pouvaient tre transmises entre ces modules selon deux modes :

si le module appel est une fonction, par le retour du rsultat dans tous les cas, par la transmission de paramtres (que ces paramtres soient passs par valeur ou par rfrence)

En fait, il existe un troisime et dernier moyen d'changer des informations entre diffrentes procdures et fonctions : c'est de ne pas avoir besoin de les changer, en faisant en sorte que ces procdures et fonctions partagent littralement les mmes variables. Cela suppose d'avoir recours des variables particulires, lisibles et utilisables par n'importe quelle procdure ou fonction de l'application. Par dfaut, une variable est dclare au sein d'une procdure ou d'une fonction. Elle est donc cre avec cette procdure, et disparat avec elle. Durant tout le temps de son existence, une telle variable n'est visible que par la procdure qui l'a vu natre. Si je cre une variable Toto dans une procdure Bidule, et qu'en cours de route, ma procdure Bidule appelle une sous-procdure Machin, il est hors de question que Machin puisse accder Toto, ne serait-ce que pour connatre sa valeur (et ne parlons pas de la modifier). Voil pourquoi ces variables par dfaut sont dites prives, ou locales. Mais ct de cela, il est possible de crer des variables qui certes, seront dclares dans une procdure, mais qui du moment o elles existeront, seront des variables communes toutes les procdures et fonctions de l'application. Avec de telles variables, le problme de la transmission des valeurs d'une procdure (ou d'une fonction) l'autre ne se pose mme plus : la variable Truc, existant pour toute l'application, est accessible et modifiable depuis n'importe quelle ligne de code de cette application. Plus besoin donc de la transmettre ou de la renvoyer. Une telle variable est alors dite publique, ou

globale.
La manire dont la dclaration d'une variable publique doit tre faites est videmment fonction de chaque langage de programmation. En pseudo-code algorithmique, on pourra utiliser le mot-cl Publique :

227

Variable Publique Toto en Numrique Alors, pourquoi ne pas rendre toutes les variables publiques, et s'pargner ainsi de fastidieux efforts pour passer des paramtres ? Cest trs simple, et c'est toujours la mme chose : les variables globales consomment normment de ressources en

mmoire. En consquence, le principe qui doit prsider au choix entre variables publiques
et prives doit tre celui de lconomie de moyens : on ne dclare comme publiques que les variables qui doivent absolument ltre. Et chaque fois que possible, lorsquon cre une sous-procdure, on utilise le passage de paramtres plutt que des variables publiques.

11.4 PEUT-ON TOUT FAIRE ?


A cette question, la rponse est bien videmment : oui, on peut tout faire. Mais c'est prcisment la raison pour laquelle on peut vite en arriver faire aussi absolument n'importe quoi. N'importe quoi, c'est quoi ? C'est par exemple, comme on vient de le voir, mettre des variables globales partout, sous prtexte que c'est autant de paramtres qu'on n'aura pas passer. Mais on peut imaginer d'autres atrocits. Par exemple, une fonction, dont un des paramtres d'entre serait pass par rfrence, et modifi par la fonction. Ce qui signifierait que cette fonction produirait non pas un, mais deux rsultats. Autrement dit, que sous des dehors de fonctions, elle se comporterait en ralit comme une sous-procdure. Ou inversement, on peut concevoir une procdure qui modifierait la valeur d'un paramtre (et d'un seul) pass par rfrence. Il s'agirait l d'une procdure qui en ralit, serait une fonction. Quoique ce dernier exemple ne soit pas d'une gravit dramatique, il participe de la mme logique consistant embrouiller le code en faisant passer un outil pour un autre, au lieu d'adopter la structure la plus claire et la plus lisible possible. Enfin, il ne faut pas carter la possibilit de programmeurs particulirement vicieux, qui par un savant mlange de paramtres passs par rfrence, de variables globales, de procdures et de fonctions mal choisies, finiraient par accoucher d'un code absolument illogique, illisible, et dans lequel la chasse l'erreur relverait de l'exploit.

228

Trfle de plaisanteries : le principe qui doit guider tout programmeur est celui de la solidit et de la clart du code. Une application bien programme est une application

l'architecture claire, dont les diffrents modules font ce qu'ils disent, disent ce qu'il font, et peuvent tre tests (ou modifis) un par un sans perturber le reste de la construction. Il convient donc :
1. de limiter au minimum l'utilisation des variables globales. Celles-ci doivent tre employes avec nos clbres amis italo-armniens, c'est--dire avec parcimonie et bon escient. 2. de regrouper sous forme de modules distincts tous les morceaux de code qui possdent une certaine unit fonctionnelle (programmation par "blocs"). C'est-dire de faire la chasse aux lignes de codes redondantes, ou quasi-redondantes. 3. de faire de ces modules des fonctions lorsqu'ils renvoient un rsultat unique, et des sous-procdures dans tous les autres cas (ce qui implique de ne jamais passer un paramtre par rfrence une fonction : soit on n'en a pas besoin, soit on en a besoin, et ce n'est alors plus une fonction). Respecter ces rgles d'hygine est indispensable si l'on veut qu'une application ressemble autre chose qu'au palais du facteur Cheval. Car une architecture laquelle on ne comprend rien, c'est sans doute trs potique, mais il y a des circonstances o l'efficacit est prfrable la posie. Et, pour ceux qui en douteraient encore, la programmation informatique fait (hlas ?) partie de ces circonstances.

11.5 Algorithmes fonctionnels


Pour clore ce chapitre, voici quelques mots supplmentaires propos de la structure gnrale dune application. Comme on l'a dit plusieurs reprises, celle-ci va couramment tre forme dune procdure principale, et de fonctions et de sous-procdures (qui vont au besoin elles-mmes en appeler dautres, etc.). Lexemple typique est celui dun menu, ou dun sommaire, qui branche sur diffrents traitements, donc diffrentes sousprocdures.

Lalgorithme fonctionnel de lapplication est le dcoupage et/ou la reprsentation graphique de cette structure gnrale, ayant comme objectif de faire comprendre dun
seul coup dil quelle procdure fait quoi, et quelle procdure appelle quelle autre. Lalgorithme fonctionnel est donc en quelque sorte la construction du squelette de lapplication. Il se situe un niveau plus gnral, plus abstrait, que lalgorithme normal, qui lui, dtaille pas pas les traitements effectus au sein de chaque procdure.

229

Dans la construction et la comprhension dune application, les deux documents sont indispensables, et constituent deux tapes successives de llaboration dun projet. La troisime et dernire tape, consiste crire, pour chaque procdure et fonction, lalgorithme dtaill.

Exemple de ralisation dun algorithme fonctionnel : Le Jeu du Pendu


Vous connaissez tous ce jeu : lutilisateur doit deviner un mot choisi au hasard par lordinateur, en un minimum dessais. Pour cela, il propose des lettres de lalphabet. Si la lettre figure dans le mot trouver, elle saffiche. Si elle ny figure pas, le nombre des mauvaises rponses augmente de 1. Au bout de dix mauvaises rponses, la partie est perdue. Ce petit jeu va nous permettre de mettre en relief les trois tapes de la ralisation dun algorithme un peu complexe ; bien entendu, on pourrait toujours ignorer ces trois tapes, et se lancer comme un drat directement dans la gueule du loup, savoir lcriture de lalgorithme dfinitif. Mais, sauf tre particulirement dou, mieux vaut respecter le canevas qui suit, car les difficults se rsolvent mieux quand on les saucissonne Etape 1 : le dictionnaire des donnes Le but de cette tape est didentifier les informations qui seront ncessaires au traitement du problme, et de choisir le type de codage qui sera le plus satisfaisant pour traiter ces informations. Cest un moment essentiel de la rflexion, quil ne faut surtout pas prendre la lgre Or, neuf programmeurs dbutants sur dix bclent cette rflexion, quand ils ne la zappent pas purement et simplement. La punition ne se fait gnralement pas attendre longtemps ; lalgorithme tant bti sur de mauvaises fondations, le programmeur se rend compte tout en lcrivant que le choix de codage des informations, par exemple, mne des impasses. La prcipitation est donc punie par le fait quon est oblig de tout reprendre depuis le dbut, et quon a au total perdu bien davantage de temps quon en a cru en gagner

230

Donc, avant mme dcrire quoi que ce soit, les questions quil faut se poser sont les suivantes :

de quelles informations le programme va-t-il avoir besoin pour venir bout de sa tche ?

pour chacune de ces informations, quel est le meilleur codage ? Autrement dit, celui qui sans gaspiller de la place mmoire, permettra dcrire lalgorithme le plus simple ?

Encore une fois, il ne faut pas hsiter passer du temps sur ces questions, car certaines erreurs, ou certains oublis, se payent cher par la suite. Et inversement, le temps investi ce niveau est largement rattrap au moment du dveloppement proprement dit. Pour le jeu du pendu, voici la liste des informations dont on va avoir besoin :

une liste de mots (si lon veut viter que le programme ne propose toujours le mme mot trouver, ce qui risquerait de devenir assez rapidement lassant)

le mot deviner la lettre propose par le joueur chaque tour le nombre actuel de mauvaises rponses et enfin, last but not least, lensemble des lettres dj trouves par le joueur. Cette information est capitale ; le programme en aura besoin au moins pour deux choses : dune part, pour savoir si le mot entier a t trouv. Dautre part, pour afficher chaque tour ltat actuel du mot (je rappelle qu chaque tour, les lettres trouves sont affiches en clair par la machine, les lettres restant deviner tant remplaces par des tirets).

cela, on pourrait ajouter une liste comprenant lensemble des lettres dj proposes par le joueur, quelles soient correctes ou non ; ceci permettra dinterdire au joueur de proposer nouveau une lettre prcdemment joue.

Cette

liste

dinformations

nest

peut-tre

pas

exhaustive ;

nous

aurons

vraisemblablement besoin au cours de lalgorithme de quelques variables supplmentaires (des compteurs de boucles, des variables temporaires, etc.). Mais les informations essentielles sont bel et bien l. Se pose maintenant le problme de choisir le mode de codage le plus fut. Si, pour certaines informations, la question va tre vite rgle, pour dautres, il va falloir faire des choix (et si possible, des choix intelligents !). Cest parti, mon kiki :

231

Pour la liste des mots trouver, il sagit dun ensemble dinformations de type alphanumrique. Ces informations pourraient faire partie du corps de la procdure principale, et tre ainsi stockes en mmoire vive, sous la forme dun tableau de chanes. Mais ce nest certainement pas le plus judicieux. Toute cette place occupe risque de peser lourd inutilement, car il ny a aucun intrt stocker lensemble des mots en mmoire vive. Et si lon souhaite enrichir la liste des mots trouver, on sera oblig de rcrire des lignes de programme Conclusion, la liste des mots sera bien plus sa place dans un fichier texte, dans lequel le programme ira piocher un seul mot, celui quil faudra trouver. Nous constituerons donc un fichier texte, appel dico.txt, dans lequel figurera un mot par ligne (par enregistrement).

Le mot trouver, lui, ne pose aucun problme : il sagit dune information simple de type chane, qui pourra tre stock dans une variable appele mot, de type caractre.

De mme, la lettre propose par le joueur est une information simple de type chane, qui sera stocke dans une variable appele lettre, de type caractre.

Le nombre actuel de mauvaises rponses est une information qui pourra tre stocke dans une variable numrique de type entier simple appele MovRep.

Lensemble des lettres trouves par le joueur est typiquement une information qui peut faire lobjet de plusieurs choix de codage ; rappelons quau moment de laffichage, nous aurons besoin de savoir pour chaque lettre du mot deviner si elle a t trouve ou non. Une premire possibilit, immdiate, serait de disposer dune chane de caractres comprenant lensemble des lettres prcdemment trouves. Cette solution est loin dtre mauvaise, et on pourrait tout fait ladopter. Mais ici, on fera une autre choix, ne serait-ce que pour varier les plaisirs : on va se doter dun tableau de boolens, comptant autant demplacements quil y a de lettres dans le mot deviner. Chaque emplacement du tableau correspondra une lettre du mot trouver, et indiquera par sa valeur si la lettre a t dcouverte ou non (faux, la lettre na pas t devine, vrai, elle la t). La correspondance entre les lments du tableau et le mot deviner tant immdiate, la programmation de nos boucles en sera facilite. Nous baptiserons notre tableau de boolens du joli nom de verif .

Enfin, lensemble des lettres proposes sera stocke sans soucis dans une chane de caractres nomme Propos.

232

Nous avons maintenant suffisamment gamberg pour dresser le tableau final de cette tape, savoir le dictionnaire des donnes proprement dit :

Nom Dico.txt Mot Lettre MovRep

Type Fichier texte Caractre Caractre Entier

Description Liste des mots deviner Mot deviner Lettre propose Nombre de mauvaises rponses Lettres prcdemment devines, en

Verif()

Tableau de Boolens

correspondance avec Mot Liste des lettres proposes

Propos

Caractre

Etape 2 : lalgorithme fonctionnel On peut prsent passer la ralisation de lalgorithme fonctionnel, cest--dire au dcoupage de notre problme en blocs logiques. Le but de la manuvre est multiple :

faciliter la ralisation de lalgorithme dfinitif en le trononnant en plus petits morceaux.

Gagner du temps et de la lgret en isolant au mieux les sous-procdures et fonctions qui mritent de ltre. Eviter ainsi ventuellement des rptitions multiples de code au cours du programme, rptitions qui ne diffrent les unes des autres qu' quelques variantes prs.

Permettre une division du travail entre programmeurs, chacun se voyant assigner la programmation de sous-procdures ou de fonctions spcifiques (cet aspect est essentiel ds quon quitte le bricolage personnel pour entrer dans le monde de la programmation professionnelle, donc collective).

Dans notre cas prcis, un premier bloc se dtache : il sagit de ce quon pourrait appeler les prparatifs du jeu (choix du mot deviner). Puisque le but est de renvoyer une valeur et une seule (le mot choisi par la machine), nous pouvons confier cette tche une fonction spcialise ChoixDuMot ( noter que ce dcoupage est un choix de lisibilit, et pas une ncessit absolue ; on pourrait tout aussi bien faire cela dans la procdure principale). 233

Cette procdure principale, justement, va ensuite avoir ncessairement la forme dune boucle Tantque : en effet , tant que la partie nest pas finie, on recommence la srie des traitements qui reprsentent un tour de jeu. Mais comment, justement, savoir si la partie est finie ? Elle peut se terminer soit parce que le nombre de mauvaises rponses a atteint 10, soit parce que toutes les lettres du mot ont t trouves. Le mieux sera donc de confier lexamen de tout cela une fonction spcialise, PartieFinie, qui renverra une valeur numrique (0 pour signifier que la partie est en cours, 1 en cas de victoire, 2 en cas de dfaite). Passons maintenant au tour de jeu. La premire chose faire, cest dafficher lcran ltat actuel du mot deviner : un mlange de lettres en clair (celles qui ont t trouves) et de tirets (correspondant aux lettres non encore trouves). Tout ceci pourra tre pris en charge par une sousprocdure spcialise, appele AffichageMot. Quant linitialisation des diffrentes variables, elle pourra tre place, de manire classique, dans la procdure principale elle-mme. Ensuite, on doit procder la saisie de la lettre propose, en veillant effectuer les contrles de saisie adquats. L encore, une fonction spcialise, SaisieLettre, sera toute indique. Une fois la proposition faite, il convient de vrifier si elle correspond ou non une lettre deviner, et en tirer les consquences. Ceci sera fait par une sous-procdure appele VrifLettre. Enfin, une fois la partie termine, on doit afficher les conclusions lcran ; on dclare cet effet une dernire procdure, FinDePartie. Nous pouvons, dans un algorithme fonctionnel complet, dresser un tableau des diffrentes procdures et fonctions, exactement comme nous lavons fait juste avant pour les donnes (on spargnera cette peine dans le cas prsent, ce que nous avons crit ci-dessus suffisant amplement. Mais dans le cas dune grosse application, un tel travail serait ncessaire et nous pargnerait bien des soucis). On peut aussi schmatiser le fonctionnement de notre application sous forme de blocs, chacun des blocs reprsentant une fonction ou une sous-procdure : A ce stade, lanalyse dite fonctionnelle est termine. Les fondations (solides, espronsle) sont poses pour finaliser lapplication.

234

Etape 3 : Algorithmes dtaills Normalement, il ne nous reste plus qu traiter chaque procdure isolment. On commencera par les sous-procdures et fonctions, pour terminer par la rdaction de la procdure principale. ATTENTION ! les pages suivantes mnent directement aux corrigs !

235

Fonction ChoixDuMot Quelques explications : on lit intgralement le fichier contenant la liste des mots. Au fur et mesure, on range ces mots dans le tableau Liste, qui est redimensionn chaque tour de boucle. Un tirage alatoire intervient alors, qui permet de renvoyer un des mots au hasard. Fonction ChoixDuMot() Tableau Liste() en Caractre Variables Nbmots, Choisi en Numrique Ouvrir "Dico.txt" sur 1 en Lecture Nbmots -1 Tantque Non EOF(1) Nbmots Nbmots + 1 Redim Liste(Nbmots) LireFichier 1, Liste(Nbmots) FinTantQue Fermer 1 Choisi Ent(Alea() * Nbmots) Renvoyer Liste(Choisi) FinFonction

236

Fonction PartieFinie On commence par vrifier le nombre de mauvaises rponses, motif de dfaite. Ensuite, on regarde si la partie est gagne, traitement qui sapparente une gestion de Flag : il suffit que lune des lettres du mot deviner nait pas t trouve pour que la partie ne soit pas gagne. La fonction aura besoin, comme arguments, du tableau Verif, de son nombre dlments et du nombre actuel de mauvaises rponses. Fonction PartieFinie(t() en Booleen, n, x en Numrique) Variables i, issue en Numerique Si x = 10 Alors Renvoyer 2 Sinon Issue 1 Pour i 0 n Si Non t(i) Alors Issue 0 FinSi i suivant Renvoyer Issue FinSi FinFonction

237

Procdure AffichageMot Une mme boucle nous permet de considrer une par une les lettres du mot trouver (variable m), et de savoir si ces lettres ont t identifies ou non. Procdure AffichageMot(m en Caractre par Valeur, t() en Boolen par Valeur) Variable Aff en Caractere Variable i en Numerique Aff "" Pour i 0 len(m) 1 Si Non t(i) Alors Aff Aff & "-" Sinon Aff Aff & Mid(mot, i + 1, 1) FinSi i suivant Ecrire Aff FinProcdure Remarque : cette procdure aurait galement pu tre crite sous la forme d'une fonction, qui aurait renvoy vers la procdure principale la chane de caractres Aff. L'criture l'cran de cette chane Aff aurait alors t faite par la procdure principale. Voil donc une situation o on peut assez indiffremment opter pour une sous-procdure ou pour une fonction.

238

Procdure SaisieLettre On vrifie que le signe entr (paramtre b) est bien une seule lettre, qui ne figure pas dans les propositions prcdemment effectues (paramtre a) Procdure SaisieLettre(a, b en Caractre par Rfrence) Variable Correct en Booleen Variable Alpha en Caractre Dbut Correct Faux Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ" TantQue Non Correct Ecrire "Entrez la lettre propose : " Lire b Si Trouve(alpha, b) = 0 Ou len(b) <> 1 Alors Ecrire "Ce nest pas une lettre !" SinonSi Trouve(a, b) <> 0 Alors Ecrire "Lettre dj propose !" Sinon Correct Vrai aa&b FinSi FinTantQue Fin Procdure

239

Procdure VerifLettre Les paramtres se multiplient L est la lettre propose, t() le tableau de boolens, M le mot trouver et N le nombre de mauvaises propositions. Il ny a pas de difficult majeure dans cette procdure : on examine les lettres de M une une, et on en tire les consquences. Le flag sert savoir si la lettre propose faisait ou non partie du mot deviner. Procdure VerifLettre(L, M en Caractre par Valeur, t() en Boolen par Rfrence, N en Numrique par Rfrence) Variable Correct en Booleen Dbut Correct Faux Pour i 1 Len(M) Si Mid(M, i, 1) = L Alors Correct Vrai T(i - 1) Vrai FinSi FinTantQue Si Non Correct Alors NN+1 FinSi Fin Procdure

Procdure Epilogue Procdure Epilogue(M en Caractre par Valeur, N en Numrique par Valeur) Dbut Si N = 2 Alors Ecrire "Une mauvaise proposition de trop Partie termine !" Ecrire "Le mot deviner tait : ", M Sinon Ecrire "Bravo ! Vous avez trouv !" FinSi Fin Procdure

240

Procdure Principale Procdure Principale Variables Lettre, Mot, Propos en Caractere Variables g i, MovRep en Numrique Tableau Verif() en Booleen Dbut Mot ChoixDuMot() Propos "" Lettre "" Redim Verif(Len(Mot)-1) Pour i 0 Len(Mot)-1 Verif(i) Faux i suivant k0 Tantque k = 0 AffichageMot(Mot, Verif()) SaisieLettre(Propos, Lettre) VerifLettre(Lettre, Mot, Verif(), MovRep) k PartieFinie(Verif(), len(mot), MovRep) FinTantQue Epilogue(Mot, k) Fin

241

Partie 12 Notions Complmentaires


Le danger, avec les ordinateurs, ce nest pas tellement quils deviennent aussi intelligents que les hommes, mais cest que nous tombions daccord avec eux pour les rencontrer mi-chemin - Bernard Avishai

Une fois nest pas coutume, ce chapitre ne sera lobjet daucun exercice. Cela ne veut pas dire pour autant que ce qui sy trouve nest pas intressant. Non mais des fois.

12.1 Programmation structure


Petit retour sur une notion trs rapidement survole plus haut : celle de programmation structure . En fait, nous avons jusqu prsent, tels Monsieur Jourdain, fait de la programmation structure sans le savoir. Aussi, plutt quexpliquer longuement en quoi cela consiste, je prfre prendre le problme par l'autre bout : en quoi cela ne consiste pas. Dans certains langages (historiquement, ce sont souvent des langages anciens), les lignes de programmation portent des numros. Et les lignes sont excutes par la machine dans lordre de ces numros. Jusquici, en soi, pas de problme. Mais lastuce est que tous ces langages, il existe une instruction de branchement, note aller en pseudo-code, instruction qui envoie directement le programme la ligne spcifie. Inversement, ce type de langage ne comporte pas dinstructions comme FinTantQue, ou FinSi, qui ferment un bloc.

242

Prenons lexemple dune structure Si Alors Sinon Programmation Structure Si condition Alors instructions 1 Sinon instructions 2 FinSi Programmation non structure 1000 Si condition Alors Aller En 1200 1100 instruction 1 1110 etc. 1120 etc. 1190 Aller en 1400 1200 instruction 2 1210 etc. 1220 etc. 1400 suite de lalgorithme Vous voyez le topo : un programme crit dans ce type de langages se prsente comme

une suite de branchements emmls les uns dans les autres. Dune part, on ne peut
pas dire que cela favorise la lisibilit du programme. Dautre part, cest une source importante derreurs, car tt ou tard on oublie un aller , ou on un met un de trop, etc. A fortiori lorsquon complique un algorithme existant, cela peut devenir un jungle inextricable. A linverse, la programmation structure, surtout si lon prend soin de rationaliser la prsentation en mettant des lignes de commentaires et en pratiquant lindentation, vite des erreurs, et rvle sa structure logique de manire trs claire. Le danger est que si la plupart des langages de programmation utiliss sont structurs, ils offrent tout de mme la plupart du temps la possibilit de pratiquer la programmation non structure. Dans ce cas, les lignes ne sont pas dsignes par des numros, mais certaines peuvent tre repres par des noms (dits tiquettes ) et on dispose dune instruction de branchement.

Une rgle dhygine absolue est de programmer systmatiquement de manire structure, sauf impratif contraire fix par le langage (ce qui est aujourd'hui de plus en plus rare).
Autrement dit, mme quand un langage vous offre une possibilit de faire des entorses la programmation structure, il ne faut sen saisir sous aucun prtexte. 243

12.2 Interprtation et compilation


Avec ce paragraphe, on sort un peu de lalgorithmique proprement dite pour entrer dans le domaine plus technique de la ralisation pratique. Ou, si lon prfre, ces dernires lignes sont lapothose, le bouquet final, lextase ultime, la conscration grandiose, de ce cours. En toute modestie, bien sr. Jusquici, nous avons travaill sur la premire tape de la ralisation dun programme : la rdaction de l'algorithme.

En fait, si lalgorithme est bien crit, sans faute logique, ltape suivante ne doit normalement poser aucun problme conceptuel. Il n'y a plus qu' effectuer une simple traduction.

A partir de l, le travail du programmeur est virtuellement termin (en ralit, il reste tout de mme une invitable phase de tests, de corrections, etc., qui s'avre souvent trs longue). Mais en tout cas, pour lordinateur, cest l que les ennuis commencent. En effet, aucun ordinateur nest en soi apte excuter les instructions telles quelles sont rdiges dans tel ou tel langage ; lordinateur, lui, ne comprend quun seul langage, qui est un langage cod en binaire ( la rigueur en hexadcimal) et qui sappelle le langage machine (ou assembleur).

Cest cela que sert un langage : vous pargner la programmation en binaire (une pure horreur, vous vous en doutez) et vous permettre de vous faire comprendre de lordinateur dune manire (relativement) lisible.

244

Cest pourquoi tout langage, partir dun programme crit, doit obligatoirement procder une traduction en langage machine pour que ce programme soit excutable. Il existe deux stratgies de traduction, ces deux stratgies tant parfois disponibles au sein du mme langage.

le langage traduit les instructions au fur et mesure quelles se prsentent. Cela sappelle la compilation la vole, ou linterprtation.

le langage commence par traduire lensemble du programme en langage machine, constituant ainsi un deuxime programme (un deuxime fichier) distinct physiquement et logiquement du premier. Ensuite, et ensuite seulement, il excute ce second programme. Cela sappelle la compilation

Il va de soi quun langage interprt est plus maniable : on peut excuter directement son code - et donc le tester - au fur et mesure quon le tape, sans passer chaque fois par ltape supplmentaire de la compilation. Mais il va aussi de soi quun programme compil sexcute beaucoup plus rapidement quun programme interprt : le gain est couramment dun facteur 10, voire 20 ou plus. Toute application destine un usage professionnel (ou mme, tout simplement srieux) est forcment une application compile.

12.3 Une logique vicelarde : la programmation rcursive


Vous savez comment sont les informaticiens : on ne peut pas leur donner quoi que ce soit sans quils essayent de jouer avec, et le pire, cest quils y russissent. La programmation des fonctions personnalises a donn lieu l'essor dune logique un peu particulire, adapte en particulier au traitement de certains problmes mathmatiques (ou de jeux) : la programmation rcursive. Pour vous expliquer de quoi il retourne, nous allons reprendre un exemple cher vos curs : le calcul dune factorielle (l, je sentais que jallais encore me faire des copains). Rappelez-vous : la formule de calcul de la factorielle dun nombre n scrit : N!=1x2x3xxn Nous avions programm cela aussi sec avec une boucle Pour, et roule Raoul. Mais une autre manire de voir les choses, ni plus juste, ni moins juste, serait de dire que quel que soit le nombre n : n ! = n x (n-1) !

245

En bon franais : la factorielle dun nombre, cest ce nombre multipli par la factorielle du nombre prcdent. Encore une fois, cest une manire ni plus juste ni moins juste de prsenter les choses ; cest simplement une manire diffrente. Si lon doit programmer cela, on peut alors imaginer une fonction Fact, charge de calculer la factorielle. Cette fonction effectue la multiplication du nombre pass en argument par la factorielle du nombre prcdent. Et cette factorielle du nombre prcdent va bien entendu tre elle-mme calcule par la fonction Fact. Autrement dit, on va crer une fonction qui pour fournir son rsultat, va sappeler elle-

mme un certain nombre de fois. Cest cela, la rcursivit.


Toutefois, il nous manque une chose pour finir : quand ces auto-appels de la fonction Fact vont-ils sarrter ? Cela naura-t-il donc jamais de fin ? Si, bien sr, rassure-toi, public, la rcursivit, ce nest pas Les Feux de LAmour. On sarrte quand on arrive au nombre 1, pour lequel la factorielle est par dfinition 1. Cela produit lcriture suivante, un peu dconcertante certes, mais parfois trs pratique : Fonction Fact (N en Numrique) Si N = 0 alors Renvoyer 1 Sinon Renvoyer Fact(N-1) * N Finsi Fin Fonction Vous remarquerez que le processus rcursif remplace en quelque sorte la boucle, cest-dire un processus itratif. Et en plus, avec tous ces nouveaux mots qui riment, vous allez pouvoir crire de trs chouettes pomes. Vous remarquerez aussi quon traite le problme lenvers : on part du nombre, et on remonte rebours jusqu 1 pour pouvoir calculer la factorielle. Cet effet de rebours est caractristique de la programmation rcursive. Pour conclure sur la rcursivit, trois remarques fondamentales.

la programmation rcursive,

pour

traiter certains problmes, est

trs

conomique

pour

le

programmeur

; elle permet de faire les choses

correctement, en trs peu d'instructions.

en revanche, elle est trs dispendieuse de ressources machine. Car lexcution, la machine va tre oblige de crer autant de variables temporaires que de tours de fonction en attente. 246

Last but not least, et cest le gag final, tout problme formul en termes

rcursifs peut galement tre formul en termes itratifs ! Donc, si la


programmation rcursive peut faciliter la vie du programmeur, elle nest jamais indispensable. Mais a me faisait tant plaisir de vous en parler que je nai pas pu rsister Et puis, accessoirement, mme si on ne s'en sert pas, en tant qu'informaticien, il faut connatre cette technique sur laquelle on peut toujours tomber un jour ou l'autre.

247

LA PAGE DES LIENS


Mme auteur, autres sujets :

la spcialit PISE du Master SSAMECI (Universit Paris 7), la formation dans laquelle j'enseigne ce cours.

un cours Visual Basic.Net, dans le mme esprit que celui-ci. Avec l aussi exercices et corrigs... mais sans citations philosophiques.

un cours Visual Basic, du mme tonneau, pour les anciennes versions (5 et 6). un cours d'introduction l'analyse conomique (pour L1 SES) enseigner l'informatique ou l'conomie c'est bien, jouer du rock'n roll, c'est mieux ! Visitez le site des Midnight Jokers, le groupe dans lequel j'ai le bonheur de svir. Vous y trouverez dates de concerts, morceaux en tlchargement, photos, videos, and more and more !

et mon autre groupe, les Moonlight Swampers, de la country et du rockabilly acoustiques.

mes photos sous-marines, avec des btes, petites et grosses, de toutes les couleurs et de toutes les formes.

Mme sujet, autres auteurs :

Donnes et Algorithmique : Patrick Trau, entre autres nombreux cours, propose cet expos riche et pdagogique. Peut tre un peu difficile d'accs pour les vrais dbutants, surtout s'ils ne sont pas matheux.

Algorithmique et langage Pascal : beaucoup de choses dans ce site, dont certaines techniques de programmation un peu volues (pointeurs). A signaler un intressant historique de l'algorithmique.

Algorithmique et programmation : un site riche li aux cours du CNAM, avec de nombreux exemples d'algorithmes. Plutt orient sur le perfectionnement que sur les dbutants.

248

Vous aimerez peut-être aussi