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
La base dcimale
10
La base binaire
12
Le codage hexadcimal
15
Introduction l'algorithmique
18
18
19
20
Algorithmique et programmation
21
22
1. Les Variables
23
23
24
24
26
26
27
28
28
30
Exercices
32
Corrigs
35
38
39
39
40
Exercices
41
Corrigs
42
43
2. Lecture et Ecriture
44
44
45
Exercices
46
Corrigs
47
3. Les Tests
49
49
50
51
Exercices
53
Corrigs
54
55
Exercices
58
Corrigs
59
60
Exercices
62
Corrigs
63
65
3.7Variables boolennes
67
3
4. Encore de la Logique
68
68
Exercices
71
Corrigs
73
76
Exercices
78
Corrigs
80
5. Les Boucles
89
89
Exercices
94
Corrigs
95
97
99
101
Exercices
102
Corrigs
105
6. Les Tableaux
111
111
112
Exercices
115
Corrigs
118
121
Exercices
122
Corrigs
124
7. Techniques Ruses
129
129
131
135
137
Exercices
139
Corrigs
141
8. Tableaux Multidimensionnels
146
146
147
Exercices
149
Corrigs
152
159
9. Fonctions Prdfinies
160
160
Exercices
162
Corrigs
163
164
Exercices
166
Corrigs
168
172
Exercices
174
Corrigs
177
181
10. Fichiers
182
182
184
185
10.4 Instructions
187
Exercices
191
Corrigs
192
194
195
195
197
198
Exercices
200
Corrigs
202
212
212
212
215
216
Exercices
218
Corrigs
219
11.2 Sous-procdures
221
11.2.1 Gnralits
221
222
223
227
6
228
229
Corrigs
236
242
242
244
245
Liens
248
Prambule : Le Codage
Linformation nest pas le savoir. Le savoir nest pas
la sagesse. La sagesse nest pas la beaut. La beaut
nest pas lamour. Lamour nest pas la musique, et la
musique, cest ce quil y a de mieux. - Frank Zappa
Les ordinateurs sont comme les dieux de lAncien
Testament : avec beaucoup de rgles, et sans piti.
- Joseph Campbell
Compter en octal, cest comme compter en dcimal,
si on nutilise pas ses pouces - Tom Lehrer
Il y a 10 sortes de gens au monde : ceux qui
connaissent le binaire et les autres - Anonyme
Cest bien connu, les ordinateurs sont comme le gros rock qui tche : ils sont binaires.
Mais ce qui est moins connu, cest ce que ce qualificatif de binaire recouvre
exactement, et ce quil implique. Aussi, avant de nous plonger dans les arcanes de
lalgorithmique proprement dite, ferons-nous un dtour par la notion de codage binaire.
Contrairement aux apparences, nous ne sommes pas loigns de notre sujet principal.
Tout au contraire, ce que nous allons voir prsent constitue un ensemble de notions
indispensables lcriture de programmes. Car pour parler une machine, mieux vaut
connatre son vocabulaire
1. Pourquoi les ordinateurs sont-ils binaires ?
De nos jours, les ordinateurs sont ces machines merveilleuses capables de traiter du
texte, dafficher des tableaux de matre, de jouer de la musique ou de projeter des
vidos. On nen est pas encore tout fait HAL, lordinateur de 2001 Odysse de
Lorsque nous disons que 4+3=7 (ce qui reste, normalement, dans le domaine de
comptence mathmatique de tous ceux qui lisent ce cours !), nous manions de pures
abstractions, reprsentes par de non moins purs symboles ! Un tre humain dil y a
quelques millnaires se serait demand longtemps quest-ce que cest que quatre ou
trois , sans savoir quatre ou trois quoi ? . Mine de rien, le fait mme de concevoir
des nombres, cest--dire de pouvoir considrer, dans un ensemble, la quantit
indpendamment de tout le reste, cest dj une abstraction trs hardie, qui a mis trs
longtemps avant de simposer tous comme une vidence. Et le fait de faire des
additions sans devoir prciser des additions de quoi ? , est un pas supplmentaire qui
a t encore plus difficile franchir.
Le concept de nombre, de quantit pure, a donc constitu un immense progrs (que les
ordinateurs nont quant eux, je le rpte, toujours pas accompli). Mais si concevoir les
nombres, cest bien, possder un systme de notation performant de ces nombres, cest
encore mieux. Et l aussi, lhumanit a mis un certain temps (et essay un certain
nombre de pistes qui se sont rvles tre des impasses) avant de parvenir au systme
actuel, le plus rationnel. Ceux qui ne sont pas convaincus des progrs raliss en ce
domaine peuvent toujours essayer de rsoudre une multiplication comme 587 x 644 en
chiffres romains, on leur souhaite bon courage !
2. La numrotation de position en base dcimale
Lhumanit actuelle, pour reprsenter nimporte quel nombre, utilise un systme de
numrotation de position, base dcimale. Quest-ce qui se cache derrire cet obscur
jargon ?
Commenons par la numrotation de position. Pour reprsenter un nombre, aussi grand
soit-il, nous disposons dun alphabet spcialis : une srie de 10 signes qui sappellent les
chiffres. Et lorsque nous crivons un nombre en mettant certains de ces chiffres les
uns derrire les autres, lordre dans lequel nous mettons les chiffres est capital. Ainsi,
par exemple, 2 569 nest pas du tout le mme nombre que 9 562. Et pourquoi ? Quel
opration, quel dcodage mental effectuons-nous lorsque nous lisons une suite de
chiffres reprsentant un nombre ? Le problme, cest que nous sommes tellement
habitus faire ce dcodage de faon instinctive que gnralement nous nen
connaissons plus les rgles. Mais ce nest pas trs compliqu de les reconstituer Et
cest l que nous mettons le doigt en plein dans la deuxime caractristique de notre
systme de notation numrique : son caractre dcimal.
10
Lorsque jcris 9562, de quel nombre est-ce que je parle ? Dcomposons la lecture
chiffre par chiffre, de gauche droite :
9562, cest 9000 + 500 + 60 + 2.
Allons plus loin, mme si cela parat un peu bbte :
9000, cest 9 x 1000, parce que le 9 est le quatrime chiffre en partant de la droite
500, cest 5 x 100, parce que le 5 est le troisime chiffre en partant de la droite
60, cest 6 x 10, parce que le 6 est le deuxime chiffre en partant de la droite
2, cest 2 x 1, parce que le 2 est le premier chiffre en partant de la droite
On peut encore crire ce mme nombre dune manire lgrement diffrente. Au lieu
de :
9 562 = 9 x 1 000 + 5 x 100 + 6 x 10 + 2,
On crit que :
9 562 = (9 x 10 x 10 x 10) + (5 x 10 x 10) + (6 x 10) + (2)
Arrivs ce stade de la comptition, je prie les allergiques de mexcuser, mais il nous
faut employer un petit peu de jargon mathmatique. Ce nest pas grand-chose, et on
touche au but. Alors, courage ! En fait, ce jargon se rsume au fait que les matheux
notent la ligne ci-dessus laide du symbole de puissance . Cela donne :
9 562 = 9 x 103 + 5 x 102 + 6 x 101 + 2 x 100
Et voil, nous y sommes. Nous avons dgag le mcanisme gnral de la reprsentation
par numrotation de position en base dcimale.
Alors, nous en savons assez pour conclure sur les consquences du choix de la base
dcimale. Il y en a deux, qui nen forment en fin de compte quune seule :
parce que nous sommes en base dcimale, nous utilisons un alphabet numrique de dix
symboles. Nous nous servons de dix chiffres, pas un de plus, pas un de moins.
toujours parce nous sommes en base dcimale, la position dun de ces dix chiffres dans
un nombre dsigne la puissance de dix par laquelle ce chiffre doit tre multipli pour
reconstituer le nombre. Si je trouve un 7 en cinquime position partir de la droite, ce
7 ne reprsente pas 7 mais 7 fois 104, soit 70 000.
11
Un dernier mot concernant le choix de la base dix. Pourquoi celle-l et pas une autre ?
Aprs tout, la base dix ntait pas le seul choix possible. Les babyloniens, qui furent de
brillants mathmaticiens, avaient en leur temps adopt la base 60 (dite sexagsimale).
Cette base 60 impliquait certes dutiliser un assez lourd alphabet numrique de 60
chiffres. Mais ctait somme toute un inconvnient mineur, et en retour, elle possdait
certains avantages non ngligeables. 60 tant un nombre divisible par beaucoup dautres
(cest pour cette raison quil avait t choisi), on pouvait, rien quen regardant le dernier
chiffre, savoir si un nombre tait divisible par 2, 3, 4, 5, 6, 10, 12, 15, 20 et 30. Alors
quen base 10, nous ne pouvons immdiatement rpondre la mme question que pour les
diviseurs 2 et 5. La base sexagsimale a certes disparu en tant que systme de notation
des nombres. Mais Babylone nous a laiss en hritage sa base sexagsimale dans la
division du cercle en soixante parties (pour compter le temps en minutes et secondes),
et celle en 6 x 60 parties (pour les degrs de la gomtrie et de lastronomie).
Alors, pourquoi avons-nous adopt la base dcimale, moins pratique bien des gards ?
Nul doute que cela tienne au dispositif matriel grce auquel tout tre humain
normalement constitu stocke spontanment une information numrique : ses doigts !
Profitons-en pour remarquer que le professeur Shadoko avait invent exactement le
mme systme, la seule diffrence tant qu'il avait choisi la base 4 (normal, les shadoks
n'avaient que 4 mots). Regardez donc cette video - ou comment faire rigoler les gens en
ne disant (presque) que des choses vraies :
http://www.youtube.com/watch?v=X9l8u4SjRcI&eurl=http://aigespc57.cicrp.jussieu.fr/
algo/codage.htm&feature=player_embedded
J'ajoute que c'est l'ensemble des videos des shadoks, et en particulier celles traitant
de la logique et des mathmatiques, qui vaut son pesant de cacahutes interstellaires.
Mais hlas cela nous loignerait un peu trop de notre propos (c'est pas grave, on y
reviendra la prochaine pause).
3. La numrotation de position en base binaire
Les ordinateurs, eux, comme on la vu, ont un dispositif physique fait pour stocker (de
multiples faons) des informations binaires. Alors, lorsquon reprsente une information
stocke par un ordinateur, le plus simple est dutiliser un systme de reprsentation
deux chiffres : les fameux 0 et 1. Mais une fois de plus, je me permets dinsister, le
choix du 0 et du 1 est une pure convention, et on aurait pu choisir nimporte quelle autre
paire de symboles leur place.
12
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
14
Premire mthode :
On retombe sur un raisonnement dj abord. Cet octet reprsente en base dix :
1 x 27 + 0 x 26 + 0 x 25 + 1 x 24 + 1 x 23 + 1 x 22 + 1 x 21 + 0 x 20 =
1 x 128 + 1 x 16 + 1 x 8 + 1 x 4 + 1 x 2 + 0 x 1 =
128 + 16 + 8 + 4 + 2 =
158
De l, il faut repartir vers la base hexadcimale.
Dans 158, on trouve 9 x 16, cest--dire 9 x 161. Je retranche 144 de 158 et jobtiens 14.
Dans 14, on trouve 14 x 1, cest--dire 14 x 160. On y est.
Le nombre scrit donc en hexadcimal : 9E
Deuxime mthode :
Divisons 1 0 0 1 1 1 1 0 en 1 0 0 1 (partie gauche) et 1 1 1 0 (partie droite).
1 0 0 1, cest 8 + 1, donc 9
1 1 1 0, cest 8 + 4 + 2 donc 14
Le nombre scrit donc en hexadcimal : 9E. Cest la mme conclusion quavec la premire
mthode. Encore heureux !
16
Le codage hexadcimal est trs souvent utilis quand on a besoin de reprsenter les
octets individuellement, car dans ce codage, tout octet correspond seulement deux
signes.
Allez, assez bavard, on passe aux choses srieuses : les arcanes de lalgorithmique
17
Introduction a lAlgorithmique
Un langage de programmation est une convention
pour donner des ordres un ordinateur. Ce nest pas
cens tre obscur, bizarre et plein de piges subtils.
Ca, ce sont les caractristiques de la magie. - Dave
Small
C'est illogique, Capitaine - Mr Spock
Lalgorithmique est un terme dorigine arabe, comme algbre, amiral ou znith. Ce nest
pas une excuse pour massacrer son orthographe, ou sa prononciation.
Ainsi, lalgo nest pas rythmique , la diffrence du bon rockn roll. Lalgo nest pas
non plus lagglo .
Alors, ne confondez pas lalgorithmique avec lagglo rythmique, qui consiste poser des
parpaings en cadence.
1. Quest-ce que lalgomachin ?
Avez-vous dj ouvert un livre de recettes de cuisine ? Avez vous dj dchiffr un
mode demploi traduit directement du coren pour faire fonctionner un magntoscope ou
un rpondeur tlphonique rticent ? Si oui, sans le savoir, vous avez dj excut des
algorithmes.
Plus fort : avez-vous dj indiqu un chemin un touriste gar ? Avez vous fait
chercher un objet quelquun par tlphone ? Ecrit une lettre anonyme stipulant
comment procder une remise de ranon ? Si oui, vous avez dj fabriqu et fait
excuter des algorithmes.
Comme quoi, lalgorithmique nest pas un savoir sotrique rserv quelques rares
initis touchs par la grce divine, mais une aptitude partage par la totalit de
lhumanit. Donc, pas dexcuses
Un algorithme, cest une suite dinstructions, qui une fois excute correctement,
conduit un rsultat donn. Si lalgorithme est juste, le rsultat est le rsultat voulu,
et le touriste se retrouve l o il voulait aller. Si lalgorithme est faux, le rsultat est,
disons, alatoire, et dcidment, cette saloperie de rpondeur ne veut rien savoir.
Compltons toutefois cette dfinition. Aprs tout, en effet, si lalgorithme, comme on
vient de le dire, nest quune suite dinstructions menant celui qui lexcute rsoudre un
problme, pourquoi ne pas donner comme instruction unique : rsous le problme , et
18
comprhensibles par celui qui devra lexcuter. Cest dailleurs lun des points dlicats
pour les rdacteurs de modes demploi : les rfrences culturelles, ou lexicales, des
utilisateurs, tant variables, un mme mode demploi peut tre trs clair pour certains
et parfaitement abscons pour dautres.
En informatique, heureusement, il ny a pas ce problme : les choses auxquelles ont doit
donner des instructions sont les ordinateurs, et ceux-ci ont le bon got dtre tous
strictement aussi idiots les uns que les autres.
2. Faut-il tre matheux pour tre bon en algorithmique ?
Je consacre quelques lignes cette question, car cette opinion aussi fortement
affirme que faiblement fonde sert rgulirement dexcuse : moi, de toute faon, je
suis mauvais(e) en algo, jai jamais rien pig aux maths . Faut-il tre bon en maths
pour expliquer correctement son chemin quelquun ? Je vous laisse juge.
La matrise de lalgorithmique requiert deux qualits, trs complmentaires dailleurs :
il faut avoir une certaine intuition, car aucune recette ne permet de savoir a priori
quelles instructions permettront dobtenir le rsultat voulu. Cest l, si lon y tient,
quintervient la forme dintelligence requise pour lalgorithmique. Alors, cest certain,
il y a des gens qui possdent au dpart davantage cette intuition que les autres.
Cependant, et jinsiste sur ce point, les rflexes, cela sacquiert. Et ce quon appelle
lintuition nest finalement que de lexprience tellement rpte que le raisonnement, au
dpart laborieux, finit par devenir spontan .
19
il faut tre mthodique et rigoureux. En effet, chaque fois quon crit une srie
dinstructions quon croit justes, il faut systmatiquement se mettre mentalement la
place de la machine qui va les excuter, arm d'un papier et d'un crayon, afin de vrifier
si le rsultat obtenu est bien celui que lon voulait. Cette opration ne requiert pas la
moindre once dintelligence. Mais elle reste nanmoins indispensable, si lon ne veut pas
crire laveuglette.
Et petit petit, force de pratique, vous verrez que vous pourrez faire de plus en plus
souvent lconomie de cette dernire tape : lexprience fera que vous verrez le
rsultat produit par vos instructions, au fur et mesure que vous les crirez.
Naturellement, cet apprentissage est long, et demande des heures de travail patient.
Aussi, dans un premier temps, vitez de sauter les tapes : la vrification mthodique,
risquer quil se passe quelque chose de pire (pour dautres fortes maximes Shadok,
nhsitez pas visiter leur site Internet, il y en a toute une collection qui vaut le
dtour).
LADN, qui est en quelque sorte le programme gntique, lalgorithme la base de
construction des tres vivants, est une chane construite partir de quatre lments
invariables. Ce nest que le nombre de ces lments, ainsi que lordre dans lequel ils sont
arrangs, qui vont dterminer si on obtient une puce ou un lphant. Et tous autant que
nous sommes, splendides russites de la Nature, avons t construits par un
programme constitu uniquement de ces quatre briques, ce qui devrait nous inciter
la modestie.
20
indpendamment des particularits de tel ou tel langage. Pour prendre une image, si
un programme tait une dissertation, lalgorithmique serait le plan, une fois mis de ct
la rdaction et lorthographe. Or, vous savez quil vaut mieux faire dabord le plan et
rdiger ensuite que linverse
Apprendre lalgorithmique, cest apprendre manier la structure logique dun programme
informatique.
Cette
dimension
est
prsente
quelle
que
soit
le
langage
de
programmation ; mais lorsquon programme dans un langage (en C, en Visual Basic, etc.)
on doit en plus se colleter les problmes de syntaxe, ou de types dinstructions, propres
ce langage. Apprendre lalgorithmique de manire spare, cest donc srier les
difficults pour mieux les vaincre.
A cela, il faut ajouter que des gnrations de programmeurs, souvent autodidactes (mais
pas toujours, hlas !), ayant directement appris programmer dans tel ou tel langage, ne
font pas mentalement clairement la diffrence entre ce qui relve de la structure
logique gnrale de toute programmation (les rgles fondamentales de lalgorithmique)
21
et ce qui relve du langage particulier quils ont appris. Ces programmeurs, non
seulement ont beaucoup plus de mal passer ensuite un langage diffrent, mais encore
crivent bien souvent des programmes qui mme sils sont justes, restent laborieux. Car
on nignore pas impunment les rgles fondamentales de lalgorithmique Alors, autant
lapprendre en tant que telle !
Bon, maintenant que jai bien fait larticle pour vendre ma marchandise, on va presque
pouvoir passer au vif du sujet
5. Avec quelles conventions crit-on un algorithme ?
Historiquement, plusieurs types de notations ont reprsent des algorithmes.
Il y a eu notamment une reprsentation graphique, avec des carrs, des losanges, etc.
quon appelait des organigrammes. Aujourdhui, cette reprsentation est quasiment
abandonne, pour deux raisons. Dabord, parce que ds que lalgorithme commence
grossir un peu, ce nest plus pratique du tout du tout. Ensuite parce que cette
reprsentation favorise le glissement vers un certain type de programmation, dite non
structure (nous dfinirons ce terme plus tard), que lon tente au contraire dviter.
Cest pourquoi on utilise gnralement une srie de conventions appele pseudocode , qui ressemble un langage de programmation authentique dont on aurait vacu
la plupart des problmes de syntaxe. Ce pseudo-code est susceptible de varier
lgrement dun livre (ou dun enseignant) un autre. Cest bien normal : le pseudo-code,
encore une fois, est purement conventionnel ; aucune machine nest cense le
reconnatre. Donc, chaque cuisinier peut faire sa sauce sa guise, avec ses petites
pices bien lui, sans que cela prte consquence.
Comme je nai pas moins de petites manies que la majorit de mes semblables, le pseudocode que vous dcouvrirez dans les pages qui suivent possde quelques spcificits
mineures qui ne doivent qu mes nvroses personnelles.
Rassurez-vous cependant, celles-ci restent dans les limites tout fait acceptables.
En tout cas, personnellement, je les accepte trs bien.
22
Partie 1
Les Variables
Nattribuez
jamais
la
malveillance
ce
qui
celle
consistant
attribuer
lerreur
lordinateur. - Anonyme
de lui coller une tiquette. Ceci se fait tout au dbut de lalgorithme, avant mme les
instructions proprement dites. Cest ce quon appelle la dclaration des variables. Cest
un genre de dclaration certes moins romantique quune dclaration damour, mais dun
autre ct moins dsagrable quune dclaration dimpts.
Le nom de la variable (ltiquette de la bote) obit des impratifs changeant selon les
langages. Toutefois, une rgle absolue est quun nom de variable peut comporter des
lettres et des chiffres, mais quil exclut la plupart des signes de ponctuation, en
particulier les espaces. Un nom de variable correct commence galement imprativement
par une lettre. Quant au nombre maximal de signes pour un nom de variable, il dpend du
langage utilis.
En pseudo-code algorithmique, on est bien sr libre du nombre de signes pour un nom de
variable, mme si pour des raisons purement pratiques, et au grand dsespoir de
Stphane Bern, on vite gnralement les noms rallonge.
Lorsquon dclare une variable, il ne suffit pas de crer une bote (rserver un
emplacement mmoire) ; encore doit-on prciser ce que lon voudra mettre dedans, car
de cela dpendent la taille de la bote (de lemplacement mmoire) et le type de codage
utilis.
24
Tous les langages, quels quils soient offrent un bouquet de types numriques, dont le
dtail est susceptible de varier lgrement dun langage lautre. Grosso modo, on
retrouve cependant les types suivants :
Type Numrique
Plage
Byte (octet)
0 255
Entier simple
Entier long
Rel simple
Rel double
-3,40x1038
1,40x10
-45
1,79x10308
-1,40x1045
3,40x10
38
pour
les
valeurs
ngatives
-4,94x10-324
pour
les
valeurs
ngatives
il
marche
en
vitant
de
gaspiller
les
25
type chane ou en anglais, le type string mais ne fantasmez pas trop vite, les string,
cest loin dtre aussi excitant que le nom le suggre. Une tudiante qui se reconnatra si
elle lit ces lignes a d'ailleurs mis le doigt - si j'ose m'exprimer ainsi - sur le fait qu'il en
va de mme en ce qui concerne les bytes).
Dans une variable de ce type, on stocke des caractres, quil sagisse de lettres, de
signes de ponctuation, despaces, ou mme de chiffres. Le nombre maximal de
caractres pouvant tre stocks dans une seule variable string dpend du langage
utilis.
Un groupe de caractres (y compris un groupe de un, ou de zro caractres), quil soit ou
non stock dans une variable, dailleurs, est donc souvent appel chane de caractres.
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.
type
boolen
est
trs
souvent
nglig
par
les
programmeurs, tort.
Il est vrai qu'il n'est pas proprement parler indispensable,
et qu'on pourrait crire peu prs nimporte quel
programme en l'ignorant compltement. Pourtant, si le type
boolen est mis disposition des programmeurs dans tous
les langages, ce n'est pas pour rien. Le recours aux variables
boolennes s'avre trs souvent un puissant instrument de
lisibilit des algorithmes : il peut faciliter la vie de celui qui
crit l'algorithme, comme de celui qui le relit pour le
corriger.
Alors, maintenant, c'est certain, en algorithmique, il y a une
question de style : c'est exactement comme dans le langage
courant, il y a plusieurs manires de s'exprimer pour dire
sur le fond la mme chose. Nous verrons plus loin diffrents
exemples de variations stylistiques autour d'une mme
solution. En attendant, vous tes prvenus : l'auteur de ce
cours est un adepte fervent (mais pas irraisonn) de
l'utilisation des variables boolennes.
27
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
30
Exemple 1
Variable A en Numrique
Dbut
A 12
Fin
Exemple 2
Variable A en Numrique
Dbut
A 34
Fin
Tous les lments sont maintenant en votre possession pour que ce soit vous de jouer !
31
PARTIE 1
nonc des Exercices
Exercice 1.1
Quelles seront les valeurs des variables A et B aprs excution des instructions
suivantes ?
Variables A, B en Entier
Dbut
A1
BA+3
A3
Fin
Exercice 1.2
Quelles seront les valeurs des variables A, B et C aprs excution des instructions
suivantes ?
Variables A, B, C en Entier
Dbut
A5
B3
CA+B
A2
CBA
Fin
32
Exercice 1.3
Quelles seront les valeurs des variables A et B aprs excution des instructions
suivantes ?
Variables A, B en Entier
Dbut
A5
BA+4
AA+1
BA4
Fin
Exercice 1.4
Quelles seront les valeurs des variables A, B et C aprs excution des instructions
suivantes ?
Variables A, B, C en Entier
Dbut
A3
B 10
CA+B
BA+B
AC
Fin
33
Exercice 1.5
Quelles seront les valeurs des variables A et B aprs excution des instructions
suivantes ?
Variables A, B en Entier
Dbut
A5
B2
AB
BA
Fin
Moralit : les deux dernires instructions permettent-elles dchanger les deux valeurs
de B et A ? Si lon inverse les deux dernires instructions, cela change-t-il quelque
chose ?
Exercice 1.6
Plus difficile, mais cest un classique absolu, quil faut absolument matriser : crire un
algorithme permettant dchanger les valeurs de deux variables A et B, et ce quel que
soit leur contenu pralable.
Exercice 1.7
Une variante du prcdent : on dispose de trois variables A, B et C. Ecrivez un
algorithme transfrant B la valeur de A, C la valeur de B et A la valeur de C
(toujours quels que soient les contenus pralables de ces variables).
34
PARTIE 1
Corrigs des Exercices
Exercice 1.1
Aprs
A1
A=1
B=?
BA+3
A=1
B=4
A3
A = 3
B = 4
Exercice 1.2
Aprs
A5
A=5
B=?
C=?
B3
A=5
B=3
C=?
CA+B
A=5
B=3
C=8
A2
A=2
B=3
C=8
CBA
A = 2
B = 3
C = 1
Exercice 1.3
Aprs
A5
A=5
B=?
BA+4
A=5
B=9
AA+1
A=6
B=9
BA4
A = 6
B = 2
35
Exercice 1.4
Aprs
A3
A=3
B=?
C=?
B 10
A=3
B = 10
C=?
CA+B
A=3
B = 10
C = 13
BA+B
A=3
B = 13
C = 13
AC
A = 13
B = 13
C = 13
Exercice 1.5
Aprs
A5
A=5
B=?
B2
A=5
B=2
AB
A=2
B=2
BA
A = 2
B = 2
Les deux dernires instructions ne permettent donc pas dchanger les deux valeurs de
B et A, puisque lune des deux valeurs (celle de A) est ici crase.
Si lon inverse les deux dernires instructions, cela ne changera rien du tout, hormis le
fait que cette fois cest la valeur de B qui sera crase.
Exercice 1.6
Dbut
CA
AB
BC
Fin
On est oblig de passer par une variable dite temporaire (la variable C).
36
Exercice 1.7
Dbut
DC
CB
BA
AD
Fin
En fait, quel que soit le nombre de variables, une seule variable temporaire suffit
37
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 :
lexpression situe droite de la flche soit du mme type que la variable situe
gauche. Cest trs logique : on ne peut pas ranger convenablement des outils
dans un sac provision, ni des lgumes dans une trousse outils sauf
provoquer un rsultat catastrophique.
Si lun des trois points numrs ci-dessus nest pas respect, la machine sera incapable
dexcuter laffectation, et dclenchera une erreur (est-il besoin de dire que si aucun de
ces points nest respect, il y aura aussi erreur !)
On va maintenant dtailler ce que lon entend par le terme d oprateur.
38
40
PARTIE 1
nonc des Exercices
Exercice 1.8
Que produit lalgorithme suivant ?
Variables A, B, C en Caractres
Dbut
A "423"
B "12"
CA+B
Fin
Exercice 1.9
Que produit lalgorithme suivant ?
Variables A, B, C en Caractres
Dbut
A "423"
B "12"
CA&B
Fin
41
PARTIE 1
Corrigs des Exercices
Exercice 1.8
Il ne peut produire quune erreur dexcution, puisquon ne peut pas additionner des
caractres.
Exercice 1.9
En revanche, on peut les concatner. A la fin de lalgorithme, C vaudra donc "42312".
42
En informatique, une variable possde un moment donn une valeur et une seule.
A la rigueur, elle peut ne pas avoir de valeur du tout (une fois quelle a t dclare, et
tant quon ne la pas affecte. A signaler que dans certains langages, les variables non
encore affectes sont considres comme valant automatiquement zro). Mais ce qui
est important, cest que cette valeur justement, ne varie pas proprement parler.
Du moins ne varie-t-elle que lorsquelle est lobjet dune instruction daffectation.
La deuxime remarque concerne le signe de laffectation. En algorithmique, comme on la
vu, cest le signe . Mais en pratique, la quasi totalit des langages emploient le signe
gal. Et l, pour les dbutants, la confusion avec les maths est galement facile. En
maths, A = B et B = A sont deux propositions strictement quivalentes. En informatique,
absolument pas, puisque cela revient crire A B et B A, deux choses bien
diffrentes. De mme, A = A + 1, qui en mathmatiques, constitue une quation sans
solution, reprsente en programmation une action tout fait licite (et de surcrot
extrmement courante). Donc, attention ! ! ! La meilleure des vaccinations contre cette
confusion consiste bien employer le signe en pseudo-code, signe qui a le mrite de
ne pas laisser place lambigut. Une fois acquis les bons rflexes avec ce signe, vous
naurez plus aucune difficult passer au = des langages de programmation.
43
Partie 2
Lecture et Ecriture
Un programme est un sort jet sur un ordinateur,
qui transforme tout texte saisi au clavier en message
derreur. - Anonyme
Un clavier Azerty en vaut deux - Anonyme
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.
45
PARTIE 2
nonc des Exercices
Exercice 2.1
Quel rsultat produit le programme suivant ?
Variables val, double numriques
Dbut
Val 231
Double Val * 2
Ecrire Val
Ecrire Double
Fin
Exercice 2.2
Ecrire un programme qui demande un nombre lutilisateur, puis qui calcule et affiche le
carr de ce nombre.
Exercice 2.3
Ecrire un programme qui lit le prix HT dun article, le nombre darticles et le taux de
TVA, et qui fournit le prix total TTC correspondant. Faire en sorte que des libells
apparaissent clairement.
Exercice 2.4
Ecrire un algorithme utilisant des variables de type chane de caractres, et affichant
quatre variantes possibles de la clbre belle marquise, vos beaux yeux me font
mourir damour . On ne se soucie pas de la ponctuation, ni des majuscules.
46
PARTIE 2
Corrigs des Exercices
Exercice 2.1
On verra apparatre lcran 231, puis 462 (qui vaut 231 * 2)
Exercice 2.2
Variables nb, carr en Entier
Dbut
Ecrire "Entrez un nombre :"
Lire nb
carr nb * nb
Ecrire "Son carr est : ", carr
Fin
En fait, on pourrait tout aussi bien conomiser la variable carr en remplaant les deux
avant-dernires lignes par :
Ecrire "Son carr est : ", nb*nb
C'est une question de style ; dans un cas, on privilgie la lisibilit de l'algorithme, dans
l'autre, on privilgie l'conomie d'une variable.
47
Exercice 2.3
Variables nb, pht, ttva, pttc en Numrique
Dbut
Ecrire "Entrez le prix hors taxes :"
Lire pht
Ecrire "Entrez le nombre darticles :"
Lire nb
Ecrire "Entrez le taux de TVA :"
Lire ttva
pttc nb * pht * (1 + ttva)
Ecrire "Le prix toutes taxes est : ", pttc
Fin
L aussi, on pourrait squeezer une variable et une ligne en crivant directement. :
Ecrire "Le prix toutes taxes est : ", nb * pht * (1 + ttva)
C'est plus rapide, plus lger en mmoire, mais un peu plus difficile relire (et crire !)
Exercice 2.4
Variables t1, t2, t3, t4 en Caractre
Dbut
t1 "belle Marquise"
t2 "vos beaux yeux"
t3 "me font mourir"
t4 "damour"
Ecrire t1 & " " & t2 & " " & t3 & " " & t4
Ecrire t3 & " " & t2 & " " & t4 & " " & t1
Ecrire t2 & " " & t3 & " " & t1 & " " & t4
Ecrire t4 & " " & t1 & " " & t2 & " " & t3
Fin
48
Partie 3
Les Tests
Il est assez difficile de trouver une erreur dans
son code quand on la cherche. Cest encore bien plus
dur quand on est convaincu que le code est juste. Steve McConnell
Il nexiste pas, et il nexistera jamais, de langage
dans lequel il soit un tant soit peu difficile dcrire
de mauvais programmes . Anonyme
Si le dboguage est lart denlever les bogues, alors
la programmation doit tre lart de les crer. Anonyme
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.
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
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
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
FAUX
VRAI
52
PARTIE 3
nonc des Exercices
Exercice 3.1
Ecrire un algorithme qui demande un nombre lutilisateur, et linforme ensuite si ce
nombre est positif ou ngatif (on laisse de ct le cas o le nombre vaut zro).
53
PARTIE 3
Corrigs des Exercices
Exercice 3.1
Variable n en Entier
Dbut
Ecrire "Entrez un nombre : "
Lire n
Si n > 0 Alors
Ecrire "Ce nombre est positif
Sinon
Ecrire "Ce nombre est ngatif"
Finsi
Fin
54
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 Vrai
Vrai
Faux
C1 Faux
Faux
Faux
C1 ou C2
C2 Vrai
C2 Faux
C1 Vrai
Vrai
Vrai
C1 Faux
Vrai
Faux
C1 xor C2
C2 Vrai
C2 Faux
C1 Vrai
Faux
Vrai
C1 Faux
Vrai
Faux
Non C1
C1 Vrai
Faux
C1 Faux
Vrai
56
LE GAG DE LA JOURNE...
...Consiste formuler dans un test une condition qui ne
pourra jamais tre vraie, ou jamais tre fausse. Si ce
nest pas fait exprs, cest assez rigolo. Si cest fait exprs,
cest encore plus drle, car une condition dont on sait
davance quelle sera toujours fausse nest pas une condition.
Dans tous les cas, cela veut dire quon a crit un test qui nen
est pas un, et qui fonctionne comme sil ny en avait pas.
Cela peut tre par exemple : Si Toto < 10 ET Toto > 15
Alors (il est trs difficile de trouver un nombre qui soit
la fois infrieur 10 et suprieur 15 !)
Bon, a, cest un motif immdiat pour payer une tourne
gnrale, et je sens quon ne restera pas longtemps le gosier
sec.
57
PARTIE 3
nonc des Exercices
Exercice 3.2
Ecrire un algorithme qui demande deux nombres lutilisateur et linforme ensuite si
leur produit est ngatif ou positif (on laisse de ct le cas o le produit est nul).
Attention toutefois : on ne doit pas calculer le produit des deux nombres.
Exercice 3.3
Ecrire un algorithme qui demande trois noms lutilisateur et linforme ensuite sils sont
rangs ou non dans lordre alphabtique.
58
PARTIE 3
Corrigs des Exercices
Exercice 3.2
Variables m, n en Entier
Dbut
Ecrire "Entrez deux nombres : "
Lire m, n
Si (m > 0 ET n > 0) OU (m < 0 ET n < 0) Alors
Ecrire "Leur produit est positif"
Sinon
Ecrire "Leur produit est ngatif"
Finsi
Fin
Exercice 3.3
Variables a, b, c en Caractre
Dbut
Ecrire "Entrez successivement trois noms : "
Lire a, b, c
Si a < b ET b < c Alors
Ecrire "Ces noms sont classs alphabtiquement"
Sinon
Ecrire "Ces noms ne sont pas classs"
Finsi
Fin
59
60
Il serait ainsi bien plus rationnel dimbriquer les tests de cette manire :
Variable Temp en Entier
Dbut
Ecrire "Entrez la temprature de leau :"
Lire Temp
Si Temp =< 0 Alors
Ecrire "Cest de la glace"
Sinon
Si Temp < 100 Alors
Ecrire "Cest du liquide"
Sinon
Ecrire "Cest de la vapeur"
Finsi
Finsi
Fin
Nous avons fait des conomies : au lieu de devoir taper trois conditions, dont une
compose, nous navons plus que deux conditions simples. Mais aussi, et surtout, nous
avons fait des conomies sur le temps dexcution de lordinateur. Si la temprature est
infrieure zro, celui-ci crit dornavant Cest de la glace et passe directement
la fin, sans tre ralenti par lexamen dautres possibilits (qui sont forcment fausses).
Cette deuxime version nest donc pas seulement plus simple crire et plus lisible, elle
est galement plus performante lexcution.
Les structures de tests imbriqus sont donc un outil indispensable la simplification et
loptimisation des algorithmes.
61
PARTIE 3
nonc des Exercices
Exercice 3.4
Ecrire un algorithme qui demande un nombre lutilisateur, et linforme ensuite si ce
nombre est positif ou ngatif (on inclut cette fois le traitement du cas o le nombre
vaut zro).
Exercice 3.5
Ecrire un algorithme qui demande deux nombres lutilisateur et linforme ensuite si le
produit est ngatif ou positif (on inclut cette fois le traitement du cas o le produit
peut tre nul). Attention toutefois, on ne doit pas calculer le produit !
Exercice 3.6
Ecrire un algorithme qui demande lge dun enfant lutilisateur. Ensuite, il linforme de
sa catgorie :
"Poussin" de 6 7 ans
"Pupille" de 8 9 ans
"Minime" de 10 11 ans
62
PARTIE 3
Corrigs des Exercices
Exercice 3.4
Variable n en Entier
Dbut
Ecrire "Entrez un nombre : "
Lire n
Si n < 0 Alors
Ecrire "Ce nombre est ngatif"
SinonSi n = 0 Alors
Ecrire "Ce nombre est nul"
Sinon
Ecrire "Ce nombre est positif"
Finsi
Fin
Exercice 3.5
Variables m, n en Entier
Dbut
Ecrire "Entrez deux nombres : "
Lire m, n
Si m = 0 OU n = 0 Alors
Ecrire "Le produit est nul"
SinonSi (m < 0 ET n < 0) OU (m > 0 ET n > 0) Alors
Ecrire "Le produit est positif"
Sinon
Ecrire "Le produit est ngatif"
Finsi
Fin
Si on souhaite simplifier lcriture de la condition lourde du SinonSi, on peut toujours
passer par des variables boolennes intermdiaires. Une astuce de sioux consiste
galement employer un Xor (c'est l'un des rares cas dans lesquels il est pertinent)
63
Exercice 3.6
Variable age en Entier
Dbut
Ecrire "Entrez lge de lenfant : "
Lire age
Si age >= 12 Alors
Ecrire "Catgorie Cadet"
SinonSi age >= 10 Alors
Ecrire "Catgorie Minime"
SinonSi age >= 8 Alors
Ecrire "Catgorie Pupille"
SinonSi age >= 6 Alors
Ecrire "Catgorie Poussin"
Finsi
Fin
On peut videmment crire cet algorithme de diffrentes faons, ne serait-ce quen
commenant par la catgorie la plus jeune.
64
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
66
Mais souvenons-nous : une variable boolenne na besoin que dun seul bit pour
tre stocke. De ce point de vue, lalourdissement nest donc pas considrable.
dans certains cas, notamment celui de conditions composes trs lourdes (avec
plein de ET et de OU tout partout) cette technique peut faciliter le travail du
programmeur, en amliorant nettement la lisibilit de lalgorithme. Les variables
boolennes peuvent galement savrer trs utiles pour servir de flag, technique
dont on reparlera plus loin (rassurez-vous, rien voir avec le flagrant dlit des
policiers).
67
Partie 4
Encore de la Logique
La programmation peut tre un plaisir ; de mme
que la cryptographie. Toutefois, il faut viter de
combiner les deux. - Kreitzberg et Sneidermann
68
69
Bien sr, on ne peut pas se contenter de remplacer purement et simplement les ET par
des OU ; ce serait un peu facile. La rgle dquivalence est la suivante (on peut la
vrifier sur lexemple de la fentre) :
Si A ET B Alors
Instructions 1
Sinon
Instructions 2
Finsi
quivaut :
Si NON A OU NON B Alors
Instructions 2
Sinon
Instructions 1
Finsi
Cette rgle porte le nom de transformation de Morgan, du nom du mathmaticien
anglais qui l'a formule.
70
PARTIE 4
nonc des Exercices
Exercice 4.1
Formulez un algorithme quivalent lalgorithme suivant :
Si Tutu > Toto + 4 OU Tata = "OK" Alors
Tutu Tutu + 1
Sinon
Tutu Tutu 1
Finsi
Exercice 4.2
Cet algorithme est destin prdire l'avenir, et il doit tre infaillible !
Il lira au clavier lheure et les minutes, et il affichera lheure quil sera une minute plus
tard. Par exemple, si l'utilisateur tape 21 puis 32, l'algorithme doit rpondre :
"Dans une minute, il sera 21 heure(s) 33".
NB : on suppose que l'utilisateur entre une heure valide. Pas besoin donc de la vrifier.
Exercice 4.3
De mme que le prcdent, cet algorithme doit demander une heure et en afficher une
autre. Mais cette fois, il doit grer galement les secondes, et afficher l'heure qu'il
sera une seconde plus tard.
Par exemple, si l'utilisateur tape 21, puis 32, puis 8, l'algorithme doit rpondre : "Dans
une seconde, il sera 21 heure(s), 32 minute(s) et 9 seconde(s)".
NB : l encore, on suppose que l'utilisateur entre une date valide.
71
Exercice 4.4
Un magasin de reprographie facture 0,10 E les dix premires photocopies, 0,09 E les
vingt suivantes et 0,08 E au-del. Ecrivez un algorithme qui demande lutilisateur le
nombre de photocopies effectues et qui affiche la facture correspondante.
Exercice 4.5
Les habitants de Zorglub paient limpt selon les rgles suivantes :
72
PARTIE 4
Corrigs des Exercices
Exercice 4.1
Aucune difficult, il suffit dappliquer la rgle de la transformation du OU en ET vue en
cours (loi de Morgan). Attention toutefois la rigueur dans la transformation des
conditions en leur contraire...
Si Tutu <= Toto + 4 ET Tata <> "OK" Alors
Tutu Tutu 1
Sinon
Tutu Tutu + 1
Finsi
Exercice 4.2
Variables h, m en Numrique
Dbut
Ecrire "Entrez les heures, puis les minutes : "
Lire h, m
mm+1
Si m = 60 Alors
m0
hh+1
FinSi
Si h = 24 Alors
h0
FinSi
Ecrire "Dans une minute il sera ", h, "heure(s) ", m, "minute(s)"
Fin
73
Exercice 4.3
Variables h, m, s en Numrique
Dbut
Ecrire "Entrez les heures, puis les minutes, puis les secondes : "
Lire h, m, s
ss+1
Si s = 60 Alors
s0
mm+1
FinSi
Si m = 60 Alors
m0
hh+1
FinSi
Si h = 24 Alors
h0
FinSi
Ecrire "Dans une seconde il sera ", h, "h", m, "m et ", s, "s"
Fin
Exercice 4.4
Variables n, p en Numrique
Dbut
Ecrire "Nombre de photocopies : "
Lire n
Si n <= 10 Alors
p n * 0,1
SinonSi n <= 30 Alors
p 10 * 0,1 + (n 10) * 0,09
Sinon
p 10 * 0,1 + 20 * 0,09 + (n 30) * 0,08
FinSi
Ecrire "Le prix total est: ", p
Fin
74
Exercice 4.5
Variable sex en Caractre
Variable age en Numrique
Variables C1, C2 en Boolen
Dbut
Ecrire "Entrez le sexe (M/F) : "
Lire sex
Ecrire "Entrez lge: "
Lire age
C1 sex = "M" ET age > 20
C2 sex = "F" ET (age > 18 ET age < 35)
Si C1 ou C2 Alors
Ecrire "Imposable"
Sinon
Ecrire "Non Imposable"
FinSi
Fin
75
76
77
PARTIE 4
nonc des Exercices
Exercice 4.6
Les lections lgislatives, en Guignolerie Septentrionale, obissent la rgle suivante :
lorsque l'un des candidats obtient plus de 50% des suffrages, il est lu ds le
premier tour.
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 :
Exercice 4.8
Ecrivez un algorithme qui a prs avoir demand un numro de jour, de mois et d'anne
l'utilisateur, renvoie s'il s'agit ou non d'une date valide.
Cet exercice est certes dun manque doriginalit affligeant, mais aprs tout, en
algorithmique comme ailleurs, il faut connatre ses classiques ! Et quand on a fait cela
une fois dans sa vie, on apprcie pleinement lexistence dun type numrique date
dans certains langages).
Il n'est sans doute pas inutile de rappeler rapidement que le mois de fvrier compte 28
jours, sauf si lanne est bissextile, auquel cas il en compte 29. Lanne est bissextile si
elle est divisible par quatre. Toutefois, les annes divisibles par 100 ne sont pas
bissextiles, mais les annes divisibles par 400 le sont. Ouf !
Un dernier petit dtail : vous ne savez pas, pour linstant, exprimer correctement en
pseudo-code lide quun nombre A est divisible par un nombre B. Aussi, vous vous
contenterez dcrire en bons tlgraphistes que A divisible par B se dit A dp B .
79
PARTIE 4
Corrigs des Exercices
Exercice 4.6
Cet exercice, du pur point de vue algorithmique, n'est pas trs mchant. En revanche, il
reprsente dignement la catgorie des noncs pigs.
En effet, rien de plus facile que d'crire : si le candidat a plus de 50%, il est lu, sinon
s'il a plus de 12,5 %, il est au deuxime tour, sinon il est limin. H h h... mais il ne
faut pas oublier que le candidat peut trs bien avoir eu 20 % mais tre tout de mme
limin, tout simplement parce que l'un des autres a fait plus de 50 % et donc qu'il n'y a
pas de deuxime tour !...
Moralit : ne jamais se jeter sur la programmation avant d'avoir soigneusement men
l'analyse du problme traiter.
Variables A, B, C, D en Numrique
Dbut
Ecrire "Entrez les scores des quatre prtendants :"
Lire A, B, C, D
C1 A > 50
C2 B > 50 ou C > 50 ou D > 50
C3 A >= B et A >= C et A >= D
C4 A >= 12,5
Si C1 Alors
Ecrire Elu au premier tour"
Sinonsi C2 ou Non(C4) Alors
Ecrire Battu, limin, sorti !!!
SinonSi C3 Alors
Ecrire "Ballotage favorable"
Sinon
Ecrire "Ballotage dfavorable"
FinSi
Fin
80
Exercice 4.7
L encore, on illustre l'utilit d'une bonne analyse. Je propose deux corrigs diffrents.
Le premier suit l'nonc pas pas. C'est juste, mais c'est vraiment lourd. La deuxime
version s'appuie sur une vraie comprhension d'une situation pas si embrouille qu'elle
n'en a l'air.
Dans les deux cas, un recours aux variables boolennes are srieusement l'criture.
Donc, premier corrig, on suit le texte de l'nonc pas pas :
Variables age, perm, acc, assur en Numrique
Variables C1, C2, C3 en Boolen
Variable situ en Caractre
Dbut
Ecrire "Entrez lge: "
Lire age
Ecrire "Entrez le nombre d'annes de permis: "
Lire perm
Ecrire "Entrez le nombre d'accidents: "
Lire acc
Ecrire "Entrez le nombre d'annes d'assurance: "
Lire assur
C1 age >= 25
C2 perm >= 2
C3 assur > 1
Si Non(C1) et Non(C2) Alors
Si acc = 0 Alors
situ "Rouge"
Sinon
situ "Refus"
FinSi
Sinonsi ((Non(C1) et C2) ou (C1 et Non(C2)) Alors
Si acc = 0 Alors
situ "Orange"
SinonSi acc = 1 Alors
situ "Rouge"
Sinon
situ "Refus"
FinSi
Sinon
Si acc = 0 Alors
81
situ "Vert"
SinonSi acc = 1 Alors
situ "Orange"
SinonSi acc = 2 Alors
situ "Rouge"
Sinon
situ "Refus"
FinSi
FinSi
Si C3 Alors
Si situ = "Rouge" Alors
situ "Orange"
SinonSi situ = "Orange" Alors
situ "Orange"
SinonSi situ = "Vert" Alors
situ "Bleu"
FinSi
FinSi
Ecrire "Votre situation : ", situ
Fin
Vous trouvez cela compliqu ? Oh, certes oui, a l'est ! Et d'autant plus qu'en lisant
entre les lignes, on pouvait s'apercevoir que ce galimatias de tarifs recouvre en fait une
logique trs simple : un systme points. Et il suffit de comptabiliser les points pour
que tout s'claire... Reprenons juste aprs l'affectation des trois variables boolennes
C1, C2, et C3. On crit :
P0
Si Non(C1) Alors
PP+1
FinSi
Si Non(C2) Alors
PP+1
FinSi
P P + acc
Si P < 3 et C3 Alors
PP1
FinSi
Si P = -1 Alors
situ "Bleu"
SinonSi P = 0 Alors
82
situ "Vert"
SinonSi P = 1 Alors
situ "Orange"
SinonSi P = 2 Alors
situ "Rouge"
Sinon
situ "Refus"
FinSi
Ecrire "Votre situation : ", situ
Fin
Cool, non ?
83
Exercice 4.8
En ce qui concerne le dbut de cet algorithme, il ny a aucune difficult. Cest de la saisie
bte et mme pas mchante:
Variables J, M, A, JMax en Numrique
Variables VJ, VM, B en Booleen
Dbut
Ecrire "Entrez le numro du jour"
Lire J
Ecrire "Entrez le numro du mois"
Lire M
Ecrire "Entrez l'anne"
Lire A
C'est videmment ensuite que les ennuis commencent La premire manire d'aborder
la chose consiste se dire que fondamentalement, la structure logique de ce problme
est trs simple. Si nous crons deux variables boolennes VJ et VM, reprsentant
respectivement la validit du jour et du mois entrs, la fin de l'algorithme sera d'une
simplicit biblique (lanne est valide par dfinition, si on vacue le dbat byzantin
concernant lexistence de lanne zro) :
Si VJ et VM alors
Ecrire "La date est valide"
Sinon
Ecrire "La date n'est pas valide"
FinSi
Toute la difficult consiste affecter correctement les variables VJ et VM, selon les
valeurs des variables J, M et A. Dans l'absolu, VJ et VM pourraient tre les objets
d'une affectation monstrueuse, avec des conditions atrocement composes. Mais
franchement, crire ces conditions en une seule fois est un travail de bndictin sans
grand intrt. Pour viter d'en arriver une telle extrmit, on peut srier la difficult
en crant deux variables supplmentaires :
B
JMax : variable numrique qui indiquera le dernier jour valable pour le mois entr.
Avec tout cela, on peut y aller et en ressortir vivant.
On commence par initialiser nos variables boolennes, puis on traite les annes, puis les
mois, puis les jours.
84
Sinon
Ecrire "Date Valide"
FinSi
SinonSi A dp 4 Alors
Si J < 1 ou J > 28 Alors
Ecrire "Date Invalide"
Sinon
Ecrire "Date Valide"
FinSi
Sinon
Si J < 1 ou J > 28 Alors
Ecrire "Date Invalide"
Sinon
Ecrire "Date Valide"
FinSi
FinSi
SinonSi M = 4 ou M = 6 ou M = 9 ou M = 11 Alors
Si J < 1 ou J > 30 Alors
Ecrire "Date Invalide"
Sinon
Ecrire "Date Valide"
FinSi
Sinon
Si J < 1 ou J > 31 Alors
Ecrire "Date Invalide"
Sinon
Ecrire "Date Valide"
FinSi
FinSi
On voit que dans ce cas, l'alternative finale (Date valide ou invalide) se trouve rpte
un grand nombre de fois. Ce n'est en soi ni une bonne, ni une mauvaise chose. C'est
simplement une question de choix stylistique.
Personnellement, j'avoue prfrer assez nettement la premire solution, qui fait
ressortir beaucoup plus clairement la structure logique du problme (il n'y a qu'une
seule alternative, autant que cette alternative ne soit crite qu'une seule fois).
Il convient enfin de citer une solution trs simple et lgante, un peu plus difficile peuttre imaginer du premier coup, mais qui avec le recul apparat comme trs immdiate.
Sur le fond, cela consiste dire qu'il y a quatre cas pour qu'une date soit valide : celui
d'un jour compris entre 1 et 31 dans un mois 31 jours, celui d'un jour compris entre 1
86
et 30 dans un mois 30 jours, celui d'un jour compris entre 1 et 29 en fvrier d'une
anne bissextile, et celui d'un jour de fvrier compris entre 1 et 28. Ainsi :
B (A dp 4 et Non(A dp 100)) ou A dp 400
K1 (m=1 ou m=3 ou m=5 ou m=7 ou m=8 ou m=10 ou m=12) et (J>=1 et J=<31)
K2 (m=4 ou m=6 ou m=9 ou m=11) et (J>=1 et J=<30)
K3 m=2 et B et J>=1 et J=<29
K4 m=2 et J>=1 et J=<28
Si K1 ou K2 ou K3 ou K4 Alors
Ecrire "Date valide"
Sinon
Ecrire "Date non valide"
FinSi
Fin
Tout est alors rgl avec quelques variables boolennes et quelques conditions
composes, en un minimum de lignes de code.
La morale de ce long exercice - et non moins long corrig, c'est qu'un problme de test
un peu compliqu admet une pliade de solutions justes...
...Mais que certaines sont plus astucieuses que d'autres !
87
Si vous avez compris ce qui prcde, et que l'exercice de la date ne vous pose plus aucun
problme, alors vous savez tout ce qu'il y a savoir sur les tests pour affronter
n'importe quelle situation. Non, ce n'est pas de la dmagogie !
Malheureusement, nous ne sommes pas tout fait au bout de nos peines ; il reste une
dernire structure logique examiner, et pas des moindres
88
Partie 5
Les Boucles
Les premiers 90% du code prennent les premiers
90% du temps de dveloppement. Les 10% restants
prennent
les
autres
90%
du
temps
de
Alors, dans tout programme un tant soit peu srieux, on met en place ce quon appelle un
contrle de saisie, afin de vrifier que les donnes entres au clavier correspondent
bien celles attendues par lalgorithme.
A vue de nez, on pourrait essayer avec un SI. Voyons voir ce que a donne :
Variable Rep en Caractre
Dbut
Ecrire "Voulez vous un caf ? (O/N)"
Lire Rep
Si Rep <> "O" et Rep <> "N" Alors
Ecrire "Saisie erronne. Recommencez"
Lire Rep
FinSi
Fin
Cest impeccable. Du moins tant que lutilisateur a le bon got de ne se tromper quune
seule fois, et dentrer une valeur correcte la deuxime demande. Si lon veut galement
btonner en cas de deuxime erreur, il faudrait rajouter un SI. Et ainsi de suite, on
peut rajouter des centaines de SI, et crire un algorithme aussi lourd quune blague des
Grosses Ttes, on nen sortira pas, il y aura toujours moyen quun acharn flanque le
programme par terre.
La solution consistant aligner des SI en pagaille est donc une impasse. La seule issue
est donc de flanquer une structure de boucle, qui se prsente ainsi :
TantQue boolen
Instructions
FinTantQue
Le principe est simple : le programme arrive sur la ligne du TantQue. Il examine alors la
valeur du boolen (qui, je le rappelle, peut tre une variable boolenne ou, plus
frquemment, une condition). Si cette valeur est VRAI, le programme excute les
instructions qui suivent, jusqu ce quil rencontre la ligne FinTantQue. Il retourne
ensuite sur la ligne du TantQue, procde au mme examen, et ainsi de suite. Le mange
enchant ne sarrte que lorsque le boolen prend la valeur FAUX.
90
91
93
PARTIE 5
nonc des Exercices
Exercice 5.1
Ecrire un algorithme qui demande lutilisateur un nombre compris entre 1 et 3 jusqu
ce que la rponse convienne.
Exercice 5.2
Ecrire un algorithme qui demande un nombre compris entre 10 et 20, jusqu ce que la
rponse convienne. En cas de rponse suprieure 20, on fera apparatre un message :
Plus petit ! , et inversement, Plus grand ! si le nombre est infrieur 10.
Exercice 5.3
Ecrire un algorithme qui demande un nombre de dpart, et qui ensuite affiche les dix
nombres suivants. Par exemple, si l'utilisateur entre le nombre 17, le programme
affichera les nombres de 18 27.
94
PARTIE 5
Corrigs des Exercices
Exercice 5.1
Variable N en Entier
Debut
N0
Ecrire "Entrez un nombre entre 1 et 3"
TantQue N < 1 ou N > 3
Lire N
Si N < 1 ou N > 3 Alors
Ecrire "Saisie errone. Recommencez
FinSi
FinTantQue
Fin
Exercice 5.2
Variable N en Entier
Debut
N0
Ecrire "Entrez un nombre entre 10 et 20"
TantQue N < 10 ou N > 20
Lire N
Si N < 10 Alors
Ecrire "Plus grand !"
SinonSi N > 20 Alors
Ecrire "Plus petit !"
FinSi
FinTantQue
Fin
95
Exercice 5.3
Variables N, i en Entier
Debut
Ecrire "Entrez un nombre : "
Lire N
Ecrire "Les 10 nombres suivants sont : "
Pour i N + 1 N + 10
Ecrire i
i Suivant
Fin
96
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
99
Des boucles peuvent donc tre imbriques (cas n1) ou successives (cas n2). Cependant,
elles ne peuvent jamais, au grand jamais, tre croises. Cela naurait aucun sens logique,
et de plus, bien peu de langages vous autoriseraient ne serait-ce qu crire cette
structure aberrante.
Variables Truc, Trac en Entier
Pour Truc
Instructions
Pour Trac
Instructions
Truc Suivant
instructions
Trac Suivant
Pourquoi imbriquer des boucles ? Pour la mme raison quon imbrique des tests. La
traduction en bon franais dun test, cest un cas . Eh bien un cas (par exemple,
est-ce un homme ou une femme ? ) peut trs bien se subdiviser en dautres cas ( at-il plus ou moins de 18 ans ? ).
De mme, une boucle, cest un traitement systmatique, un examen dune srie
dlments un par un (par exemple, prenons tous les employs de lentreprise un par
un ). Eh bien, on peut imaginer que pour chaque lment ainsi considr (pour chaque
employ), on doive procder un examen systmatique dautre chose ( prenons chacune
des commandes que cet employ a traites ). Voil un exemple typique de boucles
imbriques : on devra programmer une boucle principale (celle qui prend les employs un
par un) et lintrieur, une boucle secondaire (celle qui prend les commandes de cet
employ une par une).
Dans la pratique de la programmation, la matrise des boucles imbriques est ncessaire,
mme si elle nest pas suffisante. Tout le contraire dAlain Delon, en quelque sorte.
100
101
PARTIE 5
nonc des Exercices
Exercice 5.4
Ecrire un algorithme qui demande un nombre de dpart, et qui ensuite crit la table de
multiplication de ce nombre, prsente comme suit (cas o l'utilisateur entre le nombre
7) :
Table de 7 :
7x1=7
7 x 2 = 14
7 x 3 = 21
7 x 10 = 70
Exercice 5.5
Ecrire un algorithme qui demande un nombre de dpart, et qui calcule la somme des
entiers jusqu ce nombre. Par exemple, si lon entre 5, le programme doit calculer :
1 + 2 + 3 + 4 + 5 = 15
NB : on souhaite afficher uniquement le rsultat, pas la dcomposition du calcul.
Exercice 5.6
Ecrire un algorithme qui demande un nombre de dpart, et qui calcule sa factorielle.
NB : la factorielle de 8, note 8 !, vaut
1x2x3x4x5x6x7x8
102
Exercice 5.7
Ecrire un algorithme qui demande successivement 20 nombres lutilisateur, et qui lui
dise ensuite quel tait le plus grand parmi ces 20 nombres :
Entrez le nombre numro 1 : 12
Entrez le nombre numro 2 : 14
etc.
Entrez le nombre numro 20 : 6
Le plus grand de ces nombres est : 14
Modifiez ensuite lalgorithme pour que le programme affiche de surcrot en quelle
position avait t saisie ce nombre :
Ctait le nombre numro 2
Exercice 5.8
Rcrire lalgorithme prcdent, mais cette fois-ci on ne connat pas davance combien
lutilisateur souhaite saisir de nombres. La saisie des nombres sarrte lorsque
lutilisateur entre un zro.
Exercice 5.9
Lire la suite des prix (en euros entiers et termine par zro) des achats dun client.
Calculer la somme quil doit, lire la somme quil paye, et simuler la remise de la monnaie
en affichant les textes "10 Euros", "5 Euros" et "1 Euro" autant de fois quil y a de
coupures de chaque sorte rendre.
103
Exercice 5.10
crire un algorithme qui permette de connatre ses chances de gagner au tierc, quart,
quint et autres impts volontaires.
On demande lutilisateur le nombre de chevaux partants, et le nombre de chevaux
jous. Les deux messages affichs devront tre :
Dans lordre : une chance sur X de gagner
Dans le dsordre : une chance sur Y de gagner
X et Y nous sont donns par la formule suivante, si n est le nombre de chevaux partants
et p le nombre de chevaux jous (on rappelle que le signe ! signifie "factorielle", comme
dans l'exercice 5.6 ci-dessus) :
X = n ! / (n - p) !
Y = n ! / (p ! * (n p) !)
NB : cet algorithme peut tre crit dune manire simple, mais relativement peu
performante. Ses performances peuvent tre singulirement augmentes par une petite
astuce. Vous commencerez par crire la manire la plus simple, puis vous identifierez le
problme, et crirez une deuxime version permettant de le rsoudre.
104
PARTIE 5
Corrigs des Exercices
Exercice 5.4
Variables N, i en Entier
Debut
Ecrire "Entrez un nombre : "
Lire N
Ecrire "La table de multiplication de ce nombre est : "
Pour i 1 10
Ecrire N, " x ", i, " = ", n*i
i Suivant
Fin
Exercice 5.5
Variables N, i, Som en Entier
Debut
Ecrire "Entrez un nombre : "
Lire N
Som 0
Pour i 1 N
Som Som + i
i Suivant
Ecrire "La somme est : ", Som
Fin
105
Exercice 5.6
Variables N, i, F en Entier
Debut
Ecrire "Entrez un nombre : "
Lire N
F1
Pour i 2 N
FF*i
i Suivant
Ecrire "La factorielle est : ", F
Fin
Exercice 5.7
Variables N, i, PG en Entier
Debut
PG 0
Pour i 1 20
Ecrire "Entrez un nombre : "
Lire N
Si i = 1 ou N > PG Alors
PG N
FinSi
i Suivant
Ecrire "Le nombre le plus grand tait : ", PG
Fin
En ligne 3, on peut mettre nimporte quoi dans PG, il suffit que cette variable soit
affecte pour que le premier passage en ligne 7 ne provoque pas d'erreur.
106
Exercice 5.8
Variables N, i, PG, IPG en Entier
Debut
N1
i0
PG 0
TantQue N <> 0
Ecrire "Entrez un nombre : "
Lire N
ii+1
Si i = 1 ou N > PG Alors
PG N
IPG i
FinSi
FinTantQue
Ecrire "Le nombre le plus grand tait : ", PG
Ecrire "Il a t saisi en position numro ", IPG
Fin
107
Exercice 5.9
Variables FF, somdue, M, IPG, Reste, Nb10F, Nb5F En Entier
Debut
E1
somdue 0
TantQue E <> 0
Ecrire "Entrez le montant : "
Lire E
somdue somdue + E
FinTantQue
Ecrire "Vous devez :", E, " euros"
Ecrire "Montant vers :"
Lire M
Reste M E
Nb10E 0
TantQue Reste >= 10
Nb10E Nb10E + 1
Reste Reste 10
FinTantQue
Nb5E 0
Si Reste >= 5
Nb5E 1
Reste Reste 5
FinSi
Ecrire "Rendu de la monnaie :"
Ecrire "Billets de 10 E : ", Nb10E
Ecrire "Billets de 5 E : ", Nb5E
Ecrire "Pices de 1 E : ", reste
Fin
108
Exercice 5.10
Spontanment, on est tent d'crire l'algorithme suivant :
Variables N, P, i, Num, Dno1, Dno2 en Entier
Debut Ecrire "Entrez le nombre de chevaux partants : "
Lire N
Ecrire "Entrez le nombre de chevaux jous : "
Lire P
Num 1
Pour i 2 N
Num Num * i
i Suivant
Dno1 1
Pour i 2 N-P
Dno1 Dno1 * i
i Suivant
Dno2 1
Pour i 2 P
Dno2 Dno2 * i
i Suivant
Ecrire "Dans lordre, une chance sur ", Num / Dno1
Ecrire "Dans le dsordre, une sur ", Num / (Dno1 * Dno2)
Fin
Cette version, formellement juste, comporte tout de mme deux faiblesses.
La premire, et la plus grave, concerne la manire dont elle calcule le rsultat final.
Celui-ci est le quotient d'un nombre par un autre ; or, ces nombres auront rapidement
tendance tre trs grands. En calculant, comme on le fait ici, d'abord le numrateur,
puis ensuite le dnominateur, on prend le risque de demander la machine de stocker
des nombres trop grands pour qu'elle soit capable de les coder (cf. le prambule). C'est
d'autant plus bte que rien ne nous oblige procder ainsi : on n'est pas oblig de
passer par la division de deux trs grands nombres pour obtenir le rsultat voulu.
La deuxime remarque est qu'on a programm ici trois boucles successives. Or, en y
regardant bien, on peut voir qu'aprs simplification de la formule, ces trois boucles
comportent le mme nombre de tours ! (si vous ne me croyez pas, crivez un exemple de
calcul et biffez les nombres identiques au numrateur et au dnominateur). Ce triple
calcul (ces trois boucles) peut donc tre ramen(es) un(e) seul(e).
109
Et voil le travail, qui est non seulement bien plus court, mais aussi plus performant :
Variables N, P, i, O, F en Entier
Debut
Ecrire "Entrez le nombre de chevaux partants : "
Lire N
Ecrire "Entrez le nombre de chevaux jous : "
Lire P
A1
B1
Pour i 1 P
A A * (i + N - P)
BB*i
i Suivant
Ecrire "Dans lordre, une chance sur ", A
Ecrire "Dans le dsordre, une chance sur ", A / B
Fin
110
Partie 6
Les Tableaux
Si on ment un compilateur, il prendra sa
revanche. - Henry Spencer.
Bonne nouvelle ! Je vous avais annonc quil y a avait en tout et pour tout quatre
structures logiques dans la programmation. Eh bien, a y est, on les a toutes passes en
revue.
Mauvaise nouvelle, il vous reste tout de mme quelques petites choses apprendre
une seule, au sein de laquelle chaque valeur sera dsigne par un numro. En bon
franais, cela donnerait donc quelque chose du genre la note numro 1 , la note
numro 2 , la note numro 8 . Cest largement plus pratique, vous vous en doutez.
111
les "cases" sont numrotes partir de zro, autrement dit que le plus petit
indice est zro.
112
Lnorme avantage des tableaux, cest quon va pouvoir les traiter en faisant des boucles.
Par exemple, pour effectuer notre calcul de moyenne, cela donnera par exemple :
Tableau Note(11) en Numrique
Variables Moy, Som en Numrique
Dbut
Pour i 0 11
Ecrire "Entrez la note n", i
Lire Note(i)
i Suivant
Som 0
Pour i 0 11
Som Som + Note(i)
i Suivant
Moy Som / 12
Fin
NB : On a fait deux boucles successives pour plus de lisibilit, mais on aurait tout aussi
bien pu nen crire quune seule dans laquelle on aurait tout fait dun seul coup.
Remarque gnrale : lindice qui sert dsigner les lments dun tableau
peut tre exprim directement comme un nombre en clair, mais il peut tre
aussi une variable, ou une expression calcule.
Dans un tableau, la valeur dun indice doit toujours :
tre gale au moins 0 (dans quelques rares langages, le premier lment dun
tableau porte lindice 1). Mais comme je l'ai dj crit plus haut, nous avons choisi
ici de commencer la numrotation des indices zro, comme cest le cas en
langage C et en Visual Basic. Donc attention, Truc(6) est le septime lment du
tableau Truc !
tre un nombre entier Quel que soit le langage, llment Truc(3,1416) nexiste
jamais.
Je le re-re-rpte, si lon est dans un langage o les indices commencent zro, il faut
en tenir compte la dclaration :
Tableau Note(13) en Numrique
113
...crera un tableau de 14 lments, le plus petit indice tant 0 et le plus grand 13.
LE GAG DE LA JOURNEE
Il consiste confondre, dans sa tte et / ou dans un
algorithme, lindice dun lment dun tableau avec le contenu
de cet lment. La troisime maison de la rue na pas
forcment trois habitants, et la vingtime vingt habitants.
En notation algorithmique, il ny a aucun rapport entre i et
truc(i).
Hol, Tavernier, prpare la cervoise !
114
PARTIE 6
nonc des Exercices
Exercice 6.1
Ecrire un algorithme qui dclare et remplisse un tableau de 7 valeurs numriques en les
mettant toutes zro.
Exercice 6.2
Ecrire un algorithme qui dclare et remplisse un tableau contenant les six voyelles de
lalphabet latin.
Exercice 6.3
Ecrire un algorithme qui dclare un tableau de 9 notes, dont on fait ensuite saisir les
valeurs par lutilisateur.
Exercice 6.4
Que produit lalgorithme suivant ?
Tableau Nb(5) en Entier
Variable i en Entier
Dbut
Pour i 0 5
Nb(i) i * i
i suivant
Pour i 0 5
Ecrire Nb(i)
i suivant
Fin
Peut-on simplifier cet algorithme avec le mme rsultat ?
115
Exercice 6.5
Que produit lalgorithme suivant ?
Tableau N(6) en Entier
Variables i, k en Entier
Dbut
N(0) 1
Pour k 1 6
N(k) N(k-1) + 2
k Suivant
Pour i 0 6
Ecrire N(i)
i suivant
Fin
Peut-on simplifier cet algorithme avec le mme rsultat ?
Exercice 6.6
Que produit lalgorithme suivant ?
Tableau Suite(7) en Entier
Variable i en Entier
Dbut
Suite(0) 1
Suite(1) 1
Pour i 2 7
Suite(i) Suite(i-1) + Suite(i-2)
i suivant
Pour i 0 7
Ecrire Suite(i)
i suivant
Fin
116
Exercice 6.7
Ecrivez la fin de lalgorithme 6.3 afin que le calcul de la moyenne des notes soit effectu
et affich lcran.
117
Partie 6
Corrigs des Exercices
Exercice 6.1
Tableau Truc(6) en Numrique
Variable i en Numrique
Debut
Pour i 0 6
Truc(i) 0
i Suivant
Fin
Exercice 6.2
Tableau Truc(5) en Caractre
Debut
Truc(0) "a"
Truc(1) "e"
Truc(2) "i"
Truc(3) "o"
Truc(4) "u"
Truc(5) "y"
Fin
Exercice 6.3
Tableau Notes(8) en Numrique
Variable i en Numrique
Pour i 0 8
Ecrire "Entrez la note numro ", i + 1
Lire Notes(i)
i Suivant
Fin
118
Exercice 6.4
Cet algorithme remplit un tableau avec six valeurs : 0, 1, 4, 9, 16, 25.
Il les crit ensuite lcran. Simplification :
Tableau Nb(5) en Numrique
Variable i en Numrique
Dbut
Pour i 0 5
Nb(i) i * i
Ecrire Nb(i)
i Suivant
Fin
Exercice 6.5
Cet algorithme remplit un tableau avec les sept valeurs : 1, 3, 5, 7, 9, 11, 13.
Il les crit ensuite lcran. Simplification :
Tableau N(6) en Numrique
Variables i, k en Numrique
Dbut
N(0) 1
Ecrire N(0)
Pour k 1 6
N(k) N(k-1) + 2
Ecrire N(k)
k Suivant
Fin
Exercice 6.6
Cet algorithme remplit un tableau de 8 valeurs : 1, 1, 2, 3, 5, 8, 13, 21
119
Exercice 6.7
Variable S en Numrique
Tableau Notes(8) en Numrique
Debut
s0
Pour i 0 8
Ecrire "Entrez la note n ", i + 1
Lire Notes(i)
s s + Notes(i)
i Suivant
Ecrire "Moyenne :", s/9
Fin
120
du
programme,
que
lon
va
fixer
ce
nombre
via
une
instruction
de
redimensionnement : Redim.
Notez que tant quon na pas prcis le nombre dlments dun tableau, dune
Cette technique na rien de sorcier, mais elle fait partie de larsenal de base de la
programmation en gestion.
121
PARTIE 6
nonc des Exercices
Exercice 6.8
Ecrivez un algorithme permettant lutilisateur de saisir un nombre quelconque de
valeurs, qui devront tre stockes dans un tableau. Lutilisateur doit donc commencer
par entrer le nombre de valeurs quil compte saisir. Il effectuera ensuite cette saisie.
Enfin, une fois la saisie termine, le programme affichera le nombre de valeurs
ngatives et le nombre de valeurs positives.
Exercice 6.9
Ecrivez un algorithme calculant la somme des valeurs dun tableau (on suppose que le
tableau a t pralablement saisi).
Exercice 6.10
Ecrivez un algorithme constituant un tableau, partir de deux tableaux de mme
longueur pralablement saisis. Le nouveau tableau sera la somme des lments des deux
tableaux de dpart.
Tableau 1 :
4
14
12
11
11
10
Tableau 2 :
Tableau constituer :
11
122
Exercice 6.11
Toujours partir de deux tableaux prcdemment saisis, crivez un algorithme qui
calcule le schtroumpf des deux tableaux. Pour calculer le schtroumpf, il faut multiplier
chaque lment du tableau 1 par chaque lment du tableau 2, et additionner le tout. Par
exemple si l'on a :
Tableau 1 :
4
12
Tableau 2 :
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
Ecrivez un algorithme permettant, toujours sur le mme principe, lutilisateur de saisir
un nombre dtermin de valeurs. Le programme, une fois la saisie termine, renvoie la
plus grande valeur en prcisant quelle position elle occupe dans le tableau. On prendra
soin deffectuer la saisie dans un premier temps, et la recherche de la plus grande
valeur du tableau dans un second temps.
Exercice 6.14
Toujours et encore sur le mme principe, crivez un algorithme permettant,
lutilisateur de saisir les notes d'une classe. Le programme, une fois la saisie termine,
renvoie le nombre de ces notes suprieures la moyenne de la classe.
123
Partie 6
Corrigs des Exercices
Exercice 6.8
Variables Nb, Nbpos, Nbneg en Numrique
Tableau T() en Numrique
Debut
Ecrire "Entrez le nombre de valeurs :"
Lire Nb
Redim T(Nb-1)
Nbpos 0
Nbneg 0
Pour i 0 Nb 1
Ecrire "Entrez le nombre n ", i + 1
Lire T(i)
Si T(i) > 0 alors
Nbpos Nbpos + 1
Sinon
Nbneg Nbneg + 1
Finsi
i Suivant
Ecrire "Nombre de valeurs positives : ", Nbpos
Ecrire "Nombre de valeurs ngatives : ", Nbneg
Fin
124
Exercice 6.9
Variables i, Som, N en Numrique
Tableau T() en Numrique
Debut
(on ne programme pas la saisie du tableau, dont on suppose quil compte N lments)
Redim T(N-1)
Som 0
Pour i 0 N 1
Som Som + T(i)
i Suivant
Ecrire "Somme des lments du tableau : ", Som
Fin
Exercice 6.10
Variables i, N en Numrique
Tableaux T1(), T2(), T3() en Numrique
Debut
(on suppose que T1 et T2 comptent N lments, et quils sont dj saisis)
Redim T3(N-1)
Pour i 0 N 1
T3(i) T1(i) + T2(i)
i Suivant
Fin
125
Exercice 6.11
Variables i, j, N1, N2, S en Numrique
Tableaux T1(), T2() en Numrique
Debut
On ne programme pas la saisie des tableaux T1 et T2.
(On suppose que T1 possde N1 lments, et que T2 en possde T2)
S0
Pour i 0 N1 1
Pour j 0 N2 1
S S + T1(i) * T2(j)
j Suivant
i Suivant
Ecrire "Le schtroumpf est : ", S
Fin
Exercice 6.12
Variables Nb, i en Numrique
Tableau T() en Numrique
Debut
Ecrire "Entrez le nombre de valeurs : "
Lire Nb
Redim T(Nb-1)
Pour i 0 Nb 1
Ecrire "Entrez le nombre n ", i + 1
Lire T(i)
i Suivant
Ecrire "Nouveau tableau : "
Pour i 0 Nb 1
T(i) T(i) + 1
Ecrire T(i)
i Suivant
Fin
126
Exercice 6.13
Variables Nb, Posmaxi en Numrique
Tableau T() en Numrique
Ecrire "Entrez le nombre de valeurs :"
Lire Nb
Redim T(Nb-1)
Pour i 0 Nb 1
Ecrire "Entrez le nombre n ", i + 1
Lire T(i)
i Suivant
Posmaxi 0
Pour i 0 Nb 1
Si T(i) > T(Posmaxi) alors
Posmaxi i
Finsi
i Suivant
Ecrire "Element le plus grand : ", T(Posmaxi)
Ecrire "Position de cet lment : ", Posmaxi
Fin
127
Exercice 6.14
Variables Nb, i, Som, Moy, Nbsup en Numrique
Tableau T() en Numrique
Debut
Ecrire "Entrez le nombre de notes saisir : "
Lire Nb
Redim T(Nb-1)
Pour i 0 Nb 1
Ecrire "Entrez le nombre n ", i + 1
Lire T(i)
i Suivant
Som 0
Pour i 0 Nb 1
Som Som + T(i)
i Suivant
Moy Som / Nb
NbSup 0
Pour i 0 Nb 1
Si T(i) > Moy Alors
NbSup NbSup + 1
FinSi
i Suivant
Ecrire NbSup, " lves dpassent la moyenne de la classe"
Fin
128
Partie 7
Techniques Rusees
Informatique : alliance d'une science inexacte et
d'une activit humaine faillible - Luc Fayard
Une fois nest pas coutume, ce chapitre na pas pour but de prsenter un nouveau type
de donnes, un nouveau jeu dinstructions, ou que sais-je encore.
Son propos est de dtailler quelques techniques de programmation qui possdent deux
grands points communs :
Et que valent quelques kilos daspirine, compars lineffable bonheur procur par la
comprhension suprme des arcanes de lalgorithmique ? Hein ?
122
12
21
78
64
129
53
89
28
84
46
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
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 :
boucle principale : le point de dpart se dcale chaque tour
Pour i 0 10
on considre provisoirement que t(i) est le plus petit lment
posmini i
on examine tous les lments suivants
Pour j i + 1 11
Si t(j) < t(posmini) Alors
posmini j
Finsi
j suivant
A cet endroit, on sait maintenant o est le plus petit lment. Il ne reste plus qu'
effectuer la permutation.
temp t(posmini)
t(posmini) t(i)
t(i) temp
On a plac correctement l'lment numro i, on passe prsent au suivant.
i suivant
131
entirement accompli.
132
Nous rcrivons donc cet algorithme en plaant le test aprs la boucle. Faute de mieux,
on se contentera de faire dpendre pour le moment la rponse d'une variable boolenne
que nous appellerons Trouv.
Tableau Tab(19) en Numrique
Variable N en Numrique
Dbut
Ecrire "Entrez la valeur rechercher"
Lire N
Pour i 0 19
???
i suivant
Si Trouv Alors
Ecrire "N fait partie du tableau"
Sinon
Ecrire "N ne fait pas partie du tableau"
FinSi
Fin
Il ne nous reste plus qu' grer la variable Trouv. Ceci se fait en deux tapes.
un test figurant dans la boucle, indiquant lorsque la variable Trouv doit devenir
vraie ( savoir, lorsque la valeur N est rencontre dans le tableau). Et attention :
le test est asymtrique. Il ne comporte pas de "sinon". On reviendra l dessus
dans un instant.
last, but not least, l'affectation par dfaut de la variable Trouv, dont la valeur
de dpart doit tre videmment Faux.
133
partie du tableau. En revanche, il faut qu'elle soit diffrente de toutes les valeurs
de Tab pour qu'elle n'en fasse pas partie.
Voil la raison qui nous oblige passer par une variable boolenne , un drapeau qui
peut se lever, mais jamais se rabaisser. Et cette technique de flag (que nous
pourrions lgamment surnommer gestion asymtrique de variable boolenne ) doit
tre mise en uvre chaque fois que lon se trouve devant pareille situation.
Autrement dit, connatre ce type de raisonnement est indispensable, et savoir le
reproduire bon escient ne l'est pas moins.
134
TantQue Yapermute
FinTantQue
Fin
Que va-t-on faire lintrieur de la boucle ? Prendre les lments du tableau, du
premier jusqu lavant-dernier, et procder un change si ncessaire.
135
Cest parti :
Variable Yapermute en Boolen
Dbut
TantQue Yapermute
Pour i 0 10
Si t(i) > t(i+1) Alors
temp t(i)
t(i) t(i+1)
t(i+1) temp
Finsi
i suivant
Fin
Mais il ne faut pas oublier un dtail capital : la gestion de notre flag. Lide, cest que
cette variable va nous signaler le fait quil y a eu au moins une permutation effectue. Il
faut donc :
lui attribuer la valeur Vrai ds quune seule permutation a t faite (il suffit quil
y en ait eu une seule pour quon doive tout recommencer encore une fois).
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
Yapermut Vrai
TantQue Yapermut
Yapermut Faux
Pour i 0 10
Si t(i) > t(i+1) alors
temp t(i)
t(i) t(i+1)
t(i+1) temp
Yapermut Vrai
Finsi
i suivant
FinTantQue
Fin
Au risque de me rpter, la comprhension et la matrise du principe du flag font partie
de larsenal du programmeur bien arm.
137
Or, il y a une autre manire de chercher, bien plus intelligente pourrait-on dire, et qui
met profit le fait que dans un dictionnaire, les mots sont tris par ordre alphabtique.
D'ailleurs, un tre humain qui cherche un mot dans le dictionnaire ne lit jamais tous les
mots, du premier au dernier : il utilise lui aussi le fait que les mots sont tris.
Pour une machine, quelle est la manire la plus rationnelle de chercher dans un
dictionnaire ? C'est de comparer le mot vrifier avec le mot qui se trouve pile poil au
milieu du dictionnaire. Si le mot vrifier est antrieur dans l'ordre alphabtique, on
sait qu'on devra le chercher dornavant dans le premire moiti du dico. Sinon, on sait
maintenant qu'on devra le chercher dans la deuxime moiti.
A partir de l, on prend la moiti de dictionnaire qui nous reste, et on recommence : on
compare le mot chercher avec celui qui se trouve au milieu du morceau de dictionnaire
restant. On carte la mauvaise moiti, et on recommence, et ainsi de suite.
A force de couper notre dictionnaire en deux, puis encore en deux, etc. on va finir par
se retrouver avec des morceaux qui ne contiennent plus qu'un seul mot. Et si on n'est
pas tomb sur le bon mot un moment ou un autre, c'est que le mot vrifier ne fait
pas partie du dictionnaire.
Regardons ce que cela donne en terme de nombre d'oprations effectuer, en
choisissant le pire cas : celui o le mot est absent du dictionnaire.
etc.
138
PARTIE 7
Enonce des Exercices
Exercice 7.1
Ecrivez un algorithme qui permette de saisir un nombre quelconque de valeurs, et qui les
range au fur et mesure dans un tableau. Le programme, une fois la saisie termine,
doit dire si les lments du tableau sont tous conscutifs ou non.
Par exemple, si le tableau est :
12
13
14
15
16
17
18
10
11
15
16
17
18
Exercice 7.2
Ecrivez un algorithme qui trie un tableau dans lordre dcroissant.
Vous crirez bien entendu deux versions de cet algorithme, l'une employant le tri par
insertion, l'autre le tri bulles.
Exercice 7.3
Ecrivez un algorithme qui inverse lordre des lments dun tableau dont on suppose qu'il
a t pralablement saisi ( les premiers seront les derniers )
139
Exercice 7.4
Ecrivez un algorithme qui permette lutilisateur de supprimer une valeur dun tableau
pralablement saisi. Lutilisateur donnera lindice de la valeur quil souhaite supprimer.
Attention, il ne sagit pas de remettre une valeur zro, mais bel et bien de la
supprimer du tableau lui-mme ! Si le tableau de dpart tait :
12
45
64
45
Exercice 7.5
Ecrivez l'algorithme qui recherche un mot saisi au clavier dans un dictionnaire. Le
dictionnaire est suppos tre cod dans un tableau pralablement rempli et tri.
140
PARTIE 7
Corrigs des Exercices
Exercice 7.1
Variables Nb, i en Entier
Variable Flag en Booleen
Tableau T() en Entier
Debut
Ecrire "Entrez le nombre de valeurs :"
Lire Nb
Redim T(Nb-1)
Pour i 0 Nb 1
Ecrire "Entrez le nombre n ", i + 1
Lire T(i)
i Suivant
Flag Vrai
Pour i 1 Nb 1
Si T(i) <> T(i 1) + 1 Alors
Flag Faux
FinSi
i Suivant
Si Flag Alors
Ecrire "Les nombres sont conscutifs"
Sinon
Ecrire "Les nombres ne sont pas conscutifs"
FinSi
Fin
Cette programmation est sans doute la plus spontane, mais elle prsente le dfaut
d'examiner la totalit du tableau, mme lorsqu'on dcouvre ds le dpart deux lments
non conscutifs. Aussi, dans le cas d'un grand tableau, est-elle dispendieuse en temps de
traitement. Une autre manire de procder serait de sortir de la boucle ds que deux
lments non conscutifs sont dtects.
141
142
Exercice 7.2
On suppose que N est le nombre dlments du tableau. Tri par insertion :
Pour i 0 N 2
posmaxi = i
Pour j i + 1 N 1
Si t(j) > t(posmaxi) alors
posmaxi j
Finsi
j suivant
temp t(posmaxi)
t(posmaxi) t(i)
t(i) temp
i suivant
Fin
Tri bulles :
Yapermut Vrai
TantQue Yapermut
Yapermut Faux
Pour i 0 N 2
Si t(i) < t(i + 1) Alors
temp t(i)
t(i) t(i + 1)
t(i + 1) temp
Yapermut Vrai
Finsi
i suivant
FinTantQue
Fin
143
Exercice 7.3
On suppose que n est le nombre dlments du tableau pralablement saisi
Pour i 0 (N-1)/2
Temp T(i)
T(i) T(N-1-i)
T(N-1-i) Temp
i suivant
Fin
Exercice 7.4
Exercice 7.5
N est le nombre d'lments du tableau Dico(), contenant les mots du dictionnaire,
tableau pralablement rempli.
Variables Sup, Inf, Comp en Entier
Variables Fini en Boolen
Dbut
Ecrire "Entrez le mot vrifier"
Lire Mot
On dfinit les bornes de la partie du tableau considrer
Sup N 1
Inf 0
Fini Faux
TantQue Non Fini
144
145
Partie 8
Tableaux Multidimensionnels
Le vrai problme nest pas de savoir si les machines
pensent, mais de savoir si les hommes pensent B.F. Skinner
La question de savoir si un ordinateur peut penser
n'est pas plus intressante que celle de savoir si un
sous-marin peut nager - Edgar W. Dijkstra
Ceci nest pas un drglement de votre tlviseur. Nous contrlons tout, nous savons
tout, et les phnomnes paranormaux que vous constatez sont dus au fait que vous tes
passs dans la quatrime dimension (musique angoissante : tintintin ).
Oui, enfin bon, avant dattaquer la quatrime, on va dj se coltiner la deuxime.
Reprenons. Un pion plac dans la case numro i, autrement dit la valeur 1 de Cases(i),
peut bouger vers les cases contigus en diagonale. Cela va nous obliger de petites
acrobaties intellectuelles : la case situe juste au-dessus de la case numro i ayant
comme indice i-8, les cases valables sont celles dindice i-7 et i-9. De mme, la case
situe juste en dessous ayant comme indice i+8, les cases valables sont celles dindice
i+7 et i+9.
Bien sr, on peut fabriquer tout un programme comme cela, mais le moins quon puisse
dire est que cela ne facilite pas la clart de lalgorithme.
Il serait videmment plus simple de modliser un damier par un damier !
REMARQUE ESSENTIELLE :
Il ny a aucune diffrence qualitative entre un tableau deux dimensions
( i, j ) et un tableau une dimension ( i * j ). De mme que le jeu de
dames quon vient dvoquer, tout problme qui peut tre modlis dune
manire peut aussi tre modlis de lautre. Simplement, lune ou lautre
de ces techniques correspond plus spontanment tel ou tel problme, et
facilite donc (ou complique, si on a choisi la mauvaise option) lcriture et
la lisibilit de lalgorithme.
147
Une autre remarque : une question classique propos des tableaux deux dimensions
est de savoir si le premier indice reprsente les lignes ou le deuxime les colonnes, ou
linverse. Je ne rpondrai pas cette question non parce que jai dcid de bouder, mais
parce quelle na aucun sens. Lignes et Colonnes sont des concepts graphiques,
visuels, qui sappliquent des objets du monde rel ; les indices des tableaux ne sont que
des coordonnes logiques, pointant sur des adresses de mmoire vive. Si cela ne vous
convainc pas, pensez un jeu de bataille navale classique : les lettres doivent-elles
dsigner les lignes et les chiffres les colonnes ? Aucune importance ! Chaque joueur peut
mme choisir une convention diffrente, aucune importance ! Lessentiel est quune fois
une convention choisie, un joueur conserve la mme tout au long de la partie, bien
entendu.
148
PARTIE 8
nonc des Exercices
Exercice 8.1
crivez un algorithme remplissant un tableau de 6 sur 13, avec des zros.
Exercice 8.2
Quel rsultat produira cet algorithme ?
Tableau X(1, 2) en Entier
Variables i, j, val en Entier
Dbut
Val 1
Pour i 0 1
Pour j 0 2
X(i, j) Val
Val Val + 1
j Suivant
i Suivant
Pour i 0 1
Pour j 0 2
Ecrire X(i, j)
j Suivant
i Suivant
Fin
149
Exercice 8.3
Quel rsultat produira cet algorithme ?
Tableau X(1, 2) en Entier
Variables i, j, val en Entier
Dbut
Val 1
Pour i 0 1
Pour j 0 2
X(i, j) Val
Val Val + 1
j Suivant
i Suivant
Pour j 0 2
Pour i 0 1
Ecrire X(i, j)
i Suivant
j Suivant
Fin
Exercice 8.4
Quel rsultat produira cet algorithme ?
Tableau T(3, 1) en Entier
Variables k, m, en Entier
Dbut
Pour k 0 3
Pour m 0 1
T(k, m) k + m
m Suivant
k Suivant
Pour k 0 3
Pour m 0 1
Ecrire T(k, m)
m Suivant
k Suivant
Fin
150
Exercice 8.5
Mmes questions, en remplaant la ligne :
T(k, m) k + m
par
T(k, m) 2 * k + (m + 1)
puis par :
T(k, m) (k + 1) + 4 * m
Exercice 8.6
Soit un tableau T deux dimensions (12, 8) pralablement rempli de valeurs numriques.
crire un algorithme qui recherche la plus grande valeur au sein de ce tableau.
Exercice 8.7
crire un algorithme de jeu de dames trs simplifi.
Lordinateur demande lutilisateur dans quelle case se trouve son pion (quelle ligne,
quelle colonne). On met en place un contrle de saisie afin de vrifier la validit des
valeurs entres.
Ensuite, on demande lutilisateur quel mouvement il veut effectuer : 0 (en haut
gauche), 1 (en haut droite), 2 (en bas gauche), 3 (en bas droite).
Si le mouvement est impossible (i.e. on sort du damier ), on le signale lutilisateur et on
sarrte l . Sinon, on dplace le pion et on affiche le damier rsultant, en affichant un
O pour une case vide et un X pour la case o se trouve le pion.
151
PARTIE 8
Corrigs des Exercices
Exercice 8.1
Tableau Truc(5, 12) en Entier
Debut
Pour i 0 5
Pour j 0 12
Truc(i, j) 0
j Suivant
i Suivant
Fin
Exercice 8.2
Cet algorithme remplit un tableau de la manire suivante:
X(0, 0) = 1
X(0, 1) = 2
X(0, 2) = 3
X(1, 0) = 4
X(1, 1) = 5
X(1, 2) = 6
Il crit ensuite ces valeurs lcran, dans cet ordre.
152
Exercice 8.3
Cet algorithme remplit un tableau de la manire suivante:
X(0, 0) = 1
X(1, 0) = 4
X(0, 1) = 2
X(1, 1) = 5
X(0, 2) = 3
X(1, 2) = 6
Il crit ensuite ces valeurs lcran, dans cet ordre.
Exercice 8.4
Cet algorithme remplit un tableau de la manire suivante:
T(0, 0) = 0
T(0, 1) = 1
T(1, 0) = 1
T(1, 1) = 2
T(2, 0) = 2
T(2, 1) = 3
T(3, 0) = 3
T(3, 1) = 4
Il crit ensuite ces valeurs lcran, dans cet ordre.
153
Exercice 8.5
Version a : cet algorithme remplit un tableau de la manire suivante:
T(0, 0) = 1
T(0, 1) = 2
T(1, 0) = 3
T(1, 1) = 4
T(2, 0) = 5
T(2, 1) = 6
T(3, 0) = 7
T(3, 1) = 8
Il crit ensuite ces valeurs lcran, dans cet ordre.
Version b : cet algorithme remplit un tableau de la manire suivante:
T(0, 0) = 1
T(0, 1) = 5
T(1, 0) = 2
T(1, 1) = 6
T(2, 0) = 3
T(2, 1) = 7
T(3, 0) = 4
T(3, 1) = 8
Il crit ensuite ces valeurs lcran, dans cet ordre.
154
Exercice 8.6
Variables i, j, iMax, jMax en Numrique
Tableau T(12, 8) en Numrique
Le principe de la recherche dans un tableau deux dimensions est strictement le mme
que dans un tableau une dimension, ce qui ne doit pas nous tonner. La seule chose qui
change, c'est qu'ici le balayage requiert deux boucles imbriques, au lieu d'une seule.
Debut
...
iMax 0
jMax 0
Pour i 0 12
Pour j 0 8
Si T(i,j) > T(iMax,jMax) Alors
iMax i
jMax j
FinSi
j Suivant
i Suivant
Ecrire "Le plus grand lment est ", T(iMax, jMax)
Ecrire "Il se trouve aux indices ", iMax, "; ", jMax
Fin
Exercice 8.7
Variables i, j , posi, posj, i2, j2 en Entier
Variables Correct, MoveOK en Boolen
Tableau Damier(7, 7) en Boolen
Tableau Mouv(3, 1) en Entier
Le damier contenant un seul pion, on choisit de le coder l'conomie, en le reprsentant
par un tableau de boolens deux dimensions. Dans chacun des emplacements de ce
damier, Faux signifie l'absence du pion, Vrai sa prsence.
155
Par ailleurs, on emploie une mchante astuce, pas obligatoire, mais bien pratique dans
beaucoup de situations. L'ide est de faire correspondre les choix possibles de
l'utilisateur avec les mouvements du pion. On entre donc dans un tableau Mouv deux
dimensions, les dplacements du pion selon les quatre directions, en prenant soin que
chaque ligne du tableau corresponde une saisie de lutilisateur. La premire valeur
tant le dplacement en i, la seconde le dplacement en j. Ceci nous pargnera par la
suite de faire quatre fois les mmes tests.
Debut
Choix 0 : pion en haut droite
Mouv(0, 0) -1
Mouv(0, 1) -1
Choix 1 : pion en haut droite
Mouv(1, 0) -1
Mouv(1, 1) 1
Choix 2 : pion en bas gauche
Mouv(2, 0) 1
Mouv(2, 1) -1
Choix 3 : pion en bas droite
Mouv(3, 0) 1
Mouv(3, 1) 1
Initialisation du damier; le pion nest pour le moment nulle part
Pour i 0 7
Pour j 0 7
Damier(i, j) Faux
j suivant
i suivant
Saisie de la coordonne en i ("posi") avec contrle de saisie
Correct Faux
TantQue Non Correct
Ecrire "Entrez la ligne de votre pion: "
Lire posi
Si posi >= 0 et posi <= 7 Alors
Correct vrai
156
Finsi
Fintantque
Saisie de la coordonne en j ("posj") avec contrle de saisie
Correct Faux
TantQue Non Correct
Ecrire "Entrez la colonne de votre pion: "
Lire posj
Si posj >= 0 et posj <= 7 Alors
Correct Vrai
Finsi
Fintantque
Positionnement du pion sur le damier virtuel.
Damier(posi, posj) Vrai
Saisie du dplacement, avec contrle
Ecrire "Quel dplacement ?"
Ecrire " - 0: en haut gauche"
Ecrire " - 1: en haut droite"
Ecrire " - 2: en bas gauche"
Ecrire " - 3: en bas droite"
Correct Faux
TantQue Non Correct
Lire Dep
Si Dep >= 0 et Dep <= 3 Alors
Correct Vrai
FinSi
FinTantQue
i2 et j2 sont les futures coordonnes du pion. La variable boolenne MoveOK vrifie la
validit de ce futur emplacement
i2 posi + Mouv(Dep, 0)
j2 posj + Mouv(Dep, 1)
MoveOK i2 >= 0 et i2 <= 7 et j2 >= 0 et j2 <= 7
Cas o le dplacement est valide
Si MoveOK Alors
Damier(posi, posj) Faux
Damier(i2, j2) Vrai
157
158
159
Partie 9
Les Fonctions Prdfinies
Il y a deux mthodes pour crire des programmes
sans erreurs. Mais il ny a que la troisime qui
marche - Anonyme
Certains traitements ne peuvent tre effectus par
un algorithme, aussi savant soit-il. Dautres ne
peuvent ltre quau prix de souffrances indicibles.
Cest par exemple le cas du calcul du sinus dun angle : pour en obtenir une valeur
approche, il faudrait appliquer une formule dune complexit vous glacer le sang.
Aussi, que se passe-t-il sur les petites calculatrices que vous connaissez tous ? On vous
fournit quelques touches spciales, dites touches de fonctions, qui vous permettent par
exemple de connatre immdiatement ce rsultat. Sur votre calculatrice, si vous voulez
connatre le sinus de 35, vous taperez 35, puis la touche SIN, et vous aurez le rsultat.
Tout langage de programmation propose ainsi un certain nombre de fonctions ; certaines
sont indispensables, car elles permettent deffectuer des traitements qui seraient sans
elles impossibles. Dautres servent soulager le programmeur, en lui pargnant de longs
et pnibles - algorithmes.
deux parenthses, une ouvrante, une fermante. Ces parenthses sont toujours
160
161
PARTIE 9
nonc des Exercices
Exercice 9.1
Parmi ces affectations (considres indpendamment les unes des autres), lesquelles
provoqueront des erreurs, et pourquoi ?
Variables A, B, C en Numrique
Variables D, E en Caractre
A Sin(B)
A Sin(A + B * C)
B Sin(A) Sin(D)
D Sin(A / B)
C Cos(Sin(A)
162
PARTIE 9
Corrigs des Exercices
Exercice 9.1
A Sin(B)
A Sin(A + B * C)
Aucun problme
Aucun problme
C Cos(Sin(A)
163
Ce sont les deux seules fonctions de chanes rellement indispensables. Cependant, pour
nous pargner des algorithmes fastidieux, les langages proposent galement :
Exemples :
Len("Bonjour, a va ?")
vaut
16
Len("")
vaut
Mid("Zorro is back", 4, 7)
vaut
"ro is b"
vaut
"c"
Left("Et pourtant", 8)
vaut
"Et pourt"
Right("Et pourtant", 4)
vaut
"t"
vaut
vaut
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
165
PARTIE 9
nonc des Exercices
Exercice 9.2
Ecrivez un algorithme qui demande un mot lutilisateur et qui affiche lcran le
nombre de lettres de ce mot (c'est vraiment tout bte).
Exercice 9.3
Ecrivez un algorithme qui demande une phrase lutilisateur et qui affiche lcran le
nombre de mots de cette phrase. On suppose que les mots ne sont spars que par des
espaces (et c'est dj un petit peu moins bte).
Exercice 9.4
Ecrivez un algorithme qui demande une phrase lutilisateur et qui affiche lcran le
nombre de voyelles contenues dans cette phrase.
On pourra crire deux solutions. La premire dploie une condition compose bien
fastidieuse. La deuxime, en utilisant la fonction Trouve, allge considrablement
l'algorithme.
Exercice 9.5
Ecrivez un algorithme qui demande une phrase lutilisateur. Celui-ci entrera ensuite le
rang dun caractre supprimer, et la nouvelle phrase doit tre affiche (on doit
rellement supprimer le caractre dans la variable qui stocke la phrase, et pas
uniquement lcran).
166
167
PARTIE 9
Corrigs des Exercices
Exercice 9.2
Vous tiez prvenus, c'est bte comme chou ! Il suffit de se servir de la fonction Len,
et c'est rgl :
Variable Mot en Caractre
Variable Nb en Entier
Debut
Ecrire "Entrez un mot : "
Lire Mot
Nb Len(Mot)
Ecrire "Ce mot compte ", Nb, " lettres"
Fin
Exercice 9.3
L, on est oblig de compter par une boucle le nombre d'espaces de la phrase, et on en
dduit le nombre de mots. La boucle examine les caractres de la phrase un par un, du
premier au dernier, et les compare l'espace.
Variable Bla en Caractre
Variables Nb, i en Entier
Debut
Ecrire "Entrez une phrase : "
Lire Bla
Nb 0
Pour i 1 Len(Bla)
Si Mid(Bla, i , 1) = " " Alors
Nb Nb + 1
FinSi
i suivant
Ecrire "Cette phrase compte ", Nb + 1, " mots"
Fin
168
Exercice 9.4
Solution 1 : pour chaque caractre du mot, on pose une trs douloureuse condition
compose. Le moins que l'on puisse dire, c'est que ce choix ne se distingue pas par son
lgance. Cela dit, il marche, donc aprs tout, pourquoi pas.
Variable Bla en Caractre
Variables Nb, i, j en Entier
Debut
Ecrire "Entrez une phrase : "
Lire Bla
Nb 0
Pour i 1 Len(Bla)
Si Mid(Bla, i, 1) = "a" ou Mid(Bla, i, 1) = "e" ou Mid(Bla, i, 1) = "i" ou Mid(Bla, i, 1) = "o"
ou Mid(Bla, i, 1) = "u" ou Mid(Bla, i, 1) = "y" Alors
Nb Nb + 1
FinSi
i suivant
Ecrire "Cette phrase compte ", Nb, " voyelles"
Fin
Solution 2 : on stocke toutes les voyelles dans une chane. Grce la fonction Trouve, on
dtecte immdiatement si le caractre examin est une voyelle ou non. C'est nettement
plus sympathique...
Variables Bla, Voy en Caractre
Variables Nb, i, j en Entier
Debut
Ecrire "Entrez une phrase : "
Lire Bla
Nb 0
Voy "aeiouy"
Pour i 1 Len(Bla)
Si Trouve(Voy, Mid(Bla, i, 1)) <> 0 Alors
Nb Nb + 1
FinSi
i suivant
Ecrire "Cette phrase compte ", Nb, " voyelles"
Fin
169
Exercice 9.5
Il n'existe aucun moyen de supprimer directement un caractre d'une chane
autrement qu'en procdant par collage. Il faut donc concatner ce qui se trouve
gauche du caractre supprimer, avec ce qui se trouve sa droite. Attention aux
paramtres des fonctions Mid, ils n'ont rien d'vident !
Variable Bla en Caractre
Variables Nb, i, j en Entier
Dbut
Ecrire "Entrez une phrase : "
Lire Bla
Ecrire "Entrez le rang du caractre supprimer : "
Lire Nb
L Len(Bla)
Bla Mid(Bla, 1, Nb 1) & Mid(Bla, Nb + 1, L Nb)
Ecrire "La nouvelle phrase est : ", Bla
Fin
170
Exercice 9.6
Sur l'ensemble des exercices de cryptographie, il y a deux grandes stratgies possibles :
- soit transformer les caractres en leurs codes ASCII. L'algorithme revient donc
ensuite traiter des nombres. Une fois ces nombres transforms, il faut les reconvertir
en caractres.
- soit en rester au niveau des caractres, et procder directement aux transformations
ce niveau. C'est cette dernire option qui est choisie ici, et pour tous les exercices de
cryptographie venir.
Pour cet exercice, il y a une rgle gnrale : pour chaque lettre, on dtecte sa position
dans l'alphabet, et on la remplace par la lettre occupant la position suivante. Seul cas
particulier, la vingt-sixime lettre (le Z) doit tre code par la premire (le A), et non
par la vingt-septime, qui n'existe pas !
Variables Bla, Cod, Alpha en Caractre
Variables i, Pos en Entier
Dbut
Ecrire "Entrez la phrase coder : "
Lire Bla
Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Cod ""
Pour i 1 Len(Bla)
Let Mid(Bla, i, 1)
Si Let <> "Z" Alors
Pos Trouve(Alpha, Let)
Cod Cod & Mid(Alpha, Pos + 1, 1)
Sinon
Cod Cod & "A"
FinSi
i Suivant
Bla Cod
Ecrire "La phrase code est : ", Bla
Fin
171
A vaut 3
B Mod(12,2)
C Mod(44,8)
Cette fonction peut paratre un peu bizarre, est rserve aux seuls matheux. Mais vous
aurez l aussi loccasion de voir dans les exercices venir que ce nest pas le cas.
Gnration de nombres alatoires
Une autre fonction classique , car trs utile, est celle qui gnre un nombre choisi au
hasard.
Tous les programmes de jeu, ou presque, ont besoin de ce type doutils, quil sagisse de
simuler un lancer de ds ou le dplacement chaotique du vaisseau spatial de lenfer de la
mort pilot par linfme Zorglub, qui veut faire main basse sur lUnivers (heureusement
vous tes l pour len empcher, ouf).
Mais il ny a pas que les jeux qui ont besoin de gnrer des nombres alatoires. La
modlisation (physique, gographique, conomique, etc.) a parfois recours des modles
dits stochastiques (chouette, encore un nouveau mot savant !). Ce sont des modles dans
lesquels les variables se dduisent les unes des autres par des relations dterministes
(autrement dit des calculs), mais o lon simule la part dincertitude par une
fourchette de hasard.
172
On a :
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 Alea()*0,30 + 1,35
Toto aura bien une valeur comprise entre 1,35 et 1,65. Et le tour est jou !
Bon, il est grand temps que vous montriez ce que vous avez appris
173
PARTIE 9
nonc des Exercices
Exercice 9.7 - Cryptographie 2 - le chiffre de Csar
Une amlioration (relative) du principe prcdent consiste oprer avec un dcalage non
de 1, mais dun nombre quelconque de lettres. Ainsi, par exemple, si lon choisit un
dcalage de 12, les A deviennent des M, les B des N, etc.
Ralisez un algorithme sur le mme principe que le prcdent, mais qui demande en plus
quel est le dcalage utiliser. Votre sens proverbial de l'lgance vous interdira bien
sr une srie de vingt-six "Si...Alors"
174
etc.
Exercice 9.10
Ecrivez un algorithme qui demande un nombre entier lutilisateur. Lordinateur affiche
ensuite le message "Ce nombre est pair" ou "Ce nombre est impair" selon le cas.
175
Exercice 9.11
Ecrivez les algorithmes qui gnrent un nombre Glup alatoire tel que
176
PARTIE 9
Corrigs des Exercices
Exercice 9.7
Cet algorithme est une gnralisation du prcdent. Mais l, comme on ne connat pas
d'avance le dcalage appliquer, on ne sait pas a priori combien de "cas particuliers",
savoir de dpassements au-del du Z, il va y avoir.
Il faut donc trouver un moyen simple de dire que si on obtient 27, il faut en ralit
prendre la lettre numro 1 de l'alphabet, que si on obtient 28, il faut en ralit prendre
la numro 2, etc. Ce moyen simple existe : il faut considrer le reste de la division par
26, autrement dit le modulo.
Il y a une petite ruse supplmentaire appliquer, puisque 26 doit rester 26 et ne pas
devenir 0.
Variable Bla, Cod, Alpha en Caractre
Variables i, Pos, Dcal en Entier
Dbut
Ecrire "Entrez le dcalage appliquer : "
Lire Dcal
Ecrire "Entrez la phrase coder : "
Lire Bla
Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Cod ""
Pour i 1 Len(Bla)
Let Mid(Bla, i, 1)
Pos Trouve(Alpha, Let)
NouvPos Mod(Pos + Dcal, 26)
Si NouvPos = 0 Alors
NouvPos 26
FinSi
Cod Cod & Mid(Alpha, NouvPos, 1)
i Suivant
Bla Cod
Ecrire "La phrase code est : ", Bla
Fin
177
Exercice 9.8
L, c'est assez direct.
Variable Bla, Cod, Alpha en Caractre
Variables i, Pos, Dcal en Entier
Dbut
Ecrire "Entrez lalphabet cl : "
Lire Cl
Ecrire "Entrez la phrase coder : "
Lire Bla
Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Cod ""
Pour i 1 Len(Bla)
Let Mid(Bla, i, 1)
Pos Trouve(Alpha, Let)
Cod Cod & Mid(Cl, Pos, 1)
i Suivant
Bla Cod
Ecrire "La phrase code est : ", Bla
Fin
Exercice 9.9
Le codage de Vigenre nest pas seulement plus difficile briser; il est galement un peu
plus raide programmer. La difficult essentielle est de comprendre quil faut deux
boucles: lune pour parcourir la phrase coder, lautre pour parcourir la cl. Mais quand
on y rflchit bien, ces deux boucles ne doivent surtout pas tre imbriques. Et en
ralit, quelle que soit la manire dont on l'crit, elle nen forment quune seule.
Variables Alpha, Bla, Cod, Cl, Let en Caractre
Variables i, Pos, PosCl, Dcal en Entier
Dbut
Ecrire "Entrez la cl : "
Lire Cl
Ecrire "Entrez la phrase coder : "
Lire Bla
Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Cod ""
PosCl 0
Pour i 1 Len(Bla)
178
On gre la progression dans la cl. Jai effectu cela " la main" par une boucle, mais un
joli emploi de la fonction Modulo aurait permis une programmation en une seule ligne!
Poscl Poscl + 1
Si PosCl > Len(Cl) Alors
PosCl 1
FinSi
On dtermine quelle est la lettre cl et sa position dans lalphabet
LetCl Mid(Cl, PosCl, 1)
PosLetCl Trouve(Alpha, LetCl)
On dtermine la position de la lettre coder et le dcalage appliquer. L encore, une
solution alternative aurait t demployer Mod : cela nous aurait pargn le Si
Let Mid(Bla, i, 1)
Pos Trouve(Alpha, Let)
NouvPos Pos + PosLetCl
Si NouvPos > 26 Alors
NouvPos NouvPos 26
FinSi
Cod Cod & Mid(Alpha, NouvPos, 1)
i Suivant
Bla Cod
Ecrire "La phrase code est : ", Bla
Fin
Exercice 9.10
On en revient des choses plus simples...
Variable Nb en Entier
Ecrire "Entrez votre nombre : "
Lire Nb
Si Nb/2 = Ent(Nb/2) Alors
Ecrire "Ce nombre est pair"
Sinon
Ecrire "Ce nombre est pair"
FinSi
Fin
179
Exercice 9.11
a) Glup Alea() * 2
b) Glup Alea() * 2 1
c) Glup Alea() * 0,30 + 1,35
d) Glup Ent(Alea() * 6) + 1
e) Glup Alea() * 17 10,5
f) Glup Ent(Alea()*6) + Ent(Alea()*6) + 2
180
181
Partie 10
Les Fichiers
On ne peut pas davantage crer des fichiers
numriques non copiables que crer de leau non
humide - Bruce Schneier
Jusqu prsent, les informations utilises dans nos programmes ne pouvaient provenir
que de deux sources : soit elles taient inclues dans lalgorithme lui-mme, par le
programmeur, soit elles taient entres en cours de route par lutilisateur. Mais
videmment, cela ne suffit pas combler les besoins rels des informaticiens.
Imaginons que lon veuille crire un programme grant un carnet dadresses. Dune
excution du programme lautre, lutilisateur doit pouvoir retrouver son carnet jour,
avec les modifications quil y a apportes la dernire fois quil a excut le programme.
Les donnes du carnet dadresse ne peuvent donc tre inclues dans lalgorithme, et
encore moins tre entres au clavier chaque nouvelle excution !
Les fichiers sont l pour combler ce manque. Ils servent stocker des informations
de manire permanente, entre deux excutions dun programme. Car si les variables,
qui sont je le rappelle des adresses de mmoire vive, disparaissent chaque fin
dexcution, les fichiers, eux sont stocks sur des priphriques mmoire de masse
(disquette, disque dur, CD Rom).
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
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
183
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
184
185
A la diffrence de la prcdente, cette typologie ne caractrise pas la structure ellemme du fichier. En fait, tout fichier peut tre utilis avec lun ou lautre des trois
types daccs. Le choix du type daccs nest pas un choix qui concerne le fichier luimme, mais uniquement la manire dont il va tre trait par la machine. Cest donc dans
Ils
sont
structurs
sous
forme de...
enregistrements
eux-mmes structurs...
Fichiers Binaires
lignes (enregistrements)
Les
Fichiers Texte
sont
Lecture du fichier
186
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.
Pour ouvrir un fichier texte, on crira par exemple :
Ouvrir "Exemple.txt" sur 4 en Lecture
Ici, "Exemple.txt" est le nom du fichier sur le disque dur, 4 est le numro de canal, et ce
fichier a donc t ouvert en lecture. Vous laviez sans doute pressenti.
187
FinTantQue
Fermer 5
Fin
Et neuf fois sur dix galement, si lon veut stocker au fur et mesure en mmoire vive
les informations lues dans le fichier, on a recours un ou plusieurs tableaux. Et comme
on ne sait pas davance combien il y aurait denregistrements dans le fichier, on ne sait
pas davantage combien il doit y avoir demplacements dans les tableaux. Quimporte, les
programmeurs avertis que vous tes connaissent la combine des tableaux dynamiques.
188
correctement dimensionnes ds leur dclaration (la plupart des langages offrent cette
possibilit) :
Ouvrir "Exemple.txt" sur 3 en Ajout
Variable Truc en Caractre
Variables Nom*20, Prnom*15, Tel*10, Mail*20 en Caractre
Une telle dclaration assure que quel que soit le contenu de la variable Nom, par
exemple, celle-ci comptera toujours 20 caractres. Si son contenu est plus petit, alors
un nombre correct despaces sera automatiquement ajout pour combler. Si on tente dy
entrer un contenu trop long, celui-ci sera automatiquement tronqu. Voyons la suite :
Nom "Jokers"
Prnom "Midnight"
Tel "0348946532"
Mail allstars@rockandroll.com
Truc Nom & Prnom & Tel & Mail
EcrireFichier 3, Truc
Et pour finir, une fois quon en a termin avec un fichier, il ne faut pas oublier de fermer
ce fichier. On libre ainsi le canal quil occupait (et accessoirement, on pourra utiliser ce
canal dans la suite du programme pour un autre fichier ou pour le mme).
190
PARTIE 10
nonc des Exercices
Exercice 10.1
Quel rsultat cet algorithme produit-il ?
Variable Truc en Caractre
Dbut
Ouvrir "Exemple.txt" sur 5 en Lecture
Tantque Non EOF(5)
LireFichier 5, Truc
Ecrire Truc
FinTantQue
Fermer 5
Fin
Exercice 10.2
Ecrivez lalgorithme qui produit un rsultat similaire au prcdent, mais le fichier texte
"Exemple.txt" est cette fois de type dlimit (caractre de dlimitation : /). On
produira l'cran un affichage o pour des raisons esthtiques, ce caractre sera
remplac avec des espaces.
Exercice 10.3
On travaille avec le fichier du carnet dadresses en champs de largeur fixe.
Ecrivez un algorithme qui permet lutilisateur de saisir au clavier un nouvel individu qui
sera ajout ce carnet dadresses.
191
PARTIE 10
Corrigs des Exercices
Exercice 10.1
Cet algorithme crit l'intgralit du fichier "Exemple.txt" l'cran
Exercice 10.2
Variable Truc en Caractre
Variable i en Entier
Debut
Ouvrir "Exemple.txt" sur 5 en Lecture
Tantque Non EOF(5)
LireFichier 5, Truc
Pour i 1 Len(Truc)
Si Mid(Truc, i, 1) = "/" Alors
Ecrire " "
Sinon
Ecrire Mid(Truc, i, 1)
FinSi
i Suivant
FinTantQue
Fermer 5
192
Exercice 10.3
Variables Nom * 20, Prnom * 17, Tel * 10, Mail * 20, Lig en Caractre
Debut
Ecrire "Entrez le nom : "
Lire Nom
Ecrire "Entrez le prnom : "
Lire Prnom
Ecrire "Entrez le tlphone : "
Lire Tel
Ecrire "Entrez le nom : "
Lire Mail
Lig Nom & Prnom & Tel & Mail
Ouvrir "Adresse.txt" sur 1 pour Ajout
EcrireFichier 1, Lig
Fermer 1
Fin
193
directement (ou presque) les informations sur le disque dur. Cest parfois un peu
acrobatique, lorsquon veut supprimer un lment dun fichier : on programme
alors une boucle avec un test, qui recopie dans un deuxime fichier tous les
lments du premier fichier sauf un ; et il faut ensuite recopier intgralement le
deuxime fichier la place du premier fichier Ouf.
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-til des cas o il vaut mieux en rester aux fichiers et ne pas passer par des tableaux ?
La recopie dun trs gros fichier en mmoire vive exige des ressources qui peuvent
atteindre des dimensions considrables. Donc, dans le cas d'immenses fichiers (trs
rares, cependant), cette recopie en mmoire peut s'avrer problmatique.
Toutefois, lorsque le fichier contient des donnes de type non homognes (chanes,
numriques, etc.) cela risque dtre coton pour le stocker dans un tableau unique : il va
falloir dclarer plusieurs tableaux, dont le maniement au final peut tre aussi lourd que
celui des fichiers de dpart.
194
A moins... d'utiliser une ruse : crer des types de variables personnaliss, composs dun
collage de plusieurs types existants (10 caractres, puis un numrique, puis 15
caractres, etc.). Ce type de variable s'appelle un type structur. Cette technique, bien
quelle ne soit pas vraiment difficile, exige tout de mme une certaine aisance... Voil
pourquoi on va maintenant en dire quelques mots.
195
Nous allons donc, avant mme la dclaration des variables, crer un type, une structure,
calque sur celle de nos enregistrements, et donc prte les accueillir :
Structure Bottin
Nom en Caractre * 20
Prnom en Caractre * 15
Tel en Caractre * 10
Mail en Caractre * 20
Fin Structure
Ici, Bottin est le nom de ma structure. Ce mot jouera par la suite dans mon programme
exactement le mme rle que les types prdfinis comme Numrique, Caractre ou
Boolen. Maintenant que la structure est dfinie, je vais pouvoir, dans la section du
programme o s'effectuent les dclarations, crer une ou des variables correspondant
cette structure :
Variable Individu en Bottin
Et si cela me chantait, je pourrais remplir les diffrentes informations contenues au
sein de la variable Individu de la manire suivante :
Individu "Joker", "Midnight", "0348946532", "allstars@rock.com"
On peut aussi avoir besoin d'accder un seul des champs de la variable structure.
Dans ce cas, on emploie le point :
Individu.Nom "Joker"
Individu.Prnom "Midnight"
Individu.Tel "0348946532"
Individu.Mail "allstars@rockandroll.com"
Ainsi, crire correctement une information dans le fichier est un jeu d'enfant, puisqu'on
dispose d'une variable Individu au bon gabarit. Une fois remplis les diffrents champs
de cette variable - ce qu'on vient de faire -, il n'y a plus qu' envoyer celle-ci
directement dans le fichier. Et zou !
EcrireFichier 3, Individu
De la mme manire, dans l'autre sens, lorsque j'effectue une opration de lecture dans
le fichier Adresses, ma vie en sera considrablement simplifie : la structure tant
faite pour cela, je peux dornavant me contenter de recopier une ligne du fichier dans
une variable de type Bottin, et le tour sera jou. Pour charger l'individu suivant du
fichier en mmoire vive, il me suffira donc d'crire :
LireFichier 5, Individu
196
Et l, direct, j'ai bien mes quatre renseignements accessibles dans les quatre champs de
la variable individu. Tout cela, videmment, parce que la structure de ma variable
Individu correspond parfaitement la structure des enregistrements de mon fichier.
Dans le cas contraire, pour reprendre une expression connue, on ne dcoupera pas selon
les pointills, et alors, je pense que vous imaginez le carnage...
variables structures.
L, bien que pas si difficile que cela, a commence devenir vraiment balze. Parce que
cela veut dire que nous disposons d'une manire de grer la mmoire vive qui va
correspondre exactement la structure d'un fichier texte (d'une base de donnes).
Comme les structures se correspondent parfaitement, le nombre de manipulations
effectuer, autrement dit de lignes de programme crire, va tre rduit au minimum.
En fait, dans notre tableau structur, les champs des emplacements du tableau
correspondront aux champs du fichier texte, et les indices des emplacements du
tableaux correspondront aux diffrentes lignes du fichier.
Voici, titre d'illustration, l'algorithme complet de lecture du fichier Adresses et de sa
recopie intgrale en mmoire vive, en employant un tableau structur.
Structure Bottin
Nom en Caractre * 20
Prnom en Caractre * 15
Tel en Caractre * 10
Mail en Caractre * 20
Fin Structure
Tableau Mespotes() en Bottin
Dbut
Ouvrir "Exemple.txt" sur 3 en Lecture
i -1
Tantque Non EOF(3)
ii+1
Redim Mespotes(i)
LireFichier 3, Mespotes(i)
FinTantQue
Fermer 3
Fin
197
Une fois que ceci est rgl, on a tout ce qu'il faut ! Si je voulais crire, un moment, le
mail de l'individu n13 du fichier (donc le n12 du tableau) l'cran, il me suffirait de
passer l'ordre :
Ecrire Mespotes(12).Mail
Et voil le travail. Simplissime, non ?
REMARQUE FINALE SUR LES DONNES STRUCTURES
Mme si le domaine de prdilection des donnes structures
est la gestion de fichiers, on peut tout fait y avoir recours
dans
d'autres
contextes,
et
organiser
plus
fichier binaire)
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
199
PARTIE 10
nonc des Exercices
Exercice 10.4
Mme question, mais cette fois le carnet est suppos tre tri par ordre alphabtique.
Lindividu doit donc tre insr au bon endroit dans le fichier.
Exercice 10.5
Ecrivez un algorithme qui permette de modifier un renseignement (pour simplifier,
disons uniquement le nom de famille) dun membre du carnet dadresses. Il faut donc
demander lutilisateur quel est le nom modifier, puis quel est le nouveau nom, et
mettre jour le fichier. Si le nom recherch n'existe pas, le programme devra le
signaler.
Exercice 10.6
Ecrivez un algorithme qui trie les individus du carnet dadresses par ordre alphabtique.
Exercice 10.7
Soient Toto.txt et Tata.txt deux fichiers dont les enregistrements ont la mme
structure. Ecrire un algorithme qui recopie tout le fichier Toto dans le fichier Tutu, puis
sa suite, tout le fichier Tata (concatnation de fichiers).
Exercice 10.8
Ecrire un algorithme qui supprime dans notre carnet d'adresses tous les individus dont
le mail est invalide (pour employer un critre simple, on considrera que sont invalides
les mails ne comportant aucune arobase, ou plus d'une arobase).
200
Exercice 10.9
Les enregistrements dun fichier contiennent les deux champs Nom (chane de
caractres) et Montant (Entier). Chaque enregistrement correspond une vente conclue
par un commercial dune socit.
On veut mmoriser dans un tableau, puis afficher l'cran, le total de ventes par
vendeur. Pour simplifier, on suppose que le fichier de dpart est dj tri
alphabtiquement par vendeur.
201
PARTIE 10
Corrigs des Exercices
Exercice 10.4
L, comme indiqu dans le cours, on passe par un tableau de strutures en mmoire vive,
ce qui est la technique la plus frquemment employe. Le tri - qui est en fait un simple
test - sera effectu sur le premier champ (nom).
Structure Bottin
Nom en Caractre * 20
Prnom en Caractre * 15
Tel en Caractre * 10
Mail en Caractre * 20
Fin Structure
Tableau Mespotes() en Bottin
Variables MonPote, Nouveau en Bottin
Variables i, j en Numrique
Debut
Ecrire "Entrez le nom : "
Lire Nouveau.Nom
Ecrire "Entrez le prnom : "
Lire Nouveau.Prnom
Ecrire "Entrez le tlphone : "
Lire Nouveau.Tel
Ecrire "Entrez le mail : "
Lire Nouveau.Mail
202
203
Exercice 10.5
C'est un peu du mme tonneau que ce qu'on vient de faire, quelques variantes prs. Il y
a essentiellement une petite gestion de flag pour faire bonne mesure.
Structure Bottin
Nom en Caractre * 20
Prnom en Caractre * 15
Tel en caractre * 10
Mail en Caractre * 20
Fin Structure
Tableau Mespotes() en Bottin
Variables MonPote en Bottin
Variables Ancien, Nouveau en Caractre*20
Variables i, j en Numrique
Variable Trouv en Boolen
Debut
Ecrire "Entrez le nom modifier : "
Lire Ancien
Ecrire "Entrez le nouveau nom : "
Lire Nouveau
On recopie l'intgralit de "Adresses" dans Fic, tout en recherchant le clampin. Si on le
trouve, on procde la modification.
Ouvrir Adresse.txt sur 1 pour Lecture
i -1
Trouv Faux
Tantque Non EOF(1)
ii+1
Redim MesPotes(i)
LireFichier 1, MonPote
Si MonPote.Nom = Ancien.Nom Alors
Trouv Vrai
MonPote.Nom Nouveau
FinSi
MesPotes(i) MonPote
FinTantQue
Fermer 1
204
Exercice 10.6
L, c'est un tri sur un tableau de structures, rien de plus facile. Et on est bien content
de disposer des structures, autrement dit de ne se coltiner qu'un seul tableau...
Structure Bottin Nom en Caractre * 20
Prnom en Caractre * 15
Tel en caractre * 10
Mail en Caractre * 20
Fin Structure
Tableau Mespotes() en Bottin
Variables Mini en Bottin
Variables i, j en Numrique
Debut
On recopie l'intgralit de "Adresses" dans MesPotes...
Ouvrir "Adresse.txt" sur 1 pour Lecture
i -1
Tantque Non EOF(1)
ii+1
Redim MesPotes(i)
LireFichier 1, MesPotes(i)
FinTantQue
Fermer 1
205
206
Exercice 10.7
Bon, celui-l est tellement idiot qu'on n'a mme pas besoin de passer par des tableaux
en mmoire vive.
Variable Lig en Caractre
Dbut
Ouvrir "Tutu.txt" sur 1 pour Ajout
Ouvrir Toto.txt sur 2 pour Lecture
Tantque Non EOF(2)
LireFichier 2, Lig
EcrireFichier 1, Lig
FinTantQue
Fermer 2
Ouvrir Tata.txt sur 3 pour Lecture
Tantque Non EOF(3)
LireFichier 2, Lig
EcrireFichier 1, Lig
FinTantQue
Fermer 3
Fermer 1
Fin
Exercice 10.8
On va liminer les mauvaises entres ds la recopie : si l'enregistrement ne prsente
pas un mail valide, on l'ignore, sinon on le copie dans le tableau.
Structure Bottin
Nom en Caractre * 20
Prnom en Caractre * 15
Tel en caractre * 10
Mail en Caractre * 20
Fin Structure
Tableau Mespotes() en Bottin
Variable MonPote en Bottin
Variables i, j en Numrique
Debut
207
208
Exercice 10.9
Une fois de plus, le passage par un tableau de structures est une stratgie commode.
Attention toutefois, comme il s'agit d'un fichier texte, tout est stock en caractre. Il
faudra donc convertir en numrique les caractres reprsentant les ventes, pour pouvoir
effectuer les calculs demands. Pour le traitement, il y a deux possibilits. Soit on
recopie le fichier l'identique dans un premier tableau, et on traite ensuite ce tableau
pour faire la somme par vendeur. Soit on fait le traitement directement, ds la lecture
du fichier. C'est cette option qui est choisie dans ce corrig.
Structure Vendeur
Nom en Caractre * 20
Montant en Numrique
Fin Structure
Tableau MesVendeurs() en Vendeur
Variables NomPrec * 20, Lig, Nom en caractre
Variables Somme, Vente en Numrique
On balaye le fichier en faisant nos additions.
Ds que le nom a chang (on est pass au vendeur suivant), on range le rsultat et on
remet tout zro
Debut
Ouvrir "Ventes.txt sur 1 pour Lecture
i -1
Somme 0
NomPrc ""
Tantque Non EOF(1)
LireFichier 1, Lig
Nom Mid(Lig, 1, 20)
Vente CNum(Mid(Lig, 21, 10)
Si Nom = NomPrec Alors
Somme Somme + Vente
Sinon
ii+1
Redim MesVendeurs(i)
MesVendeurs(i).Nom NomPrec
MesVendeurs(i).Montant Somme
Somme 0
NomPrec Nom
FinSi
FinTantQue
209
210
rcupration
elle-mme
transmettra
donc
REMARQUE N1bis
Voil pourquoi une structure s'appliquant aux fichiers textes
est forcment compose uniquement de types caractres.
Une structure traitant de fichiers binaires pourrait en
revanche tre compose de caractres, de numriques et de
boolens.
REMARQUE N2
Plusieurs langages interdisent l'criture d'une variable
structure dans un fichier texte, ne l'autorisant que pour un
fichier binaire.
Si l'on se trouve dans ce cas, cela signifie qu'on peut certes
utiliser une structure, ou un tableau de structures, mais
condition d'crire sur le fichier champ par champ, ce qui
annule une partie du bnfice de la structure.
Nous avons postul ici que cette interdiction n'existait pas ;
en tenir compte ne changerait pas fondamentalement les
algorithmes, mais alourdirait un peu le code pour les lignes
traitant de l'criture dans les fichiers.
211
Partie 11
Procdures et Fonctions
Linformatique semble encore chercher la recette
miracle
spar. Il ne restera alors plus qu' appeler ce groupe d'instructions (qui n'existe donc
dsormais quen un exemplaire unique) chaque fois quon en a besoin. Ainsi, la lisibilit
est assure ; le programme devient modulaire, et il suffit de faire une seule
modification au bon endroit, pour que cette modification prenne effet dans la totalit
de lapplication.
Le corps du programme sappelle alors la procdure principale, et ces groupes
dinstructions auxquels on a recours sappellent des fonctions et des sous-procdures
(nous verrons un peu plus loin la diffrence entre ces deux termes).
Reprenons un exemple de question laquelle lutilisateur doit rpondre par oui ou par
non.
Mauvaise Structure :
...
Ecrire "Etes-vous mari ?"
Rep1 ""
TantQue Rep1 <> "Oui" et Rep1 <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep1
FinTantQue
...
Ecrire "Avez-vous des enfants ?"
Rep2 ""
TantQue Rep2 <> "Oui" et Rep2 <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep2
FinTantQue
...
On le voit bien, il y a l une rptition quasi identique du traitement accomplir. A
chaque fois, on demande une rponse par Oui ou Non, avec contrle de saisie. La seule
chose qui change, c'est le nom de la variable dans laquelle on range la rponse. Alors, il
doit bien y avoir un truc.
La solution, on vient de le voir, consiste isoler les instructions demandant une rponse
par Oui ou Non, et appeler ces instructions chaque fois que ncessaire. Ainsi, on
vite les rptitions inutiles, et on a dcoup notre problme en petits morceaux
autonomes.
Nous allons donc crer une fonction dont le rle sera de renvoyer la rponse (oui ou non)
de l'utilisateur. Ce mot de "fonction", en l'occurrence, ne doit pas nous surprendre :
nous avons tudi prcdemment des fonctions fournies avec le langage, et nous avons
213
vu que le but d'une fonction tait de renvoyer une valeur. Eh bien, c'est exactement la
mme chose ici, sauf que c'est nous qui allons crer notre propre fonction, que nous
appellerons RepOuiNon :
Fonction RepOuiNon() en caractre
Truc ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
Renvoyer Truc
Fin
On remarque au passage lapparition dun nouveau mot-cl : Renvoyer, qui indique quelle
valeur doit prendre la fonction lorsqu'elle est utilise par le programme. Cette valeur
renvoye par la fonction (ici, la valeur de la variable Truc) est en quelque sorte contenue
dans le nom de la fonction lui-mme, exactement comme ctait le cas dans les fonctions
prdfinies.
Une fonction s'crit toujours en-dehors de la procdure principale. Selon les langages,
cela peut prendre diffrentes formes. Mais ce qu'il faut comprendre, c'est que ces
quelques lignes de codes sont en quelque sorte des satellites, qui existent en dehors du
traitement lui-mme. Simplement, elles sont sa disposition, et il pourra y faire appel
chaque fois que ncessaire. Si l'on reprend notre exemple, une fois notre fonction
RepOuiNon crite, le programme principal comprendra les lignes :
Bonne structure :
...
Ecrire "Etes-vous mari ?"
Rep1 RepOuiNon()
...
Ecrire "Avez-vous des enfants ?"
Rep2 RepOuiNon()
...
Et le tour est jou ! On a ainsi vit les rptitions inutiles, et si d'aventure, il y avait un
bug dans notre contrle de saisie, il suffirait de faire une seule correction dans la
fonction RepOuiNon pour que ce bug soit limin de toute l'application. Elle n'est pas
belle, la vie ?
Toutefois, les plus sagaces d'entre vous auront remarqu, tant dans le titre de la
fonction que dans chacun des appels, la prsence de parenthses. Celles-ci, ds qu'on
dclare ou qu'on appelle une fonction, sont obligatoires. Et si vous avez bien compris
214
tout ce qui prcde, vous devez avoir une petite ide de ce qu'on va pouvoir mettre
dedans...
lorsquon appelle la fonction, on doit lui prciser quel message elle doit afficher
avant de lire la rponse
paramtre) de la fonction. Cela n'est certes pas une dcouverte pour vous : nous avons
longuement utilis les arguments propos des fonctions prdfinies. Eh bien, quitte
construire nos propres fonctions, nous pouvons donc construire nos propres arguments.
Voil comment laffaire se prsente...
La fonction sera dornavant dclare comme suit :
Fonction RepOuiNon(Msg en Caractre) en Caractre
Ecrire Msg
Truc ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
Renvoyer Truc
Fin Fonction
Il y a donc maintenant entre les parenthses une variable, Msg, dont on prcise le type,
et qui signale la fonction quun argument doit lui tre envoy chaque appel.
215
Quant ces appels, justement, ils se simplifieront encore dans la procdure principale,
pour devenir :
...
Rep1 RepOuiNon("Etes-vous mari ?")
...
Rep2 RepOuiNon("Avez-vous des enfants ?")
...
Et voil le travail.
Une remarque importante : l, on n'a pass quun seul argument en entre. Mais bien
entendu, on peut en passer autant quon veut, et crer des fonctions avec deux, trois,
quatre, etc. arguments ; Simplement, il faut viter d'tre gourmands, et il suffit de
passer ce dont on en a besoin, ni plus, ni moins !
Dans le cas que l'on vient de voir, le passage d'un argument la fonction tait lgant,
mais pas indispensable. La preuve, cela marchait dj trs bien avec la premire version.
Mais on peut imaginer des situations o il faut absolument concevoir la fonction de sorte
qu'on doive lui transmettre un certain nombre d'arguments si l'on veut qu'elle puisse
remplir sa tche. Prenons, par exemple, toutes les fonctions qui vont effectuer des
calculs. Que ceux-ci soient simples ou compliqus, il va bien falloir envoyer la fonction
les valeurs grce auxquelles elle sera cens produire son rsultat (pensez tout btement
une fonction sur le modle d'Excel, telle que celle qui doit calculer une somme ou une
moyenne). C'est galement vrai des fonctions qui traiteront des chanes de caractres.
Bref, dans 99% des cas, lorsqu'on crera une fonction, celle-ci devra comporter des
arguments.
216
217
PARTIE 11
nonc des Exercices
Exercice 11.1
crivez une fonction qui renvoie la somme de cinq nombres fournis en argument.
Exercice 11.2
crivez une fonction qui renvoie le nombre de voyelles contenues dans une chane de
caractres passe en argument. Au passage, notez qu'une fonction a tout fait le droit
d'appeler une autre fonction.
Exercice 11.3
Rcrivez la fonction Trouve, vue prcdemment, laide des fonctions Mid et Len
(comme quoi, Trouve, la diffrence de Mid et Len, nest pas une fonction indispensable
dans un langage).
218
PARTIE 11
Corrigs des Exercices
Exercice 11.1
Voil un dbut en douceur...
Fonction Sum(a, b, c, d, e)
Renvoyer a + b + c + d + e
FinFonction
Exercice 11.2
Fonction NbVoyelles(Mot en Caractre)
Variables i, nb en Numrique
Pour i 1 Len(Mot)
Si Trouve("aeiouy", Mid(Mot, i, 1)) <> 0 Alors
nb nb + 1
FinSi
i suivant
Renvoyer nb
FinFonction
219
Exercice 11.3
Fonction Trouve(a, b)
Variable i en Numrique
Dbut
i1
TantQue i < Len(a) - Len(b) et b <> Mid(a, i, Len(b))
ii+1
FinTantQue
Si b <> Mid(a, i, Len(b)) Alors
Renvoyer 0
Sinon
Renvoyer i
FinFonction
220
11.2 Sous-Procdures
11.2.1 Gnralits
Les fonctions, c'est bien, mais dans certains cas, a ne nous rend gure service.
Il peut en effet arriver que dans un programme, on ait raliser des tches rptitives,
mais que ces tches n'aient pas pour rle de gnrer une valeur particulire, ou qu'elles
aient pour rle d'en gnrer plus d'une la fois. Vous ne voyez pas de quoi je veux
parler ? Prenons deux exemples.
Premier exemple. Imaginons qu'au cours de mon application, j'aie plusieurs fois besoin
d'effacer l'cran et de rafficher un bidule comme un petit logo en haut gauche. On
pourrait se dire qu'il faut crer une fonction pour faire cela. Mais quelle serait la valeur
renvoye par la fonction ? Aucune ! Effacer l'cran, ce n'est pas produire un rsultat
stockable dans une variable, et afficher un logo non plus. Voil donc une situation ou j'ai
besoin de rpter du code, mais o ce code n'a pas comme rle de produire une valeur.
Deuxime exemple. Au cours de mon application, je dois plusieurs fois faire saisir un
tableau d'entiers (mais chaque fois, un tableau diffrent). L encore, on serait tent
d'effectuer toutes ces saisies de tableaux dans une seule fonction. Mais problme, une
fonction ne peut renvoyer qu'une seule valeur la fois. Elle ne peut donc renvoyer un
tableau, qui est une srie de valeurs distinctes.
Alors, dans ces deux cas, faute de pouvoir traiter l'affaire par une fonction, devra-t-on
en rester au code rptitif dont nous venons de dnoncer si vigoureusement les
faiblesses ? Mmmmmh ? Vous vous doutez bien que non. Heureusement, tout est prvu, il
y a une solution. Et celle-ci consiste utiliser des sous-procdures.
En fait, les fonctions - que nous avons vues - ne sont finalement qu'un cas particulier
des sous-procdures - que nous allons voir : celui o doit tre renvoy vers la
procdure appelante une valeur et une seule. Dans tous les autres cas (celui o on ne
renvoie aucune valeur, comme celui ou en en renvoie plusieurs), il faut donc avoir recours
non la forme particulire et simplifie (la fonction), mais la forme gnrale (la sousprocdure).
Parlons donc de ce qui est commun aux sous-procdures et aux fonctions, mais aussi de
ce qui les diffrencie. Voici comment se prsente une sous-procdure :
Procdure Bidule( ... )
...
Fin Procdure
221
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.
sous-procdure. La fonction est une valeur calcule, qui renvoie son rsultat vers
la procdure principale. La sous-procdure, elle, est un traitement ; elle ne "vaut"
rien.
Mme une fois qu'on a bien compris les trois premiers points, on n'est pas
compltement au bout de nos peines.
paramtres en entre de la sous-procdure. Comme on le voit, qu'il s'agisse des sousprocdure ou des fonctions, ces choses jouant exactement le mme rle (transmettre
une information depuis le code donneur d'ordres jusqu'au code sous-traitant), elle
portent galement le mme nom. Unique petite diffrence, on a prcis cette fois qu'il
s'agissait d'arguments, ou de paramtres, en entre. Pourquoi donc ?
222
Tout simplement parce que dans une sous-procdure, on peut tre amen vouloir
renvoyer des rsultats vers le programme principal ; or, l, la diffrence des
fonctions, rien n'est prvu : la sous-procdure, en tant que telle, ne "renvoie" rien du
tout (comme on vient de le voir, elle est d'ailleurs dpourvue de l'instruction
"renvoyer"). Ces rsultats que la sous-procdure doit transmettre la procdure
appelante devront donc eux aussi tre vhiculs par des paramtres. Mais cette fois, il
s'agira de paramtres fonctionnant dans l'autre sens (du sous-traitant vers le donneur
d'ordres) : on les appellera donc des paramtres en sortie.
Ceci nous permet de reformuler en d'autres termes la vrit fondamentale apprise un
peu plus haut : toute sous-procdure possdant un et un seul paramtre en sortie
peut galement tre crite sous forme d'une fonction (et entre nous, c'est une
formulation prfrable car un peu plus facile comprendre et donc retenir).
Jusque l, a va ? Si oui, prenez un cachet d'aspirine et poursuivez la lecture. Si non,
prenez un cachet d'aspirine et recommencez depuis le dbut. Et dans les deux cas,
n'oubliez pas le grand verre d'eau pour faire passer l'aspirine.
Il nous reste un dtail examiner, dtail qui comme vous vous en doutez bien, a une
certaine importance : comment fait-on pour faire comprendre un langage quels sont les
paramtres qui doivent fonctionner en entre et quels sont ceux qui doivent fonctionner
en sortie...
223
Reprenons l'exemple que nous avons dj utilis plus haut, celui de notre fonction
RepOuiNon. Comme nous l'avons vu, rien ne nous empche de rcrire cette fonction
sous la forme d'une procdure (puisqu'une fonction n'est qu'un cas particulier de sousprocdure). Nous laisserons pour l'instant de ct la question de savoir comment
renvoyer la rponse (contenue dans la variable Truc) vers le programme principal. En
revanche, nous allons dclarer que Msg est un paramtre dont la transmission doit se
faire par valeur. Cela donnera la chose suivante :
Procdure RepOuiNon(Msg en Caractre par valeur)
Ecrire Msg
Truc ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
variable qui a t fournie par le programme principal, elle est incapable, mme si
on le souhaitait, de modifier la valeur de celle-ci. Dit d'une autre manire, dans une
procdure, un paramtre pass par valeur ne peut tre qu'un paramtre en entre.
224
C'est en mme temps une limite (aggrave par le fait que les informations ainsi
recopies occupent dornavant deux fois plus de place en mmoire) et une scurit :
quand on transmet un paramtre par valeur, on est sr et certain que mme en cas de
bug dans la sous-procdure, la valeur de la variable transmise ne sera jamais modifie
par erreur (c'est--dire crase) dans le programme principal.
Admettons prsent que nous dclarions un second paramtre, Truc, en prcisant cette
fois qu'il sera transmis par rfrence. Et adoptons pour la procdure l'criture
suivante :
Procdure RepOuiNon(Msg en
Caractre
par
valeur, Truc en
Caractre
par
rfrence)
Ecrire Msg
Truc ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
Fin Fonction
L'appel la sous-procdure deviendrait par exemple :
M "Etes-vous mari ?"
Appeler RepOuiNon(M, T)
Ecrire "Votre rponse est ", T
Dpiautons le mcanisme de cette nouvelle criture. En ce qui concerne la premire
ligne, celle qui affecte la variable M, rien de nouveau sous le soleil. Toutefois, l'appel la
sous-procdure provoque deux effets trs diffrents. Comme on l'a dj dit, la variable
Msg est cre et immdiatement affecte avec une copie du contenu de M, puisqu'on a
exig un passage par valeur. Mais en ce qui concerne Truc, il en va tout autrement. Le
fait qu'il s'agisse cette fois d'un passage par rfrence fait que la variable Truc ne
quelque sorte, sur T. Truc n'est pas une variable ordinaire : elle ne contient pas de
valeur, mais seulement la rfrence une valeur, qui elle, se trouve ailleurs (dans la
variable T). Il s'agit donc d'un genre de variable compltement nouveau, et diffrent de
ce que nous avons vu jusque l. Ce type de variable porte un nom : on l'appelle un
pointeur. Tous les paramtres passs par rfrence sont des pointeurs, mais les
pointeurs ne se limitent pas aux paramtres passs par rfrence (mme si ce sont les
seuls que nous verrons dans le cadre de ce cours). Il faut bien comprendre que ce type
de variable trange est gr directement par les langages : partir du moment o une
225
utilisation en entre
oui
oui
utilisation en sortie
non
oui
226
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)
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
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.
228
Trfle de plaisanteries : le principe qui doit guider tout programmeur est celui de la
solidit et de la clart du code. Une application bien programme est une application
l'architecture claire, dont les diffrents modules font ce qu'ils disent, disent ce
qu'il font, et peuvent tre tests (ou modifis) un par un sans perturber le reste
de la construction. Il convient donc :
1. de limiter au minimum l'utilisation des variables globales. Celles-ci doivent tre
employes avec nos clbres amis italo-armniens, c'est--dire avec parcimonie
et bon escient.
2. de regrouper sous forme de modules distincts tous les morceaux de code qui
possdent une certaine unit fonctionnelle (programmation par "blocs"). C'est-dire de faire la chasse aux lignes de codes redondantes, ou quasi-redondantes.
3. de faire de ces modules des fonctions lorsqu'ils renvoient un rsultat unique,
et des sous-procdures dans tous les autres cas (ce qui implique de ne jamais
passer un paramtre par rfrence une fonction : soit on n'en a pas besoin, soit
on en a besoin, et ce n'est alors plus une fonction).
Respecter ces rgles d'hygine est indispensable si l'on veut qu'une application
ressemble autre chose qu'au palais du facteur Cheval. Car une architecture laquelle
on ne comprend rien, c'est sans doute trs potique, mais il y a des circonstances o
l'efficacit est prfrable la posie. Et, pour ceux qui en douteraient encore, la
programmation informatique fait (hlas ?) partie de ces circonstances.
229
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).
Cette
liste
dinformations
nest
peut-tre
pas
exhaustive ;
nous
aurons
231
Pour la liste des mots trouver, il sagit dun ensemble dinformations de type
alphanumrique. Ces informations pourraient faire partie du corps de la
procdure principale, et tre ainsi stockes en mmoire vive, sous la forme dun
tableau de chanes. Mais ce nest certainement pas le plus judicieux. Toute cette
place occupe risque de peser lourd inutilement, car il ny a aucun intrt
stocker lensemble des mots en mmoire vive. Et si lon souhaite enrichir la liste
des mots trouver, on sera oblig de rcrire des lignes de programme
Conclusion, la liste des mots sera bien plus sa place dans un fichier texte, dans
lequel le programme ira piocher un seul mot, celui quil faudra trouver. Nous
constituerons donc un fichier texte, appel dico.txt, dans lequel figurera un mot
par ligne (par enregistrement).
Le mot trouver, lui, ne pose aucun problme : il sagit dune information simple
de type chane, qui pourra tre stock dans une variable appele mot, de type
caractre.
De mme, la lettre propose par le joueur est une information simple de type
chane, qui sera stocke dans une variable appele lettre, de type caractre.
Le nombre actuel de mauvaises rponses est une information qui pourra tre
stocke dans une variable numrique de type entier simple appele MovRep.
Lensemble des lettres trouves par le joueur est typiquement une information
qui peut faire lobjet de plusieurs choix de codage ; rappelons quau moment de
laffichage, nous aurons besoin de savoir pour chaque lettre du mot deviner si
elle a t trouve ou non. Une premire possibilit, immdiate, serait de disposer
dune chane de caractres comprenant lensemble des lettres prcdemment
trouves. Cette solution est loin dtre mauvaise, et on pourrait tout fait
ladopter. Mais ici, on fera une autre choix, ne serait-ce que pour varier les
plaisirs : on va se doter dun tableau de boolens, comptant autant
demplacements quil y a de lettres dans le mot deviner. Chaque emplacement du
tableau correspondra une lettre du mot trouver, et indiquera par sa valeur si
la lettre a t dcouverte ou non (faux, la lettre na pas t devine, vrai, elle la
t). La correspondance entre les lments du tableau et le mot deviner tant
immdiate, la programmation de nos boucles en sera facilite. Nous baptiserons
notre tableau de boolens du joli nom de verif .
Enfin, lensemble des lettres proposes sera stocke sans soucis dans une chane
de caractres nomme Propos.
232
Nous avons maintenant suffisamment gamberg pour dresser le tableau final de cette
tape, savoir le dictionnaire des donnes proprement dit :
Nom
Type
Description
Dico.txt
Fichier texte
Mot
Caractre
Mot deviner
Lettre
Caractre
Lettre propose
MovRep
Entier
Verif()
Tableau de Boolens
Propos
Caractre
Lettres
prcdemment
devines,
en
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
234
235
Fonction ChoixDuMot
Quelques explications : on lit intgralement le fichier contenant la liste des mots. Au
fur et mesure, on range ces mots dans le tableau Liste, qui est redimensionn chaque
tour de boucle. Un tirage alatoire intervient alors, qui permet de renvoyer un des mots
au hasard.
Fonction ChoixDuMot()
Tableau Liste() en Caractre
Variables Nbmots, Choisi en Numrique
Ouvrir "Dico.txt" sur 1 en Lecture
Nbmots -1
Tantque Non EOF(1)
Nbmots Nbmots + 1
Redim Liste(Nbmots)
LireFichier 1, Liste(Nbmots)
FinTantQue
Fermer 1
Choisi Ent(Alea() * Nbmots)
Renvoyer Liste(Choisi)
FinFonction
236
Fonction PartieFinie
On commence par vrifier le nombre de mauvaises rponses, motif de dfaite. Ensuite,
on regarde si la partie est gagne, traitement qui sapparente une gestion de Flag : il
suffit que lune des lettres du mot deviner nait pas t trouve pour que la partie ne
soit pas gagne. La fonction aura besoin, comme arguments, du tableau Verif, de son
nombre dlments et du nombre actuel de mauvaises rponses.
Fonction PartieFinie(t() en Booleen, n, x en Numrique)
Variables i, issue en Numerique
Si x = 10 Alors
Renvoyer 2
Sinon
Issue 1
Pour i 0 n
Si Non t(i) Alors
Issue 0
FinSi
i suivant
Renvoyer Issue
FinSi
FinFonction
237
Procdure AffichageMot
Une mme boucle nous permet de considrer une par une les lettres du mot trouver
(variable m), et de savoir si ces lettres ont t identifies ou non.
Procdure AffichageMot(m en Caractre par Valeur, t() en Boolen par Valeur)
Variable Aff en Caractere
Variable i en Numerique
Aff ""
Pour i 0 len(m) 1
Si Non t(i) Alors
Aff Aff & "-"
Sinon
Aff Aff & Mid(mot, i + 1, 1)
FinSi
i suivant
Ecrire Aff
FinProcdure
Remarque : cette procdure aurait galement pu tre crite sous la forme d'une
fonction, qui aurait renvoy vers la procdure principale la chane de caractres Aff.
L'criture l'cran de cette chane Aff aurait alors t faite par la procdure
principale.
Voil donc une situation o on peut assez indiffremment opter pour une sous-procdure
ou pour une fonction.
238
Procdure SaisieLettre
On vrifie que le signe entr (paramtre b) est bien une seule lettre, qui ne figure pas
dans les propositions prcdemment effectues (paramtre a)
Procdure SaisieLettre(a, b en Caractre par Rfrence)
Variable Correct en Booleen
Variable Alpha en Caractre
Dbut
Correct Faux
Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
TantQue Non Correct
Ecrire "Entrez la lettre propose : "
Lire b
Si Trouve(alpha, b) = 0 Ou len(b) <> 1 Alors
Ecrire "Ce nest pas une lettre !"
SinonSi Trouve(a, b) <> 0 Alors
Ecrire "Lettre dj propose !"
Sinon
Correct Vrai
aa&b
FinSi
FinTantQue
Fin Procdure
239
Procdure VerifLettre
Les paramtres se multiplient L est la lettre propose, t() le tableau de boolens, M le
mot trouver et N le nombre de mauvaises propositions. Il ny a pas de difficult
majeure dans cette procdure : on examine les lettres de M une une, et on en tire les
consquences. Le flag sert savoir si la lettre propose faisait ou non partie du mot
deviner.
Procdure VerifLettre(L, M en Caractre par Valeur, t() en Boolen par Rfrence, N
en Numrique par Rfrence)
Variable Correct en Booleen
Dbut
Correct Faux
Pour i 1 Len(M)
Si Mid(M, i, 1) = L Alors
Correct Vrai
T(i - 1) Vrai
FinSi
FinTantQue
Si Non Correct Alors
NN+1
FinSi
Fin Procdure
Procdure Epilogue
Procdure Epilogue(M en Caractre par Valeur, N en Numrique par Valeur)
Dbut
Si N = 2 Alors
Ecrire "Une mauvaise proposition de trop Partie termine !"
Ecrire "Le mot deviner tait : ", M
Sinon
Ecrire "Bravo ! Vous avez trouv !"
FinSi
Fin Procdure
240
Procdure Principale
Procdure Principale
Variables Lettre, Mot, Propos en Caractere
Variables g i, MovRep en Numrique
Tableau Verif() en Booleen
Dbut
Mot ChoixDuMot()
Propos ""
Lettre ""
Redim Verif(Len(Mot)-1)
Pour i 0 Len(Mot)-1
Verif(i) Faux
i suivant
k0
Tantque k = 0
AffichageMot(Mot, Verif())
SaisieLettre(Propos, Lettre)
VerifLettre(Lettre, Mot, Verif(), MovRep)
k PartieFinie(Verif(), len(mot), MovRep)
FinTantQue
Epilogue(Mot, k)
Fin
241
Partie 12
Notions Complmentaires
Le danger, avec les ordinateurs, ce nest pas
tellement quils deviennent aussi intelligents que les
hommes, mais cest que nous tombions daccord avec
eux pour les rencontrer mi-chemin - Bernard
Avishai
Une fois nest pas coutume, ce chapitre ne sera lobjet daucun exercice. Cela ne veut
pas dire pour autant que ce qui sy trouve nest pas intressant.
Non mais des fois.
retour
sur
une
notion
trs
rapidement
survole
plus
haut : celle
de
242
une suite de branchements emmls les uns dans les autres. Dune part, on ne peut
pas dire que cela favorise la lisibilit du programme. Dautre part, cest une source
importante derreurs, car tt ou tard on oublie un aller , ou on un met un de trop,
etc. A fortiori lorsquon complique un algorithme existant, cela peut devenir un jungle
inextricable.
A linverse, la programmation structure, surtout si lon prend soin de rationaliser la
prsentation en mettant des lignes de commentaires et en pratiquant lindentation, vite
des erreurs, et rvle sa structure logique de manire trs claire.
Le danger est que si la plupart des langages de programmation utiliss sont structurs,
ils offrent tout de mme la plupart du temps la possibilit de pratiquer la
programmation non structure. Dans ce cas, les lignes ne sont pas dsignes par des
numros, mais certaines peuvent tre repres par des noms (dits tiquettes ) et on
dispose dune instruction de branchement.
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.
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-
la programmation rcursive,
conomique
pour
le
pour
programmeur
trs
Last but not least, et cest le gag final, tout problme formul en termes
247
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