Vous êtes sur la page 1sur 57

Chama Hichem

PARTIE 1
INTRODUCTION A LALGORITHMIQUE

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 laisser linterlocuteur se dbrouiller avec a ? A ce tarif, nimporte
qui serait champion dalgorithmique sans faire aucun effort. Pas de a Lisette, ce serait trop facile.
Le malheur (ou le bonheur, tout dpend du point de vue) est que justement, si le touriste vous demande son
chemin, cest quil ne le connat pas. Donc, si on nest pas un goujat intgral, il ne sert rien de lui dire de le
trouver tout seul. De mme les modes demploi contiennent gnralement (mais pas toujours) un peu plus
dinformations que dbrouillez vous pour que a marche .
Pour fonctionner, un algorithme doit donc contenir uniquement des instructions comprhensibles par celui
qui devra lexcuter. Cest dailleurs lun des points dlicats pour les rdacteurs de modes demploi : les
rfrences culturelles, ou lexicales, des utilisateurs, tant variables, un mme mode demploi peut tre trs clair
pour certains et parfaitement abscons pour dautres.
En informatique, heureusement, il ny a pas ce problme : les choses auxquelles ont doit donner des instructions
sont les ordinateurs, et ceux-ci ont le bon got dtre tous strictement aussi idiots les uns que les autres.

2. FAUT-IL ETRE MATHEUX POUR ETRE 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 .

il faut tre mthodique et rigoureux. En effet, chaque fois quon crit une srie dinstructions

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

3. LADN, LES SHADOKS, ET LES ORDINATEURS


Quel rapport me direz-vous ? Eh bien le point commun est : quatre mots de vocabulaire.
Lunivers lexical Shadok, cest bien connu, se limite aux termes Ga , Bu , Zo , et Meu . Ce qui leur a
tout de mme permis de formuler quelques fortes maximes, telles que : Mieux vaut pomper et quil ne se passe
rien, plutt quarrter de pomper et risquer quil se passe quelque chose de pire (pour dautres fortes maximes
Shadok, nhsitez pas visiter leur site Internet, il y en a toute une collection qui vaut le dtour).
LADN, qui est en quelque sorte le programme gntique, lalgorithme la base de construction des tres
vivants, est une chane construite partir de quatre lments invariables. Ce nest que le nombre de ces lments,
ainsi que lordre dans lequel ils sont arrangs, qui vont dterminer si on obtient une puce ou un lphant. Et tous
autant que nous sommes, splendides russites de la Nature, avons t construits par un programme constitu
uniquement de ces quatre briques, ce qui devrait nous inciter la modestie.
Enfin, les ordinateurs, quels quils soient, ne sont fondamentalement capables de comprendre que quatre
catgories d'ordres (en programmation, on n'emploiera pas le terme d'ordre, mais plutt celui d'instructions). Ces
quatre familles d'instructions sont :

laffectation de variables

la lecture / criture

les tests

les boucles

Un algorithme informatique se ramne donc toujours au bout du compte la combinaison de ces quatre petites
briques de base. Il peut y en avoir quelques unes, quelques dizaines, et jusqu plusieurs centaines de milliers dans
certains programmes de gestion. Rassurez-vous, dans le cadre de ce cours, nous nirons pas jusque l (cependant,
la taille dun algorithme ne conditionne pas en soi sa complexit : de longs algorithmes peuvent tre finalement
assez simples, et de petits trs compliqus).

4. ALGORITHMIQUE ET PROGRAMMATION
Pourquoi apprendre lalgorithmique pour apprendre programmer ? En quoi a-t-on besoin dun langage spcial,
distinct des langages de programmation comprhensibles par les ordinateurs ?
Parce que lalgorithmique exprime les instructions rsolvant un problme donn indpendamment des
particularits de tel ou tel langage. Pour prendre une image, si un programme tait une dissertation,
lalgorithmique serait le plan, une fois mis de ct la rdaction et lorthographe. Or, vous savez quil vaut mieux
faire dabord le plan et rdiger ensuite que linverse
Apprendre lalgorithmique, cest apprendre manier la structure logique dun programme informatique. Cette
dimension est prsente quelle que soit le langage de programmation ; mais lorsquon programme dans un langage
(en C, en Visual Basic, etc.) on doit en plus se colleter les problmes de syntaxe, ou de types dinstructions,

propres ce langage. Apprendre lalgorithmique de manire spare, cest donc srier les difficults pour mieux
les vaincre.
A cela, il faut ajouter que des gnrations de programmeurs, souvent autodidactes (mais pas toujours, hlas !),
ayant directement appris programmer dans tel ou tel langage, ne font pas mentalement clairement la diffrence
entre ce qui relve de la structure logique gnrale de toute programmation (les rgles fondamentales de
lalgorithmique) 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 ECRIT-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 pseudo-code , 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 pseudocode, 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 pseudo-code que vous
dcouvrirez dans les pages qui suivent possde quelques spcificits mineures qui ne doivent qu mes nvroses
personnelles.
Rassurez-vous cependant, celles-ci restent dans les limites tout fait acceptables.
En tout cas, personnellement, je les accepte trs bien.

PARTIE 2
LECTURE ET ECRITURE
1. DE QUOI PARLE-T-ON ?
Trifouiller des variables en mmoire vive par un chouette programme, cest vrai que cest trs marrant, et
dailleurs on a tous bien rigol au chapitre prcdent. Cela dit, la fin de la foire, on peut tout de mme se
demander quoi a sert.
En effet. Imaginons que nous ayons fait un programme pour calculer le carr dun nombre, mettons 12. Si on a
fait au plus simple, on a crit un truc du genre :
Variable A en Numrique
Dbut
A 12^2
Fin

Dune part, ce programme nous donne le carr de 12. Cest trs gentil lui. Mais si lon veut le carr dun autre
nombre que 12, il faut rcrire le programme. Bof.
Dautre part, le rsultat est indubitablement calcul par la machine. Mais elle le garde soigneusement pour elle,
et le pauvre utilisateur qui fait excuter ce programme, lui, ne saura jamais quel est le carr de 12. Re-bof.
Cest pourquoi, heureusement, il existe des dinstructions pour permettre la machine de dialoguer avec
lutilisateur (et Lyce de Versailles, et ajout lestim Pierre Dac, qui en prcurseur mconnu de lalgorithmique,
affirmait tout aussi profondment que rien ne sert de penser, il faut rflchir avant ).
Dans un sens, ces instructions permettent lutilisateur de rentrer des valeurs au clavier pour quelles soient
utilises par le programme. Cette opration est la lecture.
Dans lautre sens, dautres instructions permettent au programme de communiquer des valeurs lutilisateur en
les affichant lcran. Cette opration est lcriture.
Remarque essentielle : A premire vue, on peut avoir limpression que les informaticiens taient beurrs
comme des petits lus lorsquils ont baptis ces oprations ; puisque quand lutilisateur doit crire au clavier, on
appelle a la lecture, et quand il doit lire sur lcran on appelle lcriture. Mais avant dagonir dinsultes une
digne corporation, il faut rflchir un peu plus loin. Un algorithme, cest une suite dinstructions qui programme la
machine, pas lutilisateur ! Donc quand on dit la machine de lire une valeur, cela implique que lutilisateur va
devoir crire cette valeur. Et quand on demande la machine dcrire une valeur, cest pour que lutilisateur
puisse la lire. Lecture et criture sont donc des termes qui comme toujours en programmation, doivent tre
compris du point de vue de la machine qui sera charge de les excuter. Et l, tout devient parfaitement logique.
Et toc.

2. LES INSTRUCTIONS DE LECTURE ET DECRITURE


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

Ds que le programme rencontre une instruction Lire, lexcution sinterrompt, attendant la frappe dune
valeur au clavier
Ds lors, aussitt que la touche Entre (Enter) a t frappe, lexcution reprend. Dans le sens inverse, pour
crire quelque chose lcran, cest aussi simple que :
Ecrire Toto

Avant de Lire une variable, il est trs fortement conseill dcrire des libells lcran, afin de prvenir
lutilisateur de ce quil doit frapper (sinon, le pauvre utilisateur passe son temps se demander ce que lordinateur
attend de lui et cest trs dsagrable !) :
Ecrire "Entrez votre nom : "
Lire NomFamille

Lecture et Ecriture sont des instructions algorithmiques qui ne prsentent pas de difficults particulires, une
fois quon a bien assimil ce problme du sens du dialogue (homme machine, ou machine homme).
Et a y est, vous savez dores et dj sur cette question tout ce quil y a savoir

PARTIE 3
LES TESTS
1. DE QUOI SAGIT-IL ?
Reprenons le cas de notre programmation algorithmique du touriste gar . Normalement, lalgorithme
ressemblera quelque chose comme : Allez tout droit jusquau prochain carrefour, puis prenez droite et
ensuite la deuxime gauche, et vous y tes .
Mais en cas de doute lgitime de votre part, cela pourrait devenir : Allez tout droit jusquau prochain
carrefour et l regardez droite. Si la rue est autorise la circulation, alors prenez la et ensuite cest la
deuxime gauche. Mais si en revanche elle est en sens interdit, alors continuez jusqu la prochaine droite,
prenez celle-l, et ensuite la premire droite .
Ce deuxime algorithme a ceci de suprieur au premier quil prvoit, en fonction dune situation pouvant se
prsenter de deux faons diffrentes, deux faons diffrentes dagir. Cela suppose que linterlocuteur (le touriste)
sache analyser la condition que nous avons fixe son comportement ( la rue est-elle en sens interdit ? ) pour
effectuer la srie dactions correspondante.
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.

2. STRUCTURE DUN TEST


Il ny a que deux formes possibles pour un test ; la premire est la plus simple, la seconde la plus complexe.
Si boolen Alors
Instructions
Finsi
Si boolen Alors
Instructions 1
Sinon
Instructions 2
Finsi

Ceci appelle quelques explications.


Un boolen est une expression dont la valeur est VRAI ou FAUX. Cela peut donc tre (il ny a que deux
possibilits) :

une variable (ou une expression) de type boolen

une condition

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

En fait, la forme simplifie correspond au cas o lune des deux branches du Si est vide. Ds lors, plutt
qucrire sinon ne rien faire du tout , il est plus simple de ne rien crire. Et laisser un Si... complet, avec une
des deux branches vides, est considr comme une trs grosse maladresse pour un programmeur, mme si cela ne
constitue pas proprement parler une faute.
Exprim sous forme de pseudo-code, la programmation de notre touriste de tout lheure donnerait donc
quelque chose du genre :
Allez tout droit jusquau prochain carrefour
Si la rue droite est autorise la circulation Alors
Tournez droite
Avancez
Prenez la deuxime gauche
Sinon
Continuez jusqu la prochaine rue droite
Prenez cette rue
Prenez la premire droite
Finsi

3. QUEST CE QUUNE CONDITION ?


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

une valeur

un oprateur de comparaison

une autre valeur

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

gal

diffrent de

strictement plus petit que

strictement plus grand que

plus petit ou gal

plus grand ou gal

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

VRAI
FAUX
VRAI

Remarque trs importante


En formulant une condition dans un algorithme, il faut se mfier comme de la peste de certains raccourcis du
langage courant, ou de certaines notations valides en mathmatiques, mais qui mnent des non-sens
informatiques. Prenons par exemple la phrase Toto est compris entre 5 et 8 . On peut tre tent de la traduire
par : 5 < Toto < 8

Or, une telle expression, qui a du sens en franais, comme en mathmatiques, ne veut rien dire en
programmation. En effet, elle comprend deux oprateurs de comparaison, soit un de trop, et trois valeurs, soit l
aussi une de trop. On va voir dans un instant comment traduire convenablement une telle condition.

4. CONDITIONS COMPOSEES
Certains problmes exigent parfois de formuler des conditions qui ne peuvent pas tre exprimes sous la forme
simple expose ci-dessus. Reprenons le cas Toto est inclus entre 5 et 8 . En fait cette phrase cache non une,
mais deux conditions. Car elle revient dire que Toto est suprieur 5 et Toto est infrieur 8 . Il y a donc
bien l deux conditions, relies par ce quon appelle un oprateur logique, le mot ET.
Comme on la voqu plus haut, linformatique met notre disposition quatre oprateurs logiques : ET, OU,
NON, et XOR.

Le ET a le mme sens en informatique que dans le langage courant. Pour que "Condition1 ET

Condition2" soit VRAI, il faut imprativement que Condition1 soit VRAI et que Condition2 soit VRAI. Dans
tous les autres cas, "Condition 1 et Condition2" sera faux.

Il faut se mfier un peu plus du OU. Pour que "Condition1 OU Condition2" soit VRAI, il suffit que

Condition1 soit VRAIE ou que Condition2 soit VRAIE. Le point important est que si Condition1 est VRAIE et
que Condition2 est VRAIE aussi, Condition1 OU Condition2 reste VRAIE. Le OU informatique ne veut donc
pas dire ou bien

Le XOR (ou OU exclusif) fonctionne de la manire suivante. Pour que "Condition1 XOR Condition2"

soit VRAI, il faut que soit Condition1 soit VRAI, soit que Condition2 soit VRAI. Si toutes les deux sont
fausses, ou que toutes les deux sont VRAI, alors le rsultat global est considr comme FAUX. Le XOR est
donc l'quivalent du "ou bien" du langage courant.
Jinsiste toutefois sur le fait que le XOR est une raret, dont il nest pas strictement indispensable de
sencombrer en programmation.

Enfin, le NON inverse une condition : NON(Condition1)est VRAI si Condition1 est FAUX, et il sera

FAUX si Condition1 est VRAI. C'est l'quivalent pour les boolens du signe "moins" que l'on place devant les
nombres.
Alors, vous vous demandez peut-tre quoi sert ce NON. Aprs tout, plutt qucrire NON(Prix > 20), il
serait plus simple dcrire tout bonnement Prix=<20. Dans ce cas prcis, cest vident quon se complique
inutilement la vie avec le NON. Mais si le NON n'est jamais indispensable, il y a tout de mme des situations
dans lesquelles il s'avre bien utile.
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

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.

5. TESTS IMBRIQUES
Graphiquement, on peut trs facilement reprsenter un SI comme un aiguillage de chemin de fer (ou un
aiguillage de train lectrique, cest moins lourd porter). Un SI ouvre donc deux voies, correspondant deux
traitements diffrents. Mais il y a des tas de situations o deux voies ne suffisent pas. Par exemple, un programme
devant donner ltat de leau selon sa temprature doit pouvoir choisir entre trois rponses possibles (solide,
liquide ou gazeuse).
Une premire solution serait la suivante :
Variable Temp en Entier
Dbut
Ecrire "Entrez la temprature de leau :"
Lire Temp
Si Temp =< 0 Alors
Ecrire "Cest de la glace"
FinSi
Si Temp > 0 Et Temp < 100 Alors
Ecrire "Cest du liquide"
Finsi
Si Temp > 100 Alors
Ecrire "Cest de la vapeur"
Finsi
Fin

Vous constaterez que cest un peu laborieux. Les conditions se ressemblent plus ou moins, et surtout on oblige
la machine examiner trois tests successifs alors que tous portent sur une mme chose, la temprature de l'eau (la
valeur de la variable Temp). 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.

6. DE LAIGUILLAGE A LA GARE DE TRI


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

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

Soyons bien clairs : cette structure est la seule possible du point de vue logique (mme si on peut toujours
mettre le bas en haut et le haut en bas). Mais du point de vue de lcriture, le pseudo-code algorithmique admet
une simplification supplmentaire. Ainsi, il est possible (mais non obligatoire, que lalgorithme initial :
Variable Temp en Entier
Dbut
Ecrire "Entrez la temprature de leau :"
Lire Temp
Si Temp =< 0 Alors
Ecrire "C'est de la glace"
Sinon
Si Temp < 100 Alors
Ecrire "Cest du liquide"
Sinon
Ecrire "Cest de la vapeur"
Finsi

Finsi
Fin

devienne :
Variable Temp en Entier
Dbut
Ecrire "Entrez la temprature de leau :"
Lire Temp
Si Temp =< 0 Alors
Ecrire "Cest de la glace"
SinonSi Temp < 100 Alors
Ecrire "Cest du liquide"
Sinon
Ecrire "Cest de la vapeur"
Finsi
Fin

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

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

A priori, cette technique ne prsente gure dintrt : on a alourdi plutt quallg lalgorithme de dpart, en
ayant recours deux variables supplmentaires.

Mais souvenons-nous : une variable boolenne na besoin que dun seul bit pour tre stocke. De ce

point de vue, lalourdissement nest donc pas considrable.

dans certains cas, notamment celui de conditions composes trs lourdes (avec plein de ET et de

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

PARTIE 4
ENCORE DE LA LOGIQUE
1. FAUT-IL METTRE UN ET ? FAUT-IL METTRE UN OU ?
Une remarque pour commencer : dans le cas de conditions composes, les parenthses jouent un rle
fondamental.
Variables A, B, C, D, E en Boolen
Variable X en Entier
Dbut
Lire X
A X > 12
B X > 2
C X < 6
D (A ET B) OU C
E A ET (B OU C)
Ecrire D, E
Fin

Si X = 3, alors on remarque que D sera VRAI alors que E sera FAUX.


Sil ny a dans une condition que des ET, ou que des OU, en revanche, les parenthses ne changent strictement
rien.
Dans une condition compose employant la fois des oprateurs ET et des oprateurs OU, la prsence de
parenthses possde une influence sur le rsultat, tout comme dans le cas dune expression numrique
comportant des multiplications et des additions.
On en arrive une autre proprit des ET et des OU, bien plus intressante.
Spontanment, on pense souvent que ET et OU sexcluent mutuellement, au sens o un problme donn
sexprime soit avec un ET, soit avec un OU. Pourtant, ce nest pas si vident.
Quand faut-il ouvrir la fentre de la salle ? Uniquement si les conditions limposent, savoir :
Si il fait trop chaud ET il ne pleut pas Alors
Ouvrir la fentre
Sinon
Fermer la fentre
Finsi

Cette petite rgle pourrait tout aussi bien tre formule comme suit :
Si il ne fait pas trop chaud OU il pleut Alors
Fermer la fentre
Sinon
Ouvrir la fentre
Finsi

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

2. AU-DELA DE LA LOGIQUE : LE STYLE


Ce titre un peu provocateur (mais nanmoins justifi) a pour but dattirer maintenant votre attention sur un fait
fondamental en algorithmique, fait que plusieurs remarques prcdentes ont dj d vous faire souponner : il ny
a jamais une seule manire juste de traiter les structures alternatives. Et plus gnralement, il ny a jamais une
seule manire juste de traiter un problme. Entre les diffrentes possibilits, qui ne sont parfois pas meilleures les
unes que les autres, le choix est une affaire de style.
Cest pour cela quavec lhabitude, on reconnat le style dun programmeur aussi srement que sil sagissait de
style littraire.
Reprenons nos oprateurs de comparaison maintenant familiers, le ET et le OU. En fait, on saperoit que lon
pourrait tout fait sen passer ! Par exemple, pour reprendre lexemple de la fentre de la salle :
Si il fait trop chaud ET il ne pleut pas Alors
Ouvrir la fentre
Sinon
Fermer la fentre
Finsi

Possde un parfait quivalent algorithmique sous la forme de :


Si il fait trop chaud Alors
Si il ne pleut pas Alors
Ouvrir la fentre
Sinon
Fermer la fentre
Finsi
Sinon
Fermer la fentre
Finsi

Dans cette dernire formulation, nous navons plus recours une condition compose (mais au prix dun test
imbriqu supplmentaire)
Et comme tout ce qui sexprime par un ET peut aussi tre exprim par un OU, nous en concluons que le OU peut
galement tre remplac par un test imbriqu supplmentaire. On peut ainsi poser cette rgle stylistique
gnrale :
Dans une structure alternative complexe, les conditions composes, limbrication des structures de tests et
lemploi des variables boolennes ouvrent la possibilit de choix stylistiques diffrents. Lalourdissement des
conditions allge les structures de tests et le nombre des boolens ncessaires ; lemploi de boolens
supplmentaires permet dallger les conditions et les structures de tests, et ainsi de suite.
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

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

1. A QUOI CELA SERT-IL DONC ?


Prenons le cas dune saisie au clavier (une lecture), o par exemple, le programme pose une question laquelle
lutilisateur doit rpondre par O (Oui) ou N (Non). Mais tt ou tard, lutilisateur, factieux ou maladroit, risque de
taper autre chose que la rponse attendue. Ds lors, le programme peut planter soit par une erreur dexcution
(parce que le type de rponse ne correspond pas au type de la variable attendu) soit par une erreur fonctionnelle
(il se droule normalement jusquau bout, mais en produisant des rsultats fantaisistes).
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.
Illustration avec notre problme de contrle de saisie. Une premire approximation de la solution consiste
crire :
Variable Rep en Caractre
Dbut
Ecrire "Voulez vous un caf ? (O/N)"
TantQue Rep <> "O" et Rep <> "N"
Lire Rep
FinTantQue
Fin

L, on a le squelette de lalgorithme correct. Mais de mme quun squelette ne suffit pas pour avoir un tre
vivant viable, il va nous falloir ajouter quelques muscles et organes sur cet algorithme pour quil fonctionne
correctement.
Son principal dfaut est de provoquer une erreur chaque excution. En effet, lexpression boolenne qui
figure aprs le TantQue interroge la valeur de la variable Rep. Malheureusement, cette variable, si elle a t
dclare, na pas t affecte avant lentre dans la boucle. On teste donc une variable qui na pas de valeur, ce
qui provoque une erreur et larrt immdiat de lexcution. Pour viter ceci, on na pas le choix : il faut que la
variable Rep ait dj t affecte avant quon en arrive au premier tour de boucle. Pour cela, on peut faire une
premire lecture de Rep avant la boucle. Dans ce cas, celle-ci ne servira quen cas de mauvaise saisie lors de cette
premire lecture. Lalgorithme devient alors :
Variable Rep en Caractre
Dbut
Ecrire "Voulez vous un caf ? (O/N)"
Lire Rep
TantQue Rep <> "O" et Rep <> "N"
Lire Rep
FinTantQue
Fin

Une autre possibilit, frquemment employe, consiste ne pas lire, mais affecter arbitrairement la variable
avant la boucle. Arbitrairement ? Pas tout fait, puisque cette affectation doit avoir pour rsultat de provoquer
lentre obligatoire dans la boucle. Laffectation doit donc faire en sorte que le boolen soit mis VRAI pour
dclencher le premier tour de la boucle. Dans notre exemple, on peut donc affecter Rep avec nimporte quelle
valeur, hormis O et N : car dans ce cas, lexcution sauterait la boucle, et Rep ne serait pas du tout lue au
clavier. Cela donnera par exemple :
Variable Rep en Caractre
Dbut
Rep "X"
Ecrire "Voulez vous un caf ? (O/N)"
TantQue Rep <> "O" et Rep <> "N"
Lire Rep
FinTantQue
Fin

Cette manire de procder est connatre, car elle est employe trs frquemment.
Il faut remarquer que les deux solutions (lecture initiale de Rep en dehors de la boucle ou affectation de Rep)
rendent toutes deux lalgorithme satisfaisant, mais prsentent une diffrence assez importante dans leur structure
logique.

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

Quant la deuxime solution, elle pourra devenir :


Variable Rep en Caractre
Dbut
Rep "X"
Ecrire "Voulez vous un caf ? (O/N)"
TantQue Rep <> "O" et Rep <> "N"
Lire Rep
Si Rep <> "O" et Rep <> "N" Alors
Ecrire "Saisie Errone, Recommencez"
FinSi
FinTantQue
Fin

Le Gag De La Journe
Cest dcrire une structure TantQue dans laquelle le boolen nest jamais VRAI. Le programme ne rentre alors
jamais dans la superbe boucle sur laquelle vous avez tant su !
Mais la faute symtrique est au moins aussi dsopilante.
Elle consiste crire une boucle dans laquelle le boolen ne devient jamais FAUX. Lordinateur tourne alors dans la
boucle comme un drat et nen sort plus. Seule solution, quitter le programme avec un dmonte-pneu ou un bton
de dynamite. La boucle infinie est une des hantises les plus redoutes des programmeurs. Cest un peu comme
le verre baveur, le poil gratter ou le bleu de mthylne : cest cul, mais a fait toujours rire.
Cette faute de programmation grossire mais frquente - ne manquera pas dgayer lambiance collective de
cette formation et accessoirement dtancher la soif proverbiale de vos enseignants.
Bon, eh bien vous allez pouvoir faire de chouettes algorithmes, dj rien quavec a

2. BOUCLER EN COMPTANT, OU COMPTER EN BOUCLANT


Dans le dernier exercice, vous avez remarqu quune boucle pouvait tre utilise pour augmenter la valeur
dune variable. Cette utilisation des boucles est trs frquente, et dans ce cas, il arrive trs souvent quon ait
besoin deffectuer un nombre dtermin de passages. Or, a priori, notre structure TantQue ne sait pas lavance
combien de tours de boucle elle va effectuer (puisque le nombre de tours dpend de la valeur dun boolen).
Cest pourquoi une autre structure de boucle est notre disposition :
Variable Truc en Entier
Dbut

Truc 0
TantQue Truc < 15
Truc Truc + 1
Ecrire "Passage numro : ", Truc
FinTantQue
Fin

Equivaut :
Variable Truc en Entier
Dbut
Pour Truc 1 15
Ecrire "Passage numro : ", Truc
Truc Suivant
Fin

Insistons : la structure Pour Suivant nest pas du tout indispensable ; on pourrait fort bien programmer
toutes les situations de boucle uniquement avec un Tant Que . Le seul intrt du Pour est dpargner un peu
de fatigue au programmeur, en lui vitant de grer lui-mme la progression de la variable qui lui sert de compteur
(on parle dincrmentation, encore un mot qui fera forte impression sur votre entourage).
Dit dune autre manire, la structure Pour Suivant est un cas particulier de TantQue : celui o le
programmeur peut dnombrer lavance le nombre de tours de boucles ncessaires.
Il faut noter que dans une structure Pour Suivant , la progression du compteur est laisse votre libre
disposition. Dans la plupart des cas, on a besoin dune variable qui augmente de 1 chaque tour de boucle. On ne
prcise alors rien linstruction Pour ; celle-ci, par dfaut, comprend quil va falloir procder cette
incrmentation de 1 chaque passage, en commenant par la premire valeur et en terminant par la deuxime.
Mais si vous souhaitez une progression plus spciale, de 2 en 2, ou de 3 en 3, ou en arrire, de 1 en 1, ou de
10 en 10, ce nest pas un problme : il suffira de le prciser votre instruction Pour en lui rajoutant le mot
Pas et la valeur de ce pas (Le pas dont nous parlons, cest le pas du marcheur, step en anglais).
Naturellement, quand on stipule un pas ngatif dans une boucle, la valeur initiale du compteur doit tre
suprieure sa valeur finale si lon veut que la boucle tourne ! Dans le cas contraire, on aura simplement crit une
boucle dans laquelle le programme ne rentrera jamais.
Nous pouvons donc maintenant donner la formulation gnrale dune structure Pour . Sa syntaxe gnrale
est :
Pour Compteur Initial Final Pas ValeurDuPas

Instructions

Compteur suivant

Les structures TantQue sont employes dans les situations o lon doit procder un traitement systmatique
sur les lments dun ensemble dont on ne connat pas davance la quantit, comme par exemple :

le contrle dune saisie

la gestion des tours dun jeu (tant que la partie nest pas finie, on recommence)

la lecture des enregistrements dun fichier de taille inconnue(cf. Partie 9)

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

3. DES BOUCLES DANS DES BOUCLES


( TOUT EST DANS TOUT... ET RECIPROQUEMENT )
On rigole, on rigole !
De mme que les poupes russes contiennent dautres poupes russes, de mme quune structure SI ALORS
peut contenir dautres structures SI ALORS, une boucle peut tout fait contenir dautres boucles. Y a pas de
raison.
Variables Truc, Trac en Entier
Dbut
Pour Truc 1 15
Ecrire "Il est pass par ici"
Pour Trac 1 6
Ecrire "Il repassera par l"
Trac Suivant
Truc Suivant
Fin

Dans cet exemple, le programme crira une fois "il est pass par ici" puis six fois de suite "il repassera par l", et
ceci quinze fois en tout. A la fin, il y aura donc eu 15 x 6 = 90 passages dans la deuxime boucle (celle du milieu),
donc 90 critures lcran du message il repassera par l . Notez la diffrence marquante avec cette structure :
Variables Truc, Trac en Entier
Dbut
Pour Truc 1 15
Ecrire "Il est pass par ici"
Truc Suivant
Pour Trac 1 6
Ecrire "Il repassera par l"
Trac Suivant
Fin

Ici, il y aura quinze critures conscutives de "il est pass par ici", puis six critures conscutives de "il repassera
par l", et ce sera tout.
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 ( a-t-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.

4. ET ENCORE UNE BETISE A NE PAS FAIRE !


Examinons lalgorithme suivant :
Variable Truc en Entier
Dbut
Pour Truc 1 15
Truc Truc * 2
Ecrire "Passage numro : ", Truc
Truc Suivant
Fin

Vous remarquerez que nous faisons ici grer en double la variable Truc, ces deux gestions tant
contradictoires. Dune part, la ligne
Pour

augmente la valeur de Truc de 1 chaque passage. Dautre part la ligne


Truc Truc * 2

double la valeur de Truc chaque passage. Il va sans dire que de telles manipulations perturbent compltement
le droulement normal de la boucle, et sont causes, sinon de plantages, tout au moins dexcutions erratiques.
Le Gag De La Journe
Il consiste donc manipuler, au sein dune boucle Pour, la variable qui sert de compteur cette boucle. Cette
technique est proscrire absolument sauf bien sr, si vous cherchez un prtexte pour rgaler tout le monde au
bistrot.
Mais dans ce cas, nayez aucune inhibition, proposez-le directement, pas besoin de prtexte.

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

1. UTILITE DES TABLEAUX


Imaginons que dans un programme, nous ayons besoin simultanment de 12 valeurs (par exemple, des notes
pour calculer une moyenne). Evidemment, la seule solution dont nous disposons lheure actuelle consiste
dclarer douze variables, appeles par exemple Notea, Noteb, Notec, etc. Bien sr, on peut opter pour une
notation un peu simplifie, par exemple N1, N2, N3, etc. Mais cela ne change pas fondamentalement notre
problme, car arriv au calcul, et aprs une succession de douze instructions Lire distinctes, cela donnera
obligatoirement une atrocit du genre :
Moy (N1+N2+N3+N4+N5+N6+N7+N8+N9+N10+N11+N12)/12

Ouf ! Cest tout de mme bigrement laborieux. Et pour un peu que nous soyons dans un programme de gestion
avec quelques centaines ou quelques milliers de valeurs traiter, alors l cest le suicide direct.
Cerise sur le gteau, si en plus on est dans une situation on lon ne peut pas savoir davance combien il y aura
de valeurs traiter, l on est carrment cuits.
Cest pourquoi la programmation nous permet de rassembler toutes ces variables en une seule, au sein de
laquelle chaque valeur sera dsigne par un numro. En bon franais, cela donnerait donc quelque chose du genre
la note numro 1 , la note numro 2 , la note numro 8 . Cest largement plus pratique, vous vous en
doutez.
Un ensemble de valeurs portant le mme nom de variable et repres par un nombre, sappelle un tableau, ou
encore une variable indice.
Le nombre qui, au sein dun tableau, sert reprer chaque valeur sappelle surprise lindice.
Chaque fois que lon doit dsigner un lment du tableau, on fait figurer le nom du tableau, suivi de lindice
de llment, entre parenthses.

2. NOTATION ET UTILISATION ALGORITHMIQUE


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

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

lors de la dclaration d'un tableau, on prcise la plus grande valeur de l'indice (diffrente, donc, du

nombre de cases du tableau, puisque si on veut 12 emplacements, le plus grand indice sera 11). Au dbut,
a droute, mais vous verrez, avec le temps, on se fait tout, mme au pire.
Tableau Note(11) en Entier

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

Lnorme avantage des tableaux, cest quon va pouvoir les traiter en faisant des boucles. Par exemple, pour
effectuer notre calcul de moyenne, cela donnera par exemple :
Tableau Note(11) en Numrique
Variables Moy, Som en Numrique
Dbut
Pour i 0 11
Ecrire "Entrez la note n", i
Lire Note(i)
i Suivant
Som 0
Pour i 0 11
Som Som + Note(i)
i Suivant
Moy Som / 12
Fin

NB : On a fait deux boucles successives pour plus de lisibilit, mais on aurait tout aussi bien pu nen crire
quune seule dans laquelle on aurait tout fait dun seul coup.
Remarque gnrale : lindice qui sert dsigner les lments dun tableau peut tre exprim directement
comme un nombre en clair, mais il peut tre aussi une variable, ou une expression calcule.
Dans un tableau, la valeur dun indice doit toujours :

tre gale au moins 0 (dans quelques rares langages, le premier lment dun tableau porte

lindice 1). Mais comme je l'ai dj crit plus haut, nous avons choisi ici de commencer la numrotation des
indices zro, comme cest le cas en langage C et en Visual Basic. Donc attention, Truc(6) est le septime
lment du tableau Truc !

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

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

numrotation zro). Si le tableau Bidule a t dclar comme ayant 25 lments, la prsence dans une
ligne, sous une forme ou sous une autre, de Bidule(32) dclenchera automatiquement une erreur.
Je le re-re-rpte, si lon est dans un langage o les indices commencent zro, il faut en tenir compte la
dclaration :
Tableau Note(13) en Numrique

...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 !

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

Exemple : on veut faire saisir des notes pour un calcul de moyenne, mais on ne sait pas combien il y aura de
notes saisir. Le dbut de lalgorithme sera quelque chose du genre :
Tableau Notes() en Numrique
Variable nb en Numrique
Dbut
Ecrire "Combien y a-t-il de notes saisir ?"
Lire nb
Redim Notes(nb-1)

Cette technique na rien de sorcier, mais elle fait partie de larsenal de base de la programmation en gestion.

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

leur connaissance est parfaitement indispensable

elles sont un rien finaudes

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

1. TRI DUN TABLEAU : LE TRI PAR SELECTION


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

45

122

12

21

78

64

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 :

122

12

45

21

78

64

53

89

28

84

46

On recommence chercher le plus petit lment, mais cette fois, seulement partir du deuxime (puisque le
premier est maintenant correct, on ny touche plus). On le trouve en troisime position (cest le nombre 12). On
change donc le deuxime avec le troisime :

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 :

12

21

45

122

78

64

53

89

28

84

46

Et cetera, et cetera, jusqu lavant dernier.


En bon franais, nous pourrions dcrire le processus de la manire suivante :

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

lavant dernier.

Boucle secondaire : partir de ce point de dpart mouvant, recherchons jusqu la fin du tableau

quel et le plus petit lment. Une fois que nous lavons trouv, nous lchangeons avec le point de dpart.
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

2. UN EXEMPLE DE FLAG : LA RECHERCHE DANS UN TABLEAU


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

i suivant
Fin

Il nous reste combler les points d'interrogation de la boucle Pour. videmment, il va falloir comparer N
chaque lment du tableau : si les deux valeurs sont gales, alors bingo, N fait partie du tableau. Cela va se
traduire, bien entendu, par un Si Alors Sinon. Et voil le programmeur raisonnant htivement qui se vautre en
crivant :
Tableau Tab(19) en Numrique
Variable N en Numrique
Dbut
Ecrire "Entrez la valeur rechercher"
Lire N
Pour i 0 19
Si N = Tab(i) Alors
Ecrire "N fait partie du tableau"
Sinon
Ecrire "N ne fait pas partie du tableau"
FinSi
i suivant
Fin

Et patatras, cet algorithme est une vritable catastrophe.


Il suffit d'ailleurs de le faire tourner mentalement pour s'en rendre compte. De deux choses l'une : ou bien la
valeur N figure dans le tableau, ou bien elle n'y figure pas. Mais dans tous les cas, l'algorithme ne doit produire
qu'une seule rponse, quel que soit le nombre d'lments que compte le tableau. Or, l'algorithme ci-dessus
envoie l'cran autant de messages qu'il y a de valeurs dans le tableau, en l'occurrence pas moins de 20 !
Il y a donc une erreur manifeste de conception : l'criture du message ne peut se trouver l'intrieur de la
boucle : elle doit figurer l'extrieur. On sait si la valeur tait dans le tableau ou non uniquement lorsque le
balayage du tableau est entirement accompli.
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.
Au total, l'algorithme complet et juste ! donne :
Tableau Tab(19) en Numrique
Variable N en Numrique

Dbut
Ecrire "Entrez la valeur rechercher"
Lire N
Trouv Faux
Pour i 0 19
Si N = Tab(i) Alors
Trouv Vrai
FinSi
i suivant
Si Trouv Alors
Ecrire "N fait partie du tableau"
Sinon
Ecrire "N ne fait pas partie du tableau"
FinSi
Fin

Mditons un peu sur cette affaire.


La difficult est de comprendre que dans une recherche, le problme ne se formule pas de la mme manire
selon qu'on le prend par un bout ou par un autre. On peut rsumer l'affaire ainsi : il suffit que N soit gal une
seule valeur de Tab pour qu'elle fasse partie du tableau. En revanche, il faut qu'elle soit diffrente de toutes
les valeurs de Tab pour qu'elle n'en fasse pas partie.
Voil la raison qui nous oblige passer par une variable boolenne , un drapeau qui peut se lever, mais
jamais se rabaisser. Et cette technique de flag (que nous pourrions lgamment surnommer gestion asymtrique
de variable boolenne ) doit tre mise en uvre chaque fois que lon se trouve devant pareille situation.
Autrement dit, connatre ce type de raisonnement est indispensable, et savoir le reproduire bon escient ne
l'est pas moins.

3. TRI DE TABLEAU + FLAG = TRI A BULLES


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

TantQue Yapermute

FinTantQue
Fin

Que va-t-on faire lintrieur de la boucle ? Prendre les lments du tableau, du premier jusqu lavantdernier, et procder un change si ncessaire. Cest parti :

Variable Yapermute en Boolen


Dbut

TantQue Yapermute
Pour i 0 10
Si t(i) > t(i+1) Alors
temp t(i)
t(i) t(i+1)
t(i+1) temp
Finsi
i suivant
Fin

Mais il ne faut pas oublier un dtail capital : la gestion de notre flag. Lide, cest que cette variable va nous
signaler le fait quil y a eu au moins une permutation effectue. Il faut donc :

lui attribuer la valeur Vrai ds quune seule permutation a t faite (il suffit quil y en ait eu une

seule pour quon doive tout recommencer encore une fois).

la remettre Faux chaque tour de la boucle principale (quand on recommence un nouveau tour

gnral de bulles, il ny a pas encore eu dlments changs),

dernier point, il ne faut pas oublier de lancer la boucle principale, et pour cela de donner la valeur

Vrai au flag au tout dpart de lalgorithme.


La solution complte donne donc :
Variable Yapermute en Boolen
Dbut

Yapermut Vrai
TantQue Yapermut
Yapermut Faux
Pour i 0 10
Si t(i) > t(i+1) alors
temp t(i)
t(i) t(i+1)
t(i+1) temp
Yapermut Vrai
Finsi
i suivant
FinTantQue
Fin

Au risque de me rpter, la comprhension et la matrise du principe du flag font partie de larsenal du


programmeur bien arm.

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

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

Au dpart, on cherche le mot parmi 40 000.

Aprs le test n1, on ne le cherche plus que parmi 20 000.

Aprs le test n2, on ne le cherche plus que parmi 10 000.

Aprs le test n3, on ne le cherche plus que parmi 5 000.

etc.

Aprs le test n15, on ne le cherche plus que parmi 2.

Aprs le test n16, on ne le cherche plus que parmi 1.

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

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

1. POURQUOI PLUSIEURS DIMENSIONS ?


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

C'tait pour voir si vous suiviez.

2.

Si le prof dcide contre toute vidence que les damiers font 64 cases, c'est le prof qui a raison et

l'vidence qui a tort. Rompez.


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 audessus 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 !

2. TABLEAUX A DEUX DIMENSIONS


Linformatique nous offre la possibilit de dclarer des tableaux dans lesquels les valeurs ne sont pas repres
par une seule, mais par deux coordonnes.
Un tel tableau se dclare ainsi :
Tableau Cases(7, 7) en Numrique

Cela veut dire : rserve moi un espace de mmoire pour 8 x 8 entiers, et quand jaurai besoin de lune de ces
valeurs, je les reprerai par deux indices (comme la bataille navale, ou Excel, la seule diffrence tant que pour
les coordonnes, on nutilise pas de lettres, juste des chiffres).
Pour notre problme de dames, les choses vont srieusement sclaircir. La case qui contient le pion est
dornavant Cases(i, j). Et les quatre cases disponibles sont Cases(i-1, j-1), Cases(i-1, j+1), Cases(i+1, j-1) et
Cases(i+1, j+1).
REMARQUE ESSENTIELLE :
Il ny a aucune diffrence qualitative entre un tableau deux dimensions ( i, j ) et un tableau une dimension
( i * j ). De mme que le jeu de dames quon vient dvoquer, tout problme qui peut tre modlis dune
manire peut aussi tre modlis de lautre. Simplement, lune ou lautre de ces techniques correspond plus

spontanment tel ou tel problme, et facilite donc (ou complique, si on a choisi la mauvaise option)
lcriture et la lisibilit de lalgorithme.
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.

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

PARTIE 9
LES FONCTIONS PREDEFINIES
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.

1. STRUCTURE GENERALE DES FONCTIONS


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

Une fonction est donc constitue de trois parties :

le nom proprement dit de la fonction. Ce nom ne sinvente pas ! Il doit imprativement

correspondre une fonction propose par le langage. Dans notre exemple, ce nom est SIN.

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

lorsqu'on n'crit rien l'intrieur.

une liste de valeurs, indispensables la bonne excution de la fonction. Ces valeurs sappellent des

arguments, ou des paramtres. Certaines fonctions exigent un seul argument, dautres deux, etc. et
dautres encore aucun. A noter que mme dans le cas de ces fonctions nexigeant aucun argument, les
parenthses restent obligatoires. Le nombre darguments ncessaire pour une fonction donne ne sinvente
pas : il est fix par le langage. Par exemple, la fonction sinus a besoin dun argument (ce nest pas
surprenant, cet argument est la valeur de langle). Si vous essayez de lexcuter en lui donnant deux
arguments, ou aucun, cela dclenchera une erreur lexcution. Notez galement que les arguments
doivent tre dun certain type, et quil faut respecter ces types.
Et d'entre, nous trouvons :
LE GAG DE LA JOURNEE
Il consiste affecter une fonction, quelle qu'elle soit.
Toute criture plaant une fonction gauche d'une instruction d'affectation est aberrante, pour deux raisons
symtriques.

d'une part, parce que nous le savons depuis le premier chapitre de ce cours extraordinaire,

on ne peut affecter qu'une variable, l'exclusion de tout autre chose.

ensuite, parce qu'une fonction a pour rle de produire, de renvoyer, de valoir (tout cela est

synonyme), un rsultat. Pas d'en recevoir un, donc.


L'affectation d'une fonction sera donc considre comme l'une des pires fautes algorithmiques, et punie comme
telle.
Tavernier...

2. LES FONCTIONS DE TEXTE


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

Len(chane) : renvoie le nombre de caractres dune chane

Mid(chane,n1,n2) : renvoie un extrait de la chane, commenant au caractre n1 et faisant n2

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

Left(chane,n) : renvoie les n caractres les plus gauche dans chane.

Right(chane,n) : renvoie les n caractres les plus droite dans chane

Trouve(chane1,chane2) : renvoie un nombre correspondant la position de chane2 dans

chane1. Si chane2 nest pas comprise dans chane1, la fonction renvoie zro.
Exemples :
Len("Bonjour, a va ?")
Len("")
Mid("Zorro is back", 4, 7)
Mid("Zorro is back", 12, 1)
Left("Et pourtant", 8)
Right("Et pourtant", 4)
Trouve("Un pur bonheur", "pur")
Trouve("Un pur bonheur", "techno")

vaut
vaut
vaut
vaut
vaut
vaut
vaut
vaut

16
0
"ro is b"
"c"
"Et pourt"
"t"
4
0

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

vaut
vaut

78
"?"

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

3. TROIS FONCTIONS NUMERIQUES CLASSIQUES


Partie Entire
Une fonction extrmement rpandue est celle qui permet de rcuprer la partie entire dun nombre :
Aprs :

A Ent(3,228)

A vaut 3

Cette fonction est notamment indispensable pour effectuer le clbrissime test de parit (voir exercice dans pas
longtemps).
Modulo
Cette fonction permet de rcuprer le reste de la division dun nombre par un deuxime nombre. Par exemple :

A Mod(10,3)
B Mod(12,2)
C Mod(44,8)

A vaut 1 car 10 = 3*3 + 1


B vaut 0 car 12 = 6*2
C vaut 4 car 44 = 5*8 + 4

Cette fonction peut paratre un peu bizarre, est rserve aux seuls matheux. Mais vous aurez l aussi loccasion
de voir dans les exercices venir que ce nest pas le cas.
Gnration de nombres alatoires
Une autre fonction classique , car trs utile, est celle qui gnre un nombre choisi au hasard.
Tous les programmes de jeu, ou presque, ont besoin de ce type doutils, quil sagisse de simuler un lancer de
ds ou le dplacement chaotique du vaisseau spatial de lenfer de la mort pilot par linfme Zorglub, qui veut
faire main basse sur lUnivers (heureusement vous tes l pour len empcher, ouf).
Mais il ny a pas que les jeux qui ont besoin de gnrer des nombres alatoires. La modlisation (physique,
gographique, conomique, etc.) a parfois recours des modles dits stochastiques (chouette, encore un nouveau
mot savant !). Ce sont des modles dans lesquels les variables se dduisent les unes des autres par des relations
dterministes (autrement dit des calculs), mais o lon simule la part dincertitude par une fourchette de
hasard.
Par exemple, un modle dmographique supposera quune femme a en moyenne x enfants au cours de sa vie,
mettons 1,5. Mais il supposera aussi que sur une population donne, ce chiffre peut fluctuer entre 1,35 et 1,65 (si
on laisse une part dincertitude de 10%). Chaque anne, cest--dire chaque srie de calcul des valeurs du modle,
on aura ainsi besoin de faire choisir la machine un nombre au hasard compris entre 1,35 et 1,65.
Dans tous les langages, cette fonction existe et produit le rsultat suivant :
Aprs :

Toto Alea()

On a :

0 =< Toto < 1

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

si Alea gnre un nombre compris entre 0 et 1, Alea multipli par Z produit un nombre entre 0 et Z.

Donc, il faut estimer la largeur de la fourchette voulue et multiplier Alea par cette largeur dsire.

ensuite, si la fourchette ne commence pas zro, il va suffire dajouter ou de retrancher quelque

chose pour caler la fourchette au bon endroit.


Par exemple, si je veux gnrer un nombre entre 1,35 et 1,65 ; la fourchette mesure 0,30 de large. Donc : 0
=< Alea()*0,30 < 0,30
Il suffit ds lors dajouter 1,35 pour obtenir la fourchette voulue. Si jcris que :
Toto Alea()*0,30 + 1,35

Toto aura bien une valeur comprise entre 1,35 et 1,65. Et le tour est jou !
Bon, il est grand temps que vous montriez ce que vous avez appris

4. LES FONCTIONS DE CONVERSION


Dernire grande catgorie de fonctions, l aussi disponibles dans tous les langages, car leur rle est parfois
incontournable, les fonctions dites de conversion.
Rappelez-vous ce que nous avons vu dans les premires pages de ce cours : il existe diffrents types de
variables, qui dterminent notamment le type de codage qui sera utilis. Prenons le chiffre 3. Si je le stocke dans
une variable de type alphanumrique, il sera cod en tant que caractre, sur un octet. Si en revanche je le stocke
dans une variable de type entier, il sera cod sur deux octets. Et la configuration des bits sera compltement
diffrente dans les deux cas.
Une conclusion vidente, et sur laquelle on a dj eu l'occasion d'insister, c'est qu'on ne peut pas faire n'importe
quoi avec n'importe quoi, et qu'on ne peut pas par exemple multiplier "3" et "5", si 3 et 5 sont stocks dans des

variables de type caractre. Jusque l, pas de scoop me direz-vous, juste titre vous rpondrai-je, mais attendez
donc la suite.
Pourquoi ne pas en tirer les consquences, et stocker convenablement les nombres dans des variables
numriques, les caractres dans des variables alphanumriques, comme nous l'avons toujours fait ?
Parce qu'il y a des situations o on n'a pas le choix ! Nous allons voir ds le chapitre suivant un mode de stockage
(les fichiers textes) o toutes les informations, quelles qu'elles soient, sont obligatoirement stockes sous forme de
caractres. Ds lors, si l'on veut pouvoir rcuprer des nombres et faire des oprations dessus, il va bien falloir
tre capable de convertir ces chanes en numriques.
Aussi, tous les langages proposent-ils une palette de fonctions destines oprer de telles conversions. On
trouvera au moins une fonction destine convertir une chane en numrique (appelons-la Cnum en pseudo-code),
et une convertissant un nombre en caractre (Ccar).

PARTIE 10
LES FICHIERS
Jusqu prsent, les informations utilises dans nos programmes ne pouvaient provenir que de deux sources :
soit elles taient inclues dans lalgorithme lui-mme, par le programmeur, soit elles taient entres en cours de
route par lutilisateur. Mais videmment, cela ne suffit pas combler les besoins rels des informaticiens.
Imaginons que lon veuille crire un programme grant un carnet dadresses. Dune excution du programme
lautre, lutilisateur doit pouvoir retrouver son carnet jour, avec les modifications quil y a apportes la dernire
fois quil a excut le programme. Les donnes du carnet dadresse ne peuvent donc tre inclues dans
lalgorithme, et encore moins tre entres au clavier chaque nouvelle excution !
Les fichiers sont l pour combler ce manque. Ils servent stocker des informations de manire permanente,
entre deux excutions dun programme. Car si les variables, qui sont je le rappelle des adresses de mmoire vive,
disparaissent chaque fin dexcution, les fichiers, eux sont stocks sur des priphriques mmoire de masse
(disquette, disque dur, CD Rom).

1. ORGANISATION DES FICHIERS


Vous connaissez tous le coup des papous : chez les papous, il y a les papous papas et les papous pas papas.
Chez les papous papas, il y a les papous papas poux et les papous papas pas poux, etc. Eh bien les fichiers,
c'est un peu pareil : il y a des catgories, et dans les catgories, des sortes, et dans les sortes des espces. Essayons
donc de dbroussailler un peu tout cela...
Un premier grand critre, qui diffrencie les deux grandes catgories de fichiers, est le suivant : le fichier est-il
ou non organis sous forme de lignes successives ? Si oui, cela signifie vraisemblablement que ce fichier contient
le mme genre d'information chaque ligne. Ces lignes sont alors appeles des enregistrements.
Afin d'illuminer ces propos obscurs, prenons le cas classique, celui d'un carnet d'adresses. Le fichier est destin
mmoriser les coordonnes (ce sont toujours les plus mal chausses, bien sr) d'un certain nombre de personnes.
Pour chacune, il faudra noter le nom, le prnom, le numro de tlphone et l'email. Dans ce cas, il peut paratre
plus simple de stocker une personne par ligne du fichier (par enregistrement). Dit autrement, quand on prendra
une ligne, on sera sr qu'elle contient les informations concernant une personne, et uniquement cela. Un fichier
ainsi cod sous forme d'enregistrements est appel un fichier texte.
En fait, entre chaque enregistrement, sont stocks les octets correspondants aux caractres CR (code Ascii 13)
et LF (code Ascii 10), signifiant un retour au dbut de la ligne suivante. Le plus souvent, le langage de
programmation, ds lors qu'il s'agit d'un fichier texte, grera lui-mme la lecture et l'criture de ces deux
caractres chaque fin de ligne : c'est autant de moins dont le programmeur aura s'occuper. Le programmeur,
lui, n'aura qu' dire la machine de lire une ligne, ou d'en crire une.
Ce type de fichier est couramment utilis ds lors que l'on doit stocker des informations pouvant tre assimiles
une base de donnes.
Le second type de fichier, vous l'aurez devin, se dfinit a contrario : il rassemble les fichiers qui ne possdent
pas de structure de lignes (d'enregistrement). Les octets, quels qu'il soient, sont crits la queue leu leu. Ces
fichiers sont appels des fichiers binaires. Naturellement, leur structure diffrente implique un traitement
diffrent par le programmeur. Tous les fichiers qui ne codent pas une base de donnes sont obligatoirement des
fichiers binaires : cela concerne par exemple un fichier son, une image, un programme excutable, etc. .
Toutefois, on en dira quelques mots un peu plus loin, il est toujours possible d'opter pour une structure binaire
mme dans le cas o le fichier reprsente une base de donnes.
Autre diffrence majeure entre fichiers texte et fichiers binaires : dans un fichier texte, toutes les donnes sont
crites sous forme de... texte (tonnant, non ?). Cela veut dire que les nombres y sont reprsents sous forme de
suite de chiffres (des chanes de caractres). Ces nombres doivent donc tre convertis en chanes lors de
l'criture dans le fichier. Inversement, lors de la lecture du fichier, on devra convertir ces chanes en nombre si

l'on veut pouvoir les utiliser dans des calculs. En revanche, dans les fichiers binaires, les donnes sont crites
l'image exact de leur codage en mmoire vive, ce qui pargne toutes ces oprations de conversion.
Ceci a comme autre implication qu'un fichier texte est directement lisible, alors qu'un fichier binaire ne l'est
pas(sauf bien sr en crivant soi-mme un programme appropri). Si l'on ouvre un fichier texte via un diteur de
textes, comme le bloc-notes de Windows, on y reconnatra toutes les informations (ce sont des caractres, stocks
comme tels). La mme chose avec un fichier binaire ne nous produit l'cran qu'un galimatias de scribouillis
incomprhensibles.

2. STRUCTURE DES ENREGISTREMENTS


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

ou ainsi :
Structure n2
Fonfec
Ztofrais
Herbien
Hergbel

Sophie
Mlanie
Jean-Philippe
Octave

0142156487fonfec@yahoo.fr
0456912347ztofrais@free.fr
0289765194vantard@free.fr
0149875231rg@aol.fr

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

Lavantage de la structure n1 est son faible encombrement en place mmoire ; il ny a aucun

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

La structure n2, linverse, gaspille de la place mmoire, puisque le fichier est un vrai gruyre

plein de trous. Mais dun autre ct, la rcupration des diffrents champs est trs rapide. Lorsquon
rcupre une ligne, il suffit de la dcouper en diffrentes chanes de longueur prdfinie, et le tour est
jou.
A lpoque o la place mmoire cotait cher, la structure dlimite tait souvent privilgie. Mais depuis bien
des annes, la quasi-totalit des logiciels et des programmeurs optent pour la structure en champs de largeur
fixe. Aussi, sauf mention contraire, nous ne travaillerons quavec des fichiers btis sur cette structure.
Remarque importante : lorsqu'on choisit de coder une base de donnes sous forme de champs de largeur fixe, on
peut alors trs bien opter pour un fichier binaire. Les enregistrements y seront certes la queue leu leu, sans que
rien ne nous signale la jointure entre chaque enregistrement. Mais si on sait combien d'octets mesure
invariablement chaque champ, on sait du coup combien d'octets mesure chaque enregistrement. Et on peut donc
trs facilement rcuprer les informations : si je sais que dans mon carnet d'adresse, chaque individu occupe

mettons 75 octets, alors dans mon fichier binaire, je dduis que l'individu n1 occupe les octets 1 75, l'individu
n2 les octets 76 150, l'individu n3 les octets 151 225, etc.

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

Laccs squentiel : on ne peut accder qu la donne suivant celle quon vient de lire. On ne

peut donc accder une information qu'en ayant au pralable examin celle qui la prcde. Dans le cas
d'un fichier texte, cela signifie qu'on lit le fichier ligne par ligne (enregistrement par enregistrement).

Laccs direct (ou alatoire) : on peut accder directement lenregistrement de son choix, en

prcisant le numro de cet enregistrement. Mais cela veut souvent dire une gestion fastidieuse des
dplacements dans le fichier.

Laccs index : pour simplifier, il combine la rapidit de l'accs direct et la simplicit de l'accs

squentiel (en restant toutefois plus compliqu). Il est particulirement adapt au traitement des gros
fichiers, comme les bases de donnes importantes.
A la diffrence de la prcdente, cette typologie ne caractrise pas la structure elle-mme du fichier. En fait,
tout fichier peut tre utilis avec lun ou lautre des trois types daccs. Le choix du type daccs nest pas un
choix qui concerne le fichier lui-mme, mais uniquement la manire dont il va tre trait par la machine. Cest
donc dans le programme, et seulement dans le programme, que lon choisit le type daccs souhait.
Pour conclure sur tout cela, voici un petit tableau rcapitulatif :

Fichiers Texte

Fichiers Binaires

On les utilise pour stocker...

des bases de donnes

tout, y compris des bases de donnes.

Ils sont structurs sous forme de...

lignes (enregistrements)

Ils n'ont pas de structure apparente. Ce sont


des octets crits la suite les uns des autres.

Les donnes y sont crites...

exclusivement en tant que caractres

comme en mmoire vive

Les enregistrements sont euxmmes structurs...

au choix, avec un sparateur ou en


champs de largeur fixe

en champs de largeur fixe, s'il s'agit d'un


fichier codant des enregistrements

Lisibilit

Le fichier est lisible clairement avec


n'importe quel diteur de texte

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


illisibles

Lecture du fichier

On ne peut lire le fichier que ligne par


ligne

On peut lire les octets de son choix (y compris


la totalit du fichier d'un coup)

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

4. INSTRUCTIONS (FICHIERS TEXTE EN ACCES SEQUENTIEL)


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

Si on ouvre un fichier pour lecture, on pourra uniquement rcuprer les informations quil

contient, sans les modifier en aucune manire.

Si on ouvre un fichier pour criture, on pourra mettre dedans toutes les informations que lon veut.

Mais les informations prcdentes, si elles existent, seront intgralement crases Et on ne pourra pas
accder aux informations qui existaient prcdemment.

Si on ouvre un fichier pour ajout, on ne peut ni lire, ni modifier les informations existantes. Mais on

pourra, comme vous commencez vous en douter, ajouter de nouvelles lignes (je rappelle qu'au terme de
lignes, on prfrera celui denregistrements.
Au premier abord, ces limitations peuvent sembler infernales. Au deuxime rabord, elles le sont effectivement.
Il n'y a mme pas d'instructions qui permettent de supprimer un enregistrement d'un fichier !
Toutefois, avec un peu dhabitude, on se rend compte que malgr tout, mme si ce nest pas toujours marrant,
on peut quand mme faire tout ce quon veut avec ces fichiers squentiels.
Pour ouvrir un fichier texte, on crira par exemple :
Ouvrir "Exemple.txt" sur 4 en Lecture

Ici, "Exemple.txt" est le nom du fichier sur le disque dur, 4 est le numro de canal, et ce fichier a donc t
ouvert en lecture. Vous laviez sans doute pressenti. Allons plus loin :
Variables Truc, Nom, Prnom, Tel, Mail en Caractres
Dbut
Ouvrir "Exemple.txt" sur 4 en Lecture
LireFichier 4, Truc
Nom Mid(Truc, 1, 20)
Prnom Mid(Truc, 21, 15)
Tel Mid(Truc, 36, 10)
Mail Mid(Truc, 46, 20)

Linstruction LireFichier rcupre donc dans la variable spcifie lenregistrement suivant dans le fichier...
"suivant", oui, mais par rapport quoi ? Par rapport au dernier enregistrement lu. Cest en cela que le fichier est
dit squentiel. En loccurrence, on rcupre donc la premire ligne, donc, le premier enregistrement du fichier,
dans la variable Truc. Ensuite, le fichier tant organis sous forme de champs de largeur fixe, il suffit de
trononner cette variable Truc en autant de morceaux quil y a de champs dans lenregistrement, et denvoyer ces
tronons dans diffrentes variables. Et le tour est jou.
La suite du raisonnement simpose avec une logique impitoyable : lire un fichier squentiel de bout en bout
suppose de programmer une boucle. Comme on sait rarement lavance combien denregistrements comporte le
fichier, la combine consiste neuf fois sur dix utiliser la fonction EOF (acronyme pour End Of File). Cette fonction
renvoie la valeur Vrai si on a atteint la fin du fichier (auquel cas une lecture supplmentaire dclencherait une
erreur). Lalgorithme, ultra classique, en pareil cas est donc :
Variable Truc en Caractre
Ouvrir "Exemple.txt" sur 5 en Lecture
Dbut
Tantque Non EOF(5)
LireFichier 5, Truc

FinTantQue
Fermer 5
Fin

Et neuf fois sur dix galement, si lon veut stocker au fur et mesure en mmoire vive les informations lues
dans le fichier, on a recours un ou plusieurs tableaux. Et comme on ne sait pas davance combien il y aurait
denregistrements dans le fichier, on ne sait pas davantage combien il doit y avoir demplacements dans les
tableaux. Quimporte, les programmeurs avertis que vous tes connaissent la combine des tableaux dynamiques.
En rassemblant lensemble des connaissances acquises, nous pouvons donc crire le prototype du code qui
effectue la lecture intgrale dun fichier squentiel, tout en recopiant lensemble des informations en mmoire
vive :
Tableaux Nom(), Prnom(), Tel(), Mail() en Caractre
Dbut

Ouvrir "Exemple.txt" sur 5 en Lecture


i -1
Tantque Non EOF(5)
LireFichier 5, Truc
i i + 1
Redim Nom(i)
Redim Prnom(i)
Redim Tel(i)
Redim Mail(i)
Nom(i) Mid(Truc, 1, 20)
Prnom(i) Mid(Truc, 21, 15)
Tel(i) Mid(Truc, 36, 10)
Mail(i) Mid(Truc, 46, 20)
FinTantQue
Fermer 5
Fin

Ici, on a fait le choix de recopier le fichier dans quatre tableaux distincts. On aurait pu galement tout recopier
dans un seul tableau : chaque case du tableau aurait alors t occupe par une ligne complte (un enregistrement)
du fichier. Cette solution nous aurait fait gagner du temps au dpart, mais elle alourdit ensuite le code, puisque
chaque fois que l'on a besoin d'une information au sein d'une case du tableau, il faudra aller procder une
extraction via la fonction MID. Ce qu'on gagne par un bout, on le perd donc par l'autre.
Mais surtout, comme on va le voir bientt, il y a autre possibilit, bien meilleure, qui cumule les avantages sans
avoir aucun des inconvnients.
Nanmoins, ne nous impatientons pas, chaque chose en son temps, et revenons pour le moment la solution
que nous avons employe ci-dessus.
Pour une opration dcriture, ou dajout, il faut dabord imprativement, sous peine de semer la panique dans
la structure du fichier, constituer une chane quivalente la nouvelle ligne du fichier. Cette chane doit donc tre
calibre de la bonne manire, avec les diffrents champs qui tombent aux emplacements corrects. Le
moyen le plus simple pour spargner de longs traitements est de procder avec des chanes 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).

5. STRATEGIES DE TRAITEMENT
Il existe globalement deux manires de traiter les fichiers textes :

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

presque) les informations sur le disque dur. Cest parfois un peu acrobatique, lorsquon veut supprimer un
lment dun fichier : on programme alors une boucle avec un test, qui recopie dans un deuxime fichier

tous les lments du premier fichier sauf un ; et il faut ensuite recopier intgralement le deuxime fichier
la place du premier fichier Ouf.

lautre stratgie consiste, comme on la vu, passer par un ou plusieurs tableaux. En fait, le

principe fondamental de cette approche est de commencer, avant toute autre chose, par recopier
lintgralit du fichier de dpart en mmoire vive. Ensuite, on ne manipule que cette mmoire vive
(concrtement, un ou plusieurs tableaux). Et lorsque le traitement est termin, on recopie nouveau dans
l'autre sens, depuis la mmoire vive vers le fichier dorigine.
Les avantages de la seconde technique sont nombreux, et 99 fois sur 100, c'est ainsi qu'il faudra procder :

la rapidit : les accs en mmoire vive sont des milliers de fois plus rapides (nanosecondes) que les

accs aux mmoires de masse (millisecondes au mieux pour un disque dur). En basculant le fichier du
dpart dans un tableau, on minimise le nombre ultrieur d'accs disque, tous les traitements tant ensuite
effectus en mmoire.

la facilit de programmation : bien quil faille crire les instructions de recopie du fichier dans le

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

6. DONNEES STRUCTUREES
6.1 Donnes structures simples
Nostalgiques du Lego, cette partie va vous plaire. Comment construire des trucs pas possibles et des machins
pas croyables avec juste quelques lments de base ? Vous n'allez pas tarder le savoir...
Jusqu' prsent, voil comment se prsentaient nos possibilits en matire de mmoire vive : nous pouvions
rserver un emplacement pour une information d'un certain type. Un tel emplacement s'appelle une variable
(quand vous en avez assez de me voir radoter, vous le dites). Nous pouvions aussi rserver une srie d'emplacement
numrots pour une srie d'informations de mme type. Un tel emplacement s'appelle un tableau (mme
remarque).
Eh bien toujours plus haut, toujours plus fort, voici maintenant que nous pouvons rserver une srie
d'emplacements pour des donnes de type diffrents. Un tel emplacement s'appelle une variable structure.
Son utilit, lorsqu'on traite des fichiers texte (et mme, des fichiers en gnral), saute aux yeux : car on va pouvoir
calquer chacune des lignes du fichier en mmoire vive, et considrer que chaque enregistrement sera recopi dans
une variable et une seule, qui lui sera adapte. Ainsi, le problme du "dcoupage" de chaque enregistrement en
diffrentes variables (le nom, le prnom, le numro de tlphone, etc.) sera rsolu d'avance, puisqu'on aura une
structure, un gabarit, en quelque sorte, tout prt d'avance pour accueillir et prdcouper nos enregistrements.

Attention toutefois ; lorsque nous utilisions des variables de type prdfini, comme des entiers, des boolens,
etc. nous n'avions qu'une seule opration effectuer : dclarer la variable en utilisant un des types existants. A
prsent que nous voulons crer un nouveau type de variable (par assemblage de types existants), il va falloir faire
deux choses : d'abord, crer le type. Ensuite seulement, dclarer la (les) variable(s) d'aprs ce type.
Reprenons une fois de plus l'exemple du carnet d'adresses. Je sais, c'est un peu comme mes blagues, a lasse
(l, pour ceux qui s'endorment, je signale qu'il y a un jeu de mots), mais c'est encore le meilleur moyen d'avoir un
point de comparaison.
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

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...
6.2 Tableaux de donnes structures
Et encore plus loin, encore plus vite et encore plus fort. Si partir des types simples, on peut crer des
variables et des tableaux de variables, vous me voyez venir, partir des types structurs, on peut crer des
variables structures... et des tableaux de variables structures.
L, bien que pas si difficile que cela, a commence devenir vraiment balze. Parce que cela veut dire que
nous disposons d'une manire de grer la mmoire vive qui va correspondre exactement la structure d'un fichier
texte (d'une base de donnes). Comme les structures se correspondent parfaitement, le nombre de manipulations

effectuer, autrement dit de lignes de programme crire, va tre rduit au minimum. En fait, dans notre tableau
structur, les champs des emplacements du tableau correspondront aux champs du fichier texte, et les indices des
emplacements du tableaux correspondront aux diffrentes lignes du fichier.
Voici, titre d'illustration, l'algorithme complet de lecture du fichier Adresses et de sa recopie intgrale en
mmoire vive, en employant un tableau structur.
Structure Bottin
Nom en Caractre * 20
Prnom en Caractre * 15
Tel en Caractre * 10
Mail en Caractre * 20
Fin Structure
Tableau Mespotes() en Bottin
Dbut
Ouvrir "Exemple.txt" sur 3 en Lecture
i -1
Tantque Non EOF(3)
i i + 1
Redim Mespotes(i)
LireFichier 3, Mespotes(i)
FinTantQue
Fermer 3
Fin

Une fois que ceci est rgl, on a tout ce qu'il faut ! Si je voulais crire, un moment, le mail de l'individu n13
du fichier (donc le n12 du tableau) l'cran, il me suffirait de passer l'ordre :
Ecrire Mespotes(12).Mail

Et voil le travail. Simplissime, non ?


REMARQUE FINALE SUR LES DONNES STRUCTURES
Mme si le domaine de prdilection des donnes structures est la gestion de fichiers, on peut tout fait y avoir
recours dans d'autres contextes, et organiser plus systmatiquement les variables d'un programme sous la forme de
telles structures.
En programmation dite procdurale, celle que nous tudions ici, ce type de stratgie reste relativement rare. Mais
rare ne veut pas dire interdit, ou mme inutile.
Et nous aurons l'occasion de voir qu'en programmation objet, ce type d'organisation des donnes devient
fondamental.
Mais ceci est un autre cours...

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

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

sur le mode d'accs aux enregistrements du fichier (direct ou squentiel)

sur l'organisation des champs au sein des enregistrements (prsence de sparateurs ou champs de

largeur fixe)

sur la mthode de traitement des informations (recopie intgrale pralable du fichier en mmoire

vive ou non)

sur le type de variables utilises pour cette recopie en mmoire vive (plusieurs tableaux de type

simple, ou un seul tableau de type structur).

Chacune de ces options prsente avantages et inconvnients, et il est impossible de donner une rgle de
conduite valable en toute circonstance. Il faut connatre ces techniques, et savoir choisir la bonne option selon le
problme traiter.
Voici une srie de (pas toujours) petits exercices sur les fichiers texte, que l'on pourra traiter en employant les
types structurs (c'est en tout cas le cas dans les corrigs).
Et en conclusion de la conclusion, voil plusieurs remarques fondamentales :
REMARQUE N1
Lorsqu'on veut rcuprer des donnes numriques inscrites dans un fichier texte, il ne faut surtout pas oublier que
ces donnes se prsentent forcment sous forme de caractres. La rcupration elle-mme transmettra donc
obligatoirement des donnes de type alphanumrique ; pour utiliser ces donnes des fins ultrieures de calcul, il
sera donc ncessaire d'employer une fonction de conversion.
Cette remarque ne s'applique videmment pas aux fichiers binaires.
REMARQUE N1bis
Voil pourquoi une structure s'appliquant aux fichiers textes est forcment compose uniquement de types
caractres. Une structure traitant de fichiers binaires pourrait en revanche tre compose de caractres, de
numriques et de boolens.
REMARQUE N2
Plusieurs langages interdisent l'criture d'une variable structure dans un fichier texte, ne l'autorisant que pour un
fichier binaire.
Si l'on se trouve dans ce cas, cela signifie qu'on peut certes utiliser une structure, ou un tableau de structures, mais
condition d'crire sur le fichier champ par champ, ce qui annule une partie du bnfice de la structure.
Nous avons postul ici que cette interdiction n'existait pas ; en tenir compte ne changerait pas fondamentalement
les algorithmes, mais alourdirait un peu le code pour les lignes traitant de l'criture dans les fichiers.

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

"Etes-vous mari ?"


RepOuiNon()
"Avez-vous des enfants ?"
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 tout ce qui prcde, vous devez avoir une petite ide de ce qu'on va pouvoir mettre
dedans...
1.2 Passage d'arguments
Reprenons lexemple qui prcde et analysons-le. On crit un message l'cran, puis on appelle la fonction
RepOuiNon pour poser une question ; puis, un peu plus loin, on crit un autre message l'cran, et on appelle de
nouveau la fonction pour poser la mme question, etc. Cest une dmarche acceptable, mais qui peut encore tre
amliore : puisque avant chaque question, on doit crire un message, autant que cette criture du message figure
directement dans la fonction appele. Cela implique deux choses :

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

rponse

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

lafficher.
En langage algorithmique, on dira que le message devient un argument (ou un paramtre) de la fonction. Cela
n'est certes pas une dcouverte pour vous : nous avons longuement utilis les arguments propos des fonctions
prdfinies. Eh bien, quitte construire nos propres fonctions, nous pouvons donc construire nos propres
arguments. Voil comment laffaire se prsente...
La fonction sera dornavant dclare comme suit :
Fonction RepOuiNon(Msg en Caractre) en Caractre
Ecrire Msg
Truc ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
Renvoyer Truc
Fin Fonction

Il y a donc maintenant entre les parenthses une variable, Msg, dont on prcise le type, et qui signale la
fonction quun argument doit lui tre envoy chaque appel. 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.
1.3 Deux mots sur l'analyse fonctionnelle
Comme souvent en algorithmique, si l'on s'en tient la manire dont marche l'outil, tout cela n'est en ralit pas
trs compliqu. Les fonctions personnalises se dduisent trs logiquement de la manire nous nous avons dj
expriment les fonctions prdfinies.
Le plus difficile, mais aussi le plus important, c'est d'acqurir le rflexe de constituer systmatiquement les
fonctions adquates quand on doit traiter un problme donn, et de flairer la bonne manire de dcouper son
algorithme en diffrentes fonctions pour le rendre lger, lisible et performant.
Cette partie de la rflexion s'appelle d'ailleurs l'analyse fonctionnelle d'un problme, et c'est toujours par elle
qu'il faut commencer : en gros, dans un premier temps, on dcoupe le traitement en modules (algorithmique
fonctionnelle), et dans un deuxime temps, on crit chaque module (algorithmique classique). Cependant, avant

d'en venir l, il nous faut dcouvrir deux autres outils, qui prennent le relais l o les fonctions deviennent
incapables de nous aider.

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

Dans la procdure principale, lappel la sous-procdure Bidule devient quant lui :


Appeler Bidule(...)

tablissons un premier tat des lieux.

Alors qu'une fonction se caractrisait par les mots-cls Fonction ... Fin Fonction, une sous-

procdure est identifie par les mots-cls Procdure ... Fin Procdure. Oui, je sais, c'est un peu trivial
comme remarque, mais, bon, on ne sait jamais.

Lorsqu'une fonction tait appele, sa valeur (retourne) tait toujours affecte une variable (ou

intgre dans le calcul d'une expression). L'appel une procdure, lui, est au contraire toujours une
instruction autonome. "Excute la procdure Bidule" est un ordre qui se suffit lui-mme.

Toute fonction devait, pour cette raison, comporter l'instruction "Renvoyer". Pour la mme raison,

l'instruction "Renvoyer" n'est jamais utilise dans une sous-procdure. La fonction est une valeur
calcule, qui renvoie son rsultat vers la procdure principale. La sous-procdure, elle, est un traitement ;
elle ne "vaut" rien.

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

nos peines.

2.2 Le problme des arguments


En effet, il nous reste examiner ce qui peut bien se trouver dans les parenthses, la place des points de
suspension, aussi bien dans la dclaration de la sous-procdure que dans l'appel. Vous vous en doutez bien : c'est l
que vont se trouver les outils qui vont permettre l'change d'informations entre la procdure principale et la sousprocdure (en fait, cette dernire phrase est trop restrictive : mieux vaudrait dire : entre la procdure appelante
et la procdure appele. Car une sous-procdure peut trs bien en appeler elle-mme une autre afin de pouvoir
accomplir sa tche)
De mme qu'avec les fonctions, les valeurs qui circulent depuis la procdure (ou la fonction) appelante vers la
sous-procdure appele se nomment des arguments, ou des paramtres en entre de la sous-procdure. Comme
on le voit, qu'il s'agisse des sous-procdure ou des fonctions, ces choses jouant exactement le mme rle
(transmettre une information depuis le code donneur d'ordres jusqu'au code sous-traitant), elle portent galement
le mme nom. Unique petite diffrence, on a prcis cette fois qu'il s'agissait d'arguments, ou de paramtres, en
entre. Pourquoi donc ?
Tout simplement parce que 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 soustraitant 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...
2.3 Comment a marche tout a ?
En fait, si je dis qu'un paramtre est "en entre" ou "en sortie", j'nonce quelque chose propos de son rle dans
le programme. Je dis ce que je souhaite qu'il fasse, la manire dont je veux qu'il se comporte. Mais les programmes
eux-mmes n'ont cure de mes dsirs, et ce n'est pas cette classification qu'ils adoptent. C'est toute la diffrence
entre dire qu'une prise lectrique sert brancher un rasoir ou une cafetire (ce qui caractrise son rle), et dire
qu'elle est en 220 V ou en 110 V (ce qui caractrise son type technique, et qui est l'information qui intresse
l'lectricien). A l'image des lectriciens, les langages se contrefichent de savoir quel sera le rle (entre ou sortie)
d'un paramtre. Ce qu'ils exigent, c'est de connatre leur voltage... pardon, le mode de passage de ces paramtres.
Il n'en existe que deux :

le passage par valeur

le passage par rfrence

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


Reprenons l'exemple que nous avons dj utilis plus haut, celui de notre fonction RepOuiNon. Comme nous
l'avons vu, rien ne nous empche de rcrire cette fonction sous la forme d'une procdure (puisqu'une fonction
n'est qu'un cas particulier de sous-procdure). Nous laisserons pour l"instant de ct la question de savoir comment

renvoyer la rponse (contenue dans la variable Truc) vers le programme principal. En revanche, nous allons
dclarer que Msg est un paramtre dont la transmission doit se faire par valeur. Cela donnera la chose suivante :
Procdure RepOuiNon(Msg en Caractre par valeur)
Ecrire Msg
Truc ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue

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


Fin Procdure

Quant l'appel cette sous-procdure, il pourra prendre par exemple cette forme :
M "Etes-vous mari ?"
Appeler RepOuiNon(M)

Que va-t-il se passer ?


Lorsque le programme principal arrive sur la premire ligne, il affecte la variable M avec le libell "tes-vous
mari". La ligne suivante dclenche l'excution de la sous-procdure. Celle-ci cre aussitt une variable Msg. Celleci ayant t dclare comme un paramtre pass par valeur, Msg va tre affect avec le mme contenu que M.
Cela signifie que Msg est dornavant une copie de M. Les informations qui taient contenues dans M ont t
intgralement recopies (en double) dans Msg. Cette copie subsistera tout au long de l'excution de la sousprocdure RepOuiNon et sera dtruite la fin de celle-ci.
Une consquence essentielle de tout cela est que si d'aventure la sous-procdure RepOuiNon contenait une
instruction qui modifiait le contenu de la variable Msg, cela n'aurait aucune espce de rpercussion sur la
procdure principale en gnral, et sur la variable M en particulier. La sous-procdure ne travaillant que sur une
copie de la variable qui a t fournie par le programme principal, elle est incapable, mme si on le souhaitait,
de modifier la valeur de celle-ci. Dit d'une autre manire, dans une procdure, un paramtre pass par valeur ne
peut tre qu'un paramtre en entre.
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 contiendra pas la valeur de T, mais son
adresse, c'est--dire sa rfrence.

Ds lors, toute modification de Truc sera immdiatement redirige, par ricochet en quelque sorte, sur T.
Truc n'est pas une variable ordinaire : elle ne contient pas de valeur, mais seulement la rfrence une valeur, qui
elle, se trouve ailleurs (dans la variable T). Il s'agit donc d'un genre de variable compltement nouveau, et
diffrent de ce que nous avons vu jusque l. Ce type de variable porte un nom : on l'appelle un pointeur. Tous les
paramtres passs par rfrence sont des pointeurs, mais les pointeurs ne se limitent pas aux paramtres passs
par rfrence (mme si ce sont les seuls que nous verrons dans le cadre de ce cours). Il faut bien comprendre que
ce type de variable trange est gr directement par les langages : partir du moment o une variable est
considre comme un pointeur, toute affectation de cette variable se traduit automatiquement par la
modification de la variable sur laquelle elle pointe.
Passer un paramtre par rfrence, cela prsente donc deux avantages. Et d'une, on gagne en occupation de
place mmoire, puisque le paramtre en question ne recopie pas les informations envoyes par la procdure
appelante, mais qu'il se contente d'en noter l'adresse. Et de deux, cela permet d'utiliser ce paramtre tant en
lecture (en entre) qu'en criture (en sortie), puisque toute modification de la valeur du paramtre aura pour
effet de modifier la variable correspondante dans la procdure appelante.
Nous pouvons rsumer tout cela par un petit tableau :

passage par valeur

passage par rfrence

utilisation en entre

oui

oui

utilisation en sortie

non

oui

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

3. VARIABLES PUBLIQUES ET PRIVEES


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

si le module appel est une fonction, par le retour du rsultat

dans tous les cas, par la transmission de paramtres (que ces paramtres soient passs par valeur

ou par rfrence)
En fait, il existe un troisime et dernier moyen d'changer des informations entre diffrentes procdures et
fonctions : c'est de ne pas avoir besoin de les changer, en faisant en sorte que ces procdures et fonctions
partagent littralement les mmes variables. Cela suppose d'avoir recours des variables particulires, lisibles et
utilisables par n'importe quelle procdure ou fonction de l'application.
Par dfaut, une variable est dclare au sein d'une procdure ou d'une fonction. Elle est donc cre avec cette
procdure, et disparat avec elle. Durant tout le temps de son existence, une telle variable n'est visible que par la
procdure qui l'a vu natre. Si je cre une variable Toto dans une procdure Bidule, et qu'en cours de route, ma

procdure Bidule appelle une sous-procdure Machin, il est hors de question que Machin puisse accder Toto, ne
serait-ce que pour connatre sa valeur (et ne parlons pas de la modifier). Voil pourquoi ces variables par dfaut
sont dites prives, ou locales.
Mais ct de cela, il est possible de crer des variables qui certes, seront dclares dans une procdure, mais
qui du moment o elles existeront, seront des variables communes toutes les procdures et fonctions de
l'application. Avec de telles variables, le problme de la transmission des valeurs d'une procdure (ou d'une
fonction) l'autre ne se pose mme plus : la variable Truc, existant pour toute l'application, est accessible et
modifiable depuis n'importe quelle ligne de code de cette application. Plus besoin donc de la transmettre ou de la
renvoyer. Une telle variable est alors dite publique, ou globale.
La manire dont la dclaration d'une variable publique doit tre faites est videmment fonction de chaque
langage de programmation. En pseudo-code algorithmique, on pourra utiliser le mot-cl Publique :
Variable Publique Toto en Numrique

Alors, pourquoi ne pas rendre toutes les variables publiques, et s'pargner ainsi de fastidieux efforts pour passer
des paramtres ? Cest trs simple, et c'est toujours la mme chose : les variables globales consomment
normment de ressources en mmoire. En consquence, le principe qui doit prsider au choix entre variables
publiques et prives doit tre celui de lconomie de moyens : on ne dclare comme publiques que les variables
qui doivent absolument ltre. Et chaque fois que possible, lorsquon cre une sous-procdure, on utilise le passage
de paramtres plutt que des variables publiques.

4. PEUT-ON TOUT FAIRE ?


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

5. ALGORITHMES FONCTIONNELS
Pour clore ce chapitre, voici quelques mots supplmentaires propos de la structure gnrale dune
application. Comme on l'a dit plusieurs reprises, celle-ci va couramment tre forme dune procdure principale,
et de fonctions et de sous-procdures (qui vont au besoin elles-mmes en appeler dautres, etc.). Lexemple
typique est celui dun menu, ou dun sommaire, qui branche sur diffrents traitements, donc diffrentes sousprocdures.
Lalgorithme fonctionnel de lapplication est le dcoupage et/ou la reprsentation graphique de cette
structure gnrale, ayant comme objectif de faire comprendre dun seul coup dil quelle procdure fait quoi, et
quelle procdure appelle quelle autre. Lalgorithme fonctionnel est donc en quelque sorte la construction du
squelette de lapplication. Il se situe un niveau plus gnral, plus abstrait, que lalgorithme normal, qui lui,
dtaille pas pas les traitements effectus au sein de chaque procdure.
Dans la construction et la comprhension dune application, les deux documents sont indispensables, et
constituent deux tapes successives de llaboration dun projet. La troisime et dernire tape, consiste
crire, pour chaque procdure et fonction, lalgorithme dtaill.
Exemple de ralisation dun algorithme fonctionnel : Le Jeu du Pendu
Vous connaissez tous ce jeu : lutilisateur doit deviner un mot choisi au hasard par lordinateur, en un minimum
dessais. Pour cela, il propose des lettres de lalphabet. Si la lettre figure dans le mot trouver, elle saffiche. Si
elle ny figure pas, le nombre des mauvaises rponses augmente de 1. Au bout de dix mauvaises rponses, la partie
est perdue.
Ce petit jeu va nous permettre de mettre en relief les trois tapes de la ralisation dun algorithme un peu
complexe ; bien entendu, on pourrait toujours ignorer ces trois tapes, et se lancer comme un drat directement
dans la gueule du loup, savoir lcriture de lalgorithme dfinitif. Mais, sauf tre particulirement dou, mieux
vaut respecter le canevas qui suit, car les difficults se rsolvent mieux quand on les saucissonne
Etape 1 : le dictionnaire des donnes
Le but de cette tape est didentifier les informations qui seront ncessaires au traitement du problme, et de
choisir le type de codage qui sera le plus satisfaisant pour traiter ces informations. Cest un moment essentiel de la
rflexion, quil ne faut surtout pas prendre la lgre Or, neuf programmeurs dbutants sur dix bclent cette
rflexion, quand ils ne la zappent pas purement et simplement. La punition ne se fait gnralement pas attendre
longtemps ; lalgorithme tant bti sur de mauvaises fondations, le programmeur se rend compte tout en lcrivant
que le choix de codage des informations, par exemple, mne des impasses. La prcipitation est donc punie par le
fait quon est oblig de tout reprendre depuis le dbut, et quon a au total perdu bien davantage de temps quon
en a cru en gagner
Donc, avant mme dcrire quoi que ce soit, les questions quil faut se poser sont les suivantes :

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

pour chacune de ces informations, quel est le meilleur codage ? Autrement dit, celui qui sans

gaspiller de la place mmoire, permettra dcrire lalgorithme le plus simple ?


Encore une fois, il ne faut pas hsiter passer du temps sur ces questions, car certaines erreurs, ou certains
oublis, se payent cher par la suite. Et inversement, le temps investi ce niveau est largement rattrap au moment
du dveloppement proprement dit.

Pour le jeu du pendu, voici la liste des informations dont on va avoir besoin :

une liste de mots (si lon veut viter que le programme ne propose toujours le mme mot trouver,

ce qui risquerait de devenir assez rapidement lassant)

le mot deviner

la lettre propose par le joueur chaque tour

le nombre actuel de mauvaises rponses

et enfin, last but not least, lensemble des lettres dj trouves par le joueur. Cette information

est capitale ; le programme en aura besoin au moins pour deux choses : dune part, pour savoir si le mot
entier a t trouv. Dautre part, pour afficher chaque tour ltat actuel du mot (je rappelle qu chaque
tour, les lettres trouves sont affiches en clair par la machine, les lettres restant deviner tant
remplaces par des tirets).

cela, on pourrait ajouter une liste comprenant lensemble des lettres dj proposes par le

joueur, quelles soient correctes ou non ; ceci permettra dinterdire au joueur de proposer nouveau une
lettre prcdemment joue.
Cette liste dinformations nest peut-tre pas exhaustive ; nous aurons vraisemblablement besoin au cours de
lalgorithme de quelques variables supplmentaires (des compteurs de boucles, des variables temporaires, etc.).
Mais les informations essentielles sont bel et bien l. Se pose maintenant le problme de choisir le mode de codage
le plus fut. Si, pour certaines informations, la question va tre vite rgle, pour dautres, il va falloir faire des
choix (et si possible, des choix intelligents !). Cest parti, mon kiki :

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.
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

Liste des mots deviner

Mot

Caractre

Mot deviner

Lettre

Caractre

Lettre propose

MovRep

Entier

Nombre de mauvaises rponses

Verif()

Tableau de Boolens

Lettres prcdemment devines, en correspondance avec


Mot

Propos

Caractre

Liste des lettres proposes

Etape 2 : lalgorithme fonctionnel


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

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

Gagner du temps et de la lgret en isolant au mieux les sous-procdures et fonctions qui mritent

de ltre. Eviter ainsi ventuellement des rptitions multiples de code au cours du programme, rptitions
qui ne diffrent les unes des autres qu' quelques variantes prs.

Permettre une division du travail entre programmeurs, chacun se voyant assigner la programmation

de sous-procdures ou de fonctions spcifiques (cet aspect est essentiel ds quon quitte le bricolage
personnel pour entrer dans le monde de la programmation professionnelle, donc collective).
Dans notre cas prcis, un premier bloc se dtache : il sagit de ce quon pourrait appeler les prparatifs du jeu
(choix du mot deviner). Puisque le but est de renvoyer une valeur et une seule (le mot choisi par la machine),
nous pouvons confier cette tche une fonction spcialise ChoixDuMot ( noter que ce dcoupage est un choix de
lisibilit, et pas une ncessit absolue ; on pourrait tout aussi bien faire cela dans la procdure principale).
Cette procdure principale, justement, va ensuite avoir ncessairement la forme dune boucle Tantque : en
effet , tant que la partie nest pas finie, on recommence la srie des traitements qui reprsentent un tour de jeu.
Mais comment, justement, savoir si la partie est finie ? Elle peut se terminer soit parce que le nombre de mauvaises
rponses a atteint 10, soit parce que toutes les lettres du mot ont t trouves. Le mieux sera donc de confier
lexamen de tout cela une fonction spcialise, PartieFinie, qui renverra une valeur numrique (0 pour signifier
que la partie est en cours, 1 en cas de victoire, 2 en cas de dfaite).
Passons maintenant au tour de jeu.
La premire chose faire, cest dafficher lcran ltat actuel du mot deviner : un mlange de lettres en
clair (celles qui ont t trouves) et de tirets (correspondant aux lettres non encore trouves). Tout ceci pourra
tre pris en charge par une sous-procdure spcialise, appele AffichageMot. Quant linitialisation des
diffrentes variables, elle pourra tre place, de manire classique, dans la procdure principale elle-mme.
Ensuite, on doit procder la saisie de la lettre propose, en veillant effectuer les contrles de saisie
adquats. L encore, une fonction spcialise, SaisieLettre, sera toute indique.
Une fois la proposition faite, il convient de vrifier si elle correspond ou non une lettre deviner, et en tirer
les consquences. Ceci sera fait par une sous-procdure appele VrifLettre.

Enfin, une fois la partie termine, on doit afficher les conclusions lcran ; on dclare cet effet une dernire
procdure, FinDePartie.
Nous pouvons, dans un algorithme fonctionnel complet, dresser un tableau des diffrentes procdures et
fonctions, exactement comme nous lavons fait juste avant pour les donnes (on spargnera cette peine dans le
cas prsent, ce que nous avons crit ci-dessus suffisant amplement. Mais dans le cas dune grosse application, un
tel travail serait ncessaire et nous pargnerait bien des soucis).
On peut aussi schmatiser le fonctionnement de notre application sous forme de blocs, chacun des blocs
reprsentant une fonction ou une sous-procdure :
A ce stade, lanalyse dite fonctionnelle est termine. Les fondations (solides, esprons-le) sont poses pour
finaliser lapplication.
Etape 3 : Algorithmes dtaills
Normalement, il ne nous reste plus qu traiter chaque procdure isolment. On commencera par les sousprocdures et fonctions, pour terminer par la rdaction de la procdure principale.
ATTENTION ! les liens ci-dessous mnent directement aux corrigs !

Fonction ChoixDuMot
Fonction PartieFinie
Procdure AffichageMot
Procdure SaisieLettre
Procdure VrifLettre
Procdure Epilogue
Procdure Principale

PARTIE 12
NOTIONS COMPLEMENTAIRES
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.

1. PROGRAMMATION STRUCTUREE
Petit retour sur une notion trs rapidement survole plus haut : celle de programmation structure . En fait,
nous avons jusqu prsent, tels Monsieur Jourdain, fait de la programmation structure sans le savoir. Aussi, plutt
quexpliquer longuement en quoi cela consiste, je prfre prendre le problme par l'autre bout : en quoi cela ne
consiste pas.
Dans certains langages (historiquement, ce sont souvent des langages anciens), les lignes de programmation
portent des numros. Et les lignes sont excutes par la machine dans lordre de ces numros. Jusquici, en soi, pas
de problme. Mais lastuce est que tous ces langages, il existe une instruction de branchement, note aller en
pseudo-code, instruction qui envoie directement le programme la ligne spcifie. Inversement, ce type de
langage ne comporte pas dinstructions comme FinTantQue, ou FinSi, qui ferment un bloc.
Prenons lexemple dune structure Si Alors Sinon
Programmation Structure
Si condition Alors
instructions 1
Sinon
instructions 2
FinSi
Programmation non structure
1000 Si condition Alors Aller En 1200
1100 instruction 1
1110 etc.
1120 etc.
1190 Aller en 1400
1200 instruction 2
1210 etc.
1220 etc.
1400 suite de lalgorithme

Vous voyez le topo : un programme crit dans ce type de langages se prsente comme une suite de
branchements emmls les uns dans les autres. Dune part, on ne peut pas dire que cela favorise la lisibilit du
programme. Dautre part, cest une source importante derreurs, car tt ou tard on oublie un aller , ou on un
met un de trop, etc. A fortiori lorsquon complique un algorithme existant, cela peut devenir un jungle
inextricable.
A linverse, la programmation structure, surtout si lon prend soin de rationaliser la prsentation en mettant
des lignes de commentaires et en pratiquant lindentation, vite des erreurs, et rvle sa structure logique de
manire trs claire.
Le danger est que si la plupart des langages de programmation utiliss sont structurs, ils offrent tout de mme
la plupart du temps la possibilit de pratiquer la programmation non structure. Dans ce cas, les lignes ne sont pas
dsignes par des numros, mais certaines peuvent tre repres par des noms (dits tiquettes ) et on dispose
dune instruction de branchement.
Une rgle dhygine absolue est de programmer systmatiquement de manire structure, sauf impratif
contraire fix par le langage (ce qui est aujourd'hui de plus en plus rare).
Autrement dit, mme quand un langage vous offre une possibilit de faire des entorses la programmation
structure, il ne faut sen saisir sous aucun prtexte.

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

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

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

Cest cela que sert un langage : vous pargner la programmation en binaire (une pure horreur, vous vous en
doutez) et vous permettre de vous faire comprendre de lordinateur dune manire (relativement) lisible.
Cest pourquoi tout langage, partir dun programme crit, doit obligatoirement procder une traduction en
langage machine pour que ce programme soit excutable.
Il existe deux stratgies de traduction, ces deux stratgies tant parfois disponibles au sein du mme langage.

le langage traduit les instructions au fur et mesure quelles se prsentent. Cela sappelle la

compilation la vole, ou linterprtation.

le langage commence par traduire lensemble du programme en langage machine, constituant ainsi

un deuxime programme (un deuxime fichier) distinct physiquement et logiquement du premier. Ensuite,
et ensuite seulement, il excute ce second programme. Cela sappelle la compilation
Il va de soi quun langage interprt est plus maniable : on peut excuter directement son code - et donc le
tester - au fur et mesure quon le tape, sans passer chaque fois par ltape supplmentaire de la compilation.
Mais il va aussi de soi quun programme compil sexcute beaucoup plus rapidement quun programme interprt :
le gain est couramment dun facteur 10, voire 20 ou plus.

Toute application destine un usage professionnel (ou mme, tout simplement srieux) est forcment une
application compile.

3. UNE LOGIQUE VICELARDE : LA PROGRAMMATION RECURSIVE


Vous savez comment sont les informaticiens : on ne peut pas leur donner quoi que ce soit sans quils essayent de
jouer avec, et le pire, cest quils y russissent.
La programmation des fonctions personnalises a donn lieu l'essor dune logique un peu particulire, adapte
en particulier au traitement de certains problmes mathmatiques (ou de jeux) : la programmation rcursive. Pour
vous expliquer de quoi il retourne, nous allons reprendre un exemple cher vos curs : le calcul dune factorielle
(l, je sentais que jallais encore me faire des copains).
Rappelez-vous : la formule de calcul de la factorielle dun nombre n scrit :
N!=1x2x3xxn
Nous avions programm cela aussi sec avec une boucle Pour, et roule Raoul. Mais une autre manire de voir les
choses, ni plus juste, ni moins juste, serait de dire que quel que soit le nombre n :
n ! = n x (n-1) !
En bon franais : la factorielle dun nombre, cest ce nombre multipli par la factorielle du nombre prcdent.
Encore une fois, cest une manire ni plus juste ni moins juste de prsenter les choses ; cest simplement une
manire diffrente.
Si lon doit programmer cela, on peut alors imaginer une fonction Fact, charge de calculer la factorielle. Cette
fonction effectue la multiplication du nombre pass en argument par la factorielle du nombre prcdent. Et cette
factorielle du nombre prcdent va bien entendu tre elle-mme calcule par la fonction Fact.
Autrement dit, on va crer une fonction qui pour fournir son rsultat, va sappeler elle-mme un certain
nombre de fois. Cest cela, la rcursivit.
Toutefois, il nous manque une chose pour finir : quand ces auto-appels de la fonction Fact vont-ils sarrter ?
Cela naura-t-il donc jamais de fin ? Si, bien sr, rassure-toi, public, la rcursivit, ce nest pas Les Feux de
LAmour. On sarrte quand on arrive au nombre 1, pour lequel la factorielle est par dfinition 1.
Cela produit lcriture suivante, un peu dconcertante certes, mais parfois trs pratique :
Fonction Fact (N en Numrique)
Si N = 0 alors
Renvoyer 1
Sinon
Renvoyer Fact(N-1) * N
Finsi
Fin Fonction

Vous remarquerez que le processus rcursif remplace en quelque sorte la boucle, cest--dire un processus
itratif. Et en plus, avec tous ces nouveaux mots qui riment, vous allez pouvoir crire de trs chouettes pomes.
Vous remarquerez aussi quon traite le problme lenvers : on part du nombre, et on remonte rebours jusqu 1
pour pouvoir calculer la factorielle. Cet effet de rebours est caractristique de la programmation rcursive.
Pour conclure sur la rcursivit, trois remarques fondamentales.

la programmation rcursive, pour traiter certains problmes, est trs conomique pour le

programmeur ; elle permet de faire les choses correctement, en trs peu d'instructions.

en revanche, elle est trs dispendieuse de ressources machine. Car lexcution, la machine va

tre oblige de crer autant de variables temporaires que de tours de fonction en attente.

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

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