Académique Documents
Professionnel Documents
Culture Documents
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 8
La base dcimale 10
La base binaire 12
Le codage hexadcimal 15
Introduction l'algorithmique 18
Algorithmique et programmation 21
1. Les Variables 23
Exercices 32
Corrigs 35
2
1.4. Expressions et oprateurs 38
Exercices 41
Corrigs 42
2. Lecture et Ecriture 44
Exercices 46
Corrigs 47
3. Les Tests 49
Exercices 53
Corrigs 54
Exercices 58
Corrigs 59
Exercices 62
Corrigs 63
3.7Variables boolennes 67
3
4. Encore de la Logique 68
Exercices 71
Corrigs 73
Exercices 78
Corrigs 80
5. Les Boucles 89
Exercices 94
Corrigs 95
Exercices 102
Corrigs 105
Exercices 115
Corrigs 118
Exercices 122
Corrigs 124
4
7. Techniques Ruses 129
Exercices 139
Corrigs 141
Exercices 149
Corrigs 152
Exercices 162
Corrigs 163
Exercices 166
Corrigs 168
Exercices 174
Corrigs 177
5
10. Fichiers 182
Exercices 191
Corrigs 192
Exercices 200
Corrigs 202
Exercices 218
Corrigs 219
6
11.4 Peut-on tout faire ? 228
Corrigs 236
Liens 248
7
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
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
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 !
8
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 CD-
ROM, 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.
9
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 !
10
Lorsque jcris 9562, de quel nombre est-ce que je parle ? Dcomposons la lecture
chiffre par chiffre, de gauche droite :
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
On peut encore crire ce mme nombre dune manire lgrement diffrente. Au lieu
de :
On crit que :
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 !
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).
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.
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 utilisant trois octets, on passe 256 x 256 x 256 = 16 777 216 possibilits.
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
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.
10111010
4. Le codage hexadcimal
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.
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
Premire mthode :
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
Dans 158, on trouve 9 x 16, cest--dire 9 x 161. Je retranche 144 de 158 et jobtiens 14.
Deuxime mthode :
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
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.
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.
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 .
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.
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.
Quel rapport me direz-vous ? Eh bien le point commun est : quatre mots de vocabulaire.
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
4. Algorithmique et programmation
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
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.
Comme je nai pas moins de petites manies que la majorit de mes semblables, le pseudo-
code 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.
22
Partie 1
Les Variables
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.
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.
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
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 :
Variable g en Numrique
ou encore
Variables PrixHT, TauxTVA, PrixTTC en Numrique
25
1.2.2 Autres types numriques
Nous nemploierons pas ces types dans ce cours ; mais je les signale, car vous ne
manquerez pas de les rencontrer en programmation proprement dite.
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.
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.
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.
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.
27
1.3 Linstruction daffectation
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.
Ainsi :
Toto 24
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
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.
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
34
PARTIE 1
Corrigs des Exercices
Exercice 1.1
Exercice 1.2
Exercice 1.3
35
Exercice 1.4
Exercice 1.5
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
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 :
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 !)
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.
+ : addition
- : soustraction
* : multiplication
/ : division
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.
Variables A, B, C en Caractre
Dbut
A "Gloubi"
B "Boulga"
CA&B
Fin
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
Variables A, B, C en Caractres
Dbut
A "423"
B "12"
CA+B
Fin
Exercice 1.9
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
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
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.
43
Partie 2
Lecture et Ecriture
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.
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.
Tout btement, pour que lutilisateur entre la (nouvelle) valeur de Titi, on mettra :
Lire Titi
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 !) :
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
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
46
PARTIE 2
Corrigs des Exercices
Exercice 2.1
Exercice 2.2
En fait, on pourrait tout aussi bien conomiser la variable carr en remplaant les deux
avant-dernires lignes par :
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
Fin
C'est plus rapide, plus lger en mmoire, mais un peu plus difficile relire (et crire !)
Exercice 2.4
48
Partie 3
Les Tests
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 .
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.
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
Un boolen est une expression dont la valeur est VRAI ou FAUX. Cela peut donc tre (il
ny a que deux possibilits) :
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.
Cette dfinition est essentielle ! Elle signifie quune condition est compose de trois
lments :
une valeur
un oprateur de comparaison
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
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 VRAI
Maman > Papa FAUX
maman > Papa VRAI
52
PARTIE 3
nonc des Exercices
Exercice 3.1
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 C2 Vrai C2 Faux
C1 ou C2 C2 Vrai C2 Faux
Non C1
C1 Vrai Faux
C1 Faux Vrai
56
LE GAG DE LA JOURNE...
57
PARTIE 3
nonc des Exercices
Exercice 3.2
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
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 :
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.
61
PARTIE 3
nonc des Exercices
Exercice 3.4
Exercice 3.5
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
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
63
Exercice 3.6
64
3.6 De laiguillage la gare de tri
Cette citation napporte peut-tre pas grand chose cet expos, mais je laime bien,
alors ctait le moment ou jamais.
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 :
devienne :
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.
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
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
Sil ny a dans une condition que des ET, ou que des OU, en revanche, les parenthses ne
changent strictement rien.
On en arrive une autre proprit des ET et des OU, bien plus intressante.
68
Quand faut-il ouvrir la fentre de la salle ? Uniquement si les conditions limposent,
savoir :
Cette petite rgle pourrait tout aussi bien tre formule comme suit :
Ces deux formulations sont strictement quivalentes. Ce qui nous amne la conclusion
suivante :
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 :
70
PARTIE 4
nonc des Exercices
Exercice 4.1
Exercice 4.2
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 :
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)".
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
72
PARTIE 4
Corrigs des Exercices
Exercice 4.1
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
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.
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
lorsque l'un des candidats obtient plus de 50% des suffrages, il est lu ds le
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 :
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 !...
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.
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
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 :
JMax : variable numrique qui indiquera le dernier jour valable pour le mois entr.
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" :
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.
Il convient enfin de citer une solution trs simple et lgante, un peu plus difficile peut-
tre 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 :
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...
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
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.
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 :
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 :
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 :
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 :
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.
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 :
Le Gag De La Journe
Bon, eh bien vous allez pouvoir faire de chouettes algorithmes, dj rien quavec a
93
PARTIE 5
nonc des Exercices
Exercice 5.1
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).
Equivaut :
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.
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 :
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 :
la gestion des tours dun jeu (tant que la partie nest pas finie, on recommence)
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.
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 :
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.
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 ( a-
t-il plus ou moins de 18 ans ? ).
100
5.4 Et encore une btise ne pas faire !
Vous remarquerez que nous faisons ici grer en double la variable Truc, ces deux
gestions tant contradictoires. Dune part, la ligne
Pour
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
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
Exercice 5.6
1x2x3x4x5x6x7x8
102
Exercice 5.7
etc.
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.
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
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 :
Exercice 5.8
107
Exercice 5.9
108
Exercice 5.10
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
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
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.
111
Un ensemble de valeurs portant le mme nom de variable et repres par
un nombre, sappelle un tableau, ou encore une variable indice.
Chaque fois que lon doit dsigner un lment du tableau, on fait figurer
le nom du tableau, suivi de lindice de llment, entre parenthses.
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.
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 :
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.
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.
Je le re-re-rpte, si lon est dans un langage o les indices commencent zro, il faut
en tenir compte la dclaration :
113
...crera un tableau de 14 lments, le plus petit indice tant 0 et le plus grand 13.
LE GAG DE LA JOURNEE
114
PARTIE 6
nonc des Exercices
Exercice 6.1
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
115
Exercice 6.5
Exercice 6.6
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
Exercice 6.2
Exercice 6.3
118
Exercice 6.4
Exercice 6.5
Cet algorithme remplit un tableau avec les sept valeurs : 1, 3, 5, 7, 9, 11, 13.
Exercice 6.6
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.
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 :
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
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
Tableau 1 :
4 8 7 9 1 5 4 6
Tableau 2 :
7 6 5 2 1 3 7 4
Tableau constituer :
11 14 12 11 2 8 11 10
122
Exercice 6.11
Tableau 1 :
4 8 7 12
Tableau 2 :
3 6
Le Schtroumpf sera :
3 * 4 + 3 * 8 + 3 * 7 + 3 * 12 + 6 * 4 + 6 * 8 + 6 * 7 + 6 * 12 = 279
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
Exercice 6.14
123
Partie 6
Corrigs des Exercices
Exercice 6.8
124
Exercice 6.9
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
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
126
Exercice 6.13
127
Exercice 6.14
128
Partie 7
Techniques Rusees
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 :
Et que valent quelques kilos daspirine, compars lineffable bonheur procur par la
comprhension suprme des arcanes de lalgorithmique ? Hein ?
Il existe plusieurs stratgies possibles pour trier les lments dun tableau ; nous en
verrons deux : le tri par slection, et le tri bulles. Champagne !
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
130
Cela scrit :
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.
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 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 !
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.
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 :
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.
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 :
TantQue Yapermute
FinTantQue
Fin
135
Cest parti :
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).
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 :
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
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.
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 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.
Eh bien maintenant que je vous ai expliqu comment faire, vous n'avez plus qu' traduire !
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.
12 13 14 15 16 17 18
9 10 11 15 16 17 18
Exercice 7.2
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
12 8 4 45 9 2
Exercice 7.5
140
PARTIE 7
Corrigs des Exercices
Exercice 7.1
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
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
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
Exercice 7.5
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.
145
Partie 8
Tableaux Multidimensionnels
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 ).
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 :
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.
Linformatique nous offre la possibilit de dclarer des tableaux dans lesquels les
valeurs ne sont pas repres par une seule, mais par deux coordonnes.
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(i-
1, j-1), Cases(i-1, j+1), Cases(i+1, j-1) et Cases(i+1, j+1).
REMARQUE ESSENTIELLE :
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
Exercice 8.2
149
Exercice 8.3
Exercice 8.4
150
Exercice 8.5
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
Exercice 8.7
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.
151
PARTIE 8
Corrigs des Exercices
Exercice 8.1
Exercice 8.2
X(0, 0) = 1
X(0, 1) = 2
X(0, 2) = 3
X(1, 0) = 4
X(1, 1) = 5
X(1, 2) = 6
152
Exercice 8.3
X(0, 0) = 1
X(1, 0) = 4
X(0, 1) = 2
X(1, 1) = 5
X(0, 2) = 3
X(1, 2) = 6
Exercice 8.4
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
153
Exercice 8.5
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
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
154
Exercice 8.6
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
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
Mouv(0, 0) -1
Mouv(0, 1) -1
Mouv(1, 0) -1
Mouv(1, 1) 1
Mouv(2, 0) 1
Mouv(2, 1) -1
Mouv(3, 0) 1
Mouv(3, 1) 1
Pour i 0 7
Pour j 0 7
Damier(i, j) Faux
j suivant
i suivant
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
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
i2 posi + Mouv(Dep, 0)
j2 posj + Mouv(Dep, 1)
MoveOK i2 >= 0 et i2 <= 7 et j2 >= 0 et j2 <= 7
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
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.
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
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.
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)
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.
LE GAG DE LA JOURNEE
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
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 :
Ce sont les deux seules fonctions de chanes rellement indispensables. Cependant, pour
nous pargner des algorithmes fastidieux, les langages proposent galement :
Exemples :
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") vaut 78
Chr(63) vaut "?"
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
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
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 :
Exercice 9.3
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.
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...
169
Exercice 9.5
170
Exercice 9.6
- 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.
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 !
171
9.3 Trois fonctions numriques classiques
Partie Entire
Une fonction extrmement rpandue est celle qui permet de rcuprer la partie entire
dun nombre :
Modulo
Cette fonction permet de rcuprer le reste de la division dun nombre par un deuxime
nombre. Par exemple :
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.
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 :
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 :
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 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
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"
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.
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.
Exercice 9.10
175
Exercice 9.11
Ecrivez les algorithmes qui gnrent un nombre Glup alatoire tel que
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.
177
Exercice 9.8
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.
Poscl Poscl + 1
Si PosCl > Len(Cl) Alors
PosCl 1
FinSi
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
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.
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
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).
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.
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 Sophie 0142156487fonfec@yahoo.fr
Ztofrais Mlanie 0456912347ztofrais@free.fr
Herbien Jean-Philippe 0289765194vantard@free.fr
Hergbel Octave 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.
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.
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.
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 :
185
A la diffrence de la prcdente, cette typologie ne caractrise pas la structure elle-
mme 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 lui-
mme, 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.
On les utilise pour stocker... des bases de donnes tout, y compris des bases de donnes.
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.
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.
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 :
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 :
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) :
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
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
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
Exercice 10.2
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
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.
Pourquoi, alors, demanderez-vous haletants, ne fait-on pas cela tous les coups ? Y a-t-
il 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.
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...
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 :
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...
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.
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
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 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
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.
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.
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
204
On recopie ensuite l'intgralit de Fic dans "Adresse"
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...
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
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.
Exercice 10.8
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...
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
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 j 0 i
Ecrire MesVendeurs(j)
j suivant
Fin
210
Et en conclusion de la conclusion, voil plusieurs remarques fondamentales :
REMARQUE N1
REMARQUE N1bis
REMARQUE N2
211
Partie 11
Procdures et Fonctions
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.
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.
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
...
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 :
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...
lorsquon appelle la fonction, on doit lui prciser quel message elle doit afficher
avant de lire la rponse
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.
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
Fonction Sum(a, b, c, d, e)
Renvoyer a + b + c + d + e
FinFonction
Exercice 11.2
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 sous-
procdure).
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 :
221
Dans la procdure principale, lappel la sous-procdure Bidule devient quant lui :
Appeler Bidule(...)
Alors qu'une fonction se caractrisait par les mots-cls Fonction ... Fin Fonction,
une sous-procdure est identifie par les mots-cls Procdure ... Fin
Procdure. Oui, je sais, c'est un peu trivial comme remarque, mais, bon, on ne sait
jamais.
Mme une fois qu'on a bien compris les trois premiers points, on n'est pas
compltement au bout de nos peines.
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 sous-
procdure 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.
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...
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 :
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 sous-
procdure). 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 :
Quant l'appel cette sous-procdure, il pourra prendre par exemple cette forme :
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 sous-
procdure. 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.
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 :
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.
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 :
dans tous les cas, par la transmission de paramtres (que ces paramtres soient
passs par valeur ou par rfrence)
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.
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.
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.
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 :
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.
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.
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.
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
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 :
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
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).
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 :
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).
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 sous-
procdure spcialise, appele AffichageMot. Quant linitialisation des diffrentes
variables, elle pourra tre place, de manire classique, dans la procdure principale
elle-mme.
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.
A ce stade, lanalyse dite fonctionnelle est termine. Les fondations (solides, esprons-
le) sont poses pour finaliser lapplication.
234
Etape 3 : Algorithmes dtaills
235
Fonction ChoixDuMot
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
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.
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)
239
Procdure VerifLettre
Procdure Epilogue
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
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.
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
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.
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.
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.
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.
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.
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.
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.
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 :
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.
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
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).
mes photos sous-marines, avec des btes, petites et grosses, de toutes les
couleurs et de toutes les formes.
248