Vous êtes sur la page 1sur 183

PARTIE 1

INTRODUCTION A LALGORITHMIQUE

Un langage de programmation est une convention

pour donner des ordres un ordinateur. Ce nest pas


cens tre obscur, bizarre et plein de piges
subtils. a, ce sont les caractristiques de la
magie.
C'est

illogique,

Dave

Capitaine

Small
-

Mr

Spock

Lalgorithmique est un terme dorigine arabe, comme algbre, amiral ou znith.


Ce nest pas une excuse pour massacrer son orthographe, ou sa prononciation.
Ainsi, lalgo nest pas rythmique , la diffrence du bon rockn roll. Lalgo
nest pas non plus lagglo .
Alors, ne confondez pas lalgorithmique avec lagglo rythmique, qui consiste
poser des parpaings en cadence.

1. QUEST-CE

QUE LALGOMACHIN

Avez-vous dj ouvert un livre de recettes de cuisine ? Avez vous dj


dchiffr

un

mode

demploi

traduit directement

du

coren pour

faire

fonctionner un magntoscope ou un rpondeur tlphonique rticent ? Si oui,


sans le savoir, vous avez dj excut des algorithmes.
Plus fort : avez-vous dj indiqu un chemin un touriste gar ? Avez vous
fait chercher un objet quelquun par tlphone ? Ecrit une lettre anonyme
stipulant comment procder une remise de ranon ? Si oui, vous avez dj
fabriqu et fait excuter des algorithmes.

Comme quoi, lalgorithmique nest pas un savoir sotrique rserv quelques


rares initis touchs par la grce divine, mais une aptitude partage par la
totalit de lhumanit. Donc, pas dexcuses
Un algorithme, cest une suite dinstructions, qui une fois excute
correctement, conduit un rsultat donn. Si lalgorithme est juste, le
rsultat est le rsultat voulu, et le touriste se retrouve l o il voulait aller. Si
lalgorithme est faux, le rsultat est, disons, alatoire, et dcidment, cette
saloperie de rpondeur ne veut rien savoir.
Compltons toutefois cette dfinition. Aprs tout, en effet, si lalgorithme,
comme on vient de le dire, nest quune suite dinstructions menant celui qui
lexcute rsoudre un problme, pourquoi ne pas donner comme instruction
unique : rsous le problme , et 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 . Fautil tre bon en maths pour expliquer correctement son chemin quelquun ? Je
vous laisse juger.
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 at-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.
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 pseudo-code, encore une fois, est purement conventionnel ;


aucune machine nest cense le reconnatre. Donc, chaque cuisinier peut faire sa
sauce sa guise, avec ses petites pices bien lui, sans que cela prte
consquence.
Comme je nai pas moins de petites manies que la majorit de mes semblables,
le 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 1
LES VARIABLES

Nattribuez jamais la malveillance ce qui


sexplique trs bien par lincomptence. - Napolon
Bonaparte
A

lorigine

de

toute

erreur

attribue

lordinateur, vous trouverez au moins deux erreurs


humaines. Dont celle consistant attribuer lerreur

1. A

QUOI SERVENT LES VARIABLES

lordinateur.

Anonyme

Dans un programme informatique, on va avoir en permanence besoin de stocker


provisoirement des valeurs. Il peut sagir de donnes issues du disque dur,
fournies par lutilisateur (frappes au clavier), ou que sais-je encore. Il peut
aussi sagir de rsultats obtenus par le programme, intermdiaires ou dfinitifs.

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

2. DECLARATION

DES VARIABLES

La premire chose faire avant de pouvoir utiliser une variable est de crer
la bote et de lui coller une tiquette. Ceci se fait tout au dbut de
lalgorithme, avant mme les instructions proprement dites. Cest ce quon appelle
la dclaration des variables. Cest un genre de dclaration certes moins

romantique quune dclaration damour, mais dun autre ct moins dsagrable


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

2.1 Types numriques classiques


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

les valeurs maximales et minimales des nombres pouvant tre

stocks dans la variable

la prcision de ces nombres (dans le cas de nombres dcimaux).

Tous les langages, quels quils soient offrent un bouquet de types


numriques, dont le dtail est susceptible de varier lgrement dun langage
lautre.

Grosso

modo,

on

retrouve

cependant

les

types

suivants :

Type Numrique

Plage

Byte (octet)

0 255

Entier simple

-32 768 32 767

Entier long

-2 147 483 648 2 147 483 647

Rel simple

-3,40x1038 -1,40x1045 pour les valeurs ngatives


1,40x10-45 3,40x1038 pour les valeurs positives

Rel double

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


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

Pourquoi ne pas dclarer toutes les variables numriques en rel


double, histoire de btonner et dtre certain quil ny aura pas de
problme ? En vertu du principe de lconomie de moyens. Un bon
algorithme ne se contente pas de marcher ; il marche en vitant
de gaspiller les ressources de la machine. Sur certains programmes
de grande taille, labus de variables surdimensionnes peut entraner
des ralentissements notables lexcution, voire un plantage pur et
simple de lordinateur. Alors, autant prendre ds le dbut de bonnes
habitudes dhygine.

En algorithmique, on ne se tracassera pas trop avec les sous-types de


variables numriques (sachant qu'on aura toujours assez de soucis comme a,
allez). On se contentera donc de prciser qu'il s'agit d'un nombre, en gardant en
tte que dans un vrai langage, il faudra tre plus prcis.

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


Variable g en Numrique
ou encore
Variables PrixHT, TauxTVA, PrixTTC en Numrique
2.2 Autres types numriques
Certains langages autorisent dautres types numriques, notamment :

le type montaire (avec strictement deux chiffres aprs la virgule)

le type date (jour/mois/anne).

Nous nemploierons pas ces types dans ce cours ; mais je les signale, car vous
ne manquerez pas de les rencontrer en programmation proprement dite.

2.3 Type alphanumrique


Fort heureusement, les botes que sont les variables peuvent contenir bien
dautres informations que des nombres. Sans cela, on serait un peu embt ds
que lon devrait stocker un nom de famille, par exemple.
On dispose donc galement du type alphanumrique (galement appel type
caractre, type chane ou en anglais, le type string mais ne fantasmez pas trop
vite, les string, cest loin dtre aussi excitant que le nom le suggre. Une
tudiante qui se reconnatra si elle lit ces lignes a d'ailleurs mis le doigt - si j'ose
m'exprimer ainsi - sur le fait qu'il en va de mme en ce qui concerne les bytes).
Dans une variable de ce type, on stocke des caractres, quil sagisse de
lettres, de signes de ponctuation, despaces, ou mme de chiffres. Le nombre
maximal de caractres pouvant tre stocks dans une seule variable string
dpend du langage utilis.

Un groupe de caractres (y compris un groupe de un, ou de zro caractres),


quil soit ou non stock dans une variable, dailleurs, est donc souvent appel
chane de caractres.
En pseudo-code, une chane de caractres est toujours note entre
guillemets
Pourquoi

diable ?

Pour

viter

deux

sources

principales

de possibles

confusions :

la confusion entre des nombres et des suites de chiffres. Par

exemple, 423 peut reprsenter le nombre 423 (quatre cent vingt-trois),


ou la suite de caractres 4, 2, et 3. Et ce nest pas du tout la mme chose !
Avec le premier, on peut faire des calculs, avec le second, point du tout.
Ds lors, les guillemets permettent dviter toute ambigut : sil ny en a
pas, 423 est quatre cent vingt trois. Sil y en a, "423" reprsente la suite
des chiffres 4, 2, 3.

Mais ce n'est pas le pire. L'autre confusion, bien plus grave - et

bien plus frquente consiste se mlanger les pinceaux entre le nom


d'une variable et son contenu. Pour parler simplement, cela consiste
confondre l'tiquette d'une bote et ce qu'il y a l'intrieur On
reviendra

sur

ce

point

crucial

dans

quelques

instants.

2.4 Type boolen


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

Le type boolen est trs souvent nglig par les programmeurs,


tort.

Il est vrai qu'il n'est pas proprement parler indispensable, et qu'on


pourrait crire peu prs nimporte quel programme en l'ignorant
compltement. Pourtant, si le type boolen est mis disposition des
programmeurs dans tous les langages, ce n'est pas pour rien. Le
recours aux variables boolennes s'avre trs souvent un puissant
instrument de lisibilit des algorithmes : il peut faciliter la vie de
celui qui crit l'algorithme, comme de celui qui le relit pour le
corriger.

Alors, maintenant, c'est certain, en algorithmique, il y a une question


de style : c'est exactement comme dans le langage courant, il y a
plusieurs manires de s'exprimer pour dire sur le fond la mme
chose. Nous verrons plus loin diffrents exemples de variations
stylistiques autour d'une mme solution. En attendant, vous tes
prvenus : l'auteur de ce cours est un adepte fervent (mais pas
irraisonn) de l'utilisation des variables boolennes.

3. LINSTRUCTION DAFFECTATION
3.1 Syntaxe et signification
Ouf, aprs tout ce baratin prliminaire, on aborde enfin nos premires
vritables manipulations dalgorithmique. Pas trop tt, certes, mais pas moyen de
faire autrement !

En fait, la variable (la bote) n'est pas un outil bien sorcier manipuler. A la
diffrence du couteau suisse ou du superbe robot mnager vendu sur Tl
Boutique Achat, on ne peut pas faire trente-six mille choses avec une variable,
mais seulement une et une seule.
Cette seule chose quon puisse faire avec une variable, cest laffecter, cest-dire lui attribuer une valeur. Pour poursuivre la superbe mtaphore file dj
employe, on peut remplir la bote.
En pseudo-code, l'instruction d'affectation se note avec le signe
Ainsi :
Toto 24
Attribue la valeur 24 la variable Toto.
Ceci, soit dit en passant, sous-entend imprativement que Toto soit une
variable de type numrique. Si Toto a t dfini dans un autre type, il faut bien
comprendre que cette instruction provoquera une erreur. Cest un peu comme si,
en donnant un ordre quelquun, on accolait un verbe et un complment
incompatibles, du genre Epluchez la casserole . Mme dote de la meilleure
volont du monde, la mnagre lisant cette phrase ne pourrait quinterrompre
dubitativement sa tche. Alors, un ordinateur, vous pensez bien
On peut en revanche sans aucun problme attribuer une variable la valeur
dune autre variable, telle quelle ou modifie. Par exemple :
Tutu Toto
Signifie que la valeur de Tutu est maintenant celle de Toto.

Notez bien que cette instruction na en rien modifi la valeur de Toto : une
instruction daffectation ne modifie que ce qui est situ gauche de la
flche.
Tutu Toto + 4
Si Toto contenait 12, Tutu vaut maintenant 16. De mme que prcdemment,
Toto vaut toujours 12.
Tutu Tutu + 1
Si Tutu valait 6, il vaut maintenant 7. La valeur de Tutu est modifie, puisque
Tutu est la variable situe gauche de la flche.
Pour revenir prsent sur le rle des guillemets dans les chanes de
caractres et sur la confusion numro 2 signale plus haut, comparons
maintenant deux algorithmes suivants :
Exemple n1
Dbut
Riri "Loulou"
Fifi "Riri"
Fin

Exemple n2
Dbut
Riri "Loulou"
Fifi Riri
Fin

La seule diffrence entre les deux algorithmes consiste dans la prsence ou


dans labsence des guillemets lors de la seconde affectation. Et l'on voit que cela
change tout !
Dans l'exemple n1, ce que l'on affecte la variable Fifi, c'est la suite de
caractres R i r - i. Et la fin de lalgorithme, le contenu de la variable Fifi
est donc Riri .
Dans l'exemple n2, en revanche, Riri tant dpourvu de guillemets, n'est pas
considr comme une suite de caractres, mais comme un nom de variable. Le
sens de la ligne devient donc : affecte la variable Fifi le contenu de la
variable Riri . A la fin de lalgorithme n2, la valeur de la variable Fifi est donc
Loulou . Ici, loubli des guillemets conduit certes un rsultat, mais un
rsultat diffrent.
A noter, car cest un cas trs frquent, que gnralement, lorsquon oublie les
guillemets lors dune affectation de chane, ce qui se trouve droite du signe
daffectation ne correspond aucune variable prcdemment dclare et
affecte. Dans ce cas, loubli des guillemets se solde immdiatement par une
erreur dexcution.
Ceci est une simple illustration. Mais elle rsume lensemble des problmes qui
surviennent lorsquon oublie la rgle des guillemets aux chanes de caractres.

3.2 Ordre des instructions


Il va de soi que lordre dans lequel les instructions sont crites va jouer un
rle essentiel dans le rsultat final. Considrons les deux algorithmes suivants :
Exemple 1
Variable A en Numrique
Dbut
A 34
A 12

Fin

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

Exemple 2
Variable A en Numrique

Dbut
A 34
Fin
Tous les lments sont maintenant en votre possession pour que ce soit vous
de jouer !

4. EXPRESSIONS

ET OPERATEURS

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


trouve :

gauche de la flche, un nom de variable, et uniquement cela. En ce

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

droite de la flche, ce quon appelle une expression. Voil encore

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

Une expression est un ensemble de valeurs, relies par des oprateurs, et


quivalent une seule valeur
Cette dfinition vous parat peut-tre obscure. Mais rflchissez-y quelques
minutes, et vous verrez quelle recouvre quelque chose dassez simple sur le fond.
Par exemple, voyons quelques expressions de type numrique. Ainsi :

7
5+4
123-45+844
Toto-12+5-Riri
sont toutes des expressions valides, pour peu que Toto et Riri soient bien
des nombres. Car dans le cas contraire, la quatrime expression na pas de sens.
En loccurrence, les oprateurs que jai employs sont laddition (+) et la
soustraction (-).
Revenons pour le moment sur laffectation. Une condition supplmentaire (en
plus des deux prcdentes) de validit dune instruction daffectation est que :

lexpression situe droite de la flche soit du mme type que la

variable situe gauche. Cest trs logique : on ne peut pas ranger


convenablement des outils dans un sac provision, ni des lgumes dans une
trousse outils sauf provoquer un rsultat catastrophique.
Si lun des trois points numrs ci-dessus nest pas respect, la machine sera
incapable dexcuter laffectation, et dclenchera une erreur (est-il besoin de
dire que si aucun de ces points nest respect, il y aura aussi erreur !)
On va maintenant dtailler ce que lon entend par le terme doprateur.
Un oprateur est un signe qui relie deux valeurs, pour produire un rsultat.
Les oprateurs possibles dpendent du type des valeurs qui sont en jeu.
Allons-y, faisons le tour, cest un peu fastidieux, mais comme dit le sage au petit
scarabe, quand cest fait, cest plus faire.

4.1 Oprateurs numriques :


Ce sont les quatre oprations arithmtiques tout ce quil y a de classique.

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

4.2 Oprateur alphanumrique : &


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

4.3 Oprateurs logiques (ou boolens) :


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

5. DEUX

REMARQUES POUR TERMINER

Maintenant que nous sommes familiers des variables et que nous les
manipulons les yeux ferms (mais les neurones en veil, toutefois), jattire votre
attention sur la trompeuse similitude de vocabulaire entre les mathmatiques et
linformatique. En mathmatiques, une variable est gnralement une
inconnue, qui recouvre un nombre non prcis de valeurs. Lorsque jcris :
y=3x+2
les variables x et y satisfaisant lquation existent en nombre infini
(graphiquement, lensemble des solutions cette quation dessine une droite).
Lorsque jcris :
ax + bx + c = 0
la variable x dsigne les solutions cette quation, cest--dire zro, une
ou deux valeurs la fois
En informatique, une variable possde un moment donn une valeur et
une seule. A la rigueur, elle peut ne pas avoir de valeur du tout (une fois quelle a
t dclare, et tant quon ne la pas affecte. A signaler que dans certains
langages, les variables non encore affectes sont considres comme valant
automatiquement zro). Mais ce qui est important, cest que cette valeur
justement, ne varie pas proprement parler. Du moins ne varie-t-elle que
lorsquelle est lobjet dune instruction daffectation.

La deuxime remarque concerne le signe de laffectation. En algorithmique,


comme on la vu, cest le signe . Mais en pratique, la quasi totalit des langages
emploient le signe gal. Et l, pour les dbutants, la confusion avec les maths est
galement facile. En maths, A = B et B = A sont deux propositions strictement
quivalentes. En informatique, absolument pas, puisque cela revient crire A
et B

A, deux choses bien diffrentes. De mme, A = A + 1, qui en

mathmatiques,

constitue

une

quation

sans

solution,

reprsente

en

programmation une action tout fait licite (et de surcrot extrmement


courante). Donc, attention

! ! ! La meilleure des vaccinations contre cette

confusion consiste bien employer le signe

en pseudo-code, signe qui a le

mrite de ne pas laisser place lambigut. Une fois acquis les bons rflexes
avec ce signe, vous naurez plus aucune difficult passer au = des langages de
programmation.
ENONCE

DES

EXERCICES

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

Exercice 1.2

Quelles seront les valeurs des variables A, B et C aprs excution des


instructions suivantes ?
Variables A, B, C en Entier
Dbut
A5
B3
CA+B
A2
CBA
Fin
corrig - retour au cours

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

Exercice 1.4
Quelles seront les valeurs des variables A, B et C aprs excution des
instructions suivantes ?

Variables A, B, C en Entier
Dbut
A3
B 10
CA+B
BA+B
AC
Fin
corrig - retour au cours

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

Exercice 1.6

Plus difficile, mais cest un classique absolu, quil faut absolument


matriser : crire un algorithme permettant dchanger les valeurs de
deux variables A et B, et ce quel que soit leur contenu pralable.
corrig - retour au cours

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

Exercice 1.8
Que produit lalgorithme suivant ?
Variables A, B, C en Caractres
Dbut
A "423"
B "12"
CA+B
Fin
corrig - retour au cours

Exercice 1.9
Que produit lalgorithme suivant ?
Variables A, B, C en Caractres
Dbut

A "423"
B "12"
CA&B
Fin

CORRIGES DES EXERCICES

Exercice 1.1
Aprs

La

valeur
A

A3

des

A = 3

variables est

=
B

?
=

B = 4
nonc - retour au cours

Exercice 1.2
Aprs
A

La
5

CBA

valeur

A
A = 2

des

variables est

B
B
5

=
B

B = 3

=?
3
=

3
3

:
=

C = 1
nonc - retour au cours

Exercice 1.3
Aprs
A

La

valeur
A

des
5

variables est
B

:
?

BA4

A = 6

B = 2
nonc - retour au cours

Exercice 1.4
Aprs

La

valeur

des

variables est

=?

10

= 10

= 10

13

= 13

13

AC

A = 13

B = 13

C = 13
nonc - retour au cours

Exercice 1.5
Aprs

La

valeur

des

variables est

=?

=2

A
BA

A = 2

=2

B = 2

Les deux dernires instructions ne permettent donc pas dchanger les


deux valeurs de B et A, puisque lune des deux valeurs (celle de A) est
ici

crase.

Si lon inverse les deux dernires instructions, cela ne changera rien du


tout, hormis le fait que cette fois cest la valeur de B qui sera crase.
nonc - retour au cours

Exercice 1.6
Dbut

CA
AB
BC
Fin
On est oblig de passer par une variable dite temporaire (la variable
C).
nonc - retour au cours

Exercice 1.7
Dbut

DC
CB
BA
AD
Fin
En fait, quel que soit le nombre de variables, une seule variable
temporaire suffit
nonc - retour au cours

Exercice 1.8
Il ne peut produire quune erreur dexcution, puisquon ne peut pas
additionner des caractres.
nonc - retour au cours

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

PARTIE 2
LECTURE ET ECRITURE

Un programme est un sort jet sur un ordinateur,

qui transforme tout texte saisi au clavier en


message

derreur.

Anonyme

Un clavier Azerty en vaut deux - Anonyme

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

ENONCE

DES

EXERCICES

Exercice 2.1
Quel rsultat produit le programme suivant ?
Variables val, double numriques
Dbut
Val 231
Double Val * 2
Ecrire Val
Ecrire Double
Fin
corrig - retour au cours

Exercice 2.2
Ecrire un programme qui demande un nombre lutilisateur, puis qui
calcule et affiche le carr de ce nombre.
corrig - retour au cours

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

Exercice 2.4

Ecrire un algorithme utilisant des variables de type chane de


caractres, et affichant quatre variantes possibles de la clbre
belle marquise, vos beaux yeux me font mourir damour . On ne se
soucie pas de la ponctuation, ni des majuscules.
corrig - retour au cours
CORRIGES DES EXERCICES

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

Exercice 2.2
nb,

Variables

carr

en

Entier

Dbut
"Entrez

Ecrire

un

nombre

:"
nb

Lire
carr
Ecrire

nb

"Son

carr

*
est

nb
",

carr

Fin
En fait, on pourrait tout aussi bien conomiser la variable carr en
remplaant les deux avant-dernires lignes par :
Ecrire "Son carr est : ", nb*nb
C'est une question de style ; dans un cas, on privilgie la lisibilit de
l'algorithme, dans l'autre, on privilgie l'conomie d'une variable.
nonc - retour au cours

Exercice 2.3
Variables
Dbut

nb,

pht,

ttva,

pttc

en

Numrique

"Entrez

Ecrire

le

prix

hors

taxes

:"
pht

Lire
"Entrez

Ecrire

le

nombre

darticles

:"
nb

Lire
"Entrez

Ecrire

le

taux

de

TVA

:"
ttva

Lire
pttc

nb

pht

Ecrire

"Le

prix

toutes

(1

taxes

est

ttva)
",

pttc

Fin
L aussi, on pourrait squeezer une variable et une ligne en crivant
directement. :
Ecrire "Le prix toutes taxes est : ", nb * pht * (1 + ttva)
C'est plus rapide, plus lger en mmoire, mais un peu plus difficile
relire (et crire !)
nonc - retour au cours

Exercice 2.4
t1,

Variables

t2,

t3,

t4

en

Caractre

Dbut
t1

"belle

Marquise"

t2

"vos

beaux

t3

"me

font

t4

yeux"
mourir"
"damour"

Ecrire

t1

&

"

"

&

t2

&

"

"

&

t3

&

"

"

&

t4

Ecrire

t3

&

"

"

&

t2

&

"

"

&

t4

&

"

"

&

t1

Ecrire

t2

&

"

"

&

t3

&

"

"

&

t1

&

"

"

&

t4

Ecrire

t4

&

"

"

&

t1

&

"

"

&

t2

&

"

"

&

t3

Fin

PARTIE 3
LES TESTS

Il est assez difficile de trouver une erreur dans

son code quand on la cherche. Cest encore bien plus


dur quand on est convaincu que le code est juste. Steve

McConnell

Il nexiste pas, et il nexistera jamais, de langage

dans lequel il soit un tant soit peu difficile dcrire


de

mauvais

programmes .

Anonyme

Si le dboguage est lart denlever les bogues,

alors la programmation doit tre lart de les crer.


-

Anonyme

Je vous avais dit que lalgorithmique, cest la combinaison de quatre structures


lmentaires. Nous en avons dj vu deux, voici la troisime. Autrement dit, on a
quasiment fini le programme.
Mais non, je rigole.

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.

Retour Haut de Page


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
Instructions

Sinon

Alors
1

Instructions

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

Retour Haut de Page


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

VRAI

Maman > Papa

FAUX

maman > Papa

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

<

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.

Exercice 3.1

Retour Haut de Page


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

LE

GAG

C1 Vrai

Faux

C1 Faux

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

Exercice 3.2
Exercice 3.3

Retour Haut de Page


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.

Exercice 3.4
Exercice 3.5
Exercice 3.6

Retour Haut de Page


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.

Retour Haut de Page


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 (rassurezvous, rien voir avec le flagrant dlit des policiers).

ENONCE

DES

EXERCICES

Exercice 3.1
Ecrire un algorithme qui demande un nombre lutilisateur, et linforme
ensuite si ce nombre est positif ou ngatif (on laisse de ct le cas o
le nombre vaut zro).
corrig - retour au cours

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

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

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

corrig - retour au cours

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

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

"Poussin" de 6 7 ans

"Pupille" de 8 9 ans

"Minime" de 10 11 ans

"Cadet" aprs 12 ans

Peut-on concevoir plusieurs algorithmes quivalents menant ce


rsultat ?
CORRIGES

DES

EXERCICES

Exercice 3.1
n

Variable

en

Entier

Dbut
"Entrez

Ecrire

un

nombre :

"
n

Lire
n

Si
Ecrire

>
"Ce

0
nombre

Alors
est

positif

Sinon
"Ce

Ecrire

nombre

est

ngatif"

Finsi
Fin
nonc - retour au cours

Exercice 3.2
m,

Variables

en

Entier

Dbut
"Entrez

Ecrire

deux

"

m,

Lire
Si

nombres :

(m

>

ET

>

0)

OU

n
(m

<

ET

<

0)

Alors

Ecrire

"Leur

produit

est

positif"

Ecrire

"Leur

produit

est

ngatif"

Sinon

Finsi
Fin
nonc - retour au cours

Exercice 3.3
a,

Variables

b,

en

Caractre

Dbut
"Entrez

Ecrire

trois

a,

Lire
Si

successivement

a
Ecrire

<

b,

"Ces

noms :

ET

noms

sont

c
<

classs

"

Alors

alphabtiquement"

Sinon
Ecrire

"Ces

noms

ne

sont

pas

classs"

Finsi
Fin
nonc - retour au cours

Exercice 3.4
n

Variable

en

Entier

Dbut
"Entrez

Ecrire

un

nombre :

"
n

Lire
n

Si

<

"Ce

Ecrire

nombre

SinonSi

est

=
"Ce

Ecrire

Alors
ngatif"

Alors

nombre

est

nul"

Sinon
"Ce

Ecrire

nombre

est

positif"

Finsi
Fin
nonc - retour au cours

Exercice 3.5
m,

Variables

en

Entier

Dbut
"Entrez

Ecrire

deux

(m

<

Ecrire

OU

ET

n
"Le

<

n
n

"Le

Ecrire
SinonSi

"

m,

Lire
Si

nombres :

produit
0)

OU

(m

produit

>

Alors

est
0

ET
est

nul"
>

0)

Alors
positif"

Sinon
"Le

Ecrire

produit

est

ngatif"

Finsi
Fin
Si on souhaite simplifier lcriture de la condition lourde du SinonSi, on
peut toujours passer par des variables boolennes intermdiaires. Une
astuce de sioux consiste galement employer un Xor (c'est l'un des
rares cas dans lesquels il est pertinent)
nonc - retour au cours

Exercice 3.6
age

Variable

en

Entier

Dbut
Ecrire

"Entrez

lge

de

lenfant :

"
age

Lire
Si

age

>=

12
"Catgorie

Ecrire
SinonSi

age

10

age

>=

age
Ecrire

>=

Alors
Minime"

"Catgorie

Ecrire
SinonSi

Cadet"

"Catgorie

Ecrire
SinonSi

>=

Alors

Alors
Pupille"

"Catgorie

Alors
Poussin"

Finsi
Fin
On peut videmment crire cet algorithme de diffrentes faons, ne
serait-ce quen commenant par la catgorie la plus jeune.
ENCORE DE LA LOGIQUE

La programmation peut tre un plaisir ; de mme

que la cryptographie. Toutefois, il faut viter de


combiner les deux. - Kreitzberg et Sneidermann

1. FAUT-IL

METTRE UN

ET ? FAUT-IL

METTRE UN

OU ?

Une remarque pour commencer : dans le cas de conditions composes, les


parenthses jouent un rle fondamental.
Variables A, B, C, D, E en Boolen
Variable X en Entier
Dbut
Lire X
A X > 12
BX>2
CX<6
D (A ET B) OU C
E A ET (B OU C)
Ecrire D, E
Fin
Si X = 3, alors on remarque que D sera VRAI alors que E sera FAUX.
Sil ny a dans une condition que des ET, ou que des OU, en revanche, les
parenthses ne changent strictement rien.
Dans une condition compose employant la fois des oprateurs ET et des
oprateurs OU, la prsence de parenthses possde une influence sur le
rsultat, tout comme dans le cas dune expression numrique comportant des
multiplications et des additions.
On en arrive une autre proprit des ET et des OU, bien plus intressante.

Spontanment, on pense souvent que ET et OU sexcluent mutuellement, au


sens o un problme donn sexprime soit avec un ET, soit avec un OU. Pourtant,
ce nest pas si vident.
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.

Exercice 4.1
Exercice 4.2

Exercice 4.3
Exercice 4.4
Exercice 4.5

Retour Haut de Page


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.

Exercice 4.6
Exercice 4.7
Exercice 4.8

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

Les premiers 90% du code prennent les premiers

90% du temps de dveloppement. Les 10% restants


prennent

les

autres

dveloppement

90%
-

du

temps

Tom

de

Cargill

Et a y est, on y est, on est arrivs, la voil, cest Broadway, la quatrime et


dernire structure : a est les boucles. Si vous voulez pater vos amis, vous
pouvez galement parler de structures

rptitives, voire carrment de

structures itratives. Ca calme, hein ? Bon, vous faites ce que vous voulez, ici on
est entre nous, on parlera de boucles.
Les

boucles,

c'est

gnralement

le

point

douloureux

de

l'apprenti

programmeur. C'est l que a coince, car autant il est assez facile de


comprendre comment fonctionnent les boucles, autant il est souvent long
d'acqurir les rflexes qui permettent de les laborer judicieusement pour
traiter un problme donn.
On peut dire en fait que les boucles constituent la seule vraie structure
logique caractristique de la programmation. Si vous avez utilis un tableur
comme Excel, par exemple, vous avez sans doute pu manier des choses

quivalentes aux variables (les cellules, les formules) et aux tests (la fonction
SI). Mais les boucles, a, a n'a aucun quivalent. Cela n'existe que dans les
langages de programmation proprement dits.
Le maniement des boucles, s'il ne diffrencie certes pas l'homme de la bte (il
ne faut tout de mme pas exagrer), est tout de mme ce qui spare en
informatique le programmeur de l'utilisateur, mme averti.
Alors, vos futures et invitables - difficults sur le sujet, il y a trois
remdes : de la rigueur, de la patience, et encore de la rigueur !

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
Mais

sur
la

faute

laquelle

vous

symtrique

est

avez
au

moins

tant
aussi

su

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

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

Exercice 5.1
Exercice 5.2
Exercice 5.3

Retour Haut de Page

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.

Retour Haut de Page


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

Retour Haut de Page

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.

Exercice 5.4
Exercice 5.5
Exercice 5.6
Exercice 5.7
Exercice 5.8
Exercice 5.9
Exercice 5.10

ENONCE

DES

EXERCICES

Exercice 5.1
Ecrire un algorithme qui demande lutilisateur un nombre compris
entre 1 et 3 jusqu ce que la rponse convienne.
corrig - retour au cours

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

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

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

7 x 10 = 70
corrig - retour au cours

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

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

Exercice 5.7
Ecrire

un

algorithme

qui

demande successivement

20

nombres lutilisateur, et qui lui dise ensuite quel tait le


plus grand parmi ces 20 nombres :
Entrez le nombre numro 1 : 12
Entrez le nombre numro 2 : 14
etc.
Entrez le nombre numro 20 : 6
Le plus grand de ces nombres est : 14
Modifiez ensuite lalgorithme pour que le programme affiche
de surcrot en quelle position avait t saisie ce nombre :
Ctait le nombre numro 2
corrig - retour au cours

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

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

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

DES

EXERCICES

Exercice 5.1
N

Variable

en

Entier

Debut
N

"Entrez

Ecrire

un

TantQue

nombre

<

entre

ou

et

>

<

ou

"Saisie

Ecrire

3
N

Lire
Si

3"

>

errone.

Alors

Recommencez
FinSi
FinTantQue

Fin
nonc - retour au cours

Exercice 5.2
N

Variable

en

Entier

Debut
N
Ecrire

"Entrez
N

TantQue

un

nombre

<

10

entre
ou

10
N

<

10
"Plus

Ecrire
N

SinonSi
Ecrire

>

20"
20
N

Lire
Si

et

>

grand !"
20

"Plus

Alors

Alors
petit !"
FinSi

FinTantQue
Fin
nonc - retour au cours

Exercice 5.3
N,

Variables

en

un

nombre :

Entier

Debut
"Entrez

Ecrire

"
N

Lire
"Les

Ecrire

10

Pour

nombres
N

suivants
1

sont :
N

"

10
i

Ecrire
i

Suivant

Fin
nonc - retour au cours

Exercice 5.4
N,

Variables

en

un

nombre :

Entier

Debut
"Entrez

Ecrire

"
N

Lire
"La

Ecrire

table

de

Pour
Ecrire

multiplication

"

ce

N,

de

",

i,

nombre

est :

"

"
10

",

n*i
Suivant

Fin
nonc - retour au cours

Exercice 5.5
Variables
Debut

N,

i,

Som

en

Entier

"Entrez

Ecrire

un

nombre :

"
N

Lire
Som

Pour

Som

Som

N
+

Suivant
"La

Ecrire

somme

est :

",

Som

Fin
nonc - retour au cours

Exercice 5.6
N,

Variables

i,

en

Entier

Debut
"Entrez

Ecrire

un

nombre :

"
N

Lire
F

Pour

i
Ecrire

Suivant
"La

factorielle

est :

",

Fin
nonc - retour au cours

Exercice 5.7
N,

Variables

i,

PG

en

Entier

Debut
PG
Pour

20

"Entrez

Ecrire

un

nombre :

"
N

Lire
i

Si

ou

PG

>

PG

Alors
N

FinSi
i

Suivant

Ecrire

"Le

nombre

le

plus

grand

tait :

",

PG

Fin
En ligne 3, on peut mettre nimporte quoi dans PG, il suffit que cette
variable soit affecte pour que le premier passage en ligne 7 ne
provoque

pas

d'erreur.

Pour la version amliore, cela donne :


Variables N, i, PG, IPG en Entier
Debut
PG 0
Pour i 1 20
Ecrire "Entrez un nombre : "
Lire N
Si i = 1 ou N > PG Alors
PG N
IPG i
FinSi
i Suivant
Ecrire "Le nombre le plus grand tait : ", PG
Ecrire "Il a t saisi en position numro ", IPG
Fin
nonc - retour au cours

Exercice 5.8
N,

Variables

i,

PG,

IPG

en

Entier

Debut
N

PG

TantQue

<>

"Entrez

Ecrire

un

nombre :

"
N

Lire
i
i

Si

ou

PG

>

1
PG

Alors
N

IPG

FinSi
FinTantQue
Ecrire
Ecrire

"Le
"Il

nombre
a

le

plus

saisi

en

grand

tait :

",

PG

position

numro

",

IPG

Fin
nonc - retour au cours

Exercice 5.9
Variables

FF,

somdue,

M,

IPG,

Reste,

Nb10F,

Nb5F

En

Entier

Debut
E

somdue

TantQue
Ecrire

<>

"Entrez

le

0
montant :

Lire
somdue

"

somdue

FinTantQue
Ecrire

"Vous

devez :",

E,

"

euros"

"Montant

Ecrire

vers :"
M

Lire
Reste

Nb10E

E
0

Reste

TantQue
Nb10E

>=
Nb10E

Reste

10
+

Reste

1
10

FinTantQue
Nb5E

Reste

>=

Nb5E

Si

Reste

Reste

FinSi
Ecrire

"Rendu

de

la

Ecrire

"Billets

de

10

E:

Ecrire

"Billets

de

E:

Ecrire

"Pices

de 1

E:

monnaie :"
",
",
",

Nb10E
Nb5E
reste

Fin
nonc - retour au cours

Exercice 5.10
Spontanment, on est tent d'crire l'algorithme suivant :
Variables N, P, i, Num, Dno1, Dno2 en Entier
Debut Ecrire "Entrez le nombre de chevaux partants : "
Lire N
Ecrire "Entrez le nombre de chevaux jous : "
Lire P

Num 1
Pour i 2 N
Num Num * i
i Suivant
Dno1 1
Pour i 2 N-P
Dno1 Dno1 * i
i Suivant
Dno2 1
Pour i 2 P
Dno2 Dno2 * i
i Suivant
Ecrire "Dans lordre, une chance sur ", Num / Dno1
Ecrire "Dans le dsordre, une sur ", Num / (Dno1 * Dno2)
Fin
Cette version, formellement juste, comporte tout de mme deux
faiblesses.
La premire, et la plus grave, concerne la manire dont elle calcule le
rsultat final. Celui-ci est le quotient d'un nombre par un autre ; or,
ces nombres auront rapidement tendance tre trs grands. En
calculant, comme on le fait ici, d'abord le numrateur, puis ensuite le
dnominateur, on prend le risque de demander la machine de stocker
des nombres trop grands pour qu'elle soit capable de les coder (cf. le
prambule). C'est d'autant plus bte que rien ne nous oblige
procder ainsi : on n'est pas oblig de passer par la division de deux
trs

grands

nombres

pour

obtenir

le

rsultat

voulu.

La deuxime remarque est qu'on a programm ici trois boucles


successives. Or, en y regardant bien, on peut voir qu'aprs
simplification de la formule, ces trois boucles comportent le mme
nombre de tours ! (si vous ne me croyez pas, crivez un exemple de

calcul et biffez les nombres identiques au numrateur et au


dnominateur). Ce triple calcul (ces trois boucles) peut donc tre
ramen(es) un(e) seul(e). Et voil le travail, qui est non seulement
bien plus court, mais aussi plus performant :
Variables N, P, i, O, F en Entier
Debut
Ecrire "Entrez le nombre de chevaux partants : "
Lire N
Ecrire "Entrez le nombre de chevaux jous : "
Lire P
A1
B1
Pour i 1 P
A A * (i + N - P)
BB*i
i Suivant
Ecrire "Dans lordre, une chance sur ", A
Ecrire "Dans le dsordre, une chance sur ", A / B
Fin
LES TABLEAUX

Si on ment un compilateur, il prendra sa

revanche.

Henry

Spencer.

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

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.

Retour Haut de Page


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 !

Exercice 6.1
Exercice 6.2
Exercice 6.3

Exercice 6.4
Exercice 6.5
Exercice 6.6
Exercice 6.7

Retour Haut de Page


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.

Exercice 6.8
Exercice 6.9
Exercice 6.10
Exercice 6.11
Exercice 6.12
Exercice 6.13
Exercice 6.14

Retour Haut de Page


ENONCE DES EXERCICES

Exercice 6.1
Ecrire un algorithme qui dclare et remplisse un tableau de 7 valeurs
numriques en les mettant toutes zro.
corrig - retour au cours

Exercice 6.2

Ecrire un algorithme qui dclare et remplisse un tableau contenant les


six voyelles de lalphabet latin.
corrig - retour au cours

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

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

Exercice 6.5

Que produit lalgorithme suivant ?


Tableau N(6) en Entier
Variables i, k en Entier
Dbut
N(0) 1
Pour k 1 6
N(k) N(k-1) + 2
k Suivant
Pour i 0 6
Ecrire N(i)
i suivant
Fin
Peut-on simplifier cet algorithme avec le mme rsultat ?
corrig - retour au cours

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

i suivant
Fin
corrig - retour au cours

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

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

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

Exercice 6.10

Ecrivez un algorithme constituant un tableau, partir de deux


tableaux de mme longueur pralablement saisis. Le nouveau tableau
sera la somme des lments des deux tableaux de dpart.
Tableau 1 :
4

12

11

11

10

Tableau 2 :
7

Tableau constituer :
11

14

corrig - retour au cours

Exercice 6.11
Toujours partir de deux tableaux prcdemment saisis, crivez un
algorithme qui calcule le schtroumpf des deux tableaux. Pour calculer
le schtroumpf, il faut multiplier chaque lment du tableau 1 par
chaque lment du tableau 2, et additionner le tout. Par exemple si
l'on a :
Tableau 1 :
4

Tableau 2 :

12

Le Schtroumpf sera :
3 * 4 + 3 * 8 + 3 * 7 + 3 * 12 + 6 * 4 + 6 * 8 + 6 * 7 + 6 * 12 = 279
corrig - retour au cours

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

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

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

DES

EXERCICES

Exercice 6.1
Truc(6)

Tableau

en

Variable

Numrique

en

Numrique

Debut
i

Pour

Truc(i)

6
0

Suivant

Fin
nonc - retour au cours

Exercice 6.2
Truc(5)

Tableau

en

Caractre

Debut
Truc(0)

"a"

Truc(1)

"e"

Truc(2)

"i"

Truc(3)

"o"

Truc(4)

"u"

Truc(5)

"y"

Fin
nonc - retour au cours

Exercice 6.3
Notes(8)

Tableau

Variable

Ecrire

"Entrez

Numrique

en

Pour

en

la

Numrique

note
Lire

numro

",

8
i

Notes(i)

Suivant

Fin
nonc - retour au cours

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

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

13.

k Suivant
Fin
nonc - retour au cours

Exercice 6.6
Cet algorithme remplit un tableau de 8 valeurs : 1, 1, 2, 3, 5, 8, 13, 21
nonc - retour au cours

Exercice 6.7
S

Variable

en

Notes(8)

Tableau

Numrique
en

Numrique

Debut
s

Pour

"Entrez

Ecrire

la

note

",

8
i

Notes(i)

Lire
s

Notes(i)

Suivant
"Moyenne

Ecrire

:",

s/9

Fin
nonc - retour au cours

Exercice 6.8
Variables

Nb,

Nbpos,

Nbneg

T()

Tableau

en

en

Numrique
Numrique

Debut
Ecrire

"Entrez

le

nombre

de

valeurs

:"

Nb

Lire

T(Nb-1)

Redim
Nbpos

Nbneg

Pour

"Entrez

Ecrire

le

Nb

nombre

",

1
+

1
T(i)

Lire
T(i)

Si
Nbpos

>

Nbpos

alors
+

1
Sinon

Nbneg

Nbneg

1
Finsi

Suivant

Ecrire

"Nombre

de

valeurs

positives

",

Nbpos

Ecrire

"Nombre

de

valeurs

ngatives

",

Nbneg

Fin
nonc - retour au cours

Exercice 6.9
Variables

i,

Tableau

Som,
T()

en
en

Numrique
Numrique

Debut
(on ne programme pas la saisie du tableau, dont on suppose quil
compte N lments)
Redim T(N-1)

Som 0
Pour i 0 N - 1
Som Som + T(i)

i Suivant
Ecrire "Somme des lments du tableau : ", Som
Fin
nonc - retour au cours

Exercice 6.10
i,

Variables
T1(),

Tableaux

en

T2(),

T3()

Numrique
en

Numrique

Debut
(on suppose que T1 et T2 comptent N lments, et quils sont dj
saisis)
Redim T3(N-1)

Pour i 0 N - 1
T3(i) T1(i) + T2(i)
i Suivant
Fin
nonc - retour au cours

Exercice 6.11
Variables

i,

Tableaux

j,
T1(),

N1,

N2,
T2()

en
en

Numrique
Numrique

Debut
On ne programme pas la saisie des tableaux T1 et T2.
On suppose que T1 possde N1 lments, et que T2 en possde T2)

S0
Pour i 0 N1 1

Pour j 0 N2 1
S S + T1(i) * T2(j)
j Suivant
i Suivant
Ecrire "Le schtroumpf est : ", S
Fin
nonc - retour au cours

Exercice 6.12
Nb,

Variables

en

T()

Tableau

Numrique

en

Numrique

Debut
Ecrire

"Entrez

le

nombre

de

valeurs

"
Nb

Lire

T(Nb-1)

Redim
i

Pour

"Entrez

Ecrire

le

Nb

nombre

",

Suivant
"Nouveau

Ecrire
i
T(i)

tableau
0

:
Nb

T(i)

Ecrire

1
T(i)

Lire

Pour

"

1
1
T(i)
Suivant

Fin
nonc - retour au cours

Exercice 6.13

Nb,

Variables

Posmaxi

en

T()

Tableau
"Entrez

Ecrire

Numrique

en

le

Numrique

nombre

de

valeurs

:"
Nb

Lire

T(Nb-1)

Redim
i

Pour

"Entrez

Ecrire

le

Nb

nombre

",

1
+

1
T(i)

Lire
i

Suivant

Posmaxi

Pour

T(i)

Si

Nb

>

T(Posmaxi)

Posmaxi

alors
i

Finsi
i

Suivant

Ecrire

"Element

le

plus

Ecrire

"Position

de

cet

grand

",

lment

T(Posmaxi)
",

Posmaxi

Fin
nonc - retour au cours

Exercice 6.14
Nb,

Variables

i,

Som,

Moy,

Nbsup

T()

Tableau

en

Numrique

en

Numrique

Debut
Ecrire

"Entrez

le

nombre

de

notes

saisir

"
Nb

Lire

T(Nb-1)

Redim
i

Pour
Ecrire

"Entrez

le

nombre

Nb
n

",

1
+

T(i)

Lire
i

Suivant

Som
Pour

Som

Nb

Som

T(i)

Suivant

Moy

Som

NbSup
Pour

Nb
0

T(i)

Si
NbSup

Nb

>

Moy

1
Alors

NbSup

1
FinSi

Suivant

Ecrire

NbSup,

"

lves

dpassent

la

moyenne

de

la

classe"

Fin
PARTIE 7
TECHNIQUES RUSEES

Informatique : alliance d'une science inexacte et

d'une activit humaine faillible - Luc Fayard

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

leur connaissance est parfaitement indispensable

elles sont un rien finaudes

Et que valent quelques kilos daspirine, compars lineffable bonheur procur


par la comprhension suprme des arcanes de lalgorithmique ? Hein ?

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

45

122

12

part

21

78

64

53

89

de :

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

12

122

45

21

le

78

64

53

troisime :

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,

12

ce

21

45

qui

122

78

donnera

64

53

89

in

28

fine :

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

Retour Haut de Page

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.

Retour Haut de Page

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 lavant-dernier, 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.

Retour Haut de Page

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.

Exercice 7.1
Exercice 7.2
Exercice 7.3
Exercice 7.4
Exercice 7.5

TABLEAUX

PARTIE 8
MULTIDIMENSIONNELS

Le vrai problme nest pas de savoir si les

machines pensent, mais de savoir si les hommes


pensent

B.F.

Skinner

La question de savoir si un ordinateur peut penser

n'est pas plus intressante que celle de savoir si un


sous-marin peut nager - Edgar W. Dijkstra

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

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

2.

Si le prof dcide contre toute vidence que les damiers font 64

pour

voir

si

vous

suiviez.

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 au-dessus de la case
numro i ayant comme indice i-8, les cases valables sont celles dindice i-7 et i-9.
De mme, la case situe juste en dessous ayant comme indice i+8, les cases
valables sont celles dindice i+7 et i+9.
Bien sr, on peut fabriquer tout un programme comme cela, mais le moins quon
puisse dire est que cela ne facilite pas la clart de lalgorithme.
Il serait videmment plus simple de modliser un damier par un damier !

Retour Haut de Page


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.

Exercice 8.1
Exercice 8.2
Exercice 8.3
Exercice 8.4
Exercice 8.5
Exercice 8.6
Exercice 8.7

Retour Haut de Page


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

LES

PARTIE 9
FONCTIONS PREDEFINIES

Il y a deux mthodes pour crire des programmes

sans erreurs. Mais il ny a que la troisime qui


marche

Anonyme

Certains traitements ne peuvent tre effectus par un algorithme, aussi


savant soit-il. Dautres ne peuvent ltre quau prix de souffrances indicibles.
Cest par exemple le cas du calcul du sinus dun angle : pour en obtenir une
valeur approche, il faudrait appliquer une formule dune complexit vous
glacer le sang. Aussi, que se passe-t-il sur les petites calculatrices que vous
connaissez tous ? On vous fournit quelques touches spciales, dites touches de
fonctions, qui vous permettent par exemple de connatre immdiatement ce
rsultat. Sur votre calculatrice, si vous voulez connatre le sinus de 35, vous
taperez 35, puis la touche SIN, et vous aurez le rsultat.

Tout langage de programmation propose ainsi un certain nombre de fonctions ;


certaines sont indispensables, car elles permettent deffectuer des traitements
qui seraient sans elles impossibles. Dautres servent soulager le programmeur,
en lui pargnant de longs et pnibles - algorithmes.

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
Il

GAG
consiste

DE
affecter

une

LA
fonction,

JOURNEE
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

Tavernier...

Exercice 9.1

Retour Haut de Page


2. LES

FONCTIONS DE TEXTE

comme

telle.

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("")

vaut
vaut

16

Mid("Zorro is back", 4, 7)

vaut

"ro is b"

Mid("Zorro is back", 12, 1)

vaut

"c"

Left("Et pourtant", 8)

vaut

"Et pourt"

Right("Et pourtant", 4)

vaut

"t"

Trouve("Un pur bonheur", "pur")

vaut

Trouve("Un pur bonheur", "techno")

vaut

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

vaut

78

Chr(63)

vaut

"?"

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.

Exercice 9.2
Exercice 9.3
Exercice 9.4
Exercice 9.5
Exercice 9.6

Retour Haut de Page


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)

A vaut 1 car 10 = 3*3 + 1

B Mod(12,2)

B vaut 0 car 12 = 6*2

C Mod(44,8)

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

Exercice 9.7
Exercice 9.8
Exercice 9.9
Exercice 9.10
Exercice 9.11

Retour Haut de Page


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

On ne peut pas davantage crer des fichiers

numriques non copiables que crer de leau non


humide - Bruce Schneier
Jusqu prsent, les informations utilises dans nos programmes ne pouvaient
provenir que de deux sources : soit elles taient inclues dans lalgorithme luimme, 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.

Retour Haut de Page


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

Sophie

Ztofrais

Mlanie

Herbien

Jean-Philippe

Hergbel

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.

Retour Haut de Page


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,

On les utilise
stocker...

pour

Ils sont structurs


sous forme de...

voici

un petit tableau

Fichiers Texte

Fichiers Binaires

des bases de donnes

tout, y compris des bases de


donnes.

lignes (enregistrements)

Ils n'ont pas de structure


apparente. Ce sont des
octets crits la suite les
uns des autres.

Les donnes y sont exclusivement en tant que


crites...
caractres
Les enregistrements
sont
eux-mmes
structurs...

rcapitulatif

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

comme en mmoire vive


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

Lisibilit

Le fichier est lisible


Le fichier a l'apparence
clairement avec n'importe
d'une suite d'octets illisibles
quel diteur de texte

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.

Retour Haut de Page


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
ii+1
Redim Nom(i)
Redim Prnom(i)
Redim Tel(i)
Redim Mail(i)
Nom(i) Mid(Truc, 1, 20)
Prnom(i) Mid(Truc, 21, 15)
Tel(i) Mid(Truc, 36, 10)
Mail(i) Mid(Truc, 46, 20)
FinTantQue
Fermer 5
Fin
Ici, on a fait le choix de recopier le fichier dans quatre tableaux distincts. On
aurait pu galement tout recopier dans un seul tableau : chaque case du tableau
aurait alors t occupe par une ligne complte (un enregistrement) du fichier.
Cette solution nous aurait fait gagner du temps au dpart, mais elle alourdit
ensuite le code, puisque chaque fois que l'on a besoin d'une information au sein
d'une case du tableau, il faudra aller procder une extraction via la fonction
MID. Ce qu'on gagne par un bout, on le perd donc par l'autre.

Mais surtout, comme on va le voir bientt, il y a autre possibilit, bien


meilleure, qui cumule les avantages sans avoir aucun des inconvnients.
Nanmoins, ne nous impatientons pas, chaque chose en son temps, et revenons
pour le moment la solution que nous avons employe ci-dessus.
Pour une opration dcriture, ou dajout, il faut dabord imprativement, sous
peine de semer la panique dans la structure du fichier, constituer une chane
quivalente la nouvelle ligne du fichier. Cette chane doit donc tre calibre
de la bonne manire, avec les diffrents champs qui tombent aux
emplacements corrects. Le moyen le plus simple pour spargner de longs
traitements est de procder avec des chanes 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).

Exercice 10.1
Exercice 10.2
Exercice 10.3

Retour Haut de Page


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.

Retour Haut de Page

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)


ii+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

Mais ceci est un autre cours...

devient

fondamental.

Retour Haut de Page

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

Exercice 10.4
Exercice 10.5

Exercice 10.6
Exercice 10.7
Exercice 10.8
Exercice 10.9

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

Linformatique semble encore chercher la recette

miracle

qui permettra aux gens dcrire des

programmes corrects sans avoir rflchir. Au lieu


de cela, nous devons apprendre aux gens comment
rflchir

1. FONCTIONS

Anonyme

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 sousprocdures (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 "Etes-vous mari ?"
Rep1 RepOuiNon()
...
Ecrire "Avez-vous des enfants ?"

Rep2 RepOuiNon()
...
Et le tour est jou ! On a ainsi vit les rptitions inutiles, et si d'aventure, il
y avait un bug dans notre contrle de saisie, il suffirait de faire une seule
correction dans la fonction RepOuiNon pour que ce bug soit limin de toute
l'application. Elle n'est pas belle, la vie ?
Toutefois, les plus sagaces d'entre vous auront remarqu, tant dans le titre
de la fonction que dans chacun des appels, la prsence de parenthses. Celles-ci,
ds qu'on dclare ou qu'on appelle une fonction, sont obligatoires. Et si vous avez
bien compris 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.

Exercice 11.1
Exercice 11.2
Exercice 11.3

Retour Haut de Page


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 sous-procdure (en fait, cette dernire phrase est
trop restrictive : mieux vaudrait dire : entre la procdure appelante et la
procdure appele. Car une sous-procdure peut trs bien en appeler elle-mme
une autre afin de pouvoir accomplir sa tche)
De mme qu'avec les fonctions, les valeurs qui circulent depuis la procdure
(ou la fonction) appelante vers la sous-procdure appele se nomment des
arguments, ou des paramtres en entre de la sous-procdure. Comme on le
voit, qu'il s'agisse des sous-procdure ou des fonctions, ces choses jouant
exactement le mme rle (transmettre une information depuis le code donneur

d'ordres jusqu'au code sous-traitant), elle portent galement le mme nom.


Unique petite diffrence, on a prcis cette fois qu'il s'agissait d'arguments, ou
de paramtres, en entre. Pourquoi donc ?
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 sous-traitant vers le donneur d'ordres) : on les appellera donc
des paramtres en sortie.
Ceci nous permet de reformuler en d'autres termes la vrit fondamentale
apprise un peu plus haut : toute sous-procdure possdant un et un seul
paramtre en sortie peut galement tre crite sous forme d'une fonction
(et entre nous, c'est une formulation prfrable car un peu plus facile
comprendre et donc retenir).
Jusque l, a va ? Si oui, prenez un cachet d'aspirine et poursuivez la lecture.
Si non, prenez un cachet d'aspirine et recommencez depuis le dbut. Et dans les
deux cas, n'oubliez pas le grand verre d'eau pour faire passer l'aspirine.
Il nous reste un dtail examiner, dtail qui comme vous vous en doutez bien,
a une certaine importance : comment fait-on pour faire comprendre un langage
quels sont les paramtres qui doivent fonctionner en entre et quels sont ceux
qui doivent fonctionner en sortie...

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. Celle-ci
ayant t dclare comme un paramtre pass par valeur, Msg va tre affect
avec le mme contenu que M. Cela signifie que Msg est dornavant une copie de
M. Les informations qui taient contenues dans M ont t intgralement
recopies (en double) dans Msg. Cette copie subsistera tout au long de
l'excution de la sous-procdure RepOuiNon et sera dtruite la fin de celle-ci.
Une consquence essentielle de tout cela est que si d'aventure la sousprocdure 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

utilisation
entre

rsumer

en

utilisation en sortie

tout

cela

par

un

petit

passage par valeur

passage par
rfrence

oui

oui

non

oui

tableau

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.

Retour Haut de Page


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.

Retour Haut de Page


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, celleci 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 sous-procdures.
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 sousprocdure 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 sous-procdures 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

Le danger, avec les ordinateurs, ce nest pas

tellement quils deviennent aussi intelligents que les


hommes, mais cest que nous tombions daccord avec
eux pour les rencontrer mi-chemin - Bernard
Avishai

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

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.

Retour Haut de Page


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.

Retour Haut de Page


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.

LA PAGE DES LIENS

Mme auteur, autres sujets :

la spcialit PISE du Master SSAMECI (Universit Paris 7), la

formation dans laquelle j'enseigne ce cours.

un cours Visual Basic.Net, dans le mme esprit que celui-ci. Avec l

aussi exercices et corrigs... mais sans citations philosophiques.

un cours Visual Basic, du mme tonneau, pour les anciennes versions

(5 et 6).

un cours d'introduction l'analyse conomique (pour L1 SES)

enseigner l'informatique ou l'conomie c'est bien, jouer du rock'n

roll, c'est mieux ! Visitez le site des Midnight Jokers, le groupe dans
lequel j'ai le bonheur de svir. Vous y trouverez dates de concerts,
morceaux en tlchargement, photos, videos, and more and more !

mes photos sous-marines, avec des btes, petites et grosses, de

toutes les couleurs et de toutes les formes.


Mme sujet, autres auteurs :

Donnes et Algorithmique : Patrick Trau, entre autres nombreux

cours, propose cet expos riche et pdagogique. Peut tre un peu difficile
d'accs pour les vrais dbutants, surtout s'ils ne sont pas matheux.

Algorithmique et langage Pascal : beaucoup de choses dans ce site,

dont certaines techniques de programmation un peu volues (pointeurs).


A signaler un intressant historique de l'algorithmique.

Algorithmique et programmation : un site riche li aux cours du

CNAM, avec de nombreux exemples d'algorithmes. Plutt orient sur le


perfectionnement que sur les dbutants.
LES SOUVENT POSEES QUESTIONS

Peut-on tlcharger intgralement ce cours ?

Peut-on faire un miroir de ce site ?

N'y aurait-il pas une erreur dans le corrig de cet exercice ?

Pourquoi tel ou tel aspect n'est-il pas abord dans ce cours ?

Les Midnight Jokers sont-ils aussi bons qu'on le prtend ?

Peut-on tlcharger intgralement ce cours ?


Rien ne vous l'interdit, mais je n'ai pas mis en ligne une archive contenant la
totalit du site. D'une part parce que cette archive serait trop volumineuse.
D'autre part parce que je n'ai pas envie de la remettre jour aussi souvent qu'il
y a de modifications dans le site. Donc, si vous y tenez vraiment, employez un
logiciel

aspirateur,

ou

faites

une

petite

srie

de

"Enregistrer

sous".

Peut-on faire un miroir de ce site ?


Avec plaisir. L'auteur n'en sera nullement contrari, au contraire, cela flatte
son ego surdimensionn. Je vous demande juste de me signaler ce genre de
manip, afin que je puisse recenser ces miroirs, et envoyer aux Webmestres les
mises jour subies par le site. Et si en plus, vous en profitez pour m'inviter au
restaurant,

alors

mon

bonheur

sera

complet.

N'y aurait-il pas une erreur dans le corrig de tel ou tel exercice ?
C'est

franchement

bien

possible.

Malgr

d'innombrables

relectures

individuelles et collectives, certaines erreurs, tourderies ou franches btises,


peuvent avoir la vie dure et avoir survcu. Le problme de l'algorithmique, c'est
que c'est une discipline mentale. Contrairement ce qui se passe avec la "vraie"
programmation, aucune "machine apprendre" n'est l pour vous mettre des
baffes chaque fois que vous crivez une mauvaise instruction. Conclusion, si
vous

trouvez

une

erreur,

n'hsitez

pas

me

la

Pourquoi tel ou tel aspect n'est-il pas abord dans ce cours ?

signaler

De deux choses l'une. Ou bien j'y ai pens, mais j'ai choisi, pour une raison ou
pour une autre, de laisser cet aspect de ct. Ou bien je n'y ai pas pens, et la
rflexion, c'est dommage de ne pas l'avoir trait. Pour en avoir le coeur net,
envoyez-moi

un

mail

pour

me

poser

la

question.

Les Midnight Jokers sont-ils aussi bons qu'on le prtend ?


En fait, et toute modestie mise part, ils sont mme largement meilleurs.
Mais plutt que se fier aux on-dit, pourquoi ne pas commencer par jeter un petit
coup d'oeil (et d'oreille) leur offichl web site, et venir ensuite leur tmoigner
votre admiration sans bornes lors d'une de leurs bruyantes apparitions publiques
?

Ca

leur

fait

Retour Haut de Page

tellement

plaisir...

Vous aimerez peut-être aussi