Vous êtes sur la page 1sur 313

Version numrique pour la prparation des cours

partir du manuel scolaire ISN :


En attendant la diffusion dun PDF sous
licence CC by-nc-sa, les enseignants et tous
autres utilisateurs visant un intrt gnral non
commercial peuvent bien sr utiliser ce PDF
sous les mmes conditions quune licence cc
by-nc, par exemple pour leurs cours, en
prenant soin de citer les auteurs et lditeur.
Mais l'ouvrage n'est pas imprimer, voici
pourquoi:
L'diteur, Eyrolles, met ce livre en vente
moins de 20, donc un prix tel qu'il est moins
cher de l'acheter que de l'imprimer. Au niveau
de l'impact environnemental l'impression
industrielle d'un livre est un ordre de
grandeur plus petit qu'une impression au cas
cas sur une photocopieuse ou imprimante.
De plus, nous toutes et tous, professeur-e-s et
enseignant-chercheurs voulons apprendre aux
jeunes le monde numrique et les nouveaux
modles conomiques qui y mergent : nous
devons donc avoir une conduite exemplaire
vis vis du manuel scolaire. Cela signifie ici
profiter pleinement de la possibilit d'accder
au contenu numrique. Et se procurer
l'exemplaire papier si c'est le manuel utilis.
Respecter les rgles commerciales est aussi la
meilleure faon de remercier l'diteur de nous
permettre, notre connaissance, de disposer
du premier manuel scolaire ISN disponible
ds cette rentre.
Pour se procurer le livre contacter Sylvie
Chauveau <SChauveau@Eyrolles.com> avec
comme objet "Commande du livre ISN
G13543" pour les commandes groupes ou
aller, par exemple, sur www.amazon.fr pour
les commandes individuelles.
Ref: https://wiki.inria.fr/sciencinfolycee/Informatique_et_Sciences_du_Numrique_-_Spcialit_ISN_en_Terminale_S
Gow
on-omboummonuoCouoCm
bConCnnbIyVvnjomnWo
loGoypoluouCogFon

Groupe Eyrolles, 2012


Lanne 2012 voit lentre de linformatique en tant quenseignement de sp-
cialit en classe de Terminale scientifique. Cette entre devenait urgente, car
linformatique est dsormais partout. Cre dans les annes 1950 grce une
collaboration entre lectroniciens, mathmaticiens et logiciens (ces derniers
en ayant pos les bases ds 1935), elle na cess dacclrer son mouvement
depuis, envahissant successivement lindustrie, les tlcommunications, les
transports, le commerce, ladministration, la diffusion des connaissances, les
loisirs, et maintenant les sciences, la mdecine et lart, tout cela en crant de
nouvelles formes de communication et de relations sociales. Les objets infor-
matiques sont maintenant par milliards et de toutes tailles, allant du giga-
ordinateur quip de centaines de milliers de processeurs aux micro-puces des
cartes bancaires ou des prothses cardiaques et auditives, en passant par les
PC, les tablettes et smartphones, les appareils photos, ou encore les ordina-
teurs qui conduisent et contrlent les trains, les avions et bientt les voitures.
Tous fonctionnent grce la conjonction de puces lectroniques et de logi-
ciels, objets immatriels qui dcrivent trs prcisment ce que vont faire ces
appareils lectroniques. Au XXI
e
sicle, la matrise du traitement de linfor-
mation est devenue aussi importante que celle de lnergie dans les sicles
prcdents, et linformatique au sens large est devenue un des plus grands
bassins demploi travers le monde. Cela implique que de nombreux lycens
actuels participeront son essor dans lavenir.
Ces jeunes lycens sont bien sr trs familiers avec les appareils informatiss.
Mais ce nest pas pour cela quils en comprennent le fonctionnement, mme
Prface
ManuelDowek.book Page V Monday, July 9, 2012 4:58 PM
Informatique et sciences du numrique
Groupe Eyrolles, 2012
VI
sur des plans lmentaires pour certains. Une opinion encore fort rpandue est
quil ny a pas besoin de comprendre ce fonctionnement, et quil suffit
dapprendre lusage des appareils et logiciels. lanalyse, cette opinion appa-
remment naturelle savre tout fait simpliste, avec des consquences nfastes
quil faut tudier de prs. Pour faire un parallle avec une autre discipline, on
enseigne la physique car elle est indispensable la comprhension de la nature
de faon gnrale, et aussi de faon plus spcifique au travail de tout ingnieur
et de tout scientifique, cest--dire aux dbouchs naturels de beaucoup
dlves de terminale scientifique. Mais qui penserait quil suffit de passer le
permis de conduire pour comprendre la physique dun moteur ou la mca-
nique une voiture ? Or, nous sommes tous autant confronts linformatique
qu la physique, mme si elle ne reprsente pas un phnomne
naturel prexistant ; comme pour la physique, les ingnieurs et scientifiques
devront y tre au moins autant crateurs que consommateurs. Pour tre plus
prcis, sous peine de ne rester que des consommateurs serviles de ce qui se cre
ailleurs, il est indispensable pour notre futur de former au cur conceptuel et
technique de linformatique tout lve dont le travail technique sera reli
lutilisation avance ou la cration de linformatique du prsent ou du futur. Il
est donc bien naturel que la nouvelle formation linformatique sinaugure en
terminale scientifique. Mais elle devra immanquablement ensuite tre largie
dautres classes, car tout lve sera concern en tant que futur citoyen.
Pour tre efficace, toute formation scolaire demande un support adquat. Ce
premier livre va jouer ce rle pour linformatique, en prsentant de faon
pdagogique les quatre composantes scientifiques et techniques centrales de
son cur scientifique et technique : langages de programmation, numrisa-
tion de linformation, machines et rseaux, et algorithmes. Il a t crit par
des chercheurs et enseignants confirms, tous profondment intresss par
le fait que les lves comprennent, assimilent et apprcient les concepts et
techniques prsentes. Il insiste bien sur deux points essentiels : le fait que
ces quatre composantes sont tout fait gnriques, cest--dire valables pour
tous les types dapplications, des mga-calculs ncessaires pour tudier lvo-
lution du climat aux calculs lgers et rapides effectuer dans les micro-puces
enfouies partout, et le fait que les concepts associs resteront valables dans le
temps. En effet, si les applications de linformatique voluent trs vite, son
cur conceptuel reste trs stable, au moins au niveau appropri pour la ter-
minale scientifique. Lenseigner de faon adquate est ncessaire autant la
comprhension des bases qu tout approfondissement ultrieur. nen pas
douter, cet ouvrage y contribuera.
Grard Berry, directeur de recherche Inria
Professeur au Collge de France,
Membre de lAcadmie des sciences, de lAcadmie des technologies,
et de lAcademia Europaea
ManuelDowek.book Page VI Monday, July 9, 2012 4:58 PM
Table des matires
Groupe Eyrolles, 2011
VII
PRFACE...................................................................... V
AVANT-PROPOS............................................................ 1
Structure de louvrage 2
Parcours possibles 4
Remerciements 4
PREMIRE PARTIE
LANGAGES.........................................................5
1. LES INGRDIENTS DES PROGRAMMES .............................. 7
Un premier programme 8
La description du programme 9
SAVOIR-FAIRE Modifier un programme existant pour obtenir
un rsultat diffrent 11
Les ingrdients dun programme 12
SAVOIR-FAIRE Comprendre un programme et expliquer
ce quil fait 14
SAVOIR-FAIRE crire un programme 15
SAVOIR-FAIRE Mettre un programme au point en le testant 16
Les instructions et les expressions 17
Les oprations 18
Les accolades 19
SAVOIR-FAIRE Indenter un programme 21
Ai-je bien compris ? 22
2. LES BOUCLES.............................................................. 23
La boucle for 24
SAVOIR-FAIRE crire un programme utilisant une boucle for 26
SAVOIR-FAIRE Imbriquer deux boucles 26
La boucle while 28
SAVOIR-FAIRE crire un programme utilisant une boucle while 29
SAVOIR-FAIRE Commenter un programme 30
La non-terminaison 31
La boucle for, cas particulier de la boucle while 31
SAVOIR-FAIRE Choisir entre une boucle for et la boucle while
pour crire un programme 33
Ai-je bien compris ? 34
3. LES TYPES .................................................................. 35
Les types de base 37
SAVOIR-FAIRE Diffrencier les types de base 39
SAVOIR-FAIRE Changer le type dune expression 39
La porte et linitialisation des variables 41
SAVOIR-FAIRE Dclarer les variables avec des types
et des portes appropris 43
SAVOIR-FAIRE Initialiser les variables 43
Les tableaux 44
SAVOIR-FAIRE Utiliser un tableau dans un programme 46
Les tableaux bidimensionnels 48
Les chanes de caractres 50
SAVOIR-FAIRE Calculer avec des chanes de caractres 50
La mise au point des programmes 52
SAVOIR-FAIRE Mettre au point un programme
en linstrumentant 52
Ai-je bien compris ? 54
4. LES FONCTIONS (AVANC) ............................................ 55
Isoler une instruction 56
Passer des arguments 58
Rcuprer une valeur 59
SAVOIR-FAIRE crire len-tte dune fonction 60
ManuelDowek.book Page VII Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2011
VIII
Informatique et sciences du numrique
SAVOIR-FAIRE crire une fonction 61
Le programme principal 62
La porte des variables et les variables globales 62
SAVOIR-FAIRE Identifier la porte des variables
dans un programme comportant des fonctions 65
SAVOIR-FAIRE Choisir une porte adapte aux diffrentes
variables dun programme comportant des fonctions 69
Le passage par valeur 71
SAVOIR-FAIRE
Choisir entre un passage par valeur et une variable globale 73
Le passage par valeur et les tableaux 74
Ai-je bien compris ? 76
5. LA RCURSIVIT (AVANC) ........................................... 77
Des fonctions qui appellent des fonctions 78
Des fonctions qui sappellent elles-mmes 79
SAVOIR-FAIRE Dfinir une fonction rcursive 81
Des images rcursives 83
Ai-je bien compris ? 84
6. LA NOTION DE LANGAGE FORMEL (AVANC)................... 85
Les langages informatiques et les langues naturelles 86
Les anctres des langages formels 87
Les langages formels et les machines 88
La grammaire 89
La smantique 91
Redfinir la smantique 92
Ai-je bien compris ? 93
DEUXIME PARTIE
INFORMATIONS ................................................95
7. REPRSENTER DES NOMBRES ENTIERS ET VIRGULE........ 97
La reprsentation des entiers naturels 99
La base cinq 100
SAVOIR-FAIRE Trouver la reprsentation en base cinq
dun entier naturel donn en base dix 100
SAVOIR-FAIRE Trouver la reprsentation en base dix
dun entier naturel donn en base cinq 101
La base deux 102
SAVOIR-FAIRE Trouver la reprsentation en base deux
dun entier naturel donn en base dix 102
SAVOIR-FAIRE Trouver la reprsentation en base dix
dun entier naturel donn en base deux 102
Une base quelconque 103
SAVOIR-FAIRE Trouver la reprsentation en base k
dun entier naturel donn en base dix 103
SAVOIR-FAIRE Trouver la reprsentation en base dix
dun entier naturel donn en base k 104
La reprsentation des entiers relatifs 105
SAVOIR-FAIRE Trouver la reprsentation binaire sur n bits
dun entier relatif donn en dcimal 106
SAVOIR-FAIRE Trouver la reprsentation dcimale
dun entier relatif donn en binaire sur n bits 106
SAVOIR-FAIRE Calculer la reprsentation p de loppos
dun entier relatif x partir de sa reprsentation p,
pour une reprsentation des entiers relatifs sur huit bits 106
La reprsentation des nombres virgule 108
SAVOIR-FAIRE Trouver la reprsentation en base dix
dun nombre virgule donn en binaire 108
Ai-je compris ? 110
8. REPRSENTER DES CARACTRES ET DES TEXTES ............. 111
La reprsentation des caractres 112
La reprsentation des textes simples 113
SAVOIR-FAIRE Trouver la reprsentation en ASCII binaire
dun texte 113
SAVOIR-FAIRE Dcoder un texte reprsent en ASCII binaire 114
La reprsentation des textes enrichis 116
SAVOIR-FAIRE crire une page en HTML 118
Ai-je bien compris ? 120
9. REPRSENTER DES IMAGES ET DES SONS ...................... 121
La reprsentation des images 122
La notion de format 123
SAVOIR-FAIRE Identifier quelques formats dimages 124
La reprsentation des images en niveaux de gris et en couleurs 124
SAVOIR-FAIRE Numriser une image sous forme dun fichier 126
La reprsentation des sons 128
La taille dun texte, dune image ou dun son 129
SAVOIR-FAIRE Comprendre les tailles des donnes et les ordres
de grandeurs 130
SAVOIR-FAIRE Choisir un format appropri par rapport
un usage ou un besoin, une qualit, des limites 131
Ai-je bien compris ? 131
10. LES FONCTIONS BOOLENNES.................................... 133
Lexpression des fonctions boolennes 134
Les fonctions non, et, ou 134
Lexpression des fonctions boolennes
avec les fonctions non, et, ou 135
ManuelDowek.book Page VIII Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2011
IX
Table des matires
SAVOIR-FAIRE Trouver une expression symbolique exprimant
une fonction partir de sa table 136
Lexpression des fonctions boolennes
avec les fonctions non et ou 137
Ai-je bien compris ? 138
11. STRUCTURER LINFORMATION (AVANC) .................... 139
La persistance des donnes 140
La notion de fichier 141
Utiliser un fichier dans un programme 141
Organiser des fichiers en une arborescence 144
SAVOIR-FAIRE Classer des fichiers sous la forme
dune arborescence 145
Liens et hypertextes 147
Lhypermnsie 148
Pourquoi linformation est-elle souvent gratuite ? 149
Ai-je bien compris ? 152
12. COMPRESSER, CORRIGER, CHIFFRER (AVANC)............ 153
Compresser 154
SAVOIR-FAIRE Utiliser un logiciel de compression 156
Compresser avec perte 157
Corriger 158
Chiffrer 160
Ai-je bien compris ? 164
TROISIME PARTIE
MACHINES.....................................................165
13. LES PORTES BOOLENNES......................................... 167
Le circuit NON 168
Le circuit OU 169
Quelques autres portes boolennes 170
Ai-je bien compris ? 175
14. LE TEMPS ET LA MMOIRE........................................ 177
La mmoire 178
Lhorloge 182
Ai-je bien compris ? 184
15. LORGANISATION DUN ORDINATEUR ......................... 185
Trois instructions 187
Le langage machine 188
SAVOIR-FAIRE Savoir drouler lexcution dune squence
dinstructions 190
La compilation 191
Les priphriques 192
Le systme dexploitation 192
Ai-je bien compris ? 195
16. LES RSEAUX (AVANC) ........................................... 197
Les protocoles 198
La communication bit par bit : les protocoles de la couche
physique 200
Les rseaux locaux :
les protocoles de la couche lien 201
SAVOIR-FAIRE Trouver les adresses MAC des cartes rseau
dun ordinateur 203
Le rseau global : les protocoles de la couche rseau 204
SAVOIR-FAIRE Trouver ladresse IP attribue un ordinateur 204
SAVOIR-FAIRE Dterminer le chemin suivi par linformation 207
SAVOIR-FAIRE Dterminer ladresse IP du serveur par lequel
un ordinateur est connect Internet 208
La rgulation du rseau global : les protocoles de la couche
transport 209
Programmes utilisant le rseau : la couche application 211
Quelles lois sappliquent sur Internet ? 212
Qui gouverne Internet ? 213
Ai-je bien compris ? 214
17. LES ROBOTS (AVANC)............................................. 215
Les composants dun robot 216
La numrisation des grandeurs captes 217
Le contrle de la vitesse : la mthode du contrle en boucle
ferme 219
Programmer un robot : les actionneurs 220
Programmer un robot : les capteurs 222
SAVOIR-FAIRE crire un programme pour commander un robot 223
Ai-je bien compris ? 225
QUATRIME PARTIE
ALGORITHMES ............................................... 227
18. AJOUTER DEUX NOMBRES EXPRIMS EN BASE DEUX..... 229
Laddition 230
Laddition pour les nombres exprims en base deux 231
La dmonstration de correction du programme 235
Ai-je bien compris ? 238
19. DESSINER............................................................... 239
Dessiner dans une fentre 240
ManuelDowek.book Page IX Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2011
X
Informatique et sciences du numrique
SAVOIR-FAIRE Crer une image 240
Dessiner en trois dimensions 242
Produire un fichier au format PPM 245
Lire un fichier au format PPM 247
Transformer les images 248
SAVOIR-FAIRE Transformer une image en couleurs
en une image en niveaux de gris 248
SAVOIR-FAIRE Augmenter le contraste dune image
en niveaux de gris 249
SAVOIR-FAIRE Modifier la luminance dune image 250
SAVOIR-FAIRE Changer la taille dune image 250
SAVOIR-FAIRE Fusionner deux images 251
SAVOIR-FAIRE Lisser une image pour liminer
ses petits dfauts et en garder les grands traits 252
Ai-je bien compris ? 254
20. LA DICHOTOMIE (AVANC) ....................................... 255
La recherche en table 256
La conversion analogique-numrique 261
Trouver un zro dune fonction 261
Ai-je bien compris ? 262
21. TRIER (AVANC) ..................................................... 263
Le tri par slection 264
Le tri par fusion 268
Lefficacit des algorithmes 272
SAVOIR-FAIRE Sinterroger sur lefficacit dun algorithme 273
Lefficacit des algorithmes de tri par slection et par fusion 274
Ai-je bien compris ? 276
22. PARCOURIR UN GRAPHE (AVANC) ............................ 277
La liste des chemins prolonger 278
viter de tourner en rond 280
La recherche en profondeur et la recherche en largeur 282
Le parcours dun graphe 283
tats et transitions 284
Ai-je bien compris ? 287
IDES DE PROJETS..................................................... 289
Un gnrateur dexercices de calcul mental 289
Mastermind 289
Brin dARN 289
Bataille navale 289
Cent mille milliards de pomes 289
Site de rencontres 289
Tracer la courbe reprsentative dune fonction polynme
du second degr 291
Grer le score au tennis 291
Automatiser les calculs de chimie 291
Tours de Hano 291
Tortue Logo 291
Dessins de plantes 291
Langage CSS 291
Calcul sur des entiers de taille arbitraire 291
Calcul en valeur exacte sur des fractions 293
Reprsentation des dates et heures 293
Transcrire dans lalphabet latin 293
Correcteur orthographique 293
Daltonisme 293
Logisim 293
Banc de registres 293
Simuler le comportement du processeur 295
Utilisation du logiciel Wireshark 295
Algorithme de pledge 295
Algorithme calculant le successeur dun nombre entier
naturel n 295
Le jeu de la vie 295
Une balle 297
Gnrateur duvres alatoires 297
Dtecteur de mouvement visuel 297
Qui est-ce ? 297
Un joueur de Tic-tac-toe 297
Enveloppe convexe 298
Chemins les plus courts 298
Utilisation des rseaux sociaux 298
ChemiUtilisation des rseaux sociaux 299
INDEX...................................................................... 299
ManuelDowek.book Page X Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
Il y a un sicle, il ny avait pas dordinateurs ; aujourdhui, il y en a plu-
sieurs milliards. Ces ordinateurs et autres machines numriques que sont
les rseaux, les tlphones, les tlvisions, les baladeurs, les appareils
photos, les robots, etc. ont chang la manire dont nous :
concevons et fabriquons des objets,
changeons des informations entre personnes,
gardons trace de notre pass,
accdons la connaissance,
faisons de la science,
crons et diffusons des uvres dart,
organisons les entreprises,
administrons les tats,
etc.
Si les ordinateurs ont tout transform, cest parce quils sont polyvalents,
ils permettent de traiter des informations de manires trs diverses. Cest
en effet le mme objet qui permet dutiliser des logiciels de conception
assiste par ordinateur, des machines commande numrique, des logi-
ciels de modlisation et de simulation, des encyclopdies, des cours en
ligne, des bases de donnes, des blogs, des forums, des logiciels de cour-
rier lectronique et de messagerie instantane, des logiciels dchange de
fichiers, des logiciels de lecture de vidos et musique, des tables de
mixage numriques, des archives numriques, etc.
En fait, les ordinateurs sont non seulement capables de traiter des infor-
mations de manires diverses, mais galement de toutes les manires
possibles. Ce sont des machines universelles.
Avant-propos
En 1936, soit quelques annes
avant la construction des premiers
ordinateurs, Alan Turing (1912-
1954) et en mme temps que lui
Alonzo Church a tudi les liens
entre les notions dalgorithme et
de raisonnement mathmatique.
Cela la men imaginer un pro-
cd de calcul, les machines de
Turing, et suggrer que ce pro-
cd de calcul puisse tre universel,
cest--dire capable dexcuter tous
les algorithmes possibles.
ManuelDowek.book Page 1 Monday, July 9, 2012 4:58 PM
Informatique et sciences du numrique
Groupe Eyrolles, 2012
2
Un procd systmatique qui permet de traiter des informations sappelle un
algorithme. Ainsi, on peut parler dalgorithmes de recherche dun mot dans
un dictionnaire, dalgorithmes de chiffrement et de dchiffrement, dalgo-
rithmes pour faire des additions et des multiplications, etc. De manire plus
gnrale, un algorithme est un procd systmatique qui permet de faire
quelque chose. Par exemple une recette de cuisine est un algorithme.
La notion dalgorithme est trs ancienne. Depuis la nuit des temps, les
hommes ont conu et appris des algorithmes, pour fabriquer des objets
en cramique, tisser des toffes, nouer des cordages ou, simplement, pr-
parer des aliments.
Le bouleversement survenu au milieu du XX
e
sicle tient ce que les
hommes ont cess dutiliser exclusivement ces algorithmes la main ; ils
ont commenc les faire excuter par des machines, les ordinateurs.
Pour y parvenir, il a fallu exprimer ces algorithmes dans des langages de
programmation, accessibles aux ordinateurs. Ces langages sont diffrents
des langues humaines en ce quils permettent la communication non pas
entre tres humains, mais entre les tres humains et les machines.
Linformatique est donc ne de la rencontre de quatre concepts trs anciens :
machine,
information,
algorithme,
langage.
Ces concepts existaient tous avant la naissance de linformatique, mais linfor-
matique les a profondment renouvels et articuls en une science cohrente.
Structure de louvrage
Lobjectif de ce cours est dintroduire les quatre concepts de machine,
dinformation, dalgorithme et de langage, mais surtout de montrer la
manire dont ils fonctionnent ensemble. Quand nous tudierons les
algorithmes fondamentaux, nous les exprimerons souvent dans un lan-
gage de programmation. Quand nous tudierons lorganisation des
machines, nous verrons comment elles permettent dexcuter des pro-
grammes exprims dans un langage de programmation. Quand nous
tudierons la notion dinformation, nous verrons des algorithmes de
compression, de chiffrement, etc.
Ce livre est donc organis en quatre parties regroupant vingt-deux chapi-
tres, dont certains dun niveau plus avanc (indiqus par un astrisque) :
ALLER PLUS LOIN De la bote outils au
couteau suisse
Cette polyvalence sillustre aussi par le nombre
doutils que les ordinateurs ont remplac :
machines crire, tlphones, machines cal-
culer, tlvisions, appareils photos, lectro-
phones, mtiers tisser
T Traiter des informations
Traiter des informations signifie appliquer,
dune manire systmatique, des oprations des
symboles. La recherche dun mot dans un diction-
naire, le chiffrement et le dchiffrement dun mes-
sage secret, laddition et la multiplication de deux
nombres, la fabrication des emplois du temps des
lves dun lyce ou des pilotes dune compagnie
arienne, le calcul de laire dune parcelle agricole
ou encore le compte des points des leves dun
joueur au Tarot sont des exemples de traitements
dinformations.
ALLER PLUS LOIN Des algorithmes aussi vieux
que lcriture
Il y a quatre mille ans, les scribes et les arpen-
teurs, en Msopotamie et en gypte, mettaient
dj en uvre des algorithmes pour effectuer
des oprations comptables et des calculs daires
de parcelles agricoles. La conception dalgo-
rithmes de traitement de linformation semble
remonter aux origines mmes de lcriture. Ds
lapparition des premiers signes crits, les
hommes ont imagin des algorithmes pour les
transformer.
ManuelDowek.book Page 2 Monday, July 9, 2012 4:58 PM
Avant-propos
Groupe Eyrolles, 2012
3
Dans la premire partie Langages , nous apprendrons crire des
programmes. Pour cela, nous allons dcouvrir les ingrdients dont les
programmes sont constitus : laffectation, la squence et le test
(chapitre 1), les boucles (chapitre 2), les types (chapitre 3), les fonc-
tions (chapitre 4*) et les fonctions rcursives (chapitre 5*). Pour finir,
nous nous pencherons sur la notion de langage formel (chapitre 6*).
Ds que lon commence matriser ces concepts, il devient possible
de crer ses propres programmes.
Dans la deuxime partie, Informations , nous abordons lune des pro-
blmatiques centrales de linformatique : reprsenter les informations
que lon veut communiquer, stocker et transformer. Nous apprendrons
reprsenter les nombres entiers et les nombres virgule (chapitre 7), les
caractres et les textes (chapitre 8), les images et les sons (chapitre 9). La
notion de valeur boolenne, ou de bit, qui apparat dans ces trois chapi-
tres, nous mnera naturellement la notion de fonction boolenne
(chapitre 10). Nous apprendrons ensuite structurer de grandes quan-
tits dinformations (chapitre 11*), optimiser la place occupe grce la
compression, corriger les erreurs qui peuvent se produire au moment de
la transmission et du stockage de ces informations, et les protger par le
chiffrement (chapitre 12*).
Dans la troisime partie, Machines , nous verrons que derrire les
informations, il y a toujours des objets matriels : ordinateurs, rseaux,
robots, etc. Les premiers ingrdients de ces machines sont des portes
boolennes (chapitre 13) qui ralisent les fonctions boolennes vues au
chapitre 10. Ces portes demandent tre compltes par dautres cir-
cuits, comme les mmoires et les horloges, qui introduisent une dimen-
sion temporelle (chapitre 14). Nous dcouvrirons comment
fonctionnent les machines que nous utilisons tous les jours (chapitre 15).
Nous verrons que les rseaux, comme les oignons, sorganisent en cou-
ches (chapitre 16*). Et nous dcouvrirons enfin les entrailles des robots,
que nous apprendrons commander (chapitre 17*).
Dans la quatrime partie, Algorithmes , nous apprendrons quel-
ques-uns des savoir-faire les plus utiles au XXI
e
sicle : ajouter des
nombres exprims en base deux (chapitre 18), dessiner (chapitre 19),
retrouver une information par dichotomie (chapitre 20*), trier des
informations (chapitre 21*) et parcourir un graphe (chapitre 22*).
Chaque chapitre contient trois types de contenus :
une partie de cours ;
des sections intitules Savoir-faire , qui permettent dacqurir les
capacits essentielles ;
des exercices, avec leur corrig lorsque ncessaire.
REMARQUE Chapitres lmentaires
et chapitres avancs*
Les chapitres avancs sont nots ici dun ast-
risque. Il sagit des deux ou trois derniers chapi-
tres de chaque partie. Ils sont signals en dbut
de chapitre.
Exercices difficiles
Les exercices nots dun cactus sont dun niveau
plus difficile.
ManuelDowek.book Page 3 Monday, July 9, 2012 4:58 PM
Informatique et sciences du numrique
Groupe Eyrolles, 2012
4
Des encadrs Aller plus loin donnent des ouvertures vers des ques-
tions hors-programme. Chaque chapitre se conclut de trois questions de
cours sous forme dencadr intitul Ai-je bien compris ? .
Les propositions de projets sont regroupes en fin de manuel.
Parcours possibles
Cet ouvrage peut tre parcouru de plusieurs manires. Nous proposons
par exemple de commencer par les chapitres lmentaires de la partie
Informations (7, 8, 9 et 10), de poursuivre par ceux de la partie Lan-
gages (1, 2 et 3), de continuer par les chapitres avancs de la partie
Informations (11 et 12), les chapitres lmentaires de la partie Algo-
rithmes (18 et 19) et de la partie Machines (13, 14 et 15), et enfin de
passer aux chapitres avancs de la partie Machines (16 et 17), de la partie
Langages (4, 5 et 6) et de la partie Algorithmes (20, 21 et 22).
Il nest pas ncessaire de lire ces chapitres au mme degr de dtails.
chaque lve de choisir les thmatiques quil souhaite approfondir parmi
celles proposes, en particulier par le choix de ses projets.
La seule contrainte est dacqurir assez tt les bases des langages de pro-
grammation, aux chapitres 1, 2 et 3, pour pouvoir crire soi-mme des
programmes. Quand on apprend linformatique, il est en effet important
non seulement dcouter des cours et de lire des livres, mais aussi de
mettre en pratique les connaissances que lon acquiert en crivant soi-
mme des programmes, en se trompant et en corrigeant ses erreurs.
Remerciements
Les auteurs tiennent remercier Ali Assaf, Olivier Billet, Alain Busser,
David Cachera, Vint Cerf, Julien Cervelle, S. Barry Cooper, Ariane
Delrocq, Lena Domrse, Raffi Enficiaud, Monique Grandbastien,
Guillaume Le Blanc, Fabrice Le Fessant, Philippe Lucaud, Pierre-
tienne Moreau, Claudine Noblet, Franois Prinet, Gordon Plotkin,
Franois Pottier, Laurent Sartre, Dana Scott, Adi Shamir et Joseph
Sifakis pour leur aide au cours de la rdaction de ce livre ainsi que
lquipe des ditions Eyrolles, Anne Bougnoux, Laurne Gibaud,
Muriel Shan Sei Fan, Gal Thomas et Camille Vorng.
Merci galement Christine Paulin, Raphal Hertzog, Pierre Nron,
Grgoire Pan, Jonathan Protzenko et Dominique Quatravaux pour
leurs tmoignages vivants.
ManuelDowek.book Page 4 Monday, July 9, 2012 4:58 PM
PREMIRE PARTIE
Langages
Dans cette premire partie, nous apprenons crire des
programmes. Pour cela, nous dcouvrons les ingrdients dont les
programmes sont constitus : laffectation, la squence et le test
(chapitre 1), les boucles (chapitre 2), les types (chapitre 3), les
fonctions (chapitre 4*) et les fonctions rcursives (chapitre 5*). Pour
finir, nous nous penchons sur la notion de langage formel
(chapitre 6*).
Ds que lon commence matriser ces concepts, il devient possible
de crer ses propres programmes.
ManuelDowek.book Page 5 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 6 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
1
Les ingrdients
des
programmes
John Backus (1924-2007) est
lauteur de lun des premiers lan-
gages de programmation : le lan-
gage Fortran (1954). Il a par la suite
propos, avec Peter Naur, la notation
de Backus et Naur qui permet de
dcrire des grammaires, en particu-
lier celles des langages de program-
mation (voir le chapitre 6).
Grace Hopper (1906-1992) est, elle
aussi, lauteur dun des premiers lan-
gages de programmation : le lan-
gage Cobol (1959). Avant cela, elle a
t lune des premires pro-
grammer le Harvard Mark I de
Howard Aiken, lun des tous premiers
calculateurs lectroniques.
Un ordinateur peut faire bien des choses,
mais il faut dabord les lui expliquer.
Apprendre la programmation, ce nest pas seulement savoir
crire un programme, cest aussi comprendre de quoi il est fait,
comment il est fait et ce quil fait. Un programme est
essentiellement constitu dexpressions et dinstructions.
Nous introduisons dans ce premier chapitre les trois premires
instructions fondamentales que sont laffectation, la squence
et le test. Pour mettre en vidence leur structure, nous
indentons les programmes et utilisons les accolades lorsque
lcriture est ambigu. Nous tudions les instructions
en observant les transformations quelles oprent sur ltat
de lexcution du programme, cest--dire sur lensemble
des botes pouvant contenir des valeurs, avec leur nom
et leur valeur, le cas chant.
ManuelDowek.book Page 7 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
8
Un programme est un texte qui dcrit un algorithme que lon souhaite
faire excuter par une machine. Ce texte est crit dans un langage parti-
culier, appel langage de programmation. Il existe plusieurs milliers de
langages de programmation, parmi lesquels Java, C, Python, Caml, For-
tran, Cobol, etc. Il nest cependant pas ncessaire dapprendre ces lan-
gages les uns aprs les autres, car ils sont tous plus ou moins organiss
autour des mmes notions : dclaration, affectation, squence, test,
boucle, fonction, etc. Ce sont ces notions quil importe de comprendre.
Dans ce livre, nous utilisons principalement le langage Java. Mais rien de
ce que nous disons ici nest propre ce langage et les lves qui en utili-
sent un autre nauront aucun mal transposer.
Nous verrons, au chapitre 3, comment faire pour excuter un programme
sur un ordinateur. Dans ce chapitre et le suivant, nous parlons des pro-
grammes de manire thorique, cest--dire sans les excuter. Bien
entendu, les lecteurs sont libres danticiper et de lire les premires pages du
chapitre 3, sils souhaitent excuter leurs programmes tout de suite.
Un premier programme
Voici un premier petit programme crit en Java :
Quand on excute ce programme, il affiche vous de jouer puis attend
que lon tape deux nombres au clavier. Si ces deux nombres sont 4 et 7, il
affiche Coul ; si le premier est 4 ou le second 7, mais pas les deux, il
affiche En vue, sinon il affiche l'eau.
Ce programme permet de jouer la bataille navale, dans une variante
simplifie dans laquelle il ny a quun seul bateau, toujours plac au
mme endroit et qui noccupe quune seule case de la grille. On considre
a = 4;
b = 7;
System.out.println(" vous de jouer");
x = Isn.readInt();
y = Isn.readInt();
if (x == a && y == b) {
System.out.println("Coul");}
else {
if (x == a || y == b) {
System.out.println("En vue");}
else {
System.out.println(" l'eau");}}
ManuelDowek.book Page 8 Monday, July 9, 2012 4:58 PM
1 Les ingrdients des programmes
Groupe Eyrolles, 2012
9
quun bateau est en vue si la case propose est sur la mme ligne ou la
mme colonne que le bateau.
Exercice 1.1
Modifier ce programme afin quil affiche toi de jouer et non vous de
jouer.
Exercice 1.2
Modifier ce programme afin que le bateau soit sur la case de coordonnes (6 ; 9).
La description
du programme
Commenons par observer ce programme pour essayer den comprendre
la signification. La premire ligne contient linstruction a = 4;. Pour
comprendre ce quil se passe quand on excute cette instruction, il faut
imaginer que la mmoire de lordinateur que lon utilise est compose
dune multitude de petites botes. Chacune de ces botes porte un nom et
peut contenir une valeur. Excuter linstruction a = 4; a pour effet de
mettre la valeur 4 dans la bote de nom a.
Aprs avoir excut cette instruction, on excute b = 7;, ce qui a pour
effet de mettre la valeur 7 dans la bote de nom b.
On excute ensuite linstruction System.out.println(" vous de
jouer");, ce qui a pour effet dafficher lcran vous de jouer.
On excute ensuite linstruction x = Isn.readInt();, ce qui a pour effet
dinterrompre le droulement du programme jusqu ce que lutilisateur
tape un nombre au clavier. Ce nombre est alors mis dans la bote de nom x.
DANS DAUTRES LANGAGES
Texas Instruments et Casio
Ce mme algorithme peut sexprimer dans de
nombreux langages. titre dexemple, le voici
exprim dans le langage des calculatrices Texas
Instruments et Casio. Dans ces deux cas lalgo-
rithme utilis est le mme quen Java. Les
seules diffrences sont dans la manire
dexprimer cet algorithme : la variable affecter
est situe droite de la flche pour les calcula-
trices, linstruction de test est structure par des
mots-cls supplmentaires, entre autres.
Texas Instruments
PROGRAM:BATAILLE
:4 A
:7 B
:Disp " vous de jouer"
:Input X
:Input Y
:If X = A et Y = B
:Then
:Disp "Coul"
:Else
:If X = A ou Y = B
:Then
:Disp "En vue"
:Else
:Disp " l'eau"
:End
:End
Casio
======BATAILLE ======
4 A
7 B
" vous de jouer"
? X
? Y
If X = A And Y = B
Then "Coul"
Else
If X = A Or Y = B
Then "En vue"
Else " l'eau"
IfEnd
IfEnd
ManuelDowek.book Page 9 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
10
De mme, excuter linstruction y = Isn.readInt(); a pour effet dinter-
rompre le droulement du programme jusqu ce que lutilisateur tape un
nombre au clavier. Ce nombre est alors mis dans la bote de nom y. ce
point du programme, les botes de nom a, b, x et y contiennent chacune un
nombre. Les nombres 4 et 7 pour les deux premires et les deux nombres
entrs au clavier par lutilisateur pour les deux dernires.
Lexcution du programme doit alors diffrer selon que les deux nombres
donns par lutilisateur sont 4 et 7 ou non. Si cest le cas, on veut afficher
Coul, si ce nest pas le cas on veut faire autre chose. Cest ce que fait
linstruction :
Excuter cette instruction a pour effet de calculer la valeur de lexpres-
sion boolenne x == a && y == b, o le symbole && reprsente un et.
Cette valeur est true (vrai) quand x est gal a et y est gal b, ou false
(faux) quand ce nest pas le cas. En fonction de la valeur de cette expres-
sion, on excute ou bien linstruction System.out.println("Coul"); ou
bien linstruction :
Cette instruction tant de la mme forme, son excution a pour effet de
calculer la valeur de lexpression boolenne x == a || y == b, o le sym-
bole || reprsente un ou, et en fonction de la valeur de cette expression
dexcuter ou bien linstruction System.out.println("En vue"); ou bien
linstruction System.out.println(" l'eau");.
if (x == a && y == b) {
System.out.println("Coul");}
else {
if (x == a || y == b) {
System.out.println("En vue");}
else {
System.out.println(" l'eau");}}
if (x == a || y == b) {
System.out.println("En vue");}
else {
System.out.println(" l'eau");}
ManuelDowek.book Page 10 Monday, July 9, 2012 4:58 PM
1 Les ingrdients des programmes
Groupe Eyrolles, 2012
11
Exercice 1.3
En C, le mme extrait de programme scrit ainsi :
Quelles sont les ressemblances et les diffrences entre Java et C ?
Exercice 1.4 (avec corrig)
Le programme suivant permet de calculer le prix toutes taxes comprises dun
article, connaissant son prix hors taxes, dans le cas o le taux de TVA est de
19,6 %.
Adapter ce programme pour permettre lutilisateur de choisir le taux de TVA.
Mme si lon nest pas un expert en calcul de pourcentages, on identifie facile-
ment quil faut remplacer le 19.6 de la troisime ligne par un taux quelconque.
Pour que ce taux puisse tre choisi par lutilisateur, il doit tre stock dans une
nouvelle bote : appelons-la taux. Le contenu de cette bote doit tre saisi au
a = 4;
b = 7;
printf(" vous de jouer\n");
scanf("%d",&x);
scanf("%d",&y);
if (x == a && y == b) {
printf("Coul\n");}
else {
if (x == a || y == b) {
printf("En vue\n");}
else {
printf(" l'eau\n");}}
SAVOIR-FAIRE Modifier un programme existant pour obtenir
un rsultat diffrent
Lintrt de partir dun programme existant est quil nest pas toujours ncessaire den
comprendre le fonctionnement en dtail pour ladapter un nouveau besoin.
Il importe avant tout :
didentifier les parties du programme qui doivent tre modifies et celles qui
sont conserver,
de les modifier en consquence,
ventuellement dadapter les entres et les sorties au nouveau programme,
et, comme toujours, de le tester sur des exemples bien choisis.
System.out.println("Quel est le prix hors taxes ?");
ht = Isn.readDouble();
ttc = ht + ht * 19.6 / 100;
System.out.print("Le prix toutes taxes comprises est ");
System.out.println(ttc);
ManuelDowek.book Page 11 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
12
clavier. Il faut donc prvoir lentre correspondante. Voici donc le nouveau pro-
gramme avec, en gras, les lments ajouts ou modifis :
Exercice 1.5
En gnral, la bataille navale, un bateau nest en vue que si la case tou-
che est immdiatement voisine de celle du bateau. Modifier le premier pro-
gramme de ce chapitre pour tenir compte de cette rgle. On pourra traiter le
cas o les cases diagonalement adjacentes au bateau sont en vue et le cas
o elles ne le sont pas.
Les ingrdients
dun programme
Le programme de bataille navale utilise des instructions de diffrentes
formes :
des affectations de la forme v = e; o v est une variable et e une
expression,
des instructions dentre de la forme v = Isn.readInt(); o v est une
variable,
des instructions de sortie de la forme System.out.println(e); o e est
une expression,
des squences de la forme p q (cest--dire p suivi de q) o p et q sont
deux instructions,
des tests de la forme if (e) p else q o e est une expression et p et q
deux instructions.
La mmoire de lordinateur est constitue dune multitude de petites botes,
un programme nutilise en gnral que quelques-unes de ces botes. Chaque
bote utilise par le programme a un nom et contient une valeur. On appelle
tat de lexcution dun programme, le triplet form par le nombre de botes,
le nom de chacune delles et la valeur quelle contient.
System.out.println("Quel est le prix hors taxes ?");
ht = Isn.readDouble();
System.out.println("Quel est le taux de TVA ?");
taux = Isn.readDouble();
ttc = ht + ht * taux / 100;
System.out.print("Le prix toutes taxes comprises est ");
System.out.println(ttc);
T tat de lexcution dun programme
On appelle tat de lexcution dun pro-
gramme le triplet form par le nombre de botes
utilises, le nom de chacune delles et la valeur
quelle contient.
ManuelDowek.book Page 12 Monday, July 9, 2012 4:58 PM
1 Les ingrdients des programmes
Groupe Eyrolles, 2012
13
Excuter une instruction a pour effet de transformer cet tat.
Excuter laffectation v = e; a pour effet de calculer la valeur de
lexpression e dans ltat courant et de modifier cet tat en mettant
cette valeur dans la bote de nom v. Par exemple, excuter linstruc-
tion x = 4; dans ltat produit ltat (voir ci-contre). De mme,
excuter linstruction x = y + 3; dans ltat produit ltat .
Excuter linstruction dentre v = Isn.readInt(); o v est une
variable a pour effet dinterrompre le droulement du programme
jusqu ce que lutilisateur tape un nombre au clavier. Ce nombre est
alors mis dans la bote de nom v. Des instructions similaires, v =
Isn.readDouble(); et v = Isn.readString(); permettent lutilisa-
teur de taper un nombre virgule ou une chane de caractres.
Excuter linstruction de sortie System.out.print(e); o e est une
expression ne modifie pas ltat, mais a pour effet de calculer la valeur
de lexpression e dans ltat courant et dafficher cette valeur lcran.
Excuter linstruction de sortie System.out.println(e); affiche la
valeur de lexpression e puis passe la ligne. Excuter linstruction de
sortie System.out.println(); naffiche rien mais passe la ligne.
Excuter la squence p q o p et q sont deux instructions a pour effet
dexcuter p puis q dans ltat obtenu. Par exemple, excuter
linstruction :
dans ltat excute linstruction x = 8; ce qui produit ltat puis
linstruction y = 9; ce qui produit ltat .
Excuter le test if (e) p else q o e est une expression et p et q sont
deux instructions a pour effet de calculer la valeur de lexpression e,
puis dexcuter linstruction p ou linstruction q, selon que la valeur de
e est true (vrai) ou false (faux). Par exemple, excuter linstruction :
x = 8;
y = 9;

if (x < 7) {
System.out.println("un peu");}
else {
System.out.println("beaucoup");}

COMPRENDRE Une instruction


compose mais unique
Attention, linstruction :
x = 8;
y = 9;
est une unique instruction, savoir une
squence de deux instructions plus petites :
x = 8;
et
y = 9;
ManuelDowek.book Page 13 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
14
dans ltat affiche un peu, car la valeur de lexpression x < 7 dans
cet tat est true. En revanche, excuter cette instruction dans ltat
affiche beaucoup.
Une variante du test est le test sans else : if (e) p o e est une expres-
sion et p est une instruction. Excuter cette instruction a pour effet de
calculer la valeur de lexpression e, puis dexcuter linstruction p si la
valeur de e est true. Par exemple, excuter linstruction :
dans ltat affiche un peu, alors quexcuter cette instruction dans
ltat naffiche rien.
Exercice 1.6 (avec corrig)
Que fait ce programme ?
Il y a ici quatre entres a, b, c et d, et deux sorties qui correspondent aux pro-
duits a * c et b * d. Le premier test indique que ni b ni d ne doivent tre
nulles. De tous ces lments, on dduit que les entres reprsentent sans
doute les fractions a / b et c / d, que le programme calcule le produit de ces
deux fractions, lorsquelles existent, et donne nouveau le rsultat sous la
forme dune fraction. On notera que ce qui peut rendre ce programme diffi-
cile lire est, entre autres choses, les noms peu parlants choisis pour les varia-
bles. On gagnerait ainsi renommer a en numerateur1, b en denominateur1,
c en numerateur2, et d en denominateur2.
Exercice 1.7
Que fait ce programme ? Comment devrait-on renommer ses variables ?
if (x < 7) {
System.out.println("un peu");}

SAVOIR-FAIRE Comprendre un programme et expliquer ce quil fait
Identifier le rle de chacune des variables utilises. Si ncessaire, drouler la main une
excution du programme en notant ltat de lexcution du programme au fur et mesure.
a = Isn.readInt();
b = Isn.readInt();
c = Isn.readInt();
d = Isn.readInt();
if (b == 0 || d == 0) {
System.out.println("Dnominateur nul interdit !");}
else {
System.out.println(a * c);
System.out.println(b * d);}
a = Isn.readInt();
b = Isn.readInt();
c = Isn.readInt();
ManuelDowek.book Page 14 Monday, July 9, 2012 4:58 PM
1 Les ingrdients des programmes
Groupe Eyrolles, 2012
15
Exercice 1.8
Lexcution de linstruction :
produit-elle laffichage de la valeur 5 ou de la valeur 11 ?
Exercice 1.9 (avec corrig)
crire un programme qui, tant donn une quation du second degr, dter-
mine le nombre de ses solutions relles et leurs valeurs ventuelles.
Lentre est une quation du second degr a x + b + c = 0, fournie sous
la forme de ses coefficients a, b et c. La sortie sera laffichage du nombre de
solutions relles et de leurs valeurs. Le rle du discriminant = b
2
- 4ac est ici
suffisamment important pour mriter une variable intermdiaire delta qui
stocke sa valeur.
Il faut distinguer trois cas selon le signe du discriminant, ce qui se fait bien
entendu laide de tests.
d = Isn.readInt();
if (b == 0 || d == 0) {
System.out.println("Dnominateur nul interdit !");}
else {
System.out.println(a * d + c * b);
System.out.println(b * d);}
x = 4;
y = x + 1;
x = 10;
System.out.println(y);
SAVOIR-FAIRE crire un programme
Identifier les entres et les sorties du programme et, dans la mesure du possible, les varia-
bles intermdiaires dont on aura besoin. Si le programme doit prendre une dcision ,
une ou plusieurs instructions de tests sont ncessaires.
a = Isn.readDouble();
b = Isn.readDouble();
c = Isn.readDouble();
delta = b * b - 4 * a * c;
if (delta < 0.0) {
System.out.println("Pas de solution");}
else {
if (delta == 0.0) {
System.out.print("Une solution : ");
System.out.println(- b / (2 * a));}
else {
System.out.print("Deux solutions : ");
System.out.print((- b - Math.sqrt(delta)) / (2 * a));
System.out.print(" et ");
System.out.println((- b + Math.sqrt(delta)) / (2 * a));}}
ManuelDowek.book Page 15 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
16
Exercice 1.10
Essayer le programme ci-dessus avec les entres a = 1.0, b = 0.0, c = 1.0E-10 et
a = 1.0, b = 0.0, c = -1.0E-10. Montrer quune infime variation sur lun des
coefficients permet de franchir la ligne qui spare les cas o lquation a des
solutions des cas o elle nen a pas.
Essayer le programme ci-dessus avec les entres a = 1.0, b = 6.0, c = 9.0 et
a = 0.1, b = 0.6, c = 0.9. Expliquer les rsultats.
Exercice 1.11 (avec corrig)
Proposer un jeu de tests satisfaisant pour le programme de bataille navale.
Au minimum, il faut vrifier que le bateau est effectivement coul si lon
donne les bonnes coordonnes, mais non coul si lon en donne de mauvaises.
Par ailleurs, il faut tester si le programme affiche correctement En vue, et
donc tester au moins une case dans la mme colonne que le bateau et une
case dans la mme ligne. Ces deux derniers tests permettront galement de
vrifier que les instructions conditionnelles du programme sont crites correc-
tement, et que par exemple il ne suffit pas davoir trouv la bonne ligne pour
couler le bateau. On testera donc le programme sur les entres suivantes, par
exemple, avec les rsultats attendus :
(4 ; 7) : Coul,
(1 ; 2) : l'eau,
(4 ; 9) : En vue (mme ligne),
(8 ; 7) : En vue (mme colonne).
On pourrait galement tester ce quil se passe si lon entre une coordonne
dcimale ou une coordonne qui dpasse les limites du tableau de jeu.
Exercice 1.12
Proposer un jeu de tests satisfaisant pour le programme de calcul des solutions
relles dune quation du second degr ci-avant.
SAVOIR-FAIRE Mettre un programme au point en le testant
Pour vrifier si un programme ne produit pas derreur au cours de son excution et sil
effectue rellement la tche que lon attend de lui, une premire mthode consiste ex-
cuter plusieurs fois ce programme, en lui fournissant des entres, appeles tests, qui per-
mettent de dtecter les erreurs ventuelles. Pour quelles jouent leur rle, il faut choisir
ces entres de sorte que :
on sache quelle doit tre la sortie correcte du programme avec chacune de ces entres,
chaque cas distinct dexcution du programme soit parcouru avec au moins un choix
dentres,
les cas limites soient essays : par exemple le nombre 0, la chane vide ou un seul
caractre.
ManuelDowek.book Page 16 Monday, July 9, 2012 4:58 PM
1 Les ingrdients des programmes
Groupe Eyrolles, 2012
17
Les instructions et les expressions
Laffectation x = y + 3; est une instruction. Elle est compose dune
variable x et dune expression y + 3.
On attribue une valeur chaque expression. Pour les expressions sans
variables, comme (2 + 5) * 3, dont la valeur est 21, la valeur sobtient
simplement en effectuant les oprations prsentes dans lexpression, dans
cet exemple une addition et une multiplication. La valeur dune expression
qui contient des variables, par exemple (2 + x) * 3, se dfinit de la mme
manire, mais dpend de ltat dans lequel on calcule cette valeur.
Par exemple, la valeur de lexpression (2 + x) * 3 dans ltat est 15,
alors que celle de cette mme expression dans ltat est 18.
Exercice 1.13
Les suites de symboles suivantes sont-elles des instructions ou des expressions ?
x
x = y;
x = y + 3;
x + 3;
System.out.println(x + 3);
x = Isn.readInt();
x == a
x == a && y == b
Exercice 1.14
Dterminer la valeur des expressions suivantes dans ltat .
y + 3
x + 3
x + y
x * x
y == 5
x == 3 && y == 5
Exercice 1.15
Dterminer dans chacun des cas suivants tous les tats tels que :
y 2 vaut 1,
x * x vaut 4,
x + y vaut 1,
ces trois conditions la fois.
T Une expression
Une expression est un lment de programme
qui peut tre de diffrentes formes :
une variable, par exemple x, y ;
une constante, par exemple, 3, 3.14,
6.02E23, true, "Coul" ;
une expression de la forme e + e', e * e',
e == e' forme dune opration comme +,
*, == et dune ou plusieurs expressions, par
exemple y + 3.

ManuelDowek.book Page 17 Monday, July 9, 2012 4:58 PM


Premire partie Langages
Groupe Eyrolles, 2012
18
Les oprations
Les expressions sont formes en utilisant les oprations suivantes :
+ Addition entire
Soustraction entire
* Multiplication entire
/ Quotient de la division euclidienne. Attention
cette division est inhabituelle pour les
nombres ngatifs : -5 / 2 vaut -2 et non
-3, et -5 / -2 vaut 2.
% Reste de la division euclidienne. Attention
encore aux nombres ngatifs : -5 % 2 vaut
-1 et -5 % -2 aussi.
+ Addition dcimale
Soustraction dcimale
* Multiplication dcimale
/ Division dcimale
Math.pow Puissance
Math.sqrt Racine
Math.PI
Math.sin Sinus
Math.cos Cosinus
Math.exp Exponentielle
Math.log Logarithme nprien
Math.abs Valeur absolue
Math.min Minimum
Math.max Maximum
Math.floor Partie entire
Math.random Nombre alatoire dcimal entre 0 et 1, selon
la loi uniforme
== gal. Sapplique aux valeurs numriques et
boolennes, mais pas aux chanes de
caractres ni aux tableaux.
!= Diffrent. Sapplique aux valeurs numriques
et boolennes, mais pas aux chanes de
caractres ni aux tableaux.
<= Infrieur ou gal.
< Infrieur strictement.
>= Suprieur ou gal.
> Suprieur strictement.
Isn.stringEqual Prend en argument deux chanes de
caractres et renvoie la valeur true si ces
deux chanes sont gales et la valeur false
sinon.
Isn.stringAlph Prend en argument deux chanes de
caractres et renvoie la valeur true si la
premire chane est avant la seconde dans
lordre alphabtique, et la valeur false
sinon.
Isn.stringLength Prend en argument une chane de caractres
et renvoie un entier qui est sa longueur.
Isn.stringNth Prend en argument une chane de caractres
s et un entier n, compris entre 0 et la
longueur de la chane moins 1, et renvoie la
chane de caractres forme dun seul
caractre qui est le n-ime de la chane s.
Isn.asciiString Prend en argument un entier n et retourne
une chane de caractres qui contient un
unique caractre dont le code ASCII (voir le
chapitre 8) est n.
Isn.stringCode Fonction inverse de la prcdente, qui prend
en argument une chane de caractres s et
retourne le code ASCII du premier caractre
de cette chane.
+ Concatnation. Sapplique deux chanes de
caractres et construit une unique chane
forme de la premire, suivie de la deuxime.
! Non.
& Et (Variante : &&.)
| Ou (Variante :||.)
ManuelDowek.book Page 18 Monday, July 9, 2012 4:58 PM
1 Les ingrdients des programmes
Groupe Eyrolles, 2012
19
Exercice 1.16
Le but de cet exercice est dcrire un programme qui demande lutilisateur
une date comprise entre le 1
er
janvier 1901 et le 31 dcembre 2099 et qui
indique le nombre de jours couls entre le premier janvier 1901 et cette date.
Une bonne approximation de ce nombre est (a 1901) * 365 + (m 1) *
30 + j 1;. Mais il faut lui ajouter deux termes correctifs. Le premier est d
au fait que tous les mois ne font pas trente jours. On peut montrer que ce
terme correctif vaut m / 2 quand m est compris entre 1 et 2 et vaut (m + m /
8) / 2 2 quand m est compris entre 3 et 12. Le second est d aux annes bis-
sextiles. On peut montrer que ce terme correctif vaut (a 1900)/4 1 si a
est un multiple de 4 et m est compris entre 1 et 2 et vaut (a 1900)/4 sinon.
crire un programme qui demande lutilisateur trois nombres qui consti-
tuent une date comprise entre le premier janvier 1901 et le 31 dcembre
2099, par exemple 20 / 12 / 1996, et qui indique le nombre de jours couls
entre le premier janvier 1901 et cette date.
crire un programme qui demande lutilisateur deux dates et indique le
nombre de jours couls entre ces deux dates.
Sachant que le premier janvier 1901 tait un mardi, crire un programme
qui demande lutilisateur une date et indique le jour de la semaine cor-
respondant cette date.
Exercice 1.17
En utilisant la fonction Math.random, crire un programme qui simule la loi
uniforme sur lintervalle [a ; b], o a et b sont deux rels donns.
Exercice 1.18
En utilisant la fonction Math.random, crire un programme qui affiche alatoi-
rement pile ou face de faon quiprobable.
Les accolades
Lexpression x y + z peut tre construite ou bien avec le signe + et les
deux expressions x y et z, ou alors avec le signe et les deux expres-
sions x et y + z. Comme en mathmatiques, on lve cette ambigut en
utilisant des parenthses : on crit la premire expression (x y) + z et
ALLER PLUS LOIN Les oprat s && et ||
Lopration && est une variante de &, telle que la valeur de lexpression t
&& u soit false quand la valeur de t est false, mme si la valeur de
lexpression u nest pas dfinie.
De mme, lopration ||est une variante de | telle que la valeur de
lexpression t || u soit true quand la valeur de t est true, mme si
la valeur de lexpression u nest pas dfinie.
Ainsi lexcution de linstruction :
System.out.println(x != 0 & 1/x > 2);
provoque une erreur, quand x est gal 0, mais celle de linstruction :
System.out.println(x != 0 && 1/x > 2);
affiche false.
ALLER PLUS LOIN Les ordinateurs et le hasard
Parmi les oprations de base, nous avons cit la
fonction Math.random, qui renvoie un
nombre alatoire compris entre 0 et 1. Si lon sy
arrte quelques secondes, lexistence dune telle
fonction est contradictoire avec la notion mme
dalgorithme : un processus suffisamment bien
dcrit et dtaill pour tre excut sans erreur ni
initiative de la part dune machine ne peut pas
mener un rsultat imprvisible et diffrent
chaque excution. Pourtant lintroduction de
hasard dans les programmes est indispensable,
par exemple pour crer des situations imprvues
dans les logiciels de jeux, mais aussi pour
rsoudre certains problmes qui ne peuvent pas
tre rsolus sans une part de hasard, comme on
le verra au chapitre 16. La fonction
Math.random ne gnre pas de nombres
rellement alatoires, mais les rsultats obtenus
sont suffisamment proches de tirages alatoires
pour la plupart des applications qui utilisent ce
genre de nombres. Lexercice 2.8 donne un
exemple dun tel gnrateur de nombres
pseudo-alatoires.
ManuelDowek.book Page 19 Monday, July 9, 2012 4:58 PM
ion
Premire partie Langages
Groupe Eyrolles, 2012
20
la seconde x (y + z). Et, comme en mathmatiques, on dcide que,
quand on nutilise pas de parenthses, lexpression x y + z signifie (x
y) + z et non x (y + z).
Un problme similaire se pose avec les instructions : linstruction if (x
== 0) y = 1; else y = 2; z = 4; peut tre construite ou bien comme la
squence des instructions if (x == 0) y = 1; else y = 2; et z = 4; ou
alors comme le test form de lexpression x == 0 et des instructions y =
1; et y = 2; z = 4;
On lve cette ambigut en utilisant, non des parenthses, mais des acco-
lades, et on crit {if (x == 0) y = 1; else y = 2;} z = 4; la premire
instruction et if (x == 0) y = 1; else {y = 2; z = 4;} la seconde.
Comme dans le cas des expressions, on dcide que, quand on nutilise
pas daccolades, linstruction if (x == 0) y = 1; else y = 2; z = 4;
signifie {if (x == 0) y = 1; else y = 2;} z = 4; et non if (x == 0)
y = 1; else {y = 2; z = 4;}. Le test est prioritaire sur la squence.
Dans un test if (b) p else q, la coutume est de mettre toujours les
expressions p et q entre accolades, afin de faciliter la lecture des
programmes :
Enfin, on peut aussi mettre des accolades autour de zro instruction.
Linstruction obtenue, {}, signifie ne rien faire . On verra au
chapitre 17 une utilisation de cette instruction.
Exercice 1.19
Quel est le rsultat de lexcution des instructions :
if (x == 0) {
y = 1;}
else {
y = 2;
z = 4;}
if (x == 4) {
y = 1;}
else {
y = 2;
z = 3;}
{
if (x == 4) {
y = 1;}
else {
y = 2;}}
z = 3;
ManuelDowek.book Page 20 Monday, July 9, 2012 4:58 PM
1 Les ingrdients des programmes
Groupe Eyrolles, 2012
21
et
dans ltat :
Exercice 1.20
Le but de cet exercice est de montrer que si lon excute linstruction {p q} r
dans un tat e on obtient le mme rsultat que si lon excute linstruction p
{q r}. Soit e
2
ltat obtenu en excutant linstruction p dans ltat e, e
3
ltat
obtenu en excutant linstruction q dans ltat e
2
et e
4
ltat obtenu en excu-
tant linstruction r dans ltat e
3
.
Quel est ltat produit par lexcution de linstruction p q dans ltat e ?
Quel est ltat produit par lexcution de linstruction {p q} r dans ltat e ?
Quel est ltat produit par lexcution de linstruction q r dans ltat e
2
?
Quel est ltat produit par lexcution de linstruction p {q r} dans ltat e ?
Exercice 1.21 (avec corrig)
crire un programme qui affiche le tarif du timbre poser sur une lettre en
fonction de son type et de son poids.
On trouve sur le site web de la Poste le tableau suivant (au 1
er
octobre 2011) :
if (x == 4) {
y = 1;}
else {
y = 2;}
z = 3;
SAVOIR-FAIRE Indenter un programme
Indenter un programme, cest--dire insrer des espaces blancs en dbut de ligne, est un
moyen de visualiser le niveau dimbrication auquel une instruction se trouve. On insre
un espace blanc par accolade ouverte et non ferme situe avant cette instruction dans le
programme. Dans certains langages, comme Python, lindentation joue le rle de
parenthses, comme les accolades en Java. En Java, en revanche, lindentation est une
aide la lecture, mais ne change pas la signification des programmes.
Poids jusqu Lettre verte Lettre prioritaire Ecopli
20 g 0,57 0,60 0,55
50 g 0,95 1,00 0,78
100 g 1,40 1,45 1,00
ManuelDowek.book Page 21 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
22
On peut par exemple considrer que les diffrentes gammes de poids sont des
sous-cas dans chaque type de lettre. Le programme est donc constitu de trois
tests correspondant aux diffrents types de lettres, linstruction excute dans
chacun des cas tant elle-mme constitue de trois tests correspondant aux
diffrents poids. On dcide de ne rien afficher quand les entres type et
poids ne correspondent pas une catgorie du tableau.
Exercice 1.22
Indenter les programmes les suivants :
if (x == 4) {y = 1;} else {y = 2; z = 3;}
if (x == 4) {y = 1;} else {y = 2;} z = 3;.
if (Isn.stringEqual(type,"verte")) {
if (poids <= 20) {
System.out.println(0.57);}
else {
if (poids <= 50) {
System.out.println(0.95);}
else {
if (poids <= 100) {
System.out.println(1.40);}}}}
else {
if (Isn.stringEqual(type,"prioritaire")) {
if (poids <= 20) {
System.out.println(0.60);}
else {
if (poids <= 50) {
System.out.println(1.00);}
else {
if (poids <= 100) {
System.out.println(1.45);}}}}
else {
if (Isn.stringEqual(type,"ecopli"))
if (poids <= 20) {
System.out.println(0.55);}
else {
if (poids <= 50) {
System.out.println(0.78);}
else {
if (poids <= 100) {
System.out.println(1.00);}}}}}
Ai-je bien compris ?
Quelles sont les trois instructions prsentes dans ce chapitre et qui permettent de
construire un programme lmentaire ?
Quelle est la diffrence entre une instruction et une expression ?
Comment lexcution dune instruction transforme-t-elle ltat de lexcution du
programme ?
ManuelDowek.book Page 22 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
2 Les boucles
Gilles Kahn (1946-2006) et Gordon
Plotkin (1946-) ont propos des
outils pour dcrire la smantique des
langages de programmation, cest--
dire ce quil se passe quand on ex-
cute un programme. Gilles Kahn est
aussi lauteur, avec Grard Huet, du
systme Mentor, lun des premiers
systmes qui permet de dfinir de
manire compltement formelle des
langages de programmation. On doit
Gordon Plotkin des contributions
de nombreux domaines de linforma-
tique, en particulier la dmonstration
automatique et la thorie des sys-
tmes concurrents.
Un ordinateur est fait pour effectuer des calculs longs
et rptitifs.
Dans ce chapitre, nous introduisons une nouvelle instruction,
la boucle, qui permet dexcuter une instruction plusieurs fois.
Nous en prsentons deux variantes, la boucle for et la boucle
while. Nous expliquons comment manipuler le compteur dune
boucle for, dans quels cas plutt utiliser une boucle while,
et pourquoi il peut arriver que lexcution dune boucle ne
sarrte jamais.
ManuelDowek.book Page 23 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
24
Au cours de lexcution dun programme construit avec les instructions
prsentes au chapitre 1, chaque instruction du programme est excute
au plus une fois. Par exemple, au cours de lexcution de linstruction :
linstruction y = 7; est excute une fois et linstruction y = 3; nest pas
excute, mais aucune instruction nest excute plusieurs fois. Or, bien
souvent, nous voulons effectuer des calculs dans lesquels certaines ins-
tructions sont excutes plusieurs fois (voir lexemple ci-contre).
Permettre une instruction dtre excute plusieurs fois au cours de lex-
cution dun programme est le but dune nouvelle instruction : la boucle.
La boucle for
La premire forme de boucle, prsente dans ce chapitre, est la boucle
for. Cest une instruction de la forme for (i = e; i <= e'; i = i + 1)
p o i est une variable, e et e' sont des expressions et p est une instruc-
tion, appele corps de cette boucle. Comme dans le cas des tests, la cou-
tume est de toujours mettre le corps dune boucle entre accolades.
Excuter la boucle for (i = e; i <= e'; i = i + 1) p a pour effet
dexcuter linstruction p (n - m + 1) fois, o m est la valeur de lexpres-
sion e et n celle de lexpression e', dans des tats dans lesquels la valeur
de la variable i est successivement m, m + 1, , n.
Par exemple, excuter la boucle :
a pour effet dafficher :
Excuter la boucle :
a pour effet dafficher .
x = 1;
if (x == 2) {
y = 3;}
else {
y = 7;}
for (i = 1; i <= 10; i = i + 1) {
System.out.print("all ");}
System.out.println("t'es o ?");
all all all all all all all all all all t'es o ?
for (i = 1; i <= 10; i = i + 1) {
System.out.println(i);}
EXEMPLE Certaines instructions
sont excutes plusieurs fois
Pour crire un programme qui affiche le
calendrier :
1 janvier
2 janvier
3 janvier
4 janvier
5 janvier
6 janvier
7 janvier
8 janvier
9 janvier
10 janvier
11 janvier
12 janvier
13 janvier
14 janvier
15 janvier
16 janvier
17 janvier
18 janvier
19 janvier
20 janvier
21 janvier
22 janvier
23 janvier
24 janvier
25 janvier
26 janvier
27 janvier
28 janvier
29 janvier
30 janvier
31 janvier
nous ne voulons pas crire, dans le programme,
linstruction System.out.println trente
et une fois, mais crire cette instruction une
seule fois et faire en sorte quelle soit excute
trente et une fois au cours de lexcution du
programme.
ManuelDowek.book Page 24 Monday, July 9, 2012 4:58 PM
2 Les boucles
Groupe Eyrolles, 2012
25
Cette description de ce quil se passe quand on excute une boucle nest
exacte que quand deux conditions sont vrifies : dune part, la variable i ne
doit pas tre affecte au cours de lexcution du corps p de la boucle, dautre
part, la valeur de lexpression e' ne doit pas changer au cours de cette ex-
cution. Par exemple, excuter linstruction :
affiche , ce qui montre que le corps de la boucle est bien excut dix fois.
Mais excuter linstruction :
o la valeur de la variable i est augmente de 1 chaque fois que lins-
truction p est excute affiche , ce qui montre que le corps de la boucle
nest excut que cinq fois.
Et, de mme, excuter linstruction :
o la valeur de la variable x, qui apparat dans lexpression e', est dimi-
nue de 1 chaque fois que linstruction p est excute affiche , ce qui
montre que le corps de la boucle nest excut que cinq fois galement.
On retiendra de ces deux exemples, quil ne faut pas, dans le corps dune
boucle, affecter la variable i ni aucune des variables qui apparaissent
dans lexpression e'. Quand on est tent de le faire, cela est souvent le
signe quil aurait mieux valu utiliser une boucle while prsente ci-aprs.
En utilisant une boucle for, on peut maintenant crire une instruction
qui affiche le calendrier ci-avant :
for (i = 1; i <= 10; i = i + 1) {
System.out.println(i);}
for (i = 1; i <= 10; i = i + 1) {
System.out.println(i);
i = i + 1;}
x = 10;
for (i = 1; i <= x; i = i + 1) {
System.out.print(i);
System.out.print(" ");
System.out.println(x);
x = x 1;}
for (jour = 1; jour <= 31; jour = jour + 1) {
System.out.print(jour);
System.out.println(" janvier");}

1
2
3
4
5
6
7
8
9
10

1
3
5
7
9
1 10
2 9
3 8
4 7
5 6
DANS DAUTRES LANGAGES
Texas Instruments et Casio
Dans le langage des calculatrices Texas Instru-
ments et Casio les boucles scrivent ainsi :
Texas Instruments
PROGRAM:COMPTE
:For (I,1,10)
:Disp I
:End
Casio
======COMPTE ======
For 1 I to 10
I
Next
ManuelDowek.book Page 25 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
26
Exercice 2.1 (avec corrig)
crire un programme qui recueille au clavier les tempratures de 7 jours suc-
cessifs et calcule la temprature moyenne de la semaine.
Ici, le compteur de boucle jour ne reprsente que le numro du jour dans la
semaine et nintervient pas dans les calculs. Dans le corps de la boucle, on se
contente donc de lire les tempratures au clavier dans une variable
temperature et de faire la somme des nombres entrs au fur et mesure dans
une variable somme. Linstruction correspondante sera donc :
Pour que la somme calcule soit correcte, il faut penser initialiser la variable
somme zro avant la boucle. Enfin, une fois les 7 tempratures entres, il faut
convertir cette somme en moyenne et lafficher :
Exercice 2.2
Modifier le programme prcdent pour que lutilisateur puisse prciser le
nombre de jours avant de donner les tempratures.
Exercice 2.3
crire un programme qui calcule et affiche la liste des diviseurs dun nombre
entier naturel entr au clavier.
Exercice 2.4 (avec corrig)
crire un programme qui affiche un calendrier pour une anne entire.
Ce programme doit avoir une structure en boucles imbriques : une anne est
constitue de douze mois et chaque mois est son tour constitu de plusieurs
SAVOIR-FAIRE crire un programme utilisant une boucle for
Identifier si le compteur doit jouer un rle dans le corps de la boucle. crire le corps de la
boucle. Prvoir une initialisation des variables en amont de la boucle et un post-traite-
ment en aval.
temperature = Isn.readDouble();
somme = somme + temperature;
somme = 0;
for (jour = 1; jour <= 7; jour = jour + 1) {
temperature = Isn.readDouble();
somme = somme + temperature;}
System.out.println(somme / 7.0);
SAVOIR-FAIRE Imbriquer deux boucles
Quand linstruction excuter lintrieur dune boucle est elle aussi rptitive, le corps de
cette boucle contient une seconde boucle et on dit que ces deux boucles sont imbriques.
Les bornes de la boucle interne dpendent souvent du compteur de la boucle externe.
ManuelDowek.book Page 26 Monday, July 9, 2012 4:58 PM
2 Les boucles
Groupe Eyrolles, 2012
27
jours. Si tous les mois de lanne avaient trente jours, il suffirait dcrire le pro-
gramme suivant :
Mais comme les mois ont un nombre de jours variable, il faut, pour chaque
mois, dabord calculer le nombre de jours nbj du mois en fonction de mois,
puis utiliser une boucle dont lindice jour varie de 1 nbj :
Exercice 2.5
Combien de points affiche le programme suivant ?
Et celui-ci ?
Exercice 2.6
crire un programme qui affiche un calendrier pour une anne mais en cri-
vant les mois janvier , fvrier , etc. et non 1, 2, etc.
Exercice 2.7
crire un programme qui affiche un calendrier qui va du 1er janvier 2001 au 31
dcembre 3000. Attention les annes multiples de quatre sont bissextiles, sauf
les annes multiples de cent qui ne le sont pas, sauf les annes multiples de
quatre cents qui le sont. Ainsi, 2100, 2200, 2300, 2500, 2600, 2700, 2900 et
3000 ne sont pas bissextiles mais 2400 et 2800 le sont.
Ajouter ce calendrier le nombre de jours couls depuis le dbut du calendrier.
for (mois = 1; mois <= 12; mois = mois + 1) {
for (jour = 1; jour <= 30; jour = jour + 1) {
System.out.print(jour);
System.out.print(" / ");
System.out.println(mois);}}
for (mois = 1; mois <= 12; mois = mois + 1) {
if (mois == 2) {
nbj = 28;}
else {
nbj = 30 + (mois + mois / 8) % 2;}
for (jour = 1; jour <= nbj; jour = jour + 1) {
System.out.print(jour);
System.out.print(" / ");
System.out.println(mois);}}
for (i = 1; i <= 100; i = i + 1) {
System.out.print(".");}
for (j = 1; j <= 100; j = j + 1) {
System.out.print(".");}
System.out.println();
for (i = 1; i <= 100; i = i + 1) {
for (j = 1; j <= 100; j = j + 1) {
System.out.print(".");}}
System.out.println();
ManuelDowek.book Page 27 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
28
Ajouter ce calendrier le jour de la semaine.
Exercice 2.8 Fabriquer des nombres pseudo-alatoires
La suite de nombres dfinie par rcurrence de la manire suivante :
u
0
= 13
u
n+1
= (16805 u
n
+ 1) % 32768
semble alatoire.
crire un programme qui affiche les 10 000 premiers termes de cette suite.
Pour simuler une suite de tirages pile ou face, on observe le neuvime bit
(voir le chapitre 7) de chaque lment de cette suite et on dcrte, lors du
i-me tirage, que la pice est tombe du ct pile si le neuvime bit du
nombre u
i
est un 0, et quelle est tombe du ct face si cest un 1. crire
un programme qui affiche les 10 000 premiers tirages.
On teste la qualit de ce gnrateur dala en comptant le nombre de fois
que la pice tombe dun ct et de lautre. crire un programme qui simule
10 000 tirages et compte le nombre de fois que la pice tombe du ct pile.
Quobtient-on si on observe le bit des units au lieu dobserver le neu-
vime bit ? Expliquer pourquoi : montrer que si u
n
est pair alors u
n+1
est
impair et que si u
n
est impair alors u
n+1
est pair.
Montrer que, loin dtre rellement alatoire, la suite u est en fait prio-
dique partir dun certain rang.
La boucle while
On veut crire un programme qui prend en argument un nombre vir-
gule x suprieur ou gal 1 et qui calcule son logarithme entier. Ce pro-
gramme est form dune boucle qui divise x par 2 plusieurs fois, jusqu
obtenir un nombre infrieur ou gal 1, tout en ajoutant 1 un nombre
n chaque division, pour les compter. Quand la boucle est termine, la
variable n contient le nombre recherch. La nouveaut, avec cette
boucle, est que, tant que lexcution du calcul nest pas acheve, il ny a
aucun moyen de savoir combien de fois le corps de cette boucle sera
rpt, puisque ce nombre est prcisment le nombre que lon cherche
calculer : le logarithme entier de x. Il nest donc pas possible dcrire ce
programme avec une boucle for.
Cest pour cela que lon a introduit, dans les langages de programmation,
une autre forme de boucle : la boucle while. Dans une telle boucle, le choix
1 lundi 1 janvier 2001
2 mardi 2 janvier 2001

365241 mardi 30 dcembre 3000


365242 mercredi 31 dcembre 3000
T Logarithme entier
On appelle logarithme entier elog(x) dun
nombre rel x suprieur ou gal 1, le nombre de
fois quil faut le diviser par deux pour obtenir un
nombre infrieur ou gal 1. Par exemple, le loga-
rithme entier du nombre 60 000 est 16 car 60 000
/ 2
16
= 0.915, cest--dire 60 000 divis par 2
seize fois.
ManuelDowek.book Page 28 Monday, July 9, 2012 4:58 PM
2 Les boucles
Groupe Eyrolles, 2012
29
de continuer ou non rpter le corps de la boucle nest pas conditionn,
comme dans le cas dune boucle for, par un nombre ditrations fix avant
le dbut de lexcution de la boucle, mais il est fait dynamiquement : avant
chaque excution du corps de la boucle, on teste une condition, si cette
condition est vrifie, on excute le corps de la boucle et on recommence, si
elle ne lest pas, lexcution de la boucle est acheve.
Une boucle while est une instruction de la forme while (e) p o e est
une expression et p est une instruction, appele corps de cette boucle.
Excuter la boucle while (e) p a pour effet dexcuter linstruction p
plusieurs fois tant que la valeur de lexpression e est gale true.
Ainsi, on peut programmer le calcul du logarithme entier dun nombre x
de la manire suivante :
Exercice 2.9
Montrer que si 2
n1
< x 2
n
, alors elog(x) = n. Montrer que le logarithme
entier dun nombre est son logarithme binaire, dfini par log
2
(x) = ln(x) /
ln(2), arrondi par excs.
Exercice 2.10 (avec corrig)
Rechercher une sous-chane dans une chane de caractres.
Comme la fonction Rechercher dun logiciel de traitement de texte, on
cherche si une chane de caractres contient, par exemple, la sous-chane
"oui". Pour ce faire on doit tester si les trois caractres aux positions n, n + 1
et n + 2 de la chane s sont "o", "u" et "i" jusqu ce quon trouve ces trois
caractres, ou que lon atteigne la fin de la chane.
n = 0;
while (x > 1) {
x = x / 2;
n = n + 1;}
DANS DAUTRES LANGAGES
Texas Instruments et Casio
Dans le langage des calculatrices la boucle
while scrit de la manire suivante :
Texas Instruments
PROGRAM:ELOG
:0 N
:While X > 1
:X/2 X
:N+1 N
:End
Casio
======ELOG ======
0 N
While X > 1
X/2 X
N+1 N
WhileEnd
SAVOIR-FAIRE crire un programme utilisant une boucle while
Identifier la condition. crire le corps de la boucle. Prvoir une initialisation des varia-
bles en amont de la boucle et un post-traitement en aval.
longueur = Isn.stringLength(s);
n = 0;
while (n <= longueur 3
&& !(Isn.stringEqual(Isn.stringNth(s,n),"o")
&& Isn.stringEqual(Isn.stringNth(s,n+1),"u")
&& Isn.stringEqual(Isn.stringNth(s,n+2),"i"))) {
n = n + 1;}
if (n > longueur 3) {
System.out.println("pas de oui");}
else {
System.out.println(n);}
ManuelDowek.book Page 29 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
30
Exercice 2.11
On dfinit une suite u de la manire suivante :
u
0
= 1000
si u
n
= 1, alors la suite est finie et u
n
est son dernier lment
si u
n
est pair, alors u
n+1
= u
n
/ 2
si u
n
est impair et distinct de 1, alors u
n+1
= 3 u
n
+ 1
crire un programme qui affiche les termes de la suite u.
Cette suite est-elle finie ?
Exercice 2.12
crire un programme qui dtermine le plus petit multiple commun deux
nombres entiers entrs au clavier.
Exercice 2.13 (avec corrig)
Reprendre le programme de lexercice 1.9 qui calcule les solutions dune qua-
tion du second degr et le complter pour quil vrifie que les coefficients
entrs au clavier dterminent bien une fonction polynme du second degr,
autrement dit que a est non nul. Commenter le programme ainsi obtenu.
SAVOIR-FAIRE Commenter un programme
Ds que lon crit un programme de plus dune dizaine de lignes, il est indispensable
dajouter des commentaires dans ce programme, autrement dit des lignes crites en langue
naturelle que la machine ne cherche pas interprter comme des instructions et qui
expliquent le rle des diffrentes parties du programme aux codveloppeurs.
Ces commentaires permettent un programmeur de comprendre un programme crit
par un autre programmeur ou par lui-mme longtemps auparavant.
Pour prciser quune ligne est un commentaire, on la fait prcder dun symbole particu-
lier. En Java, il sagit de deux barres obliques //. Si lon veut crire un commentaire sur
plusieurs lignes, il faut faire prcder chacune dentre elles de ce symbole.
Ces commentaires doivent donner des informations supplmentaires sur le sens du
programme. Inutile de commenter en disant, par exemple ceci est une boucle , mais
expliquer le rle de cette boucle.
// Voici un programme qui rsout l'quation du second degr
// a x^2 + b x + c = 0
a = Isn.readDouble();
b = Isn.readDouble();
c = Isn.readDouble();
// Test du coefficient dominant
if (a == 0.0) {
System.out.println("Pas une quation du second degr");}
else {
// Calcul du discriminant
delta = b * b - 4 * a * c;
ManuelDowek.book Page 30 Monday, July 9, 2012 4:58 PM
2 Les boucles
Groupe Eyrolles, 2012
31
Exercice 2.14
Commenter le programme de la bataille navale.
La non-terminaison
Avec la boucle while apparat un nouveau comportement possible pour les
programmes : la non-terminaison. Il est possible dcrire une instruction
while (e) p telle que la valeur de lexpression e soit toujours gale true, si
bien que lexcution de linstruction p se rpte et se rpte, sans que jamais
lexcution de la boucle ne se termine. Un exemple simple est le suivant :
qui affiche all all all sans jamais sarrter.
La boucle for, cas particulier
de la boucle while
La boucle while, qui permet de choisir dynamiquement si lon continue
rpter le corps de la boucle ou si lon sarrte est un outil plus puissant
que la boucle for. En fait, la boucle for est un cas particulier de la
boucle while.
Linstruction for (i = e; i <= e'; i = i + 1) p peut tre vue comme
une manire plus simple dcrire linstruction :
// Affichage des solutions
if (delta < 0.0){
System.out.println("Pas de solution");}
else {
if (delta == 0.0) {
System.out.print("Une solution : ");
System.out.println(- b / (2 * a));}
else {
System.out.print("Deux solutions : ");
System.out.print((- b - Math.sqrt(delta)) / (2 * a));
System.out.print(" et ");
System.out.println((- b + Math.sqrt(delta)) / (2 * a));}}}
while (true) {
System.out.print("all ");}
ManuelDowek.book Page 31 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
32
Par exemple, linstruction :
peut tre vue comme une manire plus simple dcrire linstruction :
et linstruction :
peut tre vue comme une manire plus simple dcrire linstruction :
qui affiche galement.
Cette explication de ce quil se passe quand on excute une boucle for
est aussi plus prcise que celle que nous avons donne avant dintroduire
la boucle while, car elle permet aussi dexpliquer lexcution dune
boucle dans le corps de laquelle on affecte le compteur i ou une variable
utilise dans lexpression e'.
Par exemple, linstruction :
peut tre vue comme une manire plus simple dcrire linstruction :
Et on comprend donc pourquoi cette instruction affiche .
i = e;
while (i <= e') {p i = i + 1;}
for (i = 1; i <= 10; i = i + 1) {
System.out.print("all ");}
i = 1;
while (i <= 10) {
System.out.print("all ");
i = i + 1;}
for (i = 1; i <= 10; i = i + 1) {
System.out.println(i);}
i = 1;
while (i <= 10) {
System.out.println(i);
i = i + 1;}
for (i = 1; i <= 10; i = i + 1) {
System.out.println(i);
i = i + 1;}
i = 1;
while (i <= 10) {
System.out.println(i);
i = i + 1;
i = i + 1;}

1
2
3
4
5
6
7
8
9
10

1
3
5
7
9
ManuelDowek.book Page 32 Monday, July 9, 2012 4:58 PM
2 Les boucles
Groupe Eyrolles, 2012
33
Exercice 2.15 (avec corrig)
Quelle boucle est adapte lcriture de programmes traitant les problmes
suivants :
le calcul du total payer une caisse enregistreuse,
la recherche du jour le plus pluvieux dune anne,
le calcul du primtre dun polygone,
le calcul de la dure dune mission de radio, connaissant ses horaires de
dbut et de fin ?
Une boucle while : on ne sait pas combien il y aura darticles, on ne
sarrte que lorsque le tapis est vide.
Une boucle for : le corps de la boucle doit tre rpt 365 fois exactement.
ALLER PLUS LOIN Savoir si un programme se termine ou non
Savoir si un programme se termine ou non nest pas une
chose facile. Par exemple, quand on excute linstruction :
s = 4;
p = false;
for (i = 1; i <= s 1; i = i + 1) {
j = s i;
if (i * i == 25 * j * j) {
p = true;}}
on numre tous les couples dentiers strictement posi-
tifs (i ; j) dont la somme vaut 4, cest--dire les cou-
ples (1 ; 3), (2 ; 2), (3 ; 1), et on teste si lun de ces couples
est une solution de lquation : i * i == 25 * j * j.
Comme ce nest le cas daucun de ces trois couples, lins-
truction p = true; nest jamais excute et la valeur de
la variable p reste false.
De mme, quand on excute linstruction :
s = 2;
p = false;
while (!p) {
for (i = 1; i <= s 1; i = i + 1) {
j = s i;
if (i * i == 25 * j * j) {
p = true;}}
s = s + 1;}
on numre tous les couples dont la somme des lments
vaut 2, puis tous les couples dont la somme des lments
vaut 3, et ainsi de suite, puis on teste si lun de ces couples
est une solution de lquation : i * i == 25 * j * j.
Quand on essaiera les couples dont la somme des l-
ments vaut 6, on essaiera le couple (5 ; 1), qui est une
solution de lquation, on excutera linstruction p =
true; et lexcution de la boucle while se terminera.
Autrement dit, ce programme numre tous les couples
dentiers strictement positifs (i ; j) et se termine quand
il trouve une solution de lquation i * i == 25 * j * j.
Comme cette quation a une solution, le programme se
termine.
En revanche, si on remplace le nombre 25 par le nombre
2, le programme numre tous les couples dentiers
strictement positifs (i ; j) et se termine quand il
trouve une solution de lquation i * i == 2 * j * j.
Comme cette quation na pas de solution, le pro-
gramme ne se termine pas.
Ces deux programmes sont donc trs similaires, puisque
lun cherche les solutions entires de lquation i * i
== 25 * j * j et lautre celles de lquation i * i ==
2 * j * j mais lun se termine et lautre non.
SAVOIR-FAIRE Choisir entre une boucle for et la boucle while
pour crire un programme
Si on connat lavance le nombre de rptitions effectuer, la boucle for est toute indi-
que. linverse, si la dcision darrter la boucle ne peut sexprimer que par un test, cest
la boucle while quil faut choisir.
ManuelDowek.book Page 33 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
34
Cela dpend : si le nombre de cts est connu, une boucle for, sinon, une
boucle while qui sarrte lorsquon est revenu au sommet de dpart.
Il ny a pas besoin de boucle.
Exercice 2.16
crire les programmes proposs dans lexercice prcdent.
Exercice 2.17
crire un programme qui affiche un tableau de valeurs pour la fonction f : x
x 2 x 2. Lutilisateur choisit les bornes de lintervalle sur lequel on
calcule ces valeurs, ainsi que le pas entre deux valeurs.
Exercice 2.18
Dans cet exercice on crit plusieurs versions dun programme qui joue la
bataille navale, autrement dit qui cherche couler un bateau. Comme dans le
premier exemple, on suppose quil ny a quun seul bateau dune seule case,
dont la position est connue par lutilisateur.
Programmer lalgorithme naf qui consiste essayer toutes les cases syst-
matiquement.
Amliorer cet algorithme pour quil sarrte quand il a coul le bateau.
Amliorer cet algorithme pour quil cherche le bateau intelligemment si
celui-ci est en vue, cest--dire dans une case adjacente au dernier essai
effectu.
Peut-on encore amliorer cet algorithme pour minimiser le nombre
dessais ncessaires ?
Ai-je bien compris ?
quoi sert une boucle ?
Quelle est la diffrence entre une boucle for et une boucle while ?
Que signifie quun programme se termine ?
ManuelDowek.book Page 34 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
3 Les types
Robin Milner (1934-2010) est
lauteur de lun des premiers lan-
gages de programmation avec des
types polymorphes et implicites : le
langage ML. Ce langage est lanctre
de nombreux langages contempo-
rains en particulier des langages
Caml et Haskell. Par la suite il a dve-
lopp lun des premiers langages per-
mettant de dcrire des systmes
concurrents, cest--dire forms de
plusieurs processus qui sexcutent en
parallle. Dans son discours de rcep-
tion du prix Turing, il a insist sur
lautonomie de linformatique, qui
nest une partie daucune autre
science.
Une bote ne sait pas comment elle sappelle.
Cest nous de lui donner un nom et une forme.
Dans ce chapitre, nous introduisons une nouvelle instruction,
la dclaration, qui permet dajouter une bote un tat,
et nous voyons quil y a diffrents types de botes.
Chaque bote, en fonction de son type, peut contenir un nombre
entier, un nombre virgule, un boolen, une chane
de caractres ou plusieurs, dans le cas dun tableau.
Une bote associe une variable peut nexister que pendant
lexcution de certaines parties du programme on parle de
porte de la variable. Une instruction qui manipule une variable
doit donc se trouver dans la porte de celle-ci, et il est important
de comprendre cette notion pour viter les erreurs. Munis de tous
ces ingrdients, nous pouvons enfin excuter nos programmes.
ManuelDowek.book Page 35 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
36
Pour excuter le programme donn en dbut de chapitre 1, il faut dabord
le taper dans un fichier, appel par exemple BatailleNavale.java.
Certains programmes prsents dans ce livre utilisent une extension de
Java appele Isn. Il est donc galement ncessaire de rcuprer le fichier
Isn.java sur le site de lditeur de ce livre et de le mettre dans le mme
rpertoire que ses programmes.
Il faut ensuite compiler ce programme, cest--dire le traduire dans le
langage propre de lordinateur (voir le chapitre 15), avec la commande
javac BatailleNavale.java. Le programme traduit, qui se trouve alors
dans le fichier BatailleNavale.class, peut tre excut par la com-
mande java BatailleNavale.
Toutefois, pour que ce programme produise le rsultat attendu, il faut
laccompagner de quelques instructions supplmentaires :
On a ajout six lignes en dbut de programme et ferm la fin du pro-
gramme les accolades ouvertes plus haut.
On a vu que ce programme utilise quatre botes de noms a, b, x et y. Ces
botes ne sont pas associes de manire permanente ces noms, mais
cette association est cre par les instructions int a; int b; int x; int
y;, qui sappellent des dclarations. Pour abrger le programme et le
rendre plus lisible, on peut remplacer les quatre dclarations par une
seule int a,b,x,y;.
Les deux premires lignes, quant elles, constituent un en-tte qui
indique que lon va crire un programme.
class BatailleNavale {
public static void main (String [] args) {
int a;
int b;
int x;
int y;
a = 4;
b = 7;
System.out.println(" vous de jouer");
x = Isn.readInt();
y = Isn.readInt();
if (x == a && y == b) {
System.out.println("Coul");}
else {
if (x == a || y == b) {
System.out.println("En vue");}
else {
System.out.println(" l'eau");}}}}
class BatailleNavale {
public static void main (String [] args) {
COMPLMENTS
Bhttp://www.editions-eyrolles.com/
T Dclaration
La dclaration T v; p, o T est un type, v une
variable et p une instruction a pour effet dajouter
une bote de nom v et de type T ltat, excuter p
dans ltat obtenu et supprimer la bote de nom v.
ManuelDowek.book Page 36 Monday, July 9, 2012 4:58 PM
3 Les types
Groupe Eyrolles, 2012
37
Exercice 3.1
crire le programme ci-dessus dans un diteur. Compiler et excuter ce pro-
gramme.
Exercice 3.2
Ouvrir le fichier BatailleNavale.class dans un diteur.
Excuter linstruction :
dans ltat ajoute ltat une bote de nom y, ce qui produit ltat
puis excute linstruction :
ce qui produit ltat et affiche 7, et enfin supprime la bote de nom y,
ce qui produit ltat .
Les types de base
En Java, comme dans la plupart des langages de programmation, les
expressions sont classes en fonction de leur type :
les expressions, comme 1 + 2, dont la valeur est un nombre entier,
comme 3, sont de type int (integer : nombre entier),
celles comme 1.5 + 1.64, dont la valeur est un nombre virgule,
comme 3,14, sont de type double, ce nom fait rfrence au fait que les
nombres virgules exprims sur 32 bits sont appels nombres vir-
gule en simple prcision et ceux exprims sur 64 bit sont appels nom-
bres virgule en double prcision (voir le chapitre 7),
celles comme 0 < 2, dont la valeur est un boolen, false (faux) ou
true (vrai), sont de type boolean, dans les langages de programma-
tion, on crit en gnral les boolens false et true et non 0 et 1 pour
viter les confusions avec les nombres,
celles, comme "Cou" + "l", dont la valeur est une chane de carac-
tres, comme "Coul", sont de type String.
int y;
x = 3;
y = 4;
System.out.println(x + y);
x = 3;
y = 4;
System.out.println(x + y);

ManuelDowek.book Page 37 Monday, July 9, 2012 4:58 PM


Premire partie Langages
Groupe Eyrolles, 2012
38
Une valeur de type int est exprime sur 32 bits, selon la mthode vue au
chapitre 7, cest donc un nombre entier relatif compris entre - 2147483648
et 2147483647. Les valeurs de type double sont exprimes sur 64 bits selon
la mthode vue au chapitre 7 : 1 bit de signe, 11 bits dexposant, 52 bits de
mantisse. Un boolen est simplement un bit : true est une autre notation
pour le bit 1, et false une autre notation pour le bit 0. Dans une valeur de
type String, chaque caractre est exprim en Unicode, selon la mthode
vue au chapitre 8.
Donner un type chaque expression a plusieurs avantages : dune part, cela
permet de prciser la manire dont les donnes doivent tre exprimes,
puisque le nombre entier 7 et le nombre virgule 7,0 sont exprims dune
manire trs diffrente (voir le chapitre 7). Dautre part, les types permettent
dviter un certain nombre derreurs : par exemple linstruction :
contient une erreur puisque lexpression attendue aprs le if doit tre de
type boolean et non de type int. Les types jouent ici un rle comparable
celui des dimensions en physique o lquation F = m g
2
est non seule-
ment fausse, mais de plus mal forme, car le membre de gauche est
exprim en kg m s
2
alors que celui de droite est exprim en kg m
2
s
4
.
On peut changer le type dune expression en la prfixant par le nom dun
type, par exemple, si la valeur de lexpression e est le nombre entier 7,
alors celle de lexpression (double) e est le nombre virgule 7,0. Si la
valeur de lexpression e est le nombre virgule 4,0, alors celle de lexpres-
sion (int) e est le nombre entier 4.
Si la valeur de lexpression e est un nombre virgule, comme 3,4, qui ne
correspond pas un nombre entier, alors la valeur de lexpression (int)
e est la partie entire de la valeur de e, dans cet exemple 3. Attention,
cette partie entire est inhabituelle pour les nombres ngatifs : si la
valeur de lexpression e est -3,4, alors celle de (int) e est -3 et non -4. Il
vaut donc mieux systmatiquement utiliser dabord la fonction
Math.floor qui, chaque nombre virgule x, associe un autre nombre
virgule qui est la partie entire de x, avant de changer le type dune
expression. Ainsi, si la valeur de de lexpression e est -3,4, alors celle de
lexpression Math.floor(e) est -4,0 et celle de lexpression (int)
Math.floor(e) est le nombre entier -4.
if (3 + 4) {
System.out.println(x);}
else {
System.out.println(y);}
ManuelDowek.book Page 38 Monday, July 9, 2012 4:58 PM
3 Les types
Groupe Eyrolles, 2012
39
Exercice 3.3 (avec corrig)
Quel est le type appropri pour les variables suivantes :
une variable qui contient le prnom de lutilisateur,
une variable qui sert de compteur dans une boucle for,
une variable qui stocke au fur et mesure le plus grand des nombres quun
utilisateur tape au clavier,
une variable qui sert calculer le nombre datomes dans lUnivers,
une variable qui permet de traiter diffremment un nombre selon quil est
pair ou impair.
On cherche ici stocker une suite de lettres : cest une variable de type
String.
Le corps de la boucle est videmment excute un nombre entier de fois :
un compteur de boucle est toujours de type int.
On ne sait pas a priori quels types de nombres seront taps par lutilisateur
et on ne le matrise pas : il vaut donc mieux prvoir une variable de type
double. Cependant, si le programme est conu de manire naccepter
que des nombres entiers en entres, on donne le type int cette variable.
premire vue on parle ici dun nombre entier, mais le type int ne con-
viendra pas : sa valeur maximale est 2147483647 et il y a de lordre de 10
80
atomes dans lUnivers. Il faut donc utiliser plutt une variable de type
double. Le nombre calcul sera peu prcis, mais il sagit, de toute faon,
dune estimation.
Une variable de type boolean : on ne sintresse pas ici au nombre lui-
mme mais uniquement sa parit. On prendra donc par exemple true
pour pair et false pour impair .
Exercice 3.4 (avec corrig)
Quelle est la valeur de lexpression ((double) 5 / (double) 2) ? Et celle de
lexpression (double) (5 / 2) ?
SAVOIR-FAIRE Diffrencier les types de base
Plusieurs facteurs peuvent dterminer le type donner une variable.
Que reprsente-t-elle ?
Au cours de lexcution de lalgorithme, quelles valeurs peut-elle prendre ?
Quelles oprations ralise-t-on avec cette variable ?
T Type dune variable
Le type dune variable indique la nature des don-
nes que cette variable contient : nombre entier,
nombre virgule, chane de caractres, etc.
SAVOIR-FAIRE Changer le type dune expression
Les seuls types pour lesquels la conversion a rellement un sens sont int et double.
Certaines oprations, par exemple le sinus Math.sin, nacceptent que des nombres de
type double.
Certaines oprations ont une signification diffrente selon le type de leurs arguments,
par exemple la division de deux entiers est la division euclidienne, alors que la division
de deux nombres virgules est la division dcimale.
ManuelDowek.book Page 39 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
40
Dans le premier cas les nombres diviser sont convertis en nombres virgule
avant la division : il sagit donc de la division dcimale 5,0 / 2,0, dont le rsultat
est 2,5.
Dans le second cas la division 5 / 2 est une division euclidienne, et son rsultat
est donc 2. Ce nombre est ensuite converti en un nombre virgule ce qui
donne le nombre 2,0.
Exercice 3.5
En utilisant la fonction Math.random, crire un programme qui gnre de faon
quiprobable des nombres entiers entre 1 et n, o n est un entier donn.
Exercice 3.6
Modifier le programme de bataille navale pour que la position du bateau soit
choisie au hasard chaque excution.
Exercice 3.7 (avec corrig)
Arrondir la valeur de la variable x au millime prs.
La fonction Math.floor ne garde que la partie entire du nombre virgule
donn. Pour garder les trois premires dcimales, il faut donc les faire passer
temporairement dans la partie entire. Le nombre Math.floor(x * 1000.0)
a donc les chiffres recherchs mais il est 1000 fois trop grand.
Pour retrouver larrondi recherch, il faut donc effectuer sa division dcimale par
1000. Lexpression recherche est donc Math.floor(x * 1000.0) / 1000.0.
Exercice 3.8 (avec corrig)
Le programme suivant devrait permettre de trouver la mesure principale dun
angle en radians, mais il contient une erreur. Identifier cette erreur et pro-
poser une correction.
Lerreur est ici dutiliser lopration % qui est le reste de la division euclidienne
avec des nombres de type double. On est ici oblig de simuler le calcul du
reste en utilisant une partie entire : si le quotient / 2 a pour partie entire
n, alors 2n correspond au reste que lon cherche.
double alpha,principale;
alpha = Isn.readDouble();
principale = alpha % (2 * Math.PI);
if (principale > Math.PI) {
principale = principale - 2 * Math.PI;}
System.out.println(principale);
double alpha,principale,n;
alpha = Isn.readDouble();
n = Math.floor(alpha / (2 * Math.PI));
principale = alpha - 2 * n * Math.PI;
if (principale > Math.PI) {
principale = principale - 2 * Math.PI;}
System.out.println(principale);
ManuelDowek.book Page 40 Monday, July 9, 2012 4:58 PM
3 Les types
Groupe Eyrolles, 2012
41
La porte et linitialisation
des variables
Si lon excute linstruction :
dans ltat on commence par ajouter une bote z ltat puis on
met la valeur 7 dans cette bote () on affiche son contenu : 7 et on sup-
prime la bote z (). En revanche, si dans ce mme tat on excute
linstruction :
on dclenche une erreur : au moment o lon cherche remplir la bote
z, on saperoit quil ny a pas de bote z dans ltat. En fait, cette erreur
est mme dtecte avant lexcution du programme, puisque lon peut
voir simplement en observant le programme que la variable z est utilise,
alors quelle nest pas dclare.
Une erreur similaire se produit si lon cherche excuter, dans ce mme
tat, linstruction :
Cette instruction est, en effet, une squence forme de linstruction :
et de linstruction :
Lexcution de la premire de ces instructions ajoute une bote z ltat,
remplit cette bote avec la valeur 7 et supprime cette bote de ltat. On
se retrouve alors dans ltat initial pour excuter la seconde instruction
qui tente dafficher le contenu de la bote z et choue, puisquil ny a plus
int z;
{
z = 7;
System.out.println(z);}
z = 7;
System.out.println(z);
{
int z;
z = 7;}
System.out.println(z);
{
int z;
z = 7;}
System.out.println(z);

ManuelDowek.book Page 41 Monday, July 9, 2012 4:58 PM


Premire partie Langages
Groupe Eyrolles, 2012
42
de bote z dans ltat ce moment. Dans une instruction de la forme int
z; p, on ne peut utiliser la variable z que dans linstruction p : avant la
bote na pas encore t ajoute, aprs elle a dj t supprime.
Enfin, si on omet les accolades, linstruction :
est, par convention, une autre notation pour :
qui sexcute donc, comme ci-dessus. De manire plus gnrale, une ins-
truction de la forme T x; p q est une autre notation pour T x; {p q} et
non pour {T x; p} q.
Si maintenant, on cherche excuter linstruction :
dans ltat on commence par ajouter une bote z ltat ce qui donne
ltat puis on cherche afficher le contenu de cette bote, mais elle est
vide. Lerreur nest pas ici due au fait que la bote nexiste pas, mais au
fait quelle est vide : la variable z a bien t dclare, mais elle na pas t
affecte. Contrairement au cas prcdent, lexcution dun tel pro-
gramme varie grandement dun langage et dun compilateur (voir le cha-
pitre 15) lautre. Dans certains cas, une erreur se produit au moment o
lon excute le programme : au moment dexcuter linstruction
System.out.println(z);, on se rend compte que la bote est vide. Dans
dautres cas, lerreur est dtecte avant lexcution du programme : une
analyse, plus difficile que la simple analyse de porte, permet de vrifier
que toutes les variables sont initialises avant dtre utilises. Dans
dautres cas encore, aucune erreur ne se produit : la dclaration de la
variable remplit la bote z ou bien avec une valeur par dfaut, en gnral
0, ou bien avec une valeur alatoire.
int z;
z = 7;
System.out.println(z);
int z;
{
z = 7;
System.out.println(z);}
int z;
System.out.println(z);
T Porte dune variable
La porte dune variable z est lensemble des ins-
tructions au cours de lexcution desquelles la
bote z est prsente dans ltat.

ManuelDowek.book Page 42 Monday, July 9, 2012 4:58 PM


3 Les types
Groupe Eyrolles, 2012
43
Exercice 3.9 (avec corrig)
Complter le programme suivant afin que chaque variable soit correctement
dclare.
On dnombre quatre variables dans ce programme.
Laffectation initiale de n impose directement quelle soit de type int.
La fonction Math.pow renvoie un double, cest donc le type de epsilon,
qui de plus sera gal 10
n
.
Les variables racine et racineprec sont initialises par valeurs de type
double, elles sont donc de type double.
Aucune variable nest strictement locale la boucle while. On ajoutera donc
toutes les dclarations correspondantes en dbut de programme, juste avant
linstruction n = Isn.readInt();.
Ce programme calcule une valeur approche 10
n
prs de la racine carre de 2.
SAVOIR-FAIRE Dclarer les variables avec des types
et des portes appropris
Le choix des types des variables est toujours dict par les mmes raisons (voir le savoir-faire,
page 39, Diffrencier les types de base ). La dclaration des variables doit donner
chaque variable une porte suffisante pour englober tous les endroits o elle est utilise.
n = Isn.readInt();
epsilon = Math.pow(10,-n);
racine = 1.0;
racineprec = 2.0;
while (Math.abs(racine racineprec) > epsilon) {
racineprec = racine;
racine = 1.0 / (2.0 + racineprec);}
System.out.println(racine + 1.0);
SAVOIR-FAIRE Initialiser les variables
Identifier la premire ligne du programme o une variable est utilise, hormis les dclara-
tions. Lorsque lalgorithme comporte des tests, il peut y avoir plusieurs telles lignes pour la
mme variable, en fonction du rsultat du test. Vrifier que cette premire ligne est tou-
jours une initialisation. Une initialisation peut tre rendue difficile reprer parce quelle
est lintrieur dune instruction for ou parce quelle demande une saisie au clavier. Enfin,
si une initialisation est manquante, il faut dterminer une valeur dinitialisation cohrente
avec la suite du programme et ajouter linstruction correspondante avant la premire utili-
sation de la variable.
ManuelDowek.book Page 43 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
44
Exercice 3.10 (avec corrig)
Quel problme peut se poser avec le programme suivant ? Le corriger.
La variable f, qui sert calculer la factorielle de n, nest pas initialise et le
rsultat sera donc fauss par la valeur quelle contient par dfaut. Les opra-
tions qui sont effectues sur f sont toutes des multiplications. Pour que la
valeur initiale de f nait pas dinfluence sur ces calculs, il faut que ce soit 1. On
ajoutera donc la ligne f = 1; aprs les dclarations des variables. Cette initia-
lisation est dailleurs cohrente avec la convention selon laquelle 0 ! = 1.
Les tableaux
Jusqu prsent, on a crit des programmes qui utilisent les types int,
double et boolean. Une bote dun tel type contient une valeur forme
dun unique nombre ou dun unique boolen. Dans de nombreuses
situations, on a besoin dutiliser des valeurs qui, comme les textes, les
images ou les sons, sont formes de plusieurs nombres ou de plusieurs
boolens. Ces valeurs sont dites de type composite. On a commenc voir
un exemple dun tel type, puisquune valeur de type String est une
chane forme de plusieurs caractres. Dans cette section on va plus loin,
en introduisant de nouveaux types composites : les types de tableaux.
Si on veut utiliser une bote qui contient dix nombres entiers, par
exemple, les dix premires dcimales du nombre on commence par
dclarer une variable t de type tableau dentiers : int []. Toutefois,
dclarer une telle variable ajoute ltat, non pas une grande bote dix
cases comme , mais une petite bote qui a une unique case .
Pour ajouter ltat une grande bote, on utilise une nouvelle
construction : lallocation dun tableau new T [e] o T est un type et e
une expression de type int. valuer cette expression a pour effet
int n, i, f;
n = Isn.readInt();
for (i = 1; i <= n; i = i + 1) {
f = f * i;}
System.out.println(f);

T Tableau
Une bote pouvant contenir plusieurs valeurs du
mme type sappelle un tableau.
ManuelDowek.book Page 44 Monday, July 9, 2012 4:58 PM
3 Les types
Groupe Eyrolles, 2012
45
dajouter ltat une bote dont le nombre de cases est la valeur de
lexpression e, chaque case pouvant contenir une valeur de type T.
Par exemple, valuer lexpression new int [10] ajoute ltat un tableau
de dix cases, chaque case pouvant contenir un nombre entier ().
Lallocation est, avec la dclaration dune variable, lune des deux cons-
tructions qui permettent dajouter une bote ltat.
La valeur de lexpression new T [e] est la rfrence du tableau ajout
ltat. On peut ensuite utiliser une affectation pour mettre cette valeur
dans une bote de type int [] avec laffectation t = new int [10]; ().
Avec cette notion dallocation dun tableau apparaissent donc les nouvelles
notions de rfrence dune bote et de bote contenant la rfrence dune
autre bote, ce qui est symbolise par la flche dans le dessin ci-dessus.
Les deux dernires constructions qui permettent dutiliser les tableaux
sont laffectation dune case dun tableau et laccs une case dun tableau.
Si t est le nom dune bote, dont le contenu est la rfrence dun tableau
n cases, e est une expression dont la valeur est un nombre entier p com-
pris entre 0 et n 1 et e' une expression, alors lexcution de linstruc-
tion t[e] = e'; a pour effet de remplir la case numro p de ce tableau
avec la valeur de lexpression e'. Par exemple, excuter linstruction t[1]
= 4; produit ltat et excuter linstruction t[3 2] = 2 + 2; produit
naturellement ce mme tat.

ManuelDowek.book Page 45 Monday, July 9, 2012 4:58 PM


Premire partie Langages
Groupe Eyrolles, 2012
46
Enfin, on accde une case dun tableau avec lexpression t[e]. Si t est
le nom dune bote, dont le contenu est la rfrence dun tableau n
cases et e est une expression dont la valeur est un nombre entier p com-
pris entre 0 et n 1, alors la valeur de lexpression t[e] est la valeur con-
tenue dans la case numro p de ce tableau. Par exemple, la valeur de
lexpression t[1] dans ltat est 4.
Les quatre constructions quil est ncessaire de matriser pour utiliser les
tableaux sont donc :
la construction dun type tableau T [], par exemple int [],
lallocation dun tableau new T [e], par exemple new int [10],
laffectation dune case dun tableau t[e] = e', par exemple t[1] = 4;
laccs une case dun tableau t[e], par exemple t[1].
Exercice 3.11 (avec corrig)
Construire un rpertoire associant des numros de tlphone des noms.
On utilise deux tableaux lun contenant les noms et lautre les numros de
tlphone, tels que le numro tel[i] soit le numro de tlphone de la per-
sonne dont le nom est nom[i]. Retrouver le numro associ au nom s, consiste
parcourir le tableau nom, jusqu trouver un indice i tel que s soit gal
nom[i], puis afficher le numro correspondant cet indice.
SAVOIR-FAIRE Utiliser un tableau dans un programme
1 Dclarer une variable de type tableau.
2 Allouer le tableau, en lui donnant une taille n adquate.
3 Veiller ce que chacune des cases du tableau soit initialise avant dtre utilise.
4 Utiliser les affectations t[e] = e'; et les accs t[e] en veillant ce que la valeur de
lexpression e soit bien comprise entre les bornes 0 et n 1.
String [] nom, tel;
int i;
String s;
nom = new String [10];
tel = new String [10];
// Remplissage du rpertoire
nom[0] = "Alice";
tel[0] = "0606060606";
nom[1] = "Bob";
tel[1] = "0606060607";
nom[2] = "Charles";
tel[2] = "0606060608";
nom[3] = "Djamel";
tel[3] = "0606060609";
ManuelDowek.book Page 46 Monday, July 9, 2012 4:58 PM
3 Les types
Groupe Eyrolles, 2012
47
Exercice 3.12
crire un programme qui lit au clavier une chane de caractres et la traduit en
Morse, par exemple la chane sos se traduit en / / .
Exercice 3.13
crire un programme qui compte le nombre dlments suprieurs 10 dans
un tableau dentiers.
Exercice 3.14
crire un programme qui trouve llment maximal dans un tableau dentiers.
Exercice 3.15
On se donne un tableau dentiers. crire un programme qui range les l-
ments de ce tableau dans un autre tableau, en mettant les lments pairs
gauche et les lments impairs droite. Mme exercice en utilisant un seul
tableau.
Exercice 3.16
Quaffiche le programme suivant ?
Et le programme suivant ?
nom[4] = "tienne";
tel[4] = "0606060610";
nom[5] = "Frdrique";
tel[5] = "0606060611";
nom[6] = "Guillaume";
tel[6] = "0606060612";
nom[7] = "Hector";
tel[7] = "0606060613";
nom[8] = "Isabelle";
tel[8] = "0606060614";
nom[9] = "Jrme";
tel[9] = "0606060615";
// Recherche du numro associ au nom s
s = Isn.readString();
i = 0;
while (i < 10 && !Isn.stringEqual(s,nom[i])) {
i = i + 1;}
if (i < 10) {
System.out.println(tel[i]);}
else {
System.out.println("Inconnu");}
int [] t;
t = new int [10];
t[1] = 4;
System.out.println(t[1]);
int [] t;
t[1] = 4;
System.out.println(t[1]);
ManuelDowek.book Page 47 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
48
Les tableaux
bidimensionnels
Pour reprsenter une table double entre, par exemple la table , une
possibilit est dutiliser un tableau de neuf cases () mais cette manire
de faire est malcommode.
On prfre donc, en gnral, reprsenter une telle table par un tableau de
trois lments dont chaque lment est la reprsentation dune colonne,
cest--dire lui-mme un tableau de trois nombres. Ainsi une table de
nombre double entre est un tableau de tableaux de nombres : un objet
de type int [][].
Si t est une variable dun tel type, la valeur de la case dabscisse x et
dordonne y, cest--dire de la case de la colonne x et de la ligne y, est sim-
plement dsigne par lexpression t[x][y]. Affecter une case du tableau t
se fait simplement par linstruction t[x][y] = e; o e est une expression
de type int. Seule lallocation dun tableau se fait dune manire
particulire : en principe, il faudrait allouer le tableau t, puis allouer un
tableau pour chacune des colonnes. Cependant, une nouvelle expression
permet dallouer tout dun coup : new T[e][e'] o T est un type et e et e'
deux expressions de type int. valuer cette expression a comme effet
dajouter ltat un tableau bidimensionnel dont le nombre de colonnes est
la valeur de lexpression e, et le nombre de lignes est la valeur de lexpression
e', chaque case pouvant contenir une valeur de type T. Par exemple, valuer
lexpression new int [3][3] ajoute ltat un tableau de trois colonnes sur
trois lignes, chaque case contenant une valeur de type int.
Exercice 3.17
crire un programme qui, laide de la formule de Pascal, calcule les premiers
coefficients binomiaux.
On lira au clavier un entier n, puis on remplira un tableau bidimensionnel
de double coeffs_bin de sorte que la case coeffs_bin[i][j] contienne
le coefficient binomial formule pour tout i < n et pour tout j i. Les
cases pour lesquelles j > i contiendront la valeur 0.
partir de quelle valeur de n les nombres calculs dpassent-ils la capacit
de la mantisse du type double ?
Les coefficients binomiaux calculs pour une valeur de n suprieure celle-
ci sont-ils exacts ? Sinon, de quel ordre est lapproximation ralise ?
partir de quelle valeur de n les nombres calculs dpassent-ils la capacit
du type double ?
Que peut-on penser des coefficients binomiaux calculs pour une valeur de
n suprieure cette dernire ?

120 145 87
12 67 89
90 112 83

i
j

ManuelDowek.book Page 48 Monday, July 9, 2012 4:58 PM
3 Les types
Groupe Eyrolles, 2012
49
Exercice 3.18
On souhaite crire un programme qui dtermine les bornes de lintervalle de
fluctuation au seuil de 95 % dune loi binomiale de paramtres n et p quon
lira au clavier.
crire une version de ce programme qui calcule la loi de probabilit bino-
miale dans son intgralit puis dtermine et affiche lintervalle de con-
fiance.
crire une version de ce programme qui dtermine et affiche lintervalle de
confiance en ne calculant la loi de probabilit que jusqu atteindre la
borne suprieure de lintervalle de confiance. Quels calculs conomise-t-on
de cette faon ?
Si p est proche de 1, que peut-on dire du programme crit la question 2 ?
Proposer une troisime version pour rendre le programme plus efficace
dans ce cas particulier.
ALLER PLUS LOIN Quest-ce que le calcul formel ?
Comment calculer avec la fonction polynme x 2 x
3
+
8 x
2
+ 7 x + 3 ? Une possibilit est den faire une expres-
sion de son programme. Cela permet, par exemple, de
calculer sa valeur en 5.
int x, y;
x = 5;
y = 2 * x * x * x + 8 * x * x + 7 * x + 3;
System.out.println(y);
ce qui donne, bien entendu, le rsultat 488.
Mais, il est aussi possible de reprsenter une fonction
polynme du troisime degr par le quadruplet de ses
coefficients, cest--dire par un tableau
double [] t;
On peut alors dfinir la fonction polynme x 2 x
3
+ 8
x
2
+ 7 x + 3 ainsi
t = new double [4];
t[3] = 2;
t[2] = 8;
t[1] = 7;
t[0] = 3;
Calculer la valeur de cette fonction en 5 demande un
programme un peu plus complexe
int x, y, i, c;
x = 5;
y = 0;
c = 1;
for (i = 0; i <= 3; i = i + 1) {
y = y + t[i] * c;
c = c * x;}
System.out.println(y);
o la variable c contient les valeurs des puissances suc-
cessives de x.
Mais reprsenter cette fonction ainsi permet de faire de
nombreuses nouvelles choses, par exemple lafficher
for (i = 0; i <= 3; i = i + 1) {
System.out.print(t[i]);
System.out.print(" ");
if (i != 0) {
System.out.print("x");
if (i != 1) {
System.out.print("^");
System.out.print(i);}}
if (i != 3) {
System.out.print(" + ");}}
System.out.println();
ce qui donne le rsultat
3.0 + 7.0 x + 8.0 x^2 + 2.0 x^3
et mme calculer sa drive, en utilisant le fait que la
drive de x
n + 1
est (n + 1) x
n
for (i = 0; i <= 2; i = i + 1) {
u[i] = t[i+1] * (i + 1);}
t[3] = 0;
que l'on peut son tour afficher
7.0 + 16.0 x + 6.0 x^2 + 0.0 x^3
et on obtient que la fonction x 6 x
2
+ 16 x + 7 est la
drive de la fonction x 2 x
3
+ 8 x
2
+ 7 x + 3. Cette proc-
dure est bien sr valable quelle que soit la fonction poly-
nme du troisime degr reprsente dans le tableau t.
Les programmes peuvent donc calculer avec des objets
trs divers : des nombres et des chanes de caractres
bien entendu, mais aussi des expressions symboliques
comme x x
3
+ 8 x
2
+ 7 x + 3.
ManuelDowek.book Page 49 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
50
Comment dcider sil vaut mieux utiliser le programme crit la question 2
ou celui crit la question 3 ? crire un programme qui fait ce choix auto-
matiquement.
En utilisant la mthode dtaille au chapitre 21, dterminer si la partie du
programme qui prend le plus de temps est celle o lon calcule les coeffi-
cients binomiaux ou bien celle o lon dtermine lintervalle de fluctuation.
En dduire si les diffrentes versions crites dans les questions 1 4 modi-
fient significativement le temps dexcution de lalgorithme. En admettant
que lon nait jamais utiliser cet algorithme pour des valeurs de n sup-
rieures 1000, comment peut-on le rendre plus efficace ?
Les chanes de caractres
Jusqu prsent, on a dfini et manipul le type String comme si ctait un
type de base, alors quil est en fait composite : une chane de caractres est
forme de plusieurs valeurs simples que sont ses diffrents caractres.
Exercice 3.19 (avec corrig)
crire un programme qui demande lutilisateur de taper son prnom et son
nom, puis affiche les initiales correspondantes.
Si le prnom et le nom sont entrs dans deux chanes diffrentes, il suffit
dafficher le premier caractre de chacune de ces chanes.
SAVOIR-FAIRE Calculer avec des chanes de caractres
Pour comparer des chanes de caractres, on utilise imprativement les fonctions
Isn.stringEqual et Isn.stringAlph. Attention en particulier lopration == qui ne
produira pas derreur la compilation mais ne donnera pas les rsultats attendus.
Lorsque lon doit parcourir une chane de caractres lment par lment, on peut
utiliser une boucle for, le nombre dexcutions du corps de la boucle tant donn par
la fonction Isn.stringLength.
Pour modifier une chane existante, on en extrait les parties appropries laide de la
fonction Isn.stringNth, on reconstitue une nouvelle chane laide de lopration de
concatnation +, et on laffiche ou on la stocke dans une variable.
String prenom, nom;
prenom = Isn.readString();
nom = Isn.readString();
System.out.print(Isn.stringNth(prenom,0));
System.out.println(Isn.stringNth(nom,0));
ManuelDowek.book Page 50 Monday, July 9, 2012 4:58 PM
3 Les types
Groupe Eyrolles, 2012
51
Mais ce programme ne permet pas de traiter des prnoms composs ou des
noms multiples. Si le prnom et le nom sont entrs dans une seule chane, les
initiales sont les premires lettres des mots, cest--dire le premier caractre de
la chane et ceux qui suivent immdiatement un espace. Il faut donc parcourir
cette chane caractre par caractre en recherchant les espaces, et afficher le
caractre suivant ds que lon en trouve un. On ne va en ralit que jusqu
lavant-dernier caractre de la chane, car mme si le dernier caractre est un
espace, il ne peut pas tre suivi dune lettre.
Cette version est plus gnrale mais aussi plus sensible aux entres mal
formes : un espace mal plac ou un tiret utilis pour sparer des prnoms
fausse le rsultat.
Exercice 3.20
crire un programme qui lit une chane de caractres et :
compte le nombre despaces,
compte le nombre de voyelles,
calcule le score marqu au Scrabble avec cette chane, en comptant 0 point
pour les espaces et les signes de ponctuation,
dtermine la lettre la plus frquente.
Exercice 3.21
crire un programme qui lit une chane de caractres et la rcrit en revenant
la ligne entre chaque caractre.
Exercice 3.22
Chercher sur le Web ce quest la mthode de chiffrement ROT13 et crire un
programme qui lit une chane de caractres et la chiffre ou la dchiffre selon
cette mthode.
Exercice 3.23
crire un programme qui lit une chane de caractres et :
la rcrit tout en majuscules,
la rcrit tout en minuscules,
la rcrit en inversant majuscules et minuscules.
Exercice 3.24
Chercher sur le Web ce quest lcriture leet speak et crire un programme
qui lit une chane de caractres et la rcrit en leet speak.
String nom;
int i;
nom = Isn.readString();
System.out.print(Isn.stringNth(nom,0));
for (i = 0; i <= Isn.stringLength(nom) - 2; i = i + 1) {
if (Isn.stringEqual(" ",Isn.stringNth(nom, i))) {
System.out.print(Isn.stringNth(nom,i + 1));}}
System.out.println();
ManuelDowek.book Page 51 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
52
La mise au point
des programmes
Les programmes sont souvent des objets complexes forms de plusieurs
milliers, voire plusieurs millions de lignes et il est peu probable, quand
on crit un programme qui dpasse quelques dizaines de lignes, de ne
pas faire derreur. Une erreur dans un programme peut avoir des cons-
quences dramatiques si ce programme est par exemple utilis dans le
rgulateur de vitesse dune voiture, une centrale nuclaire ou un robot
chirurgical. Cest pourquoi il existe de nombreuses mthodes pour viter
les erreurs dans les programmes. La premire, dj voque au chapitre
1, est de tester les programmes que lon crit.
Quand on teste un programme et quil ne fait pas ce que lon espre, il
faut dterminer lendroit o une erreur sest produite. Pour cela on doit
instrumenter son programme, cest--dire ajouter des instructions de
sortie dans le programme, qui permettent de visualiser ce quil se passe
au cours de son excution. On repre ainsi le moment de lexcution du
programme, o une variable prend, pour la premire fois, une valeur ina-
dquate.
SAVOIR-FAIRE Mettre au point un programme en linstrumentant
1 Identifier les variables critiques, dont la valeur peut radicalement influencer le com-
portement du programme. En particulier, la variable i dans une instruction de la
forme for (i = e; i <= e'; i = i + 1) p et les variables intervenant dans lexpres-
sion e dune instruction de la forme while (e) p sont particulirement importantes
puisquelles conditionnent le nombre de fois que le corps de cette boucle est excut.
2 Identifier pour chacune de ces variables les endroits cls du programme qui la
concernent : par exemple lorsque lon lui affecte une valeur, en dbut ou en fin de
boucle.
3 Insrer un affichage lcran de chaque variable critique aux endroits appropris, en
noubliant pas de prciser de quelle variable on affiche la valeur.
ManuelDowek.book Page 52 Monday, July 9, 2012 4:58 PM
3 Les types
Groupe Eyrolles, 2012
53
Exercice 3.25 (avec corrig)
Le programme suivant est cens calculer la somme des carrs des n premiers
entiers.
Montrer que ce programme est erron laide dun test bien choisi.
Instrumenter ce programme pour dtecter lerreur et la corriger.
En testant le programme pour n = 0, 1 ou 2, on observe que le rsultat affich
est correct. En revanche, pour n = 3, on devrait trouver 1 1 + 2 2 + 3 3 =
14, or le programme affiche 5.
La variable critique est ici le compteur de boucle i, qui sert galement dans les
calculs. On affichera sa valeur la fin du corps de la boucle for. Pour cela on
insre cet endroit les lignes :
On constate alors que i contient 1 la fin de la premire itration, mais 4 la
fin de la deuxime itration et 25 la fin de la troisime. Il y a donc une ins-
truction dans le corps de la boucle qui modifie la valeur de i, ce quil ne faut
pas faire dans une boucle for. Une fois ceci constat, il nest pas difficile
dincriminer la ligne i = i * i;.
Outre le test et linstrumentation, il existe de nombreuses autres
mthodes de mise au point des programmes. Dans certains langages, les
types permettent de dtecter des erreurs de faon beaucoup plus pousse
quen Java. On peut aussi dmontrer quun programme vrifie certaines
proprits (voir le chapitre 18), ce qui vite en particulier davoir cher-
cher les erreurs ttons.
int i, n, somme;
n = Isn.readInt();
somme = 0;
for (i = 1; i <= n; i = i + 1) {
i = i * i;
somme = somme + i; }
System.out.println(somme);
System.out.print("i vaut ");
System.out.println(i);
ALLER PLUS LOIN
Pour de gros programmes
Une telle mthode est utilisable sur des pro-
grammes de petite taille, mais peut rapidement
devenir lourde mettre en place pour de gros
programmes : il faut dcider des variables
observer et des points du programme o cela a
un intrt, puis modifier le programme et le
recompiler, et enfin supprimer les affichages du
programme lorsque lon a identifi le problme.
Dans de nombreux environnements de dvelop-
pement logiciel, il existe des outils spcialiss, les
dbogueurs, pour obtenir des informations sur
ce quil se passe en mmoire durant lexcution
dun programme, ou bien excuter un pro-
gramme pas pas.
ManuelDowek.book Page 53 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
54
ALLER PLUS LOIN Un langage de programmation petit, mais complet
Maintenant que nous avons introduit la notion de dclaration, nous
pouvons construire un petit de langage de programmation qui contient
la dclaration de variables,
laffectation,
la squence,
le test
et la boucle while.
Ce langage de programmation, bien quil soit trs petit, est complet, ce
qui signifie que tous les programmes que lon peut imaginer peuvent
tre exprims dans ce langage.
Nous avons vu que linstruction :
for (i = e; i <= e'; i = i + 1) p
pouvait tre traduite en linstruction :
i = e;
while (i <= e') {p i = i + 1;}
qui ne contient que des affectations, des squences et une boucle
while. La boucle for nest donc quune manire plus confortable
dcrire des programmes qui pourraient sexprimer dans ce petit lan-
gage. De mme, les instructions qui utilisent les fonctions et la rcursi-
vit que nous introduirons aux chapitres 4 et 5, pourraient, en thorie,
tre traduites dans ce petit langage, mme si ces traductions sont beau-
coup plus complexes que celle de la boucle for.
De mme que tous les objets qui nous entourent sont forms de trois
types de particules : les protons, les neutrons et les lectrons, que tous
les textes que nous lisons sont forms de vingt-six lettres, et de quelques
signes de ponctuation, que toutes les pices de musiques que nous
entendons sont formes de douze notes, tous les programmes que nous
utilisons peuvent ultimement tre exprims avec ces cinq instructions :
la dclaration, laffectation, la squence, le test et la boucle.
Ai-je bien compris ?
Comment la dclaration dune variable transforme-t-elle ltat de lexcution dun
programme ?
Quels sont les diffrents types possibles pour une variable ?
Quest-ce que la porte dune variable ?
ManuelDowek.book Page 54 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
4 Les fonctions
CHAPITRE AVANC
John McCarthy (1927 - 2011) est
lauteur du langage Lisp (1958), dont
la principale construction est la dfi-
nition de fonctions. Il est aussi lun
des inventeurs de la notion de temps
partag, qui permet plusieurs per-
sonnes dutiliser un mme ordinateur
en mme temps. Il a crit lun des
premiers programmes jouant aux
checs et invent pour cela un algo-
rithme, la mthode alpha-bta, qui
permet de jouer non seulement aux
checs, mais aussi de nombreux
autres jeux. Il a aussi t un dfen-
seur de lide de progrs et de
limportance des mathmatiques
dans lducation.
Pour avoir du style, il faut viter les redites.
Dans ce chapitre, nous introduisons une nouvelle
construction : la dfinition de fonction, qui permet disoler une
instruction qui revient plusieurs fois dans un programme.
Une fonction est dfinie par un nom, par ses arguments
qui porteront les valeurs communiques par le programme
principal la fonction au moment de son appel et
ventuellement une valeur de retour communique
au programme par la fonction en fin dexcution.
Nous revenons dans ce chapitre sur la question de la porte
des variables dans le cas des programmes qui comportent
des fonctions. Nous introduisons aussi des variables globales
dont la porte est le programme tout entier.
ManuelDowek.book Page 55 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
56
Isoler une instruction
Au cours des chapitres prcdents, il nous est arriv dcrire des pro-
grammes dans lesquels certaines instructions revenaient plusieurs fois,
parce que nous voulions faire plusieurs fois la mme chose. Un exemple
de programme prsentant des rptitions est le suivant :
dans lequel linstruction
est rpte trois fois. Au lieu de rpter la totalit de cette instruction, on
peut lui donner un nom, par exemple tirerUnTrait, puis la remplacer par
ce nom dans le programme principal chaque fois quelle est utilise.
Pour dfinir la fonction tirerUnTrait, on procde de la faon suivante :
et on utilise ensuite cette fonction dans le programme principal, comme
si ctait une instruction du langage :
System.out.print("Le vol en direction de ");
System.out.print("Tokyo");
System.out.print(" dcollera ");
System.out.print("9h00");
System.out.println();
System.out.println("----------------------------------------");
System.out.println();
System.out.print("Le vol en direction de ");
System.out.print("Sydney");
System.out.print(" dcollera ");
System.out.print("9h30");
System.out.println();
System.out.println("----------------------------------------");
System.out.println();
System.out.print("Le vol en direction de ");
System.out.print("Toulouse");
System.out.print(" dcollera ");
System.out.print("9h45");
System.out.println();
System.out.println("----------------------------------------");
System.out.println();
System.out.println();
System.out.println("----------------------------------------");
System.out.println();
static void tirerUnTrait () {
System.out.println();
System.out.println("--------------------------------------");
System.out.println();}
T Fonction
Dans les langages de programmation, une fonc-
tion est une instruction isole du reste du pro-
gramme, qui possde un nom, et qui peut tre
appele par ce nom nimporte quel endroit du
programme et autant de fois que lon veut.
ManuelDowek.book Page 56 Monday, July 9, 2012 4:58 PM
4 Les fonctions
Groupe Eyrolles, 2012
57
Cette dfinition de fonction se place avant le programme principal, si
bien que lorganisation gnrale du programme est la suivante :
Utiliser des fonctions vite les rptitions dans les programmes et rend
donc ces derniers plus courts et, surtout, plus faciles lire et
comprendre : pour comprendre le programme ci-dessus, il nest pas
ncessaire de savoir comment la fonction tirerUnTrait est dfinie, il suffit
de savoir ce quelle fait. Utiliser des fonctions permet aussi dorganiser le
System.out.print("Le vol en direction de ");
System.out.print("Tokyo");
System.out.print(" dcollera ");
System.out.print("9h00");
tirerUnTrait();
System.out.print("Le vol en direction de ");
System.out.print("Sydney");
System.out.print(" dcollera ");
System.out.print("9h30");
tirerUnTrait();
System.out.print("Le vol en direction de ");
System.out.print("Toulouse");
System.out.print(" dcollera ");
System.out.print("9h45");
tirerUnTrait();
class Horaire {
static void tirerUnTrait () {
System.out.println();
System.out.println("------------------------------------");
System.out.println();}
public static void main (String [] args) {

System.out.print("Le vol en direction de ");
System.out.print("Tokyo");
System.out.print(" dcollera ");
System.out.print("9h00");
tirerUnTrait();
System.out.print("Le vol en direction de ");
System.out.print("Sydney");
System.out.print(" dcollera ");
System.out.print("9h30");
tirerUnTrait();
System.out.print("Le vol en direction de ");
System.out.print("Toulouse");
System.out.print(" dcollera ");
System.out.print("9h45");
tirerUnTrait();}}
T Corps dune fonction
Linstruction
System.out.println();
System.out.println("----...----");
System.out.println();
que lon isole par la dfinition de la fonction
tirerUnTrait sappelle le corps de cette fonc-
tion.
T Appel dune fonction
Linstruction tirerUnTrait(); sappelle un
appel de la fonction tirerUnTrait. Excuter cette
instruction a pour effet dexcuter le corps de la
fonction.
ManuelDowek.book Page 57 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
58
travail de dveloppement : on peut dcider dcrire le programme prin-
cipal un jour et dcrire la fonction tirerUnTrait le lendemain. On peut
aussi dcider de confier lcriture du programme principal un program-
meur et lcriture de la fonction tirerUnTrait un autre. Enfin, si lon
veut modifier la longueur du trait tirer ou le nombre de lignes sautes
au-dessus et en-dessous de ce trait, il suffit de modifier le corps de la
fonction et non le programme principal chacun des endroits concerns.
Passer des arguments
Le programme ci-prcdent est form de trois blocs qui annoncent
chacun lhoraire dun vol. On peut vouloir aller plus loin dans lorganisa-
tion de ce programme et crire une fonction annoncerUnVol, quil suffirait
dappeler trois fois dans le programme principal. Cependant, contraire-
ment lexemple de la fonction tirerUnTrait, ces trois blocs ne sont pas
absolument identiques : la destination et lhoraire du vol diffrent dun
cas lautre. Il faut donc paramtrer linstruction que lon isole pour pou-
voir choisir la destination et lhoraire du vol.
Dans notre exemple, les arguments doivent reprsenter la destination,
que lon nomme destination, et lhoraire de vol, que lon nomme horaire.
On dfinit alors cette fonction de la manire suivante :
Et le programme principal devient :
Excuter une instruction de la forme annoncerUnVol(e,e'); a pour effet
dvaluer les deux expressions e et e' et de fabriquer un nouvel tat dans
lequel deux botes de noms destination et horaire contiennent respecti-
vement la valeur de lexpression e et celle de lexpression e', dexcuter le
corps de la fonction dans cet tat, puis de revenir ltat initial. Dans
static void annoncerUnVol (String destination, String horaire) {
System.out.print("Le vol en direction de ");
System.out.print(destination);
System.out.print(" dcollera ");
System.out.print(horaire);
System.out.println();
System.out.println("--------------------------------------------");
System.out.println();}
annoncerUnVol("Tokyo","9h00");
annoncerUnVol("Sydney","9h30");
annoncerUnVol("Toulouse","9h45");
T Argument dune fonction
On appelle argument dune fonction une variable
particulire, utilise dans le corps de la fonction, et
dont la valeur est donne dans le programme prin-
cipal au moment o la fonction est appele.
ManuelDowek.book Page 58 Monday, July 9, 2012 4:58 PM
4 Les fonctions
Groupe Eyrolles, 2012
59
lexemple ci-avant, au moment o lon excute pour la premire fois
linstruction System.out.print(destination); du corps de la fonction, la
valeur de lexpression destination est "Tokyo". Lors du deuxime appel, la
valeur de lexpression destination est "Sydney". Et lors du troisime, elle
est "Toulouse".
Rcuprer une valeur
Le passage darguments permet donc de communiquer des informations
depuis le programme principal vers une fonction. On veut aussi souvent
communiquer des informations dans lautre sens : depuis une fonction,
vers le programme principal. Par exemple, si lon veut isoler, dans une
fonction, linstruction suivante qui calcule le nombre n de fois que le
caractre a apparat dans une chane s :
On veut non seulement que le programme principal puisse communi-
quer la chane de caractres s la fonction, mais aussi que la fonction
puisse communiquer le nombre n au programme principal. Cela mne
crire la fonction suivante :
Lexcution de linstruction return n; a pour effet dinterrompre lexcu-
tion du corps de la fonction et de renvoyer la valeur de lexpression n au
programme principal.
Comme la fonction nombreDea renvoie une valeur, lappel
nombreDea("abracadabra"), dans le programme principal, nest pas une ins-
truction, mais une expression, qui a la valeur 5. On peut lutiliser, par
exemple, dans une affectation x = nombreDea("abracadabra");.
int i, n;
n = 0;
for (i = 0; i <= Isn.stringLength(s) - 1; i = i + 1) {
if (Isn.stringEqual(Isn.stringNth(s,i), "a")) {
n = n + 1;}}
static int nombreDea (String s) {
int i, n;
n = 0;
for (i = 0; i <= Isn.stringLength(s) - 1; i = i + 1) {
if (Isn.stringEqual(Isn.stringNth(s,i), "a")) {
n = n + 1;}}
return n;}
T Valeur de retour
La valeur produite par une fonction partir de ses
arguments, sil en existe une, est appele valeur
de retour.
ManuelDowek.book Page 59 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
60
Si une fonction ne renvoie pas de valeur, par exemple si elle ne fait
quafficher des messages lcran, on fait prcder sa dfinition du mot-
cl void, sinon, on la fait prcder du type de sa valeur de retour.
Dans len-tte static void annoncerUnVol (String destination, String
horaire) on trouve le nom annoncerUnVol et les deux arguments
destination et horaire, lun et lautre de type String. Enfin, le mot-cl
void indique que cette fonction ne renvoie pas de valeur.
Exercice 4.1 (avec corrig)
crire len-tte dune fonction qui calcule la vitesse moyenne dun mobile con-
naissant son temps de parcours et la distance parcourue.
La fonction peut, par exemple, sappeler vitesse.
Les arguments sont tout indiqus : on les appelle, par exemple, temps et
distance.
Selon les units choisies, les arguments pourraient tre de type int ou
double. Cependant, on sait quil faut effectuer une division dcimale pour
calculer la vitesse et que cette opration requiert des nombres de type
double.
Enfin, la fonction doit renvoyer une valeur, la vitesse, qui est elle aussi de
type double cause de la division.
Len-tte de la fonction est donc static double vitesse (double temps,
double distance).
Exercice 4.2
crire len-tte des fonctions suivantes :
Une fonction qui indique sil est possible de construire un triangle avec
trois segments de mesures donnes.
Une fonction qui calcule le plus grand diviseur commun (PGCD) de deux
nombres entiers.
Une fonction qui trace lcran un segment entre deux points.
Une fonction qui crit lcran les initiales dune personne dont on donne
le nom complet.
T En-tte dune fonction
On appelle en-tte dune fonction la premire
ligne de sa dfinition, qui comporte dans lordre :
le mot-cl static,
le type de la valeur de retour de la fonction, ou
void le cas chant,
le nom de la fonction,
la liste de ses arguments entre parenthses,
chaque argument tant prcd de son type.
SAVOIR-FAIRE crire len-tte dune fonction
1 Choisir un nom qui indique clairement ce que fait la fonction.
2 Identifier les arguments qui varient lors des diffrents appels de la fonction dans le
programme principal. Donner un nom chacun de ces arguments.
3 Identifier un type appropri pour chacun de ces arguments.
4 Identifier si la fonction renvoie une valeur et, si oui, le type de cette valeur.
ALLER PLUS LOIN Lordre des arguments
Lordre des arguments na pas dimportance
pour la dfinition de la fonction : les en-ttes
static void annoncerUnVol (String
destination, String horaire) et
static void annoncerUnVol (String
horaire, String destination) permet-
tent de dfinir la mme fonction.
En revanche, lors dun appel cette fonction,
lordre des arguments doit tre respect :
annoncerUnVol("Tokyo","9h00"); est
correct vis--vis du premier en-tte, mais
annoncerUnVol("9h00","Tokyo"); nest
correct que vis--vis du second.
ManuelDowek.book Page 60 Monday, July 9, 2012 4:58 PM
4 Les fonctions
Groupe Eyrolles, 2012
61
Exercice 4.3 (avec corrig)
crire une fonction qui effectue la division dcimale de deux nombres entiers.
On appelle la fonction divisionDecimale. Il est spcifi ici que les argu-
ments doivent tre de type int ; on va les appeler dividende et diviseur.
La fonction renvoie une valeur qui ne peut tre que de type double car
cest le rsultat dune division dcimale. Son en-tte est donc :
static double divisionDecimale (int dividende, int diviseur).
Il faut prvoir une variable de type double pour noter le quotient de la divi-
sion et le renvoyer. En outre, lintrt de dfinir une telle fonction est
quelle prend systmatiquement en charge la conversion de type de ses
arguments, de faon transparente pour lutilisateur. Le corps de la fonction
doit donc comporter notamment les lignes suivantes :
On termine cette fonction par linstruction return quotient;.
Si lon veut une fonction qui prvoit tous les cas, notamment lorsque le
diviseur fourni est nul, il faut galement renvoyer une valeur, choisie arbi-
trairement mais de type conforme celui prvu dans len-tte. La fonction
peut donc se prsenter ainsi :
Le choix est fait ici de renvoyer le double spcial + (voir le chapitre 7) si le
diviseur est nul, par analogie avec la limite de la fonction inverse lorsque
x tend vers 0 par valeurs positives. Ce choix est discutable, dune part car une
division par zro ne se produit pas forcment lorsque lon recherche une
limite, dautre part car est une autre limite possible pour un quotient dont
le dnominateur tend vers 0, par exemple la fonction inverse lorsque x tend
vers 0 par valeurs ngatives.
SAVOIR-FAIRE crire une fonction
1 crire len-tte de la fonction.
2 crire le corps de la fonction comme si les arguments taient dj remplis par des
valeurs.
3 Ne pas oublier linstruction return, le cas chant.
4 Prvoir une excution correcte de la fonction quelle que soit la valeur donne chacun
des arguments, y compris dans des cas que lon na pas forcment anticips dans le cours
normal du programme principal.
double quotient;
quotient = ((double) dividende) / ((double) diviseur);
static double divisionDecimale (int dividende, int diviseur) {
double quotient;
if (denominateur == 0) {
quotient = Double.POSITIVE_INFINITY;}
else {
quotient = ((double) dividende) / ((double) diviseur);}
return quotient;}
T Dfinition dune fonction
Au bout du compte, la dfinition dune fonction est
forme de son en-tte, puis du corps de la fonc-
tion, entre accolades.
ManuelDowek.book Page 61 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
62
Cette fonction doit donc tre accompagne dune documentation qui prcise
ce qui se passe dans ce genre de cas. On aurait pu galement faire le choix
dafficher un message, par exemple System.out.println("Erreur : division
par 0 interdite."); mais ce dernier risquerait dinterfrer avec les autres sor-
ties du programme, et si la fonction est appele plusieurs fois au cours du pro-
gramme, il ne serait pas directement possible de savoir quel appel lerreur
sest produite.
Exercice 4.4
crire les fonctions suivantes.
Une fonction qui renvoie la plus grande de deux valeurs de type int.
Une fonction qui rpte un mme mot un certain nombre de fois au choix.
Une fonction, construite partir de la fonction Math.random, qui tire au
sort un nombre entier entre deux bornes donnes en arguments.
Une fonction qui dcide sil est possible de construire un triangle avec trois
segments de mesures donnes.
Exercice 4.5
crire une fonction qui prend en argument une chane de caractres s et deux
entiers i et j, et renvoie la sous-chane de s comprise entre le caractre
numro i inclus et le caractre numro j exclu.
Le programme principal
En Java, il a t choisi de faire du programme principal une fonction
particulire qui porte un nom spcial : main.
La porte des variables
et les variables globales
Isoler linstruction x = 0; dans le programme suivant :
public static void main (String [] args) {
int x;
x = 3;
x = 5;
x = 0;
x = 7;
x = 0;
x = 4;}
ManuelDowek.book Page 62 Monday, July 9, 2012 4:58 PM
4 Les fonctions
Groupe Eyrolles, 2012
63
mnerait crire une fonction :
et le programme principal :
Cependant, ce programme nest pas correct. En effet, si ltat dans lequel
on excute linstruction reinitialise(); dans le programme principal est
form dune bote de nom x qui contient, par exemple, la valeur 5, ltat
dans lequel le corps de cette fonction est excut ne contient en revanche
aucune bote, si bien que quand on excute linstruction x = 0; il ny a
pas de bote de nom x.
Une autre manire de voir le problme est quen dplaant linstruction
x = 0; du programme principal vers le corps de la fonction, on a sorti
laffectation de la variable x de la porte de cette variable. Or, la
variable x ne peut tre utilise que dans la partie en gras du programme :
Une manire de rsoudre ce problme est de dclarer la variable x de
manire ce que sa porte soit le programme entier.
static void reinitialise () {
x = 0;}
public static void main (String [] args) {
int x;
x = 3;
x = 5;
reinitialise();
x = 7;
reinitialise();
x = 4;}
static void reinitialise () {
x = 0;}
public static void main (String [] args) {
int x;
x = 3;
x = 5;
reinitialise();
x = 7;
reinitialise();
x = 4;}
static int x;
static void reinitialise () {
x = 0;}
public static void main (String [] args) {
x = 3;
x = 5;
T Variable globale ou locale
Une variable globale est une variable dclare
en dbut de programme, en dehors du programme
principal et de toute fonction. Sa porte est le pro-
gramme entier. En Java, la dclaration dune
variable globale est prcde du mot-cl static.
Par opposition, une variable locale est dclare
lintrieur dune fonction ou du programme prin-
cipal, qui est une fonction particulire. Elle nest
pas utilisable depuis les autres fonctions.
ManuelDowek.book Page 63 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
64
Ainsi, dans cet exemple, le corps de chaque fonction est excut dans un
environnement qui contient une bote x.
Dans un programme qui, comme celui-ci, contient des variables glo-
bales, lappel dune fonction a comme effet lexcution du corps de la
fonction, dans un tat qui contient dune part des botes qui ont comme
noms les arguments de la fonction, dautre part des botes qui ont
comme noms les variables globales. Quand lexcution du corps de la
fonction est acheve, on supprime les botes qui correspondent aux argu-
ments de la fonction, on garde celles qui correspondent aux variables
globales et on remet celles qui correspondent aux variables du pro-
gramme principal.
Par exemple, dans le programme suivant :
1 On excute le programme principal dans ltat qui contient la
variable globale a.
2 Au cours de lexcution du programme principal, on dclare une
autre variable n. On affecte la valeur 3 la variable a et la valeur 4 la
variable n ().
3 Au moment de lappel f(a + n); de la fonction f, on supprime la
bote de nom n de ltat, car n est une variable locale au programme
principal, mais on garde la bote de nom a car a est une variable glo-
bale, et on ajoute une bote de nom x, qui contient la valeur 7 de
lexpression a + n ().
4 On excute alors le corps de la fonction, ce qui a pour effet
dafficher 14 et daffecter cette valeur la variable a ().
5 En quittant la fonction pour revenir au programme principal, on sup-
prime la bote de nom x et on remet la bote de nom n avec le contenu
quelle possdait avant lappel de la fonction ().
reinitialise();
x = 7;
reinitialise();
x = 4;}
static int a;
static void f (int x) {
System.out.println(2 * x);
a = 2 * x;}
public static void main (String [] args) {
int n;
a = 3;
n = 4;
f(a + n);}

ManuelDowek.book Page 64 Monday, July 9, 2012 4:58 PM


4 Les fonctions
Groupe Eyrolles, 2012
65
Exercice 4.6 (avec corrig)
Le programme ci-aprs devrait raliser un gnrateur de nombres pseudo-
alatoires tel que celui prsent au chapitre 1.
Une fonction na pas leffet voulu : laquelle et pourquoi ?
Quel problme cela posera-t-il pour lutilisation de ce programme ?
Comment rsoudre ce problme ?
Tel que le programme est crit, la fonction origine na aucun effet : les
deux variables valeur et valeurTronquee quelle manipule sont locales
cette fonction et les valeurs qui leur sont affectes sont donc effaces de
ltat ds la fin de lexcution de la fonction origine.
SAVOIR-FAIRE Identifier la porte des variables dans un programme
comportant des fonctions
Si une variable est dclare en dehors de toute fonction, alors elle est globale.
Si une variable est dclare lintrieur dune fonction, y compris le programme prin-
cipal main, alors sa porte est limite cette fonction.
Si une variable fait partie des arguments dune fonction, alors sa porte est limite
cette fonction.
Si deux variables de mme nom sont dclares dans deux fonctions diffrentes, alors
elles reprsentent en ralit deux botes distinctes et la porte de chacune est limite la
fonction correspondante. Dans ce cas, elles peuvent mme avoir des types diffrents.
Il faut viter dutiliser le mme nom pour une variable globale et une variable locale.
Cependant, si cela se produit, lintrieur de la porte de la variable locale, cest celle-
ci qui est visible et non plus la variable globale, qui ne sera nouveau accessible que
quand on sera sorti de la porte de la variable locale.
class Generateur {
static int valeur;
static int periode;
// Cette fonction initialise le gnrateur
static void origine(int valeur) {
int valeurTronquee;
valeurTronquee = valeur % periode;
valeur = valeurTronquee;}
// Cette fonction cre et renvoie un nombre pseudo-alatoire compris entre 0 et (periode - 1)
static int hasard() {
valeur = (15 * valeur + 3) % periode;
return valeur;}
// Cette fonction affiche periode valeurs pseudo-alatoires
public static void main(String[] args) {
int i;
periode = 7;
origine(8);
for (i = 1; i <= periode; i = i + 1) {
System.out.println(hasard());}}}
ManuelDowek.book Page 65 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
66
La fonction origine devrait servir initialiser le gnrateur avec la valeur
donne en argument mais, comme on la vu, elle ne fait rien en ralit. La
variable globale valeur, qui est utilise dans la fonction hasard, nest donc
jamais initialise. Le programme peut alors avoir plusieurs comportements
possibles (voir le chapitre 3), notamment en fonction du compilateur utilis :
La variable valeur vaut toujours 0 en dbut de programme et les nom-
bres engendrs perdent alors leur aspect alatoire.
La valeur initiale de la variable valeur est imprvisible et on ne peut
pas matriser le gnrateur de nombres pseudo-alatoires.
Une erreur peut se produire lors du premier appel la fonction hasard.
On la vu, le problme vient de la coexistence dune variable globale
valeur et dune variable valeur locale la fonction origine. La variable
globale est ici indispensable vue la faon dont la fonction hasard est pro-
gramme. Il faut donc rcrire la fonction origine, en utilisant un autre
nom que le nom valeur, par exemple le nom graine, comme argument :
Exercice 4.7 (avec corrig)
Le programme ci-aprs est excut par un site web pour vrifier que le pseudo-
nyme quun utilisateur vient de choisir nest form que de lettres minuscules.
Dterminer la porte des diffrentes variables utilises dans ce pro-
gramme.
Expliquer pourquoi cela ne pose pas de problme dutiliser le mme comp-
teur de boucle i dans chacune des deux boucles for, alors que la fonction
appartient est appele dans le corps de la premire boucle.
static void origine(int graine) {
int graineTronquee;
graineTronquee = graine % periode;
valeur = graineTronquee;}
class Pseudo {
// Dans cette fonction, "lettre" est cense ne contenir
// qu'un seul caractre.
// On vrifie si ce caractre apparat dans la chane "mot".
static boolean appartient(String lettre, String mot) {
int i;
boolean resultat;
resultat = false;
for (i = 0; i <= Isn.stringLength(mot) - 1; i = i + 1) {
if (Isn.stringEqual(Isn.stringNth(mot, i), lettre)) {
resultat = true;}}
return resultat;}
public static void main(String[] args) {
String autorises, pseudo;
boolean pseudoOk;
int i;
ManuelDowek.book Page 66 Monday, July 9, 2012 4:58 PM
4 Les fonctions
Groupe Eyrolles, 2012
67
Les variables autorises, pseudo et pseudoOk sont locales la fonction main.
La variable resultat est locale la fonction appartient. Les variables mot et
lettre, en tant quarguments, sont galement locales la fonction
appartient. Il y a deux variables i, une dans chaque fonction, et chacune
est locale la fonction dans laquelle elle est dclare.
Comme il y a en ralit deux variables i, chacune locale une fonction, le
programme se comporte exactement comme si les deux compteurs de
boucle avaient des noms diffrents. Le compteur de la boucle externe nest
donc pas modifi par la boucle interne. Cela justifie la coutume dutiliser
souvent les variables i, j ou k comme compteurs de boucle quand il ny a
pas de ncessit de leur donner un nom plus explicite.
Exercice 4.8 (avec corrig)
Dterminer la porte de chaque variable dans le programme suivant. Lutilisa-
tion qui est faite de ces variables est-elle cohrente avec cette porte ? Si non,
comment corriger ce programme ?
Il y a cinq variables dans ce programme : t, u, x, y et z. v nest pas une variable,
mais une fonction. Les variables z et y sont dclares avant les fonctions. Elles
sont globales et peuvent donc tre utilises partout.
La variable x est un argument de la fonction v : sa porte est donc limite au
corps de cette fonction et elle nest effectivement utilise que l.
La variable u est locale la fonction v puisquelle est dclare dans le corps de
cette fonction, mais elle est utilise dans le programme principal main : le pro-
gramme est donc incorrect.
autorises = "abcdefghijklmnopqrstuvwxyz";
pseudoOk = false;
// On redemande un pseudo tant qu'il n'est pas correct
while (!pseudoOk) {
System.out.println("Entrez votre pseudo :");
pseudo = Isn.readString();
pseudoOk = true;
// On vrifie que chaque caractre du pseudo est autoris
for (i = 0; i <= Isn.stringLength(pseudo) - 1; i = i + 1) {
if (!appartient(Isn.stringNth(pseudo,i),autorises)) {
pseudoOk = false;}}}}
class Portee {
static int z, y;
static void v (double x) {
double u;
u = x * x;
z = (int)x;}
public static void main (String [] args) {
double t;
y = 4;
t = 1 / (double)y;
v(t);
System.out.println(u);}}
ManuelDowek.book Page 67 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
68
Enfin, la variable t est locale au programme principal main puisquelle est
dclare dans le corps de cette fonction. Elle nest effectivement utilise que l.
La dernire ligne du programme affiche la valeur de u. Pour pouvoir le faire
tout en respectant la porte des variables, plusieurs solutions existent :
rendre u globale : cest peu recommand, car on essaye de nutiliser des
variables globales que lorsque cela est rellement indispensable ;
dplacer laffichage de u lintrieur de la fonction v : cela nest envisa-
geable que si on est certain qu chaque appel de la fonction v, on voudra
afficher la valeur de u lcran ;
modifier la fonction v pour quelle renvoie la valeur de u : cest la solution
que lon privilgiera ici puisquelle ne modifie pas le comportement intrin-
sque de v. Cependant, cette solution ne serait pas utilisable si v avait dj
une autre valeur de retour.
Exercice 4.9
Dterminer la porte de chaque variable dans le programme suivant.
class Portee {
static int z, y;
static double v (double x) {
double u;
u = x * x;
z = (int)x;
return u;}
public static void main (String [] args) {
double t;
y = 4;
t = 1 / (double)y;
System.out.println(v(t));}}
class Portee2 {
static double b;
static boolean f (int a) {
int e;
e = Isn.readInt();
return (e == a);}
static double g (double c) {
double d;
d = Math.sin (c);
return d;}
public static void main (String [] args) {
b = Isn.readDouble();
if (f(0)) {
g(b);}
else {
g(-b);}}}
ManuelDowek.book Page 68 Monday, July 9, 2012 4:58 PM
4 Les fonctions
Groupe Eyrolles, 2012
69
Exercice 4.10
Trouver les erreurs de porte dans le programme suivant.
Exercice 4.11 (avec corrig)
O faut-il placer les dclarations des diffrentes variables dans le programme
suivant ?
class Portee3 {
static int i;
static int h (int j) {
int k;
j = j + 1;
System.out.println(i);
System.out.println(j);
k = j + i;
m = m 1;
i = 5;
return k;}
public static void main (String [] args) {
int m, n;
m = 1;
i = 10;
System.out.println(m);
n = h(m);
System.out.println(m);
System.out.println(k);
System.out.println(i + j);}}
SAVOIR-FAIRE Choisir une porte adapte aux diffrentes variables
dun programme comportant des fonctions
Pour chacune de ces variables :
si elle est utilise dans plusieurs fonctions, alors elle doit tre globale,
si elle nest utilise que dans une fonction, pour des calculs intermdiaires par
exemple, on prfre quelle soit locale cette fonction.
class Repertoire {
static void initialisation () {
nb = 10;
nom = new String [10];
tel = new String [10];
nom[0] = "Alice";
tel[0] = "0606060606";
nom[1] = "Bob";
tel[1] = "0606060607";
ManuelDowek.book Page 69 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
70
Les variables i et r ne sont utilises que dans la fonction recherche ; elles peu-
vent donc tre locales cette fonction. La variable s est un argument de cette
fonction ; elle est donc dclare comme argument. La variable n nest utilise
que dans le programme principal ; elle peut donc tre locale cette fonction.
Les variables nb, nom et tel qui contiennent linformation sur le rpertoire doi-
vent en revanche tre globales. On notera que la fonction initialisation na
pas besoin darguments puisquelle nutilise que des variables globales.
nom[2] = "Charles";
tel[2] = "0606060608";
nom[3] = "Djamel";
tel[3] = "0606060609";
nom[4] = "tienne";
tel[4] = "0606060610";
nom[5] = "Frdrique";
tel[5] = "0606060611";
nom[6] = "Guillaume";
tel[6] = "0606060612";
nom[7] = "Hector";
tel[7] = "0606060613";
nom[8] = "Isabelle";
tel[8] = "0606060614";
nom[9] = "Jrme";
tel[9] = "0606060615";}
static String recherche (String s) {
i = 0;
while (i < nb && !Isn.stringEqual(s,nom[i])) {
i = i + 1;}
if (i < nb) {
r = tel[i];}
else {
r = "Inconnu";}
return r;}
public static void main (String [] args) {
initialisation ();
n = Isn.readString();
System.out.println(recherche(n));}}
class Repertoire {
static String [] nom, tel;
static int nb;
static void initialisation () {
nb = 10;
nom = new String [10];
tel = new String [10];
nom[0] = "Alice";
tel[0] = "0606060606";
nom[1] = "Bob";
tel[1] = "0606060607";
ManuelDowek.book Page 70 Monday, July 9, 2012 4:58 PM
4 Les fonctions
Groupe Eyrolles, 2012
71
Le passage par valeur
Dans le programme suivant :
nom[2] = "Charles";
tel[2] = "0606060608";
nom[3] = "Djamel";
tel[3] = "0606060609";
nom[4] = "tienne";
tel[4] = "0606060610";
nom[5] = "Frdrique";
tel[5] = "0606060611";
nom[6] = "Guillaume";
tel[6] = "0606060612";
nom[7] = "Hector";
tel[7] = "0606060613";
nom[8] = "Isabelle";
tel[8] = "0606060614";
nom[9] = "Jrme";
tel[9] = "0606060615";}
static String recherche (String s) {
int i;
String r;
i = 0;
while (i < nb && !Isn.stringEqual(s,nom[i])) {
i = i + 1;}
if (i < nb) {
r = tel[i];}
else {
r = "Inconnu";}
return r;}
public static void main (String [] args) {
String n;
initialisation ();
n = Isn.readString();
System.out.println(recherche(n));}}
static int a,b;
public static void main (String [] args) {
int c;
a = 4;
b = 7;
c = a;
a = b;
ManuelDowek.book Page 71 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
72
lexcution de linstruction :
a pour effet dchanger le contenu des botes a et b. Le contenu initial de
la bote a est 4 et celui de la bote b 7 ; aprs lexcution de cette instruc-
tion, le contenu de la bote a est 7 et celui de la bote b 4. Ainsi le pro-
gramme affiche :
Cette opration dchange du contenu de deux botes tant souvent uti-
lise, on peut vouloir lisoler dans une fonction.
Toutefois, contrairement au prcdent, ce programme affiche :
et non :
En effet, lappel de la fonction echange(a,b); dans ltat cre ltat ,
cre une bote z, change le contenu des botes x et y en utilisant la
bote z () et supprime la bote z, puis les botes x et y ().
Le contenu des botes a et b na donc pas chang.
b = c;
System.out.print(a);
System.out.print(" ");
System.out.println(b);}
c = a;
a = b;
b = c;
7 4
static int a,b;
static void echange (int x, int y) {
int z;
z = x;
x = y;
y = z;}
public static void main (String [] args) {
a = 4;
b = 7;
echange(a,b);
System.out.print(a);
System.out.print(" ");
System.out.println(b);}
4 7
7 4

ManuelDowek.book Page 72 Monday, July 9, 2012 4:58 PM


4 Les fonctions
Groupe Eyrolles, 2012
73
Il faut donc se souvenir que, dans un appel echange(e,e');, on ne passe
jamais les expressions e et e' la fonction echange ; on ne passe que la
valeur de ces expressions. Ces valeurs sont mises dans de nouvelles botes
de noms x et y, qui nexistent que le temps de lexcution du corps de la
fonction. Quand les expressions e et e' sont des variables a et b, cela
revient recopier le contenu des botes de noms a et b dans les botes de
noms x et y.
Exercice 4.12 (avec corrig)
Dans le programme suivant, quelles sont les expressions passes par valeur ?
Quaffiche ce programme lorsquon lexcute ?
Lors de lappel h(m), la valeur 1, contenue ce moment dans la bote m, est
passe la fonction h via largument j. La variable m nest pas modifie, mme
par linstruction j = j + 1; et elle conserve sa valeur 1 jusqu la fin du pro-
gramme principal.
SAVOIR-FAIRE
Choisir entre un passage par valeur et une variable globale
Si une fonction doit utiliser une variable a du programme principal, deux cas sont
distinguer :
Si la fonction nutilise que la valeur contenue dans a sans jamais la modifier, alors cette
valeur peut tre passe en argument la fonction et la variable a peut tre locale au pro-
gramme principal.
Si la fonction doit modifier la valeur contenue dans a, alors la variable a doit tre globale.
class ParValeur {
static int i;
static int h (int j) {
int k;
j = j + 1;
System.out.println(i);
System.out.println(j);
k = j + i;
i = 5;
return k;}
public static void main (String [] args) {
int m, n;
m = 1;
i = 10;
System.out.println(m);
n = h(m);
System.out.println(m);
System.out.println(n);
System.out.println(i);}}
ManuelDowek.book Page 73 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
74
Ce programme affiche donc :
Exercice 4.13
Pour programmer les fonctions ci-dessous, faut-il plutt utiliser un passage par
valeur ou des variables globales ?
Une fonction qui trace lcran un segment connaissant les coordonnes
de ses extrmits.
Une fonction qui remplace un nombre par sa valeur absolue.
Une fonction qui calcule le logarithme entier dun nombre.
Une fonction qui met en majuscules toutes les lettres dune chane de
caractres.
Une fonction qui affiche lcran en notation scientifique un nombre
donn de type double.
Le passage par valeur
et les tableaux
Contrairement celui de la section prcdente, le programme suivant,
qui utilise des tableaux, affiche bien 7 4.
1 Valeur initiale de m
10 La variable globale i a t initialise 10 dans le programme principal.
2 j prend la valeur 1 de m lors de lappel h, puis on lui ajoute 1.
1 m nest pas modifie par h.
12 n contient la valeur de retour de h, qui a t donne par lexpression
j + i, dans laquelle j valait 2 et i valait 10.
5 On a affect la valeur 5 la variable globale i dans la fonction h.
static int [] a,b;
static void echange (int [] x, int [] y) {
int z;
z = x[0];
x[0] = y[0];
y[0] = z;}
public static void main (String [] args) {
a = new int [2];
b = new int [2];
a[0] = 4;
b[0] = 7;
ManuelDowek.book Page 74 Monday, July 9, 2012 4:58 PM
4 Les fonctions
Groupe Eyrolles, 2012
75
En effet, comme on la vu au chapitre 3, la dclaration des variables glo-
bales a et b, quon crit static int [] a,b; ajoute deux botes de noms a
et b ltat . Puis, lallocation des deux tableaux :
cre deux nouvelles botes (). Laffectation qui suit :
remplit les cases 0 de ces deux tableaux avec les valeurs 4 et 7 (). Ensuite,
lappel de la fonction echange(a,b); cre deux botes x et y et les remplit avec
la valeur des expressions a et b. Or, comme on la vu au chapitre 3, la valeur
de lexpression a est une rfrence vers la bote deux cases situe gauche
sur la figure et celle de lexpression b est une rfrence vers la bote deux
cases situe droite sur la figure. Ainsi, ltat construit est . Lexcution du
corps de la fonction change le contenu des cases x[0] et y[0], ce qui produit
ltat . Et quand, la fin de lexcution du corps de la fonction, les botes
de noms x et y sont supprimes, ltat est produit. La valeur de lexpres-
sion a[0] est donc 7 et celle de lexpression b[0] est 4.
Autrement dit, le contenu des botes de noms a et b est bien recopi dans
les botes de noms x et y au moment de lappel. Nanmoins, les tableaux
eux-mmes ne sont pas recopis, car les contenus des botes de noms a
et b ne sont pas des tableaux mais des rfrences de tableaux.
Exercice 4.14
Reprendre lexplication prcdente dans le cas o les deux variables a et b sont
locales au programme principal.
echange(a,b);
System.out.print(a[0]);
System.out.print(" ");
System.out.println(b[0]);}
a = new int [2];
b = new int [2];
a[0] = 4;
b[0] = 7;


ManuelDowek.book Page 75 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
76
ALLER PLUS LOIN Les licences logicielles : logiciel libre versus logiciel propritaire
Quand on crit un programme qui est utilis par dautres
personnes que soi, on doit prciser ses conditions dutili-
sation par un contrat qui sappelle une licence logicielle.
Les programmes ont certains points communs avec
dautres biens non rivaux (voir le chapitre 11), comme les
inventions et les uvres de lesprit . Cela explique que
le droit des licences ait certains points communs avec le
droit des brevets et le droit dauteur. Le droit des brevets
et le droit dauteur donnent aux inventeurs et aux
auteurs le monopole de lexploitation de leur cration et
les autorisent vendre ce droit dexploitation. Ils favori-
sent donc la cration, en permettant aux crateurs de
gagner de largent. Cependant, ils la freinent galement,
car ils interdisent dautres dutiliser ces crations et de
poursuivre le travail de leurs auteurs. Cest pour cela que
ce monopole dexploitation est toujours limit dans le
temps et que, dans le droit des brevets, linventeur est
souvent tenu de rendre terme son invention publique.
Il y a principalement deux formes de licences logicielles :
les licences propritaires (ou privatrices) et les licences
libres. Avec une licence propritaire, lauteur donne sim-
plement un droit dutilisation de son programme. La plu-
part du temps, il diffuse le code compil de son
programme, mais en garde le code source (voir le
chapitre 15) secret. Avec une licence libre, en revanche, il
donne le droit ses utilisateurs non seulement dutiliser
son programme, mais aussi den tudier le fonctionne-
ment et de le modifier. Il diffuse donc la fois le code
compil et le code source.
Parmi les licences libres, il y a encore deux types de
licences. Les licences contaminantes, comme la General
Public Licence (GPL), imposent, dans le cas de la diffusion
du programme modifi, de le diffuser avec la mme
licence, afin de faire bnficier les autres des mmes
liberts que celles dont on a soi-mme bnfici.
Dautres licences, comme la licence Berkeley Software Dis-
tribution (BSD), donnent la libert de modifier le pro-
gramme et de diffuser la version modifie sous une
licence propritaire.
Les licences libres ont permis un nouveau mode de dve-
loppement des logiciels, par une dmarche qui a un cer-
tain nombre de points communs avec la recherche
scientifique : coopration internationale, publication,
validation par les pairs, libert de critiquer et de modi-
fier, etc., alors que, dans les temps anciens, Pythagore,
par exemple, interdisait ses disciples de divulguer leurs
thormes et leurs dmonstrations. Au-del des pro-
grammes, cette nouvelle manire de produire et de dif-
fuser des objets industriels prfigure peut-tre une
volution plus globale de lindustrie, dans un monde
dans lequel de plus en plus de biens industriels sont com-
plexes et immatriels.
Ai-je bien compris ?
quoi sert une fonction ?
De quels lments la dfinition dune fonction est-elle compose ?
Comment utilise-t-on une fonction dans un programme ?
ManuelDowek.book Page 76 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
5 La rcursivit
CHAPITRE AVANC
Christopher Strachey (1916-1975)
et Dana Scott (1932-) ont donn
une smantique aux dfinitions
rcursives : la dfinition f = G(f) nest
pas circulaire, mais une dfinition
de f comme point fixe de G. Christo-
pher Strachey est aussi lauteur dun
des premiers programmes jouant aux
dames et de lun des premiers pro-
grammes dinformatique musicale.
Avec Michael Rabin, Dana Scott a
tudi les systmes tats et transi-
tions (voir le chapitre 22) non dter-
ministes, cest--dire dans lesquels
plusieurs transitions sont possibles
partir dun mme tat.
Une dfinition rcursive est une dfinition rcursive.
Dans ce chapitre, nous voyons quune fonction peut sappeler
elle-mme. Cette construction, alternative celle de boucle,
permet dcrire des programmes courts et lgants.
ManuelDowek.book Page 77 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
78
Des fonctions qui
appellent des fonctions
Au chapitre 4, nous avons vu que les fonctions permettaient disoler une
instruction du programme principal. Par exemple, au lieu dcrire le
programme :
il est possible dcrire le programme :
static public void main (String [] args) {
System.out.print("Le vol en direction de ");
System.out.print("Tokyo");
System.out.print(" dcollera ");
System.out.print("9h00");
System.out.println();
System.out.println("--------------------------------------------");
System.out.println();
System.out.print("Le vol en direction de ");
System.out.print("Sydney");
System.out.print(" dcollera ");
System.out.print("9h30");
System.out.println();
System.out.println("--------------------------------------------");
System.out.println();
System.out.print("Le vol en direction de ");
System.out.print("Toulouse");
System.out.print(" dcollera ");
System.out.print("9h45");
System.out.println();
System.out.println("--------------------------------------------");
System.out.println();}
static void annoncerUnVol (String destination, String horaire) {
System.out.print("Le vol en direction de ");
System.out.print(destination);
System.out.print(" dcollera ");
System.out.print(horaire);
System.out.println();
System.out.println("--------------------------------------------");
System.out.println();}
static public void main (String [] args) {
annoncerUnVol("Tokyo","9h00");
annoncerUnVol("Sydney","9h30");
annoncerUnVol("Toulouse","9h45");}
ManuelDowek.book Page 78 Monday, July 9, 2012 4:58 PM
5 La rcursivit
Groupe Eyrolles, 2012
79
Il est aussi possible disoler linstruction :
de la fonction annoncerUnVol et dcrire ce programme ainsi :
o la fonction tirerUnTrait est appele, non depuis le programme prin-
cipal, mais depuis le corps de la fonction annoncerUnVol.
Des fonctions qui
sappellent elles-mmes
Il est mme possible daller plus loin et dappeler une fonction f, non
depuis le corps dune fonction g, mais depuis le corps de la fonction f
elle-mme. Cest, par exemple, le cas de la fonction suivante :
Le cas le plus simple est celui de lappel puissance(0) qui retourne la
valeur 1 sans avoir besoin de refaire un appel la fonction puissance.
System.out.println();
System.out.println("--------------------------------------------");
System.out.println();
static void tirerUnTrait () {
System.out.println();
System.out.println("-------------------------------------------");
System.out.println();}
static void annoncerUnVol (String destination, String horaire) {
System.out.print("Le vol en direction de ");
System.out.print(destination);
System.out.print(" dcollera ");
System.out.print(horaire);
tirerUnTrait ();}
static public void main (String [] args) {
annoncerUnVol("Tokyo","9h00");
annoncerUnVol("Sydney","9h30");
annoncerUnVol("Toulouse","9h45");}
static int puissance (int exposant) {
if (exposant == 0) {
return 1;}
else {
return (2 * puissance(exposant 1));}}
T Fonction rcursive
Une fonction rcursive est une fonction qui
sappelle elle-mme.
ManuelDowek.book Page 79 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
80
On peut alors comprendre la valeur retourne par lappel puissance(1) :
quand on excute le corps de la fonction dans un tat dans lequel la bote
de nom exposant contient la valeur 1, on value lexpression
2 * puissance(exposant 1). Comme la valeur de lexpression exposant
est 1, celle de lexpression exposant 1 est 0 et celle de lexpression
puissance(exposant 1) est, comme on la vu, 1. Celle de lexpression
2 * puissance(exposant 1) est donc 2. Lappel puissance(1) retourne
donc la valeur 2.
De mme, lappel puissance(2) retourne la valeur 4, lappel puissance(3)
retourne la valeur 8, et ainsi de suite.
Plus gnralement, la valeur retourne par lappel puissance(k + 1) est le
double de celle retourne par lappel puissance(k). La valeur retourne
par lappel puissance(k) est donc 2
k
.
Cette fonction calcule donc la mme chose que la fonction :
Toutefois, elle utilise cette possibilit pour une fonction de sappeler elle-
mme, au lieu dutiliser une boucle.
On note que dans la dfinition rcursive de la fonction puissance, la
valeur de largument exposant diminue chaque appel de la fonction et le
test effectu au dbut du corps de la fonction assure que la fonction
puissance ne sappelle pas elle-mme au cours de son excution dans un
tat dans lequel la bote de nom exposant contient la valeur 0. Cette
observation fournit la garantie que tout appel la fonction puissance avec
un argument qui est un nombre entier positif exposant se termine aprs
exposant appels. Les fonctions rcursives et celles utilisant les boucles
partagent ainsi la mme proccupation de terminaison.
static int puissance (int exposant) {
int i,resultat;
resultat = 1;
for (i = 1; i <= exposant; i = i + 1) {
resultat = 2 * resultat;}
return resultat;}
ATTENTION Prvoir un cas de base
Dans la dfinition dune fonction rcursive, il
faut toujours prvoir au moins un cas de base,
comme le cas exposant == 0 dans la dfini-
tion ci-avant, dans lequel la fonction ne
sappelle pas elle-mme ; sinon elle sappellera
elle-mme indfiniment.
ManuelDowek.book Page 80 Monday, July 9, 2012 4:58 PM
5 La rcursivit
Groupe Eyrolles, 2012
81
Exercice 5.1 (avec corrig)
crire une fonction rcursive qui calcule le quotient de la division euclidienne
dun nombre entier naturel par un autre, bien entendu sans utiliser
lopration / du langage.
Le dividende et le diviseur sont les deux arguments et la valeur de retour
est le quotient. On a donc len-tte :
Une dfinition rcursive est possible : on diminue le dividende chaque
appel rcursif jusqu avoir compt combien de fois il contient le diviseur.
Le cas de base est celui o le dividende est infrieur au diviseur : le quo-
tient est alors nul. La fonction commence donc par le test :
Dans les autres cas, le dividende est suprieur au diviseur, on retranche le
diviseur au dividende et largument ainsi modifi reste positif. Le diviseur
nest pas modifi. La fonction se termine toujours car le dividende, qui est
un entier positif, ne peut pas diminuer indfiniment.
chaque appel rcursif, on compte une fois le diviseur dans le dividende,
le quotient doit donc augmenter de 1. La fonction scrit donc :
Exercice 5.2
Modifier le programme ci-avant pour quil calcule, non le quotient, mais le
reste dune division euclidienne.
SAVOIR-FAIRE Dfinir une fonction rcursive
1 crire len-tte de la fonction (voir le savoir-faire, page 60, crire len-tte dune
fonction ).
2 Vrifier tout dabord que la fonction est adapte une dfinition rcursive, autrement
dit que lon sait calculer une valeur partir dun appel plus simple la mme fonction.
3 Prvoir le ou les cas de base, qui ne ncessitent pas dappel rcursif de la fonction.
4 Dans tous les appels rcursifs, sassurer que les arguments sont plus simples que ceux avec les-
quels la fonction a t appele : nombres plus petits, chanes de caractres plus courtes, etc.
5 Reconstituer correctement la valeur de retour de la fonction partir du rsultat du ou
des appel(s) rcursif(s).
static int quotient (int dividende, int diviseur)
if (dividende < diviseur) {
return 0;}
static int quotient (int dividende, int diviseur) {
if (dividende < diviseur) {
return 0;}
else {
return 1 + quotient (dividende diviseur, diviseur);}}
ManuelDowek.book Page 81 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
82
Exercice 5.3
crire une fonction rcursive qui calcule le logarithme entier dun nombre
(voir le chapitre 2).
Exercice 5.4
crire une fonction rcursive qui calcule la factorielle dun nombre
n! = 1 2 (n 1) n.
Exercice 5.5
crire une fonction rcursive qui calcule le plus grand diviseur commun (PGCD)
de deux nombres entiers, en utilisant lalgorithme dEuclide. Dans ce pro-
gramme, en quoi les arguments de lappel rcursif sont-ils plus simples que
ceux avec lesquels la fonction est appele ?
Exercice 5.6
Programmer rcursivement le calcul du terme de rang n de la suite de Fibo-
nacci dfinie par :
u
0
= u
1
= 1
u
n+2
= u
n
+ u
n+1
Quy a-t-il de particulier dans cette fonction rcursive ? Que se passe-t-il si on
excute ce programme pour de grandes valeurs de n, partir de 35 ou 45
selon la machine utilise ? Par ailleurs, indpendamment de la machine uti-
lise, partir de n = 46, les valeurs donnes par ce programme deviennent
incorrectes. Expliquer ces deux phnomnes.
ALLER PLUS LOIN Lefficacit des fonctions rcursives
Comme on a pu le voir sur lexemple de la suite de Fibo-
nacci, si les dfinitions rcursives rendent parfois trs
pratiques lcriture dun programme, elles peuvent aussi
avoir des consquences trs nfastes sur leur efficacit.
Ainsi, dans notre exemple, pour calculer u
10
, il faut cal-
culer u
9
et u
8
, mais comme u
9
est calcul rcursivement,
pour lobtenir il faut calculer u
8
et u
7
. Le calcul de u
8
est
donc fait deux fois. On peut montrer de mme que u
7
est
calcul trois fois, u
6
cinq fois, etc.
Cela nest pas un problme inhrent aux fonctions rcur-
sives, cest juste un pige dans lequel on peut facilement
tomber quand on en crit une. Il faut dans un tel cas se
demander si certains calculs ne sont pas faits plusieurs
fois, et si cest le cas comment lviter. Les solutions habi-
tuelles sont de mmoriser, dune faon ou dune autre,
les calculs dj effectus et qui serviront nouveau. Dans
le cas de la suite de Fibonacci, il suffit de calculer les
termes de la suite dans lordre en se souvenant des deux
dernires valeurs calcules. Avec les fonctions rcursives,
on appelle accumulateurs les arguments qui propagent
ces deux valeurs dun appel de la fonction au suivant.
static int fib (int n, int u1, int u0) {
if (n > 1) {
return fib(n - 1,u1 + u0,u1);}
else {
if (n == 1) {
return u1;}
else {
return u0;}}}
Cette fonction permet en ralit de calculer le n-me
terme de toute suite vrifiant la mme relation de rcur-
rence que la suite de Fibonacci, en spcifiant les valeurs
de u
0
et u
1
. Pour le n-me terme de la suite de Fibonacci
elle-mme, il suffit dappeler fib(n,1,1).
ManuelDowek.book Page 82 Monday, July 9, 2012 4:58 PM
5 La rcursivit
Groupe Eyrolles, 2012
83
Des images rcursives
La rcursivit est un outil utile en gomtrie algorithmique et en syn-
thse dimages. Observons, par exemple, le dessin ci-contre.
Une manire de le dcrire est de dire quil est form :
dun cercle, en rouge sur la figure ci-contre,
en haut et droite de ce cercle, de deux cercles tangents de rayon
moiti moindre, en vert sur la figure,
en haut et droite de chacun de ces cercles, de deux cercles tangents
de rayon moiti moindre, en bleu sur la figure,
en haut et droite de chacun de ces cercles, de deux cercles tangents
de rayon moiti moindre,
etc.
Toutefois, une autre manire de le dcrire est de dire quil est form dun
cercle, en rouge sur la figure ci-contre et de deux copies moiti plus
petites du dessin lui-mme, en vert et en bleu sur la figure.
Cela nous montre comment crire une fonction rcursive qui dessine
cette figure : pour dessiner une figure dont le plus grand cercle a le
centre (x ; y) et le rayon rayon, on trace dabord ce cercle, puis on
appelle rcursivement deux fois la fonction dessiner en centrant le
grand cercle en (x + 3 * rayon / 2 ; y) et en (x ; y - 3 * rayon / 2) et
en lui donnant le rayon rayon / 2.
Il ne reste plus qu appeler dans le programme principal la fonction
dessiner(200,200,64);.
Exercice 5.7
Quel est largument qui assure que cette fonction ne sappelle elle-mme
quun nombre fini de fois ? Avec lappel initial propos, combien dappels
rcursifs auront lieu ?
Un dessin plus joli est obtenu en entourant chaque cercle, non pas de
deux, mais de trois dessins plus petits dans des directions qui dpendent de
sa position : sil est lui mme droite dun cercle plus grand, par exemple,
alors il est form dun cercle et de trois dessins situs en haut, en bas et
droite, mais pas gauche, de ce cercle. Pour cela, on fait correspondre un
nombre chaque direction et on ajoute un argument la fonction.
static void dessiner (int x, int y, int rayon) {
Isn.drawCircle(x,y,rayon,0,0,0);
if (rayon > 1) {
dessiner(x + 3 * rayon / 2,y,rayon / 2);
dessiner(x,y 3 * rayon / 2,rayon / 2);}}
ManuelDowek.book Page 83 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
84
Exercice 5.8
Que reprsente le nouvel argument v dans cette fonction ? Quel nom serait
plus explicite pour cet argument ?
Exercice 5.9
Comment utiliser, sans la modifier, cette dernire fonction pour obtenir le
dessin complet o le cercle central est entour de quatre motifs identiques en
haut, en bas, droite et gauche ?
// Dfinition des directions
static int gauche = 0;
static int droite = 1;
static int haut = 2;
static int bas = 3;
static int aucun = 4;
// Dessin
static void dessiner (int x, int y, int rayon, int v) {
Isn.drawCircle(x,y,rayon,0,0,0);
if (rayon > 1) {
if (v != droite) {
dessiner(x + 3 * rayon / 2,y,rayon / 2,gauche);}
if (v != gauche) {
dessiner(x - 3 * rayon / 2,y,rayon / 2,droite);}
if (v != haut) {
dessiner(x,y - 3 * rayon / 2,rayon / 2,bas);}
if (v != bas) {
dessiner(x,y + 3 * rayon / 2,rayon / 2,haut);}}}
Ai-je bien compris ?
Quest-ce quune fonction rcursive ?
Quelle autre construction la rcursivit permet-elle souvent de remplacer ?
Que faut-il toujours prvoir dans la dfinition dune fonction rcursive, si on veut que
cette fonction se termine ?
ManuelDowek.book Page 84 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
6
La notion
de langage
formel
CHAPITRE AVANC
Lidographie de Gottlob Frege
(1848 - 1925) est le premier langage
formel propos pour exprimer
lensemble des mathmatiques. Ce
langage a t aujourdhui aban-
donn, mais il est lorigine de la
thorie des ensembles, de la logique
des prdicats et, en grande partie,
des langages formels utiliss en infor-
matique, en particulier des langages
de programmation. Lorigine com-
mune des mots langage ,
logique et logiciel nous rap-
pelle les liens entre la logique
ltude du langage mathmatique
et linformatique.
Les langages informatiques sont presque comme
les langues naturelles. Mais pas tout fait.
Dans ce chapitre, hors programme lexception de la section
Redfinir la smantique , nous introduisons la notion
de langage formel, au-del des langages de programmation,
et nous comparons ces langages aux langues naturelles.
Nous prenons lexemple du langage HTML, prsent
au chapitre 8. Ceci nous permet de prsenter les notions
de grammaire et de smantique.
La grammaire dfinit quelles sont les chanes de caractres,
par exemple les programmes, qui sont correctement forms.
La smantique dfinit ce qui se passe quand on utilise un texte,
par exemple quand on excute un programme.
ManuelDowek.book Page 85 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
86
Aux chapitres 1 5, 15, 8 et 11, nous avons vu plusieurs langages : des
langages de programmation tout dabord, mais aussi, plus brivement,
des langages de description de pages web et des langages dinterrogation
de bases de donnes. Ces langages informatiques ont un certain nombre
de points communs avec les langues naturelles comme le franais ou le
japonais : ils servent exprimer et communiquer des ides. Cependant,
ils ont aussi un certain nombre de diffrences.
Les langages informatiques
et les langues naturelles
Nous avons vu quun langage de programmation, comme Java, permet
dexprimer tous les algorithmes. Toutefois, il ne permet dexprimer que
des algorithmes. On ne peut pas lutiliser pour crire un roman, un con-
trat ou une carte postale. Cest donc un langage spcialis. Une langue
naturelle, en revanche, peut tre utilise non seulement pour exprimer
des algorithmes, mme si cest souvent de manire imprcise, mais aussi
pour crire des cartes postales, des contrats et des romans : les langues
naturelles sont universelles.
Le vocabulaire dune langue naturelle contient plusieurs milliers de mots.
Celui dun langage informatique, par exemple un langage de programma-
tion, nen contient que quelques dizaines : par exemple if, while, for et
int. En revanche, le vocabulaire dun langage informatique est souvent
extensible : en dfinissant une fonction tirerUnTrait, ou en dclarant une
variable x, on ajoute un nouveau mot au langage, souvent avec une porte
limite, ce que lon ne peut pas faire dans une langue naturelle.
La grammaire des langages informatiques est plus simple, mais plus pr-
cise, que celle des langues naturelles : un point-virgule oubli dans un pro-
gramme et celui-ci nest plus correct, alors quil est difficile de trouver une
phrase en franais qui serait incomprhensible cause dun signe de ponc-
tuation oubli. De plus, la frontire entre les phrases correctes et les
phrases incorrectes dans une langue naturelle nest pas si bien dfinie.
Ainsi, la phrase Nous, on y est pas all, mon frre et moi, au cinma.
manifeste une moins grande matrise de la langue que la phrase Ni mon
frre ni moi ne sommes alls au cinma. , mais elle reste comprhensible.
En revanche, il ny a aucune discussion possible sur le fait quun pro-
ALLER PLUS LOIN
La grammaire des langues naturelles
La grammaire des langues naturelles est beau-
coup plus complexe que celle des langages for-
mels, en particulier parce quelle tient compte
de nombreuses exceptions : homonymie, syno-
nymie, etc. Ainsi, en franais, la phrase les
poules du couvent couvent est correcte.
ManuelDowek.book Page 86 Monday, July 9, 2012 4:58 PM
6 La notion de langage formel
Groupe Eyrolles, 2012
87
gramme soit grammaticalement correct ou non, car la correction gramma-
ticale, dans un langage de programmation, est dfinie par un algorithme.
Enfin, ces langages informatiques appartiennent exclusivement au
domaine de lcrit : une pice de thtre est crite pour tre dite haute
voix, pas un programme.
Les anctres des langages
formels
Pour les distinguer des langues naturelles, on appelle langages formels ces
langages artificiels la grammaire simple, mais prcise. Lapparition,
avec linformatique, de ces langages est une tape importante de lhis-
toire du langage. Certains la comparent mme linvention de lcriture
ou de lalphabet. Cependant, une fois que lon a pris conscience de la
spcificit de ces langages, on peut se demander si certains de leurs traits
ntaient pas dj prsents dans des langages spcialiss plus anciens, en
particulier dans ceux utiliss en sciences, en droit et en musique.
Tout dabord, sans cesser dtre une langue naturelle, la langue scienti-
fique prsente quelques aspects qui rappellent les langages informati-
ques. Par exemple, elle donne la possibilit dintroduire de nouveaux
mots par des dfinitions. Sil nest pas possible dans la langue courante
de dire On appellera pagneul breton un steak saignant. , puis Je vou-
drais manger un pagneul breton. , on peut, dans la langue scientifique,
donner une dfinition : On appellera travail dune force, son produit
scalaire avec le dplacement de son point dapplication. , puis utiliser le
mot dfini : Le travail dune force orthogonale au dplacement de son
point dapplication est nul. Une fois dfini, le mot travail a une
porte illimite, mais ce nest pas le cas du mot x si on lintroduit dans
une dmonstration mathmatique par la dfinition x = y + 4. Une fois
cette dmonstration acheve, il nest plus possible dutiliser le mot x pour
dsigner la valeur y + 4. De mme, dans le langage juridique, on dbute
le texte dun contrat en donnant lidentit des contractants et en indi-
quant un mot par lequel ils seront dsigns dans la suite du contrat. Par
exemple, Contrat de location entre les sous-signs, Monsieur Dupond,
demeurant 1, rue Durand, Grenoble, ci-aprs dsign le loueur et
Monsieur Durand, demeurant 1, rue Dupond, Grenoble, ci-aprs
dsign le locataire . Bien entendu, cette manire de dsigner Mon-
ManuelDowek.book Page 87 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
88
sieur Dupond et Monsieur Durand comme le loueur et le
locataire a une porte limite au texte de ce contrat.
Cependant, il y a aussi des situations o lon sloigne davantage des lan-
gues naturelles et cre de vritables langages formels, au vocabulaire limit
et la grammaire simple mais prcise. Par exemple, la nomenclature des
composs chimiques, la notation musicale et le langage algbrique. Ainsi,
dans la nomenclature des composs chimiques, il y a un chlorure
daminomthylpyrimidinylhydroxythylmthythiazolium, mais pas de
chlorure dpagneul breton : seul un nombre restreint de mots peut tre
employ dans ce langage. Comme la nomenclature des composs chimi-
ques, la notation musicale utilise un vocabulaire restreint et une grammaire
simple, mais prcise : elle autorise mettre six croches dans une mesure
binaire trois temps, mais pas quatre noires. De mme, le langage alg-
brique permet dappliquer la relation < deux expressions, mais pas la
relation < elle-mme : on peut crire x
2
< 4, mais pas x
2
< <.
Ces langages formels sont relativement rcents : la notation musicale date
du XIII
e
sicle, la notation algbrique du XVI
e
sicle et la nomenclature
des composs chimiques du XIX
e
sicle. Avant linvention de la notation
algbrique, on crivait les quations en langue naturelle, par exemple
lquation x
3
+ 3 x
2
= 20 scrivait : un cube et trois carrs font vingt.
Nanmoins, ces langages sont tous les trois antrieurs linformatique.
La ranon de luniversalit des langues naturelles semble donc tre leur
incapacit exprimer prcisment les choses, ds que lon sintresse
un domaine prcis comme les sciences, le droit ou la musique. Raison
pour laquelle les scientifiques, les juristes ou les musiciens se sont loi-
gns des langues naturelles, parfois par de petits carts, parfois en crant
de vritables langages formels. Lapparition et la gnralisation, avec
linformatique, des langages formels taient donc prpares par le dve-
loppement de ces langages spcialiss, plus ou moins formels.
Les langages formels
et les machines
Les langages de programmation, et plus gnralement les langages
informatiques, sont soumis une double contrainte. Ils doivent tre uti-
lisables par les tres humains qui crivent les programmes, mais aussi par
les machines qui les excutent. Cette seconde contrainte explique en
ALLER PLUS LOIN Mlanger langages formels
et langues naturelles
Souvent, dans un texte scientifique, on mlange
des passages crits dans des langages formels,
comme le langage algbrique, et des passages
crits en langue naturelle : Supposons quil
existe deux nombres entiers non nuls et pre-
miers entre eux tels que x
2
= 2 y
2
. Le nombre x
2
est pair et, daprs le lemme 1, le nombre x
galement : il existe donc un nombre x tel que
x = 2 x. On en dduit (2 x)
2
= 2 y
2
, cest--
dire 4 x
2
= 2 y
2
, do on tire y
2
= 2 x
2
. Le
nombre y
2
est donc pair et, en utilisant le
lemme 1 nouveau, le nombre y galement.
Les nombres x et y sont tous les deux pairs, ce
qui est en contradiction avec lhypothse .
ManuelDowek.book Page 88 Monday, July 9, 2012 4:58 PM
6 La notion de langage formel
Groupe Eyrolles, 2012
89
partie que ce soient des langages formels. Au dbut de linformatique,
cette seconde contrainte tait prpondrante et seuls existaient les lan-
gages machine, comme celui dcrit au chapitre 15, ce qui rendait lcri-
ture de ces programmes difficile pour les tres humains, mais dune
excution relativement facile pour les machines. Lhistoire des langages
de programmation est celle des efforts entrepris pour rendre ces langages
plus faciles utiliser par les tres humains, tout en gardant la possibilit
de les traduire en langage machine, et donc de les faire excuter par des
machines.
Une tendance dans lvolution des langages de programmation est de se rap-
procher des langues naturelles. Par exemple, les langages machine nutilisent
que des chiffres, mais les langages volus galement des lettres. Toutefois,
les langues naturelles ne sont pas ncessairement les bons outils pour
exprimer les algorithmes. Ainsi, la manire dcrire les quations en algbre,
sest loigne des langues naturelles, bien avant que lon ait des machines,
simplement parce que le langage algbrique est plus facile utiliser que les
langues naturelles pour exprimer des quations et les rsoudre. De mme,
certains langages formels sont peut-tre plus faciles utiliser que les langues
naturelles pour exprimer des algorithmes. La ncessit de rendre les pro-
grammes excutables par des machines nest donc pas lunique raison pour
laquelle les langages de programmation sont des langages formels.
La grammaire
La premire chose dfinir quand on conoit un langage formel, que ce
soit un langage de programmation, un langage de description de pages
web ou un langage dinterrogation de bases de donnes, est sa gram-
maire. La grammaire dun langage est un algorithme qui indique si une
chane de caractres appartient ce langage ou non. Par exemple, la
grammaire des instructions du langage Java indique que la chane de
caractres x = 1; est une instruction, mais pas la chane de caractres
1 = x;. On ne cherche pas ici dfinir ce qui se passe quand on excute
cette instruction, mais uniquement si elle est grammaticalement correcte
ou non.
Pour dfinir une grammaire, on utilise un langage qui contient :
des symboles pour les lettres du langage, a, b, etc.
des symboles pour des langages, cest--dire des ensembles de
chanes de caractres, A, B, L, etc.
les symboles = (gal), | (ou) et (chane vide).
ManuelDowek.book Page 89 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
90
On commence par un exemple simple : le langage L ne contient que
deux chanes de caractres aab et abab. La grammaire de ce langage se
dfinit ainsi :
Un autre exemple de langage est celui qui contient toutes les chanes de
caractres qui ne sont formes que de a : la chane vide , a, aa, aaa, etc.
Sa grammaire se dfinit ainsi :
Cette dfinition signifie quun lment de L est, ou bien la chane vide ,
ou bien la lettre a, suivie dun autre lment de L. En effet, les chanes
de caractres, non vides, formes uniquement de a commencent toutes
par un a, suivi dune autre chane forme uniquement de a.
On peut, de mme, dfinir le langage des chanes de caractres formes
dun certain nombre de a, suivis dun certain nombre de b. Par exemple
la chane aaabbbbb fait partie de ce langage mais pas la chane aaabbbab.
Pour cela, on dfinit dabord un langage A qui contient toutes les chanes
qui ne sont formes que de a, puis un langage B qui contient toutes les
chanes qui ne sont formes que de b, et enfin le langage dont les l-
ments sont forms dune chane de A suivie dune chane de B.
On peut de mme dfinir ainsi la grammaire des instructions simples en
Java. On suppose que lon a dj dfini le langage T des types de Java, le
langage V des noms de variables et le langage E des expressions. Le
langage I des instructions se dfinit alors ainsi :
Une instruction est en effet :
une dclaration : T V = E; I,
une affectation : V = E;,
une squence : I I,
un test : if (E) I else I,
une boucle : while (E) I,
une instruction entre accolades : {I}.
L = aab | abab
L = | a L
A = | a A
B = | b B
L = A B
I = TV = E; I | V = E; | II | if (E) I else I | while (E) I | {I}
ManuelDowek.book Page 90 Monday, July 9, 2012 4:58 PM
6 La notion de langage formel
Groupe Eyrolles, 2012
91
On peut galement dfinir la grammaire du langage HTML, ou plus
exactement de la partie de ce langage introduite au chapitre 8. On
dfinit dabord un langage qui contient les diverses lettres de lalphabet.
en excluant les symboles < et >.
Le langage form des suites de tels symboles se dfinit ainsi :
Cependant, un texte en HTML nest pas une simple suite de tels sym-
boles, puisquil peut aussi contenir des expressions comme <b>un
passage important</b>.
On dfinit alors le langage des textes en HTML ainsi :
o le langage A, qui reste dfinir, est celui des adresses web.
Ainsi, dans le langage E, on introduit les symboles < et > et les diff-
rentes balises existantes, mais on assure galement au passage que les
balises sont utilises correctement : toute balise ouverte est referme par
la suite et les balises sont correctement imbriques, cest--dire refer-
mes dans lordre correspondant leur ouverture. Par exemple, cette
grammaire exclut une suite de caractres comme <b><i>erreur</b></i>.
La smantique
La grammaire dun langage de programmation dfinit quand une suite
de symboles est un programme bien form dans ce langage ou non, mais
pas ce qui se passe quand on excute ce programme. Ce second volet de
la dfinition dun langage de programmation est appele sa smantique.
Par exemple, le fait que quand on excute linstruction x = 1; on trans-
forme ltat en mettant la valeur 1 dans la bote de nom x fait partie de la
smantique, et non de la grammaire, du langage Java.
De mme, la smantique du langage HTML dfinit la manire dont un
texte crit en HTML saffiche dans un navigateur.
C = a | b | c | d |
L = | CL
L = | CL | EL
E = <b>L</b> | <i>L</i> | <p>L</p> | <h1>L</h1> | <h2>L</h2>
| <a href = A>L</a>
ALLER PLUS LOIN Langages et formats
La notion de langage nest pas trs loigne de
la notion de format introduite au chapitre 9.
Dans un cas comme dans lautre, on dfinit un
ensemble de rgles qui permettent dexprimer
un texte, une image, etc. Dailleurs, on dit par-
fois le langage HTML et parfois le format
HTML .
On a cependant tendance rserver le mot lan-
gage aux suites de symboles exprimes dans
un alphabet riche et avec une grammaire relati-
vement complexe. Ainsi le langage HTML utilise
tous les symboles de lalphabet, qui peuvent
eux-mmes tre exprims dans un format :
ASCII ou latin-1, alors que le format latin-1 uti-
lise un alphabet qui se limite aux symboles 0
et 1. De mme, toutes les suites de huit bits sont
bien formes en latin-1, si bien que la gram-
maire du format latin-1 est trs simple et na
que peu dintrt.
ManuelDowek.book Page 91 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
92
Redfinir la smantique
En HTML (voir le chapitre 8), les balises <h1> et </h1> dlimitent un
titre et les balises <a> et </a> dlimitent un lien. Concrtement, cela
signifie que, dans un navigateur, un passage dlimit par les balises <h1>
et </h1> est crit en gros caractres et un passage dlimit par les balises
<a> et </a> est crit en bleu et soulign.
Cela dit, il est possible de modifier cette smantique et de dcider, par
exemple, que les titres doivent tre non seulement en grosses lettres,
mais aussi en rouge et centrs et que les liens doivent tre en vert et sur-
ligns. Cela est possible car la smantique de HTML est elle-mme
dfinie dans un langage formel : le langage CSS. Par exemple, la dfini-
tion CSS suivante :
indique que les titres doivent tre en 24 points, en rouge et centrs, et les
liens en vert et surligns.
Si on crit cette dfinition dans un fichier exemple.css et si lon ajoute
len-tte du fichier HTML, prsent au chapitre 8, la commande :
alors ce texte sera affich dans un navigateur, non sous la forme mais
sous la forme .
On peut aussi dfinir en CSS de nouvelles balises <oeuvre> et </oeuvre> :
h1 {Font-Size: 24pt; Color: Red; Text-Align: Center;}
a {Color: Green; Text-Decoration: Overline;}
<link rel="stylesheet" href="example.css" type="text/css">
</link>

oeuvre {Font-Style: Italic}
ManuelDowek.book Page 92 Monday, July 9, 2012 4:58 PM
6 La notion de langage formel
Groupe Eyrolles, 2012
93
Le texte :
saffiche alors dans un navigateur :
exactement comme laurait fait le texte :
La diffrence est que, si lon dcide aprs coup de souligner les noms des
uvres au lieu de les mettre en italique, il suffit de changer la sman-
tique des balises <oeuvre> et </oeuvre> :
pour que le texte saffiche :
les autres italiques du texte restant des italiques.
Cela permet de dissocier le fond (le texte, dans lequel on indique simple-
ment que Lle mystrieuse est le titre dune uvre) de la forme (la
smantique du langage HTML, dans laquelle on indique que les titres
des uvres doivent tre en italique ou souligns). La mise en page des
textes peut tre ainsi change ad libitum.
Exercice 6.1
Reprendre lune des pages HTML crites au chapitre 8 et lui adjoindre un
fichier CSS pour modifier son aspect.
<oeuvre>L'le mystrieuse</oeuvre> est la fois la suite de
<oeuvre>Vingt mille lieues sous les mers</oeuvre> et des
<oeuvre>Enfants du capitaine Grant</oeuvre>.
L'le mystrieuse est la fois la suite de Vingt mille lieues sous les mers et
des Enfants du capitaine Grant.
<i>L'le mystrieuse</i> est la fois la suite de <i>Vingt
mille lieues sous les mers</i> et des <i>Enfants du capitaine
Grant</i>.
oeuvre {Text-Decoration: Underline;}
Lle mystrieuse est la fois la suite de Vingt mille lieues sous les mers
et des Enfants du capitaine Grant.
Ai-je bien compris ?
Quelles sont les principales diffrences entre un langage formel et une langue
naturelle ?
Quelle est la diffrence entre la grammaire et la smantique dun langage ?
quoi sert le langage CSS ?
ManuelDowek.book Page 93 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 94 Monday, July 9, 2012 4:58 PM
DEUXIME PARTIE
Informations
Dans cette deuxime partie, nous abordons lune des problmatiques
centrales de linformatique : reprsenter les informations que lon veut
communiquer, stocker et transformer. Nous apprenons reprsenter
les nombres entiers et les nombres virgule (chapitre 7), les caractres
et les textes (chapitre 8), et les images et les sons (chapitre 9). La
notion de valeur boolenne, ou de bit, qui apparat dans ces trois
chapitres, nous mne naturellement la notion de fonction boolenne
(chapitre 10).
Nous apprenons ensuite structurer de grandes quantits
dinformations (chapitre 11*), optimiser la place occupe grce la
compression, corriger les erreurs qui peuvent se produire au moment
de la transmission et du stockage de ces informations et les
protger par le chiffrement (chapitre 12*).
ManuelDowek.book Page 95 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 96 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
7
Reprsenter des
nombres entiers
et virgule
Le livre de laddition et de la sous-
traction daprs le calcul indien de
Muhammad al-Khwarizmi (783 ? -
850 ?), qui prsente la numration
dcimale position et des algo-
rithmes permettant deffectuer les
oprations sur les nombres exprims
dans ce systme, a t le vecteur de la
diffusion de ce systme de numra-
tion dans le bassin mditerranen. Le
mot algorithme est driv du nom
dal-Khwarizmi et le mot algbre (al-
jabr) du titre dun autre de ses livres.
Au commencement taient le 0 et le 1, puis nous
crmes les nombres, les textes, les images et les sons.
Dans ce chapitre, nous voyons comment les nombres
sont reprsents dans les ordinateurs avec des 0 et des 1.
Nous introduisons la notion de base, en partant de la notation
dcimale que nous utilisons ordinairement pour crire
les nombres entiers. Nous passons par la base cinq puis
dcrivons la base deux, aussi appele reprsentation binaire.
Nous gnralisons ensuite aux nombres relatifs en utilisant
la notation en complment deux, puis aux nombres virgule,
reprsents par leur signe, leur mantisse et leur exposant.
ManuelDowek.book Page 97 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
98
Vus de lextrieur, les ordinateurs et les programmes que nous utilisons
tous les jours permettent de mmoriser, de transmettre et de transformer
des nombres, des textes, des images, des sons, etc.
Pourtant, quand on les observe une plus petite chelle, ces ordinateurs
ne manipulent que des objets beaucoup plus simples : des 0 et des 1.
Mmoriser, transmettre et transformer des nombres, des textes, des
images ou des sons demande donc dabord de les reprsenter comme des
suites de 0 et de 1.
La mmoire des ordinateurs est constitue dune multitude de petits cir-
cuits lectroniques qui ne peuvent tre, chacun, que dans deux tats (voir
le chapitre 14). Comme il fallait donner un nom ces tats, on a dcid
de les appeler 0 et 1, mais on aurait pu tout aussi bien les appeler A et B,
froid et chaud ou faux et vrai. Une telle valeur, 0 ou 1, sappelle un boo-
len, un chiffre binaire ou encore un bit (binary digit). Un tel circuit
deux tats sappelle un circuit mmoire un bit et se dcrit donc par le
symbole 0 ou par le symbole 1.
Ltat dun circuit, compos de plusieurs de ces circuits mmoire un bit,
se dcrit par une suite finie de 0 et de 1, que lon appelle un mot. Par
exemple, le mot 100 dcrit ltat dun circuit compos de trois circuits
mmoire un bit, respectivement dans ltat 1, 0 et 0.
Exercice 7.1
On imagine un ordinateur dont la mmoire est constitue de quatre circuits
mmoire un bit. Quel est le nombre dtats possibles de la mmoire de cet
ordinateur ? Mme question pour un ordinateur dont la mmoire est consti-
tue de dix circuits mmoire un bit. Et pour un ordinateur dont la mmoire est
constitue de 34 milliards de tels circuits.
Exercice 7.2
On veut reprsenter chacune des sept couleurs de larc-en-ciel par un mot, les
sept mots devant tre distincts et de mme longueur. Quelle est la longueur
minimale de ces mots ?
Exercice 7.3
Trouvez trois informations de la vie courante qui peuvent tre exprimes par
un boolen.
Exercice 7.4
On considre une box internet avec une diode lectroluminescente,
teinte ou allume selon un motif de 0 et de 1 qui change chaque demi-
seconde. Lorsque la box est teinte, la diode aussi, le motif est 0000000000
Lorsque la box est allume et fonctionne, la diode est allume en continu, le
motif vaut donc 1111111111 Lorsque la box est en panne, le fournisseur
daccs souhaite que la diode clignote selon diffrents motifs en fonction du
type de panne : pas de rseau, rseau satur, facture non paye, etc. On parle
ainsi de clignotement rapide pour le motif 0101010101.
ManuelDowek.book Page 98 Monday, July 9, 2012 4:58 PM
7 Reprsenter des nombres entiers et virgule
Groupe Eyrolles, 2012
99
Proposer deux motifs qui pourraient correspondre aux descriptions
clignotement lent et clignotement trs lent .
Comment peut-on dcrire les motifs suivants, rpts indfiniment :
0000100000 et 0101010000 ?
Comment faut-il procder pour quun motif donn ne saffiche que toutes
les dix secondes ?
Dans une situation o il y aurait deux types de panne en mme temps,
comment pourrait-on procder pour afficher les motifs correspondant aux
deux messages derreurs diffrents ?
La reprsentation
des entiers naturels
Depuis le Moyen ge, on crit les nombres entiers naturels en notation
dcimale position. Cela signifie que, pour crire le nombre entier
naturel n, on commence par imaginer n objets, que lon groupe par
paquets de dix, puis on groupe ces paquets de dix objets en paquets de
dix paquets, etc. la fin, il reste entre zro et neuf objets isols, entre
zro et neuf paquets isols de dix objets, entre zro et neuf paquets isols
de cent, etc. Et on crit cet entier naturel en notant, de droite gauche,
le nombre dobjets isols, le nombre de paquets de dix, le nombre de
paquets de cent, le nombre de paquets de mille, etc. Chacun de ces nom-
bres tant compris entre zro et neuf, seuls dix chiffres sont ncessaires :
0, 1, 2, 3, 4, 5, 6, 7, 8 et 9. Par exemple, lcriture 2359 exprime un
entier naturel form de 9 units, 5 dizaines, 3 centaines et 2 milliers.
Le choix de faire des paquets de dix est peut-tre d au fait que lon a dix
doigts, mais on aurait pu tout aussi bien dcider de faire des paquets de
deux, de cinq, de douze, de vingt, de soixante, etc. On crirait alors les
nombres entiers naturels en notation position en base deux, cinq,
douze, vingt ou soixante. La notation dcimale position sappelle donc
aussi la notation position en base dix.
En notation binaire, cest--dire en notation position en base deux, le
nombre treize scrit 1101 : de droite gauche, 1 unit, 0 deuzaine,
1 quatraine et 1 huitaine. Lcriture dun entier naturel en binaire est en
moyenne 3,2 fois plus longue que son criture en base dix, mais elle ne
demande dutiliser que deux chiffres : 0 et 1.
T Indiquer la base
Dans ce livre, quand une suite de chiffres exprime
un nombre dans une base diffrente de dix, on
indique la base entre parenthses, par exemple :
1101 (en base deux). On souligne aussi parfois un
mot pour indiquer quil exprime un nombre en
base deux : 1101. Enfin, on rassemble parfois les
bits par groupe de quatre ou de huit dans les mots
trs longs pour quils soient plus faciles lire :
1111111101 est crit 11 1111 1101. Comme en
base dix, ces groupes sont forms de droite
gauche.
ManuelDowek.book Page 99 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
100
Exercice 7.5
Un horloger excentrique a eu lide de fabriquer une montre sur laquelle
lheure est indique par 10 diodes lectroluminescentes appeles 1 h, 2 h, 4 h,
8 h, 1 min, 2 min, 4 min, 8 min, 16 min et 32 min. Pour connatre lheure, il
suffit dajouter la valeur de toutes les diodes allumes.
Quelle heure est-il quand sont allumes les diodes 1 h, 2 h, 4 h, 1 min, 2 min,
8 min, 16 min et 32 min ? Quelles sont les diodes allumes 5 h 55 ? Est-il pos-
sible de reprsenter toutes les heures ? Toutes les configurations sont-elles la
reprsentation dune heure ?
Comme la mmoire des ordinateurs est constitue de circuits qui ne
peuvent tre chacun que dans deux tats, on peut utiliser chaque circuit
de la mmoire pour reprsenter un chiffre binaire, en identifiant lun de
ces tats avec le chiffre binaire 0 et lautre avec le chiffre binaire 1 on
comprend a posteriori pourquoi on a choisi dappeler ces tats eux-
mmes 0 et 1. Le nombre 13 = 1101 est donc reprsent dans la
mmoire dun ordinateur par le mot 1101, cest--dire par quatre circuits
respectivement dans les tats 1, 0, 1 et 1.
La base cinq
Pour comprendre comment transformer un entier naturel, crit en base
dix, dans une autre base, on commence par la base cinq, moins particu-
lire que la base deux, sur laquelle on reviendra plus tard.
Exercice 7.6 (avec corrig)
Trouver la reprsentation en base cinq de 47.
47 objets se regroupent en 9 paquets et 2 units, puis les 9 paquets se regrou-
pent en 1 paquet de paquets et 4 paquets.
47 = 9 5 + 2 = (1 5 + 4) 5 + 2 = (1 5
2
) + (4 5
1
) + (2 5
0
)
Donc 47 = 142 (en base cinq).
SAVOIR-FAIRE Trouver la reprsentation en base cinq dun entier naturel
donn en base dix
Pour crire les entiers naturels en base cinq, on a besoin de cinq chiffres : 0, 1, 2, 3, 4.
Quand on a n objets, on les groupe par paquets de cinq, quon groupe ensuite en paquets
de cinq paquets, etc. Autrement dit, on fait une succession de divisions par 5, jusqu
obtenir un quotient gal 0.
ManuelDowek.book Page 100 Monday, July 9, 2012 4:58 PM
7 Reprsenter des nombres entiers et virgule
Groupe Eyrolles, 2012
101
Exercice 7.7 (avec corrig)
Trouver la reprsentation en base cinq du nombre 944.
On obtient 944 = 12234 (en base cinq).
Exercice 7.8
Trouver la reprsentation en base cinq du nombre 289.
Exercice 7.9 (avec corrig)
Trouver la reprsentation en base dix du nombre 401302 (en base cinq).
401302 (en base cinq) = (2 5
0
) + (0 5
1
) + (3 5
2
) + (1 5
3
) + (0 5
4
) + (4 5
5
)
= 12702.
Exercice 7.10
Trouver la reprsentation en base dix des nombres 2341 (en base cinq) et 444
(en base cinq).
SAVOIR-FAIRE Trouver la reprsentation en base dix dun entier naturel
donn en base cinq
Pour trouver la reprsentation en base dix dun entier naturel donn en base cinq, on uti-
lise le fait quen base cinq, le chiffre le plus droite reprsente les units, le prcdent les
paquets de 5, le prcdent les paquets de 5 5 = 5
2
= 25, le prcdent de
5 5 5 = 5
3
= 125, et ainsi de suite.
ManuelDowek.book Page 101 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
102
La base deux
Les nombres exprims en base deux sont plus difficiles lire, car il ny a
que deux chiffres, 0 et 1, mais le principe de la numration en base deux
est en tout point similaire celui de la numration en base cinq.
Exercice 7.11 (avec corrig)
Trouver la reprsentation en base deux du nombre 11.
On obtient 11 = 1011.
Exercice 7.12
Trouver la reprsentation en base deux du nombre 1000.
Exercice 7.13
Chercher sur le Web la date de la mort de Charlemagne. Trouver la reprsenta-
tion en base deux de ce nombre.
Exercice 7.14
Donner les reprsentations en base deux des nombres 1, 3, 7, 15, 31 et 63.
Expliquer le rsultat.
SAVOIR-FAIRE Trouver la reprsentation en base deux
dun entier naturel donn en base dix
Pour crire les nombres en base deux, on a besoin de deux chiffres : 0 et 1. Quand on a n objets,
on les groupe par paquets de deux, quon regroupe eux-mmes en paquets de deux paquets, etc.
Autrement dit, on fait une succession de divisions par 2, jusqu obtenir un quotient gal 0.
SAVOIR-FAIRE Trouver la reprsentation en base dix dun entier naturel
donn en base deux
Pour trouver la reprsentation en base dix dun entier naturel donn en base deux, on utilise
le fait quen base deux, le chiffre le plus droite reprsente les units, le prcdent les paquets
de 2, le prcdent les paquets de 2 2 = 2
2
= 4, le prcdent de 2 2 2 = 2
3
= 8, etc.
ManuelDowek.book Page 102 Monday, July 9, 2012 4:58 PM
7 Reprsenter des nombres entiers et virgule
Groupe Eyrolles, 2012
103
Exercice 7.15 (avec corrig)
Trouver la reprsentation en base dix du nombre 11111111.
11111111 = (1 2
0
) + (1 2
1
) + (1 2
2
) + (1 2
3
) + (1 2
4
) + (1 2
5
) + (1 2
6
)
+ (1 2
7
) = 255.
Exercice 7.16
Trouver la reprsentation en base dix du nombre 10010110.
Exercice 7.17
Cest en 11110010000 qua t dmontr le thorme fondamental de linfor-
matique. Exprimer ce nombre en base dix.
Exercice 7.18
Montrer quavec un mot de n bits on peut reprsenter les nombres de 0 2
n
1.
Exercice 7.19
Pour multiplier par dix un entier naturel exprim en base dix, il suffit dajouter
un 0 sa droite, par exemple, 12 10 = 120. Quelle est lopration quiva-
lente pour les entiers naturels exprims en base deux ? Exprimer en base deux
les nombres 3, 6 et 12 pour illustrer cette remarque.
Exercice 7.20
Quelle est la reprsentation binaire du nombre 57 ? Et celle du nombre 198 ?
Soit m un mot de 8 bits, n lentier naturel reprsent en binaire par le mot m,
m le mot obtenu en remplaant dans m chaque 0 par un 1 et chaque 1 par
un 0 et n lentier naturel reprsent en binaire par le mot m. Exprimer n et n
comme une somme de puissances de 2, montrer que n + n = 255. Montrer que
la reprsentation binaire du nombre 255 n est obtenue en remplaant dans
celle de n chaque 0 par un 1 et chaque 1 par un 0.
Une base quelconque
On peut gnraliser une base quelconque les mthodes vues pour la
base cinq et la base deux.
T Les octets
Dans la mmoire des ordinateurs les circuits
mmoire un bit sont souvent groups par huit : les
octets. On utilise souvent des nombres exprims
en notation binaire, cest--dire en base deux, sur
un, deux, quatre ou huit octets, soit 8, 16, 32 ou
64 bits. Ceci permet de reprsenter les nombres de
0 1111 1111 = 255 sur un octet, de 0
1111 1111 1111 1111 = 65 535 sur deux octets, de
0 1111 1111 1111 1111 1111 1111 1111 1111
= 4 294 967 295 sur trois octets et de 0
1111 1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 =
18 446 744 073 709 551 615 sur quatre octets.
SAVOIR-FAIRE Trouver la reprsentation en base k dun entier naturel
donn en base dix
Pour crire les entiers naturels en base k, on a besoin de k chiffres. Quand on a n objets, on
les groupe par paquets de k, quon regroupe leur tour en paquets de k paquets, etc. Autre-
ment dit, on fait une succession de divisions par k, jusqu obtenir un quotient gal 0.
ManuelDowek.book Page 103 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
104
Exercice 7.21 (avec corrig)
Trouver la reprsentation en base seize du nombre 965.
Rponse : 965 = 3c5 (en base seize)
Exercice 7.22
Trouver la reprsentation en base seize des nombres 6725 et 18 379.
Exercice 7.23 (avec corrig)
Trouver la reprsentation en base dix du nombre 4e2c (en base seize).
4e2c (en base seize) = (12 16
0
) + (2 16
1
) + (14 16
2
) + (4 16
3
) = 20 012.
Exercice 7.24
Trouver la reprsentation en base dix des nombres abcd (en base seize) et
281ef (en base seize).
Exercice 7.25
Chercher sur le Web ce quest le systme de numration Shadok. Est-ce un sys-
tme de numration position ? Si oui, en quelle base et avec quels chiffres ?
T Base 16
En base seize, on a besoin de 16 chiffres : 0, 1, 2,
3, 4, 5 , 6, 7, 8, 9, puis a (dix), b (onze), c (douze),
d (treize), e (quatorze) et f (quinze).
SAVOIR-FAIRE Trouver la reprsentation en base dix dun entier naturel
donn en base k
Pour trouver la reprsentation en base dix dun entier naturel donn en base k, on utilise
le fait quen base k, le chiffre le plus droite reprsente les units, le prcdent les
paquets de k, le prcdent les paquets de k k = k
2
, le prcdent les paquets de
k k k = k
3
, etc.
ManuelDowek.book Page 104 Monday, July 9, 2012 4:58 PM
7 Reprsenter des nombres entiers et virgule
Groupe Eyrolles, 2012
105
La reprsentation
des entiers relatifs
Pour reprsenter les entiers relatifs en notation binaire, on doit tendre
la reprsentation aux nombres ngatifs. Une solution est de rserver un
bit pour le signe de lentier reprsenter et dutiliser les autres pour
reprsenter sa valeur absolue. Ainsi, avec des mots de 16 bits, en utilisant
1 bit pour le signe et 15 bits pour la valeur absolue, on pourrait repr-
senter les entiers relatifs de -111 1111 1111 1111 = -(2
15
- 1) = -32 767
111 1111 1111 1111 = 2
15
- 1 = 32 767. Cependant, cette mthode a
plusieurs inconvnients, lun deux tant quil y a deux zros, lun positif
et lautre ngatif.
On a donc prfr une autre mthode, qui consiste reprsenter un entier
relatif par un entier naturel. Si on utilise des mots de 16 bits, on peut repr-
senter les entiers relatifs compris entre -32 768 et 32 767 : on reprsente un
entier relatif x positif ou nul comme lentier naturel x, et un entier relatif x
strictement ngatif comme lentier naturel x + 2
16
= x + 65 536, qui est
compris entre 32 768 et 65 535. Ainsi, les entiers naturels de 0 32 767
servent reprsenter les entiers relatifs positifs ou nuls, en vert sur la figure,
et les entiers naturels de 32 768 65 535 dcrivent les entiers relatifs stric-
tement ngatifs, en rouge sur la figure.
Lentier relatif -1 est reprsent comme lentier naturel 65 535, cest--
dire par le mot 1111 1111 1111 1111.
Cette manire de reprsenter les entiers relatifs sappelle la notation en
complment deux.
Avec des mots de seize bits, on crit les entiers relatifs compris entre
-2
15
= -32 768 et 2
15
- 1 = 32 767. Plus gnralement, avec des mots de
n bits, on crit les entiers relatifs compris entre -2
n-1
et 2
n-1
- 1 :
un entier relatif x positif ou nul compris entre 0 et 2
n-1
- 1 est repr-
sent par lentier naturel x compris entre 0 et 2
n-1
- 1 ;
un entier relatif x strictement ngatif compris entre 2
n-1
et 1 est
reprsent par lentier naturel x + 2
n
compris entre 2
n-1
et 2
n
- 1.
Exercice 7.26
Quels entiers relatifs peut-on reprsenter avec des mots de 8 bits ? Combien
sont-ils ? Mme question avec des mots de 32 bits et 64 bits.
ManuelDowek.book Page 105 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
106
Exercice 7.27 (avec corrig)
Trouver la reprsentation binaire sur huit bits des entiers relatifs 0 et -128.
Lentier relatif 0 est reprsent comme lentier naturel 0 : 0000 0000.
Lentier relatif -128 est reprsent comme lentier naturel -128 + 2
8
= -128
+ 256 = 128 : 1000 0000.
Exercice 7.28
Trouver la reprsentation binaire sur huit bits des entiers relatif 127 et -127.
Exercice 7.29 (avec corrig)
Trouver la reprsentation dcimale des entiers relatifs dont la reprsentation
binaire sur huit bits est 0000 0000 et 1000 0000.
Le mot 0000 0000 reprsente lentier naturel 0 et donc lentier relatif 0. Le mot
1000 0000 reprsente lentier naturel 128 = 2
7
et donc lentier relatif 128 -
2
8
= 128 - 256 = -128.
Exercice 7.30
Trouver la reprsentation dcimale des entiers relatifs dont la reprsentation
binaire sur huit bits est 0111 1111 et 1000 0001.
SAVOIR-FAIRE Trouver la reprsentation binaire sur n bits dun entier
relatif donn en dcimal
On a vu que :
Si lentier relatif x est positif ou nul, on le reprsente comme lentier naturel x.
Sil est strictement ngatif, on le reprsente comme lentier naturel x + 2
n
.
SAVOIR-FAIRE Trouver la reprsentation dcimale dun entier relatif
donn en binaire sur n bits
Si cet entier relatif est donn par le mot m, on commence par calculer lentier naturel p
reprsent par ce mot. Si p est strictement infrieur 2
n-1
, cest lentier relatif reprsent,
sil est suprieur ou gal 2
n-1
, lentier relatif reprsent est p - 2
n
.
SAVOIR-FAIRE Calculer la reprsentation p de loppos dun entier
relatif x partir de sa reprsentation p, pour une reprsentation des
entiers relatifs sur huit bits
Si lentier relatif x est compris entre 0 et 127, alors il est reprsent sur huit bits par lentier
naturel p = x et son oppos -x est reprsent par lentier naturel p = -x + 2
8
= -x + 256 =
256 - p. Si lentier relatif x est compris entre -127 et -1, alors il est reprsent par lentier
naturel p = x + 2
8
= x + 256 et son oppos -x est reprsent par lentier naturel p = -x = 256 - p.
ManuelDowek.book Page 106 Monday, July 9, 2012 4:58 PM
7 Reprsenter des nombres entiers et virgule
Groupe Eyrolles, 2012
107
Exercice 7.31 (avec corrig)
Calculer la reprsentation binaire sur huit bits de lentier relatif 4, puis celle de
son oppos.
Lentier relatif 4 est reprsent comme lentier naturel 4 = 0000 0100.
Pour calculer la reprsentation de son oppos, on remplace les 0 par des 1 et
les 1 par des 0, ce qui donne 1111 1011. Puis on ajoute 1, ce qui donne
1111 1100. On peut vrifier que ce nombre est bien la reprsentation de
lentier relatif -4, cest--dire de lentier naturel -4 + 256 = 252.
Exercice 7.32
Calculer la reprsentation binaire sur huit bits de lentier relatif -16, puis de
son oppos.
Exercice 7.33
Montrer que le bit le plus gauche vaut 1 pour les entiers relatifs strictement
ngatifs et 0 pour les entiers relatifs positifs ou nuls.
Exercice 7.34
On considre des entiers relatifs sur 3 bits. Dessiner le cercle rouge-vert ci-
avant en plaant les 8 nombres : 0, 1, 2, 3, -1, -2, -3, -4 leur place. Relier les
nombres opposs : 1 et -1, 2 et -2, etc. Quelle est linterprtation gomtrique
de la fonction qui chaque nombre associe son oppos ?
Exercice 7.35
Reprsenter les entiers relatifs 96 et 48 en binaire sur huit bits. Ajouter les
deux nombres binaires obtenus en utilisant lalgorithme de laddition binaire
du chapitre 18. Quel est lentier relatif obtenu ? Pourquoi est-il ngatif ?
Exercice 7.36
Expliquer comment faire une soustraction de deux nombres binaires sur huit
bits partir du calcul de loppos et de lalgorithme de laddition du
chapitre 18. Calculer ainsi 15 - 7.
Donc, sauf quand x = -128, dont loppos nest pas reprsentable sur 8 bits, si un entier
relatif x est reprsent par lentier naturel p, son oppos -x est reprsent par lentier
naturel p = 256 - p = (255 - p) + 1.
Calculer 255 - p = 1111 1111 - p est facile, puisquil suffit, dans la reprsentation binaire
de p, de remplacer chaque 0 par un 1 et chaque 1 par un 0 (voir lexercice 7.20). Il suffit
ensuite dajouter 1 au nombre obtenu.
ManuelDowek.book Page 107 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
108
La reprsentation
des nombres virgule
Comme la notation dcimale, la notation binaire permet aussi de repr-
senter des nombres virgule. En notation dcimale, les chiffres gauche de
la virgule reprsentent des units, des dizaines, des centaines, etc. et ceux
droite de la virgule, des diximes, des centimes, des millimes, etc. De
mme, en binaire, les chiffres droite de la virgule reprsentent des demis,
des quarts, des huitimes, des seizimes, etc. On peut ainsi reprsenter, par
exemple, le nombre un et un quart : 1.01. Toutefois, cette manire de faire
ne permet pas de reprsenter des nombres trs grands ou trs petits comme
le nombre dAvogadro ou la constante de Planck. On utilise donc une autre
reprsentation similaire la notation scientifique des calculatrices, sauf
quelle est en base deux et non en base dix. Un nombre est reprsent sous
la forme s m2
n
o s est le signe du nombre, n son exposant et m sa man-
tisse. Le signe est + ou -, lexposant est un entier relatif et la mantisse est un
nombre virgule, compris entre 1 inclus et 2 exclu.
Par exemple, quand on utilise 64 bits pour reprsenter un nombre vir-
gule, on utilise 1 bit pour le signe, 11 bits pour lexposant et 52 bits pour la
mantisse. Le signe + est reprsent par 0 et le signe - par 1. Lexposant n
est un entier relatif compris entre -1 022 et 1 023 ; on le reprsente
comme lentier naturel n + 1 023, qui est compris entre 1 et 2 046. Les
deux entiers naturels 0 et 2 047 sont rservs pour des situations excep-
tionnelles (+, -, NaN, etc.). La mantisse m est un nombre binaire vir-
gule compris entre 1 inclus et 2 exclu, comprenant 52 chiffres aprs la
virgule. Comme cette mantisse est comprise entre 1 et 2, elle a toujours un
seul chiffre avant la virgule et ce chiffre est toujours un 1 ; il est donc inu-
tile de le reprsenter et on utilise les 52 bits pour reprsenter les 52 chiffres
aprs la virgule.
Exercice 7.37 (avec corrig)
Trouver le nombre virgule reprsent par le mot
1100010001101001001111000011100000000000000000000000000000000000
ALLER PLUS LOIN Valeurs exceptionnelles
Ce codage prend en compte des valeurs
exceptionnelles : +, - et NaN (not a
number) qui est une valeur indfinie. Ces
valeurs non numriques sont reprsentes res-
pectivement par les mots de 64 bits suivants :
0 11111111111 00000000000000000000000
00000000000000000000000000000
1 11111111111 00000000000000000000000
00000000000000000000000000000
1 11111111111 11111111111111111111111
11111111111111111111111111111
Ce codage permet galement de reprsenter des
valeurs infinitsimales qui, sans tre nulles, sont
trop petites pour que lon puisse calculer avec
elles.
SAVOIR-FAIRE Trouver la reprsentation en base dix dun nombre
virgule donn en binaire
On identifie le signe, la mantisse et lexposant.
ManuelDowek.book Page 108 Monday, July 9, 2012 4:58 PM
7 Reprsenter des nombres entiers et virgule
Groupe Eyrolles, 2012
109
Le signe est reprsent par 1.
Lexposant est reprsent par 10001000110. La mantisse est reprsente par
1001001111000011100000000000 000000000000000000000000.
Le signe du nombre est donc -. Le nombre 100 0100 0110 est gal 1 094 et
lexposant du nombre est n = 1094 - 1023 = 71. Sa mantisse est :
Le nombre reprsent est donc -206 727 / 131 072 2
71
= -3.724 10
21
.
Exercice 7.38
Trouver le nombre virgule reprsent par le mot :
0001000000111101001110010101100000000000000000000000000000000000.
Exercice 7.39
Comment est reprsent le nombre virgule 2
-1 022
(qui est gal
2,225 10
-308
) ?
Exercice 7.40
Comment est reprsent le nombre entier 7 ? Et le nombre virgule 7,0 ?
Exercice 7.41
combien de dcimales environ correspondent 52 chiffres binaires aprs la
virgule ?
Exercice 7.42
Quel est le plus grand nombre virgule que lon peut reprsenter en binaire ?
Quel est le plus petit nombre virgule, donc ngatif, que lon peut repr-
senter en binaire ? Quel est le plus petit nombre virgule strictement positif
que lon peut reprsenter en binaire ?
Exercice 7.43
Quelle prcision perd-on si on divise par deux un nombre virgule avant de le
remultiplier par deux ?
Exercice 7.44
chaque multiplication de deux nombres virgule, on arrondit le calcul en ne
gardant que 52 chiffres binaires aprs la virgule, ce qui introduit une erreur
relative de lordre de 2
-52
. Quelle est la valeur de cette erreur en base dix ? Si
on fait plusieurs multiplications, ces erreurs saccumulent. Quelle est lerreur
relative dun calcul qui est form dun million de multiplications, qui dure
quelques millisecondes sur un ordinateur usuel ?
m = 1.1001 0011 1100 0011 1000 0000 0000 0000 0000 0000 0000 0000 0000
= 1 + 1/2 + 1/2
4
+ 1/2
7
+ 1/2
8
+ 1/2
9
+ 1/2
10
+ 1/2
15
+ 1/2
16
+ 1/2
17
= (2
17
+ 2
16
+ 2
13
+ 2
10
+ 2
9
+ 2
8
+ 2
7
+ 2
2
+ 2 + 1) / 2
17
= 206727/131072.
ManuelDowek.book Page 109 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
110
Exercice 7.45
On considre le programme suivant :
Si lon calculait sur des nombres rationnels exacts, que se passerait-il lors de
lexcution de ce programme ?
crire ce programme et lexcuter. Que constate-t-on ?
Modifier le programme de faon dterminer au bout de combien dex-
cutions du corps de la boucle il sarrte, ainsi que la valeur de x la fin de
cette excution.
Comment est reprsente cette dernire valeur de x ? Et celle de y ?
Proposer une explication de ce comportement.
Exercice 7.46
On considre le programme suivant :
Si lon calculait sur des nombres rationnels exacts, que se passerait-il lors de
lexcution de ce programme ?
crire ce programme et lexcuter. Que constate-t-on ?
Vrifier que la reprsentation binaire de 0,1 est
0011111110111001100110011001100110011001100110011001100110011010.
Quel nombre dcimal cette reprsentation dsigne-t-elle en ralit ?
En dduire les reprsentations binaires de 0,2, 0,3 et les nombres dcimaux
que cette reprsentation dsigne en ralit.
Expliquer laffichage obtenu.
double x, y;
x = 1.0;
y = x + 1.0;
while (y - x == 1.0) {
x = x * 2.0;
y = x + 1.0;}
double a;
int n;
a = 0.0;
for (n = 1; n <= 10; n = n + 1) {
a = a + 0.1;
System.out.println(a);}
Ai-je bien compris ?
En quelle base reprsente-t-on le plus souvent les nombres en informatique ?
Pourquoi ?
Comment reprsente-t-on les nombres ngatifs ?
Comment reprsente-t-on les nombres virgule ?
ManuelDowek.book Page 110 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
8
Reprsenter
des caractres
et des textes
Samuel Morse (1791 - 1872) est
linventeur dun code, dans lequel
chaque lettre est exprime par une
alternance de sons brefs symboliss
par . et longs , utilis pour
tlgraphier des textes. La lettre a
y est exprime par les sons . , la
lettre b par les sons , etc.
Artiste peintre, Samuel Morse sest
intress aux tlcommunications
aprs quen 1 25, un message lui
annonant que sa femme tait
malade ne lui est pas parvenu
temps. Comme nous le verrons au
chapitre 12, le code morse est rf-
rences de longueurs variables, mais
ce nest pas un code prfixe.
Les lettres ? Toutes des nombres !
Dans ce chapitre, nous voyons comment sont reprsents
les caractres et les textes de toutes les langues du monde.
Nous expliquons pourquoi il existe plusieurs codes tels ASCII,
latin-1, latin-2, UTF-32, UTF-8. Nous prsentons ensuite
les formats enrichis qui permettent de dcrire la forme
des caractres et des textes, comme le font les logiciels
de traitement de texte.
Un exemple de format enrichi est le langage HTML.
ManuelDowek.book Page 111 Monday, July 9, 2012 4:58 PM
8
Deuxime partie Informations
Groupe Eyrolles, 2012
112
Nous nous intressons, dans ce chapitre, la reprsentation des textes,
cest--dire des suites de caractres, ventuellement enrichies dinforma-
tions typographiques.
La reprsentation
des caractres
Puisquun texte est une suite de caractres, nous commenons par nous
intresser la reprsentation des caractres, cest--dire entre autres choses
aux lettres minuscules et majuscules, aux chiffres, aux signes de ponctua-
tion et aux symboles mathmatiques. Pour reprsenter ces caractres, on
attribue un nombre chacun.
Le code ASCII, par exemple, attribue le nombre 65 la lettre A, le nombre
66 la lettre B , le nombre 97 la lettre a et le nombre 98 la lettre
b . Il reprsente 95 caractres : les 26 lettres minuscules, les 26 lettres
majuscules, les 10 chiffres, les 32 symboles ! " # $ % & ( ) * + , . / : ; < = > ?
@ [ \ ] ^ _ ` { | } ~ et 1 signe despace. Il reprsente aussi 33 autres symboles de
mise en page, par exemple le retour chariot qui signale la fin de la ligne et le
saut de page qui signale le passage la page suivante. Le code ASCII repr-
sente donc 95 + 33 = 128 = 2
7
caractres, par des nombres qui peuvent eux-
mmes tre reprsents en binaire par des mots de sept bits. Ils sont en fait
reprsents par des mots de huit bits, le premier tant toujours un zro.
Le code ASCII tait lorigine conu pour des textes crits en anglais,
comme lindique son nom, American Standard Code for Information Inter-
change. Il nest pas adapt pour reprsenter des textes crits dans dautres
langues, mme celles qui, comme le franais, utilisent lalphabet latin, car
ces langues utilisent des accents, des cdilles et autres signes diacritiques.
Cest pourquoi on a tout dabord conu une extension du code ASCII, le
code latin-1, qui contient 191 caractres. Aux 128 caractres du code
ASCII, qui sont reprsents comme en ASCII, sajoutent les lettres ,
, , , , , , etc. qui permettent de reprsenter les
textes crits dans la plupart des langues dEurope de lOuest, mme si, pour
le franais, le a t oubli. Il manque toutefois des lettres utilises par
les langues dEurope de lEst, si bien quun autre format, le code latin-2, a
t propos pour ces langues. Ensuite, pour reprsenter les textes crits en
grec, russe, chinois, japonais, coren, etc., il a fallu proposer un format
universel : Unicode. Unicode recense prs de 110 000 caractres et associe
un nom et un numro chacun. A priori, ce numro se code sur 32 bits.
ManuelDowek.book Page 112 Monday, July 9, 2012 4:58 PM
8 Reprsenter des caractres et des textes
Groupe Eyrolles, 2012
113
Cependant, Unicode existe en plusieurs dclinaisons, parmi lesquelles
UTF-32, dans laquelle chaque caractre est ainsi exprim sur 32 bits, et
UTF-8, dans laquelle les caractres les plus courants sont exprims sur
8 bits et les moins courants sur 16, 32 ou 64 bits, utilisant une ide discute
en dtail au chapitre 12 propos de la notion de compression.
Le format UTF-8 a vocation devenir le standard, mais il ne lest pas
encore : malgr les efforts des comits de normalisation, lhumanit na
pas encore russi se doter dun format universellement accept, si bien
quil est parfois ncessaire de traduire un texte dUTF-8 en latin-1 ou de
latin-2 en UTF-8. Quand cette traduction nest pas bien faite, les carac-
tres accentus sont remplacs par des caractres bizarres.
Cependant, tous ces formats reposent sur une mme ide : associer un
nombre, cest--dire un mot binaire, chaque caractre. Tous ces for-
mats sont accessibles sur le Web.
La reprsentation
des textes simples
Un texte tant une suite de caractres, on peut le reprsenter en crivant
les caractres les uns aprs les autres.
Exercice 8.1 (avec corrig)
Trouver la reprsentation binaire en ASCII du texte Je pense, donc je suis.
On cherche la table des codes ASCII sur le Web de manire traduire le texte,
caractre par caractre : 74, 101, 32, 112, 101, 110, 115, 101, 44, 32, 100, 111,
110, 99, 32, 106, 101, 32, 115, 117, 105, 115, 46. On exprime ensuite chacun de
ces nombres en binaire sur huit bits :
01001010 01100101 00100000 01110000 01100101 01101110 01110011
01100101 00101100 00100000 01100100 01101111 01101110 01100011
00100000 01101010 01100101 00100000 01110011 01110101 01101001
01110011 00101110.
Exercice 8.2
Trouver la reprsentation binaire en ASCII du texte Cet exercice est un peu
fastidieux.
SAVOIR-FAIRE Trouver la reprsentation en ASCII binaire dun texte
En utilisant une table, on cherche le code ASCII de chaque caractre. Puis on traduit
chacun de ces nombres en reprsentation binaire.
ManuelDowek.book Page 113 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
114
Exercice 8.3 (avec corrig)
Trouver le texte reprsent en ASCII binaire par la suite de bits
01000011001001110110010101110011011101000010000001100110011000010
1100011011010010110110001100101.
On commence par dcouper la suite de bits en octets : 01000011 00100111
01100101 01110011 01110100 00100000 01100110 01100001 01100011
01101001 01101100 01100101. Chaque octet reprsente un nombre entier : 67,
39, 101, 115, 116, 32, 102, 97, 99, 105, 108, 101. On cherche ensuite la table des
codes ASCII en ligne de manire traduire chacun de ces nombres en une
lettre : Cest facile .
Exercice 8.4
Trouver le texte reprsent en ASCII binaire par la suite de bits
001100000111010001100101011101000111010000110001.
Exercice 8.5
Traduire en ASCII binaire votre phrase prfre, par exemple : Le commence-
ment de toutes les sciences, cest ltonnement. en oubliant les accents. Tra-
duire ensuite cette phrase en UTF-8 avec les accents.
Exercice 8.6
Traduire une phrase en ASCII binaire, puis la passer son voisin qui la dcode.
Exercice 8.7
On suppose que les seize lettres qui suivent sont codes ainsi :
Dcoder le message suivant : 1011 1100 1001 1111 0000 1010 1111 0111 1101
0110 0101 1111 0110 1100 1011 1110 1000, puis en se faisant ventuellement
aider dune personne qui lit larabe ou en utilisant le mcanisme de traduction
de Google, dterminer sil correspond la phrase tout en code binaire ou
les lettres deviennent des nombres .
Exercice 8.8
On considre lalphabet de 32 signes constitu des 26 lettres de lalphabet, de
lespace et de cinq symboles de ponctuation : la virgule, le point, le point-virgule,
le point dinterrogation et le point dexclamation. On reprsente les caractres de
cet alphabet par un code binaire de cinq bits prsent dans le tableau suivant. Sur
la dernire ligne, on a fait figurer la traduction dcimale de chaque code binaire.
SAVOIR-FAIRE Dcoder un texte reprsent en ASCII binaire
On dcoupe la suite de bits en octets, on traduit chaque octet en dcimal, puis on
cherche en utilisant une table, le caractre exprim par chacun de ces nombres.
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ManuelDowek.book Page 114 Monday, July 9, 2012 4:58 PM
8 Reprsenter des caractres et des textes
Groupe Eyrolles, 2012
115
Quel est le troisime bit du code de la lettre P ?
Dcoder le message suivant : 00001011100110101001011101010010001.
crire son prnom avec ce code.
Quels sont les caractres qui commencent par deux 1 ?
Pourquoi ny a t-il pas de caractres en minuscule dans cet alphabet ?
On considre lopration qui consiste transformer les 0 en 1 et vice-versa
dans chaque caractre. Recopier et remplir le tableau ci-aprs qui,
chaque caractre, associe le caractre obtenu par cette transformation.
On considre lopration qui consiste changer le premier bit avec le dernier,
et le deuxime bit avec lavant-dernier ; recopier et remplir le tableau ci-aprs
qui, chaque caractre, associe le caractre obtenu par cette transformation.
Exercice 8.9
Selon Pierre Lecomte du Noy, 01001100 01100101 00100000 01100010
01110101 01110100 00100000 01100100 01100101 00100000 01101100
01100001 00100000 01110011 01100011 01101001 01100101 01101110
01100011 01100101 00100000 01100101 01110011 01110100 00100000
01100100 01100101 00100000 01110000 01110010 01100101 01110110
01101111 01101001 01110010 00101100 00100000 00100000 01101110
01101111 01101110 00100000 01100100 01100101 00100000 01100011
01101111 01101101 01110000 01110010 01100101 01101110 01100100
01110010 01100101. tes-vous daccord avec lui ?
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z , . ; ? !
0
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
1
1
0
0
1
0
0
0
0
1
0
1
0
0
1
1
0
0
0
1
1
1
0
1
0
0
0
0
1
0
0
1
0
1
0
1
0
0
1
0
1
1
0
1
1
0
0
0
1
1
0
1
0
1
1
1
0
0
1
1
1
1
1
0
0
0
0
1
0
0
0
1
1
0
0
1
0
1
0
0
1
1
1
0
1
0
0
1
0
1
0
1
1
0
1
1
0
1
0
1
1
1
1
1
0
0
0
1
1
0
0
1
1
1
0
1
0
1
1
0
1
1
1
1
1
0
0
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z , . ; ? !
! ?
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z , . ; ? !
A Q
ATTENTION Utiliser un code standard
Pour les exercices 8.7 et 8.8, nous avons invent un code valable exclusi-
vement pour la dure de lexercice. Pour partager des informations, il ne
faut jamais faire cela, mais utiliser un code standard, connu de tous.
Sauf, bien sr, si on veut garder le texte secret (voir le chapitre 12).
ManuelDowek.book Page 115 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
116
La reprsentation
des textes enrichis
Les textes en ASCII ou en Unicode sont simplement des suites de
caractres. Les diteurs de texte sont les logiciels qui manipulent ces suites
de caractres. Toutefois, quand on crit un texte, on peut souhaiter lui
donner une forme spciale, plus jolie, plus lisible, comme le fait un
imprimeur. On peut jouer sur la police de caractres Times, Courier,
etc. , sur la taille des caractres 11 points, 12 points, etc. , sur leur
forme romain, italique, etc. , leur graisse maigre, gras, etc. On peut
aussi souhaiter dcouper un texte en chapitres et mettre en valeur les
titres des chapitres, etc. Or, les seules caractristiques que lon puisse
exprimer avec un code comme lASCII, par exemple, sont la casse dune
lettre minuscule ou majuscule et le dcoupage en paragraphes, grce
au symbole retour chariot. Les traitements de texte sont les logiciels qui
permettent ces mises en pages plus labores.
Ceci a amen enrichir ces formats, de manire :
1 qualifier certaines parties du texte, par exemple en mettant certaines
parties en gras ou en italique,
2 structurer le texte en divisions : un texte nest pas uniquement une
suite de paragraphes, mais est hirarchis en parties, chapitres, sec-
tions, sous-sections,
3 prsenter certaines informations sous forme de listes et de tables,
4 permettre de faire rfrence dautres textes,
5 donner des informations sur le texte : son titre, son ou ses auteur(s),
sa date de cration, sa langue, des mots-cls utiliss pour le recher-
cher parmi plusieurs textes, etc. Ces informations sur le texte, et non
du texte, sont appeles des mta-donnes.
Toutes ces considrations sont, bien entendu, valables aussi bien pour les
textes manuscrits ou imprims que pour les textes traits par les ordinateurs.
Lun de ces formats enrichis, qui est utilis en particulier pour crire des
pages web est appel le format HTML. En HTML, pour mettre un
passage en gras, on le dlimite par les balises <b> et </b> et pour le mettre
en italique, on le dlimite par les balises <i> et </i>. Ainsi le texte :
saffiche dans un navigateur :
Ma <i>premire</i> page <b>web</b>
ManuelDowek.book Page 116 Monday, July 9, 2012 4:58 PM
8 Reprsenter des caractres et des textes
Groupe Eyrolles, 2012
117
Comme les parenthses, les balises vont par deux : on ouvre le passage
mettre en gras avec la balise <b> et on le ferme avec la balise </b>.
Une division du texte est dlimite par les balises <div> et </div>, ainsi le
texte :
saffichera dans le navigateur en rendant ces divisions explicites.
Comme les parenthses, les balises peuvent semboter les unes dans les
autres, mais pas se chevaucher.
On indique quun passage est un titre en le dlimitant par les balises <h1>
et </h1> et que cest un sous-titre en le dlimitant par les balises <h2> et
</h2>.
De mme, les autres structurations du texte comme les numrations ou
les tableaux sont exprimes par dautres balises.
Quand on crit un texte, il est frquent de mentionner dautres textes :
par exemple, de parler dans une lettre dun livre que lon a lu. Dans le cas
dun texte manuscrit ou imprim, on donne en gnral une rfrence du
texte cit, par exemple le titre du livre et son auteur, afin que le lecteur
puisse sy rfrer sil le souhaite. Quand on veut exprimer, dans une page
web, une rfrence une autre page, on peut faire mieux que simplement
indiquer ladresse de la page web en question (par exemple ladresse
http://fr.wikipedia.org/wiki/Hypertext_Markup_Language) ; on peut changer lappa-
rence du passage o lon fait la rfrence, pour indiquer au lecteur que sil
clique sur ce passage, le navigateur affichera la page demande. On uti-
lise pour cela les balises <a> et </a> : on encadre la partie du texte quali-
fier par ces deux balises et on indique lintrieur de la balise <a>
ladresse de la page rfrence. Par exemple le texte :
qui affiche dans un navigateur :
Ma premire page web
<div>Ma premire page web
<div> comporte une premire sous-division pour dire Bonjour tout le
monde ! </div>
<div> et une seconde qui finit par bientt ! </div>
</div>
Pour les dtails sur le langage HTML, on pourra consulter <a href =
"http://fr.wikipedia.org/wiki/Hypertext_Markup_Language">la page
<i>Hypertext Markup Language de Wikipdia</i></a>.
Pour les dtails sur le langage HTML, on pourra consulter la page
Hypertext MarkupLanguage de Wikipdia.
ManuelDowek.book Page 117 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
118
Si lon clique sur le passage en bleu et soulign, le navigateur affiche la page
dont ladresse est http://fr.wikipedia.org/wiki/Hypertext_Markup_Language. Un tel
passage sur lequel on peut cliquer pour accder une autre page sappelle
un lien, et un texte qui contient au moins un lien est un hypertexte.
Les balises <body> et </body> dlimitent le texte afficher dans le naviga-
teur. On indique avant ces informations les mta-donnes relatives la
page : son titre, le format utilis pour les lettres accentues, etc.
Voici, au bout du compte, un exemple de texte au format HTML :
Len-tte situ entre les deux balises <head> et </head> indique dune part
que le texte est exprim en UTF-8, cest lobjet de la ligne :
et dautre part que le titre de la page est Un exemple.
Le contenu est situ entre les balises <body> et </body>. On y retrouve les
balises <b>, </b>, <i>, </i>, <h1>, </h1>, <h2>, </h2>, <div>, </div>, <a> et
</a> que lon a dcrites. Dans un navigateur, le texte saffiche de la
manire ci-contre.
Exercice 8.10 (avec corrig)
crire une page HTML qui prsente les diffrents projets informatiques des
lves dune classe.
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</meta>
<title>Un exemple</title>
</head>
<body>
<h1>Un titre</h1>
<h2>Un sous-titre</h2>
<div><a href="http://www.wikipedia.org/">Un lien</a></div>
<div><b>Un passage important</b></div>
</body>
</html>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</meta>
SAVOIR-FAIRE crire une page en HTML
crire le texte contenu dans cette page. Structurer ce texte en divisions. Identifier les
titres de parties, les passages mettre en gras, en italique, etc. et les rfrences vers
dautres pages. Ajouter les balises <body> et </body> autour du corps du texte, len-tte qui
contient les mta-donnes et terminer avec les balises <html> et </html>.
ManuelDowek.book Page 118 Monday, July 9, 2012 4:58 PM
8 Reprsenter des caractres et des textes
Groupe Eyrolles, 2012
119
Exercice 8.11
crire une page HTML qui prsente la liste des concerts et des spectacles pr-
sents dans un thtre.
Exercice 8.12
Changer le texte HTML Ma <i>premire</i> page web pour que le mot
premire apparaisse non en italique, mais en gras.
Exercice 8.13
Ce texte HTML est incorrect. Comment le corriger ?
Exercice 8.14
Dans ce texte, vers quel site web pointe le lien ?
Comment ce texte saffiche-t-il dans un navigateur ? Quel est lintrt de
regarder le source HTML de cette page avant de cliquer ?
Exercice 8.15
Donner le source HTML du texte suivant sachant que le texte en bleu et sou-
lign est un lien vers la page http://www.monlivre.fr/page2 :
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
<title>Projets Ada Lovelace</title>
</head>
<body>
<h1>Les projets de la classe de TS1 du Lyce <a href = "http://www.adalovelace.fr">Ada Lovelace</a></h1>
<div>
<a href="http://www.adalovelace.fr/informatique/ts1/projets/backgammon/index.html">Un programme qui <b>joue
aux Backgammon</b></a>
</div>
<div>
<a href="http://www.adalovelace.fr/informatique/ts1/projets/compression/index.html">Un programme qui
<b>compresse des images</b></a>
</div>
<div><a href="http://www.adalovelace.fr/informatique/ts1/projets/montecarlo/index.html">Un programme qui
<b>calcule des intgrales</b> sans peine</a>
</div>
</body>
</html>
Il faut <i>comprendre/i> le codage des objets numriques pour les
matriser.
Votre compte bancaire prsente une anomalie. Cliquer <a href="http://grosse-arnaque.com">ici</a> pour avoir de l'aide.
On pourra consulter la page suivante.
ManuelDowek.book Page 119 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
120
Ai-je bien compris ?
Comment reprsente-t-on un caractre ?
Quelle est la diffrence entre le code ASCII et le format Unicode ?
Quelle est la diffrence entre le format Unicode et le format HTML ?
ManuelDowek.book Page 120 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
9
Reprsenter
des images
et des sons
Claude Shannon (1916 - 2001), a
montr en 1949, en sappuyant sur
des travaux antrieurs de Harry
Nyquist, que la frquence dchan-
tillonnage dun son, et plus gnrale-
ment dun signal, doit tre au moins
le double de la frquence maximale
contenue dans ce son, pour que le
son puisse tre restitu partir de
lchantillon. Il a galement montr
comment dcrire les circuits lectro-
niques par des fonctions boolennes
(voir le chapitre 13) et comment
exprimer toutes les fonctions boo-
lennes et arithmtiques laide des
fonctions boolennes lmentaires
(voir le chapitre 10).
Pour dcrire une image, commence par comprendre
comment ton il la voit.
Cest encore avec des 0 et des 1 que lon reprsente les images
et les sons, mais en grand nombre.
Pour dcrire une image, on peut utiliser une reprsentation
vectorielle en dcrivant des formes gomtriques : un cercle,
une droite, etc., ou une reprsentation bitmap en quadrillant
limage et en dcrivant chaque case (pixel). Noir et blanc,
niveaux de gris ou couleurs sont dcrits par diffrents codages.
Les sons aussi sont chantillonns en dcoupant le temps
durant lequel le son est mis.
Les images et les sons sont de trs longues suites de 0 et de 1,
nous introduisons dans ce chapitre les units pour mesurer
la taille des fichiers.
ManuelDowek.book Page 121 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
122
La reprsentation
des images
Pour dcrire limage , une possibilit est de dire : cette image est
forme dun cercle . On peut mme tre plus prcis et indiquer les coor-
donnes du centre du cercle et son rayon. Et, partir de cette descrip-
tion, nimporte qui pourrait reconstituer le dessin.
On peut donc reprsenter cette image par trois nombres : deux pour les
coordonnes du centre et un pour le rayon. Une image forme de plu-
sieurs cercles serait de mme dcrite par trois nombres pour chacun
deux. On peut reprsenter dune manire similaire un dessin form de
cercles et de rectangles, en reprsentant chaque figure par une lettre,
c pour un cercle, r pour un rectangle, suivi dune suite de nombres
qui dfinissent les paramtres de la figure. On parle alors de reprsenta-
tion symbolique, ou parfois de reprsentation vectorielle, dune image.
Nanmoins, cette mthode est peu pratique pour reprsenter limage .
Une autre mthode, qui a lavantage de pouvoir tre utilise sur nimporte
quelle image, consiste superposer un quadrillage limage .
Chacune des cases de ce quadrillage sappelle un pixel (picture element).
On noircit ensuite les pixels qui contiennent une portion de trait ().
Puis, il suffit dindiquer la couleur de chacun des pixels, en les lisant de
gauche droite et de haut en bas, comme un texte. Ce dessin se dcrit donc
par une suite de mots blanc ou noir . Comme seuls les mots noir
ou blanc sont utiliss, on peut tre plus conome et remplacer chacun de
ces mots par un bit, par exemple 1 pour noir et 0 pour blanc .
Le dessin ci-avant, avec une grille de 10 10, se dcrit alors par la suite
de 100 bits suivante :
Cette description est assez approximative, mais on peut la rendre plus pr-
cise en utilisant un quadrillage, non plus de 10 10 pixels, mais de
100 100 pixels. partir de quelques millions de pixels, notre il nest
plus capable de faire la diffrence entre les deux images. Cette manire de
reprsenter une image sous la forme dune suite de pixels, chacun exprims
sur un bit, sappelle une bitmap. Cest une mthode approximative, mais
universelle : nimporte quelle image en noir et blanc peut se dcrire ainsi.
0000000000001111110001100001100100000010010000001001000000100100000010
011000011000111111000000000000

ManuelDowek.book Page 122 Monday, July 9, 2012 4:58 PM


9 Reprsenter des images et des sons
Groupe Eyrolles, 2012
123
La notion de format
Nous verrons au chapitre 11 que quand on stocke un texte, une image,
un son, etc. par exemple sur un disque, on le stocke dans un fichier. Pour
le moment, nous avons juste besoin de savoir quun fichier est un mot,
cest--dire une suite de 0 et de 1, auquel on a attribu un nom.
Si on trouve un fichier qui contient la suite de bits
000000000000111111000110000110010000001001000000100100000
0100100000010011000011000111111000000000000
il nest pas a priori vident que cette suite exprime une image de
10 10 pixels. Il pourrait aussi sagir par exemple dun texte en ASCII,
ou de la reprsentation dun nombre virgule. Pour cette raison, au lieu
dappeler le fichier simplement cercle, on lappelle cercle.pbm. Cette
extension pbm du nom indique que ce fichier est exprim dans le format
PBM (Portable BitMap). Ce format est lun des plus simples pour
exprimer des images. Un fichier au format PBM est un fichier en ASCII
qui se compose comme suit :
les caractres P1, suivis dun retour la ligne ou dun espace,
la largeur de limage, en base 10, suivie dun retour la ligne ou dun
espace,
la hauteur de limage, en base 10, suivie dun retour la ligne ou dun
espace,
la liste des pixels, ligne par ligne, de haut en bas et de gauche droite
les retours la ligne et les espaces sont ignors dans cette partie.
En outre, aucune ligne ne doit dpasser 70 caractres et toutes les lignes
commenant par le caractre # sont des commentaires ignors (voir le
chapitre 3). Ainsi, le code ci-contre est un fichier au format PBM. Bien
entendu, le format PBM nest que lun des multiples formats de fichiers
dimages. Dautres exemples sont PGM, PPM, PNG, JPEG, GIF, PS,
PICT, TIFF, etc.
P1
# Mon premier fichier PBM : cercle
10 10
0000000000
0011111100
0110000110
0100000010
0100000010
0100000010
0100000010
0110000110
0011111100
0000000000
ManuelDowek.book Page 123 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
124
Exercice 9.1 (avec corrig)
Chercher sur le Web les caractristiques du format PBM.
Cest un format noir et blanc, bitmap, non compress, public et libre.
Exercice 9.2
Chercher sur le Web les caractristiques des formats GIF et PNG.
La reprsentation des images en niveaux
de gris et en couleurs
Certaines images, par exemple les photos en noir et blanc, utilisent, en
plus du noir et du blanc, diverses nuances de gris. On les appelle les
images en niveaux de gris. Un format, parmi dautres, pour exprimer ces
images est le format PGM (Portable GreyMap). Pour exprimer une
image dans le format PGM, on choisit une valeur maximale, par
exemple 255, pour exprimer les niveaux de gris et on associe chaque
pixel un nombre compris entre 0 et 255, 0 indiquant que le pixel est noir
et 255 quil est blanc. Les valeurs de 1 254 expriment diffrentes
teintes de gris, de la plus fonce la plus claire. Un fichier au format
PGM, ressemble beaucoup un fichier au format PBM, cest un fichier
en ASCII qui se compose comme suit :
les caractres P2, suivis dun retour la ligne ou dun espace,
la largeur de limage, suivie dun retour la ligne ou dun espace,
la hauteur de limage, suivie dun retour la ligne ou dun espace,
SAVOIR-FAIRE Identifier quelques formats dimages
Les diffrents formats qui permettent dexprimer des images se distinguent les uns des
autres par :
le type dimage : noir et blanc, en niveaux de gris, en couleurs, etc. ;
la manire dexprimer ces images : sous forme vectorielle ou de bitmap ;
le fait que ces images soient compresses ou non ;
le fait que le format soit public ou secret : certains formats sont publics, dautres sont
gards secrets par leurs concepteurs, de manire contraindre les utilisateurs utiliser
leurs logiciels pour traiter ces images ;
le fait que ces formats soient propritaires ou libres : pour utiliser certains formats, il
est ncessaire de payer des droits leurs concepteurs, alors que pour dautres non.
ManuelDowek.book Page 124 Monday, July 9, 2012 4:58 PM
9 Reprsenter des images et des sons
Groupe Eyrolles, 2012
125
la valeur maximale utilise pour exprimer les niveaux de gris, suivie
dun retour la ligne ou dun espace,
la liste des couleurs des pixels, ligne par ligne, de haut en bas et de
gauche droite, spares par des retours la ligne ou des espaces.
Comme en PBM, aucune ligne ne doit dpasser 70 caractres et toutes
les lignes commenant par le caractre # sont ignores.
Pour comprendre comment reprsenter les images en couleurs, il faut
dabord sintresser la manire dont notre il peroit ces dernires. Notre
il contient des cellules, les cnes, qui sont sensibles la couleur, cest--dire
la longueur donde de la lumire quils reoivent. Ces cnes sont de trois
sortes, dont le maximum de sensibilit est respectivement dans le rouge
(560 nm), le vert (530 nm) et le bleu (424 nm). Quand notre il reoit une
lumire monochrome mise par une ampoule jaune, les cnes sensibles au
rouge et au vert ragissent beaucoup et ceux sensibles au bleu un tout petit
peu, exactement comme sil recevait un mlange de lumires mises par deux
ampoules rouge et verte. Ainsi, en mlangeant de la lumire produite par
une ampoule rouge et une ampoule verte, on peut donner lil la mme
sensation que sil recevait une lumire jaune. Plus gnralement, quelle que
soit la lumire quil reoit, notre il ne communique notre cerveau quune
information partielle : lintensit de la raction des cnes sensibles au rouge,
au vert et au bleu. Et deux lumires qui stimulent ces trois types de cnes de
manire identique sont indiscernables pour lil.
Ainsi, sur lcran dun ordinateur, chaque pixel est compos non pas
dune, mais de trois sources de lumire, rouge, verte et bleue ; en faisant
varier lintensit de chacune de ces sources, on peut simuler nimporte
quelle couleur.
Par exemple, en mlangeant de la lumire verte et de la lumire bleue on
obtient de la lumire cyan. En mlangeant de la lumire rouge et de la
lumire bleue on obtient de la lumire magenta. Et en mlangeant de la
lumire rouge et de la lumire verte on obtient de la lumire jaune.
Cyan est le nom savant dun bleu turquoise et magenta celui dun
rouge tirant un peu sur le violet.
Ce procd de reprsentation des couleurs dpend donc la fois de la phy-
sique de la lumire et de la biologie de la vision : si, comme certains
oiseaux, nous avions quatre types de cnes, la physique de la lumire serait
la mme, mais nous devrions cependant concevoir des crans dans lesquels
chaque pixel contient, non pas trois, mais quatre sources lumineuses.
Un format, parmi dautres, pour exprimer ces images est le format PPM
(Portable PixMap). Pour exprimer une image dans ce format, on choisit
une valeur maximale, par exemple 255, pour exprimer lintensit des
couleurs et on associe chaque pixel trois nombres, lintensit en rouge,
ManuelDowek.book Page 125 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
126
en vert et en bleu, chaque nombre tant compris entre 0 et 255. Un
fichier au format PPM, ressemble beaucoup un fichier au format PBM
ou PGM; cest un fichier ASCII qui se compose comme suit :
les caractres P3, suivis dun retour la ligne ou dun espace,
la largeur de limage, suivie dun retour la ligne ou dun espace,
la hauteur de limage, suivie dun retour la ligne ou dun espace,
la valeur maximale utilise pour exprimer lintensit des couleurs,
la liste des valeurs des couleurs, trois par pixel, dans lordre rouge,
vert, bleu, ligne par ligne, de haut en bas et de gauche droite, spa-
res par des retours la ligne ou des espaces.
Comme en PBM et en PGM, aucune ligne ne doit dpasser 70 caractres
et toutes les lignes commenant par le caractre # sont ignores.
Par exemple, en mlangeant du rouge et du vert en quantits gales, on
obtient du jaune. En augmentant la quantit de rouge, par exemple
rouge = 237, vert = 127, bleu = 16, on obtient du orange. On peut alors
crire un fichier PPM qui reprsente un carr orange de 100 pixels sur
100 pixels, le triplet 237 127 16 devant tre rpt dix mille fois, puisque
limage est forme de dix mille pixels (voir ci-contre).
Cet exemple aide comprendre pourquoi il y a des formats dimages
plus complexes que le format PPM: il y a de nombreux moyens dviter
de recopier dix mille fois le mme triplet de nombres. Cest ce que lon
appelle compresser un fichier (voir le chapitre 12).
Exercice 9.3 (avec corrig)
Lequel des formats PBM, PGM et PPM est adapt pour reprsenter un carr
noir de 10 pixels sur 10 pixels ?
Mme question pour un carr rouge de mme taille.
Comparer les tailles des fichiers obtenus.
Pour un carr noir, le format PBM suffit, puisquil ny a ni niveaux de gris ni
couleurs, et le fichier est le suivant (voir ci-contre ).
Pour un carr rouge, il faut obligatoirement recourir au format PPM, seul
capable de reprsenter de la couleur. Le rouge se reprsente par les trois
nombres 255 0 0 : intensit maximale pour le rouge et nulle pour le vert
et le bleu. On obtient le fichier .
P3
# Mon premier fichier PPM : orange
100 100
255
237 127 16
237 127 16
237 127 16
237 127 16

SAVOIR-FAIRE Numriser une image sous forme dun fichier


1 Identifier le type dimage numriser (noir et blanc, en niveaux de gris ou en couleurs)
et choisir un format appropri.
2 Identifier la valeur de chaque pixel.
3 Identifier les autres informations que contient le fichier : taille de limage, commen-
taires, etc. et la manire dont ces informations sont exprimes dans ce format.

P1
# Un carr noir
10 10
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
ManuelDowek.book Page 126 Monday, July 9, 2012 4:58 PM
9 Reprsenter des images et des sons
Groupe Eyrolles, 2012
127
Le fichier reprsentant la seconde image est significativement plus gros
que celui reprsentant la premire, puisquil faut indiquer trois octets par
pixel, au lieu dun bit dans le cas du fichier PBM.
Exercice 9.4
crire les fichiers de lexercice 9.3 dans un diteur de texte et les ouvrir avec un
logiciel de traitement dimages, par exemple Gimp. Attention, certains dessins
sont petits, il peut tre ncessaire de zoomer pour bien les voir.
Exercice 9.5
Rechercher des informations sur la structure des fichiers GIF.
Combien de bits occupe la reprsentation dun pixel dans ce format ?
Quelle information particulirement importante pour laffichage de
limage le fichier doit-il contenir et qui ntait pas prsente dans les for-
mats PBM, PGM et PPM?

P3
# Un carr rouge
10 10
255
255 0 0
255 0 0
255 0 0

(100 lignes identiques)
Depuis Georges Seurat et Paul Signac, la fin du XIX
e
sicle,
les artistes exploitent cette possibilit surprenante
de suggrer des images, avec des taches monochromes. Ici un Mario
en carrelage, photographi rue au Pltre, Paris, en juillet 2011.
Logo de DansTonChat.com en pixel art
ALLER PLUS LOIN La synthse soustractive
Les imprimantes galement simulent toutes les couleurs
en mlangeant trois types dencre. Pourtant ces trois
encres ne sont pas rouge, vert et bleu, mais cyan,
magenta et jaune. Cela est d au fait que, contraire-
ment un cran qui met de la lumire, une feuille de
papier ne fait que recevoir de la lumire blanche (cest-
-dire un mlange de lumires de toutes les couleurs),
absorber certaines couleurs et reflter les autres. Lencre
rouge, par exemple, absorbe le vert et le bleu et reflte
le rouge. De mme, lencre verte absorbe le rouge et le
bleu et reflte le vert. Si on mlange de lencre rouge et
de lencre verte, on obtient une encre qui absorbe le
rouge, le vert et le bleu et qui ne reflte rien : une encre
noire, et non jaune. Cest pour cela quen synthse sous-
tractive, on doit utiliser trois encres telles que :
La premire absorbe le rouge et reflte le vert et le
bleu : lencre cyan.
La deuxime absorbe le vert et reflte le rouge et le
bleu : lencre magenta.
La troisime absorbe le bleu et reflte le rouge et le
vert : lencre jaune.
Ce mme principe de synthse soustractive est celui
quemploient les peintres pour obtenir toutes les cou-
leurs en mlangeant, sur leur palette, trois couleurs pri-
maires.
ManuelDowek.book Page 127 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
128
La reprsentation des sons
Un son est une variation de la pression de lair au cours du temps. Une
manire simple de reprsenter un son consiste lchantillonner, cest--
dire mesurer la pression intervalles rguliers et le reprsenter comme la
suite des mesures obtenues. Lchantillonnage dun son est une mthode
assez similaire au dcoupage dune image en pixels, sauf que le dcou-
page seffectue, non dans lespace, mais dans le temps. Par exemple, si on
chantillonne 44 000 Hz, cest--dire en faisant 44 000 mesures par
seconde, une sinusode de frquence 440 Hz, on fait cent mesures par
priode et on obtient lchantillon suivant :
En revanche, si lon chantillonne 300 Hz cette mme sinusode, on
fait une mesure toutes les priodes et demie environ, et on obtient
lchantillon suivant :
On comprend quil est possible de reconstituer la sinusode dans le pre-
mier cas, mais pas dans le second. De manire plus gnrale, on montre
que quand on chantillonne un son, il faut, pour que la reconstitution
soit possible, une frquence dchantillonnage au moins double de la fr-
quence la plus leve contenue dans ce son.
ALLER PLUS LOIN La reprsentation
des sons et la notation musicale
Cette manire de reprsenter les sons par chan-
tillonnage se distingue de la notation musicale
utilise depuis le XIII
e
sicle, qui permet de repr-
senter la dure, la frquence et lintensit des
notes de musique, chacune reprsente par un
symbole sur une porte. Des systmes interm-
diaires entre lchantillonnage et la notation
musicale existent aussi, comme le format MIDI
(Musical Instrument Digital Interface) uti-
lis pour reprsenter les sons produits par les ins-
truments de musique lectroniques.
ManuelDowek.book Page 128 Monday, July 9, 2012 4:58 PM
9 Reprsenter des images et des sons
Groupe Eyrolles, 2012
129
En gnral, on chantillonne les sons 44 000 Hz, car le son sinusodal le
plus aigu que notre oreille peut entendre est de 22 000 Hz environ, ce qui
implique que notre oreille ne peut pas distinguer deux sons qui donnent le
mme chantillon 44 000 Hz. Cette frquence est relativement leve ;
cest pourquoi il faut plusieurs millions de bits pour reprsenter une minute
de son et les fichiers audio sont souvent compresss (voir le chapitre 12).
Cette mthode de reprsentation dun son par chantillonnage est uti-
lise dans de nombreux formats. Les plus simples sont RAW, WAV et
BWF, mais il existe de nombreux autres formats plus sophistiqus :
MP3, WMA, AAC, etc. Comme pour les images, ces formats se distin-
guent les uns des autres par la manire dont le son est reprsent, par le
fait quil soit compress ou non, que le format soit public ou secret et
propritaire ou libre.
La taille dun texte,
dune image ou dun son
La taille dune suite de 0 et de 1, que cette suite reprsente un texte, une
image ou un son, sexprime soit en bits, soit en octets, un octet tant gal
8 bits. Par exemple, la suite 0111 0001 0010 0111 a une taille de
16 bits, ou encore de 2 octets.
Comme les textes, les images et les sons sont souvent de longues suites ;
on peut exprimer leurs tailles en kilooctets, mgaoctets, gigaoctets ou
traoctets. Comme en physique, un kilo (k) est un millier (10
3
), un
mga (M) un million (10
6
), un giga (G) un milliard (10
9
) et un tra (T)
mille milliards (10
12
). Ainsi, une image dun mgaoctet est forme de
huit millions de bits. On utilise cependant souvent des prfixes similaires
qui expriment des nombres ronds, non en dcimal, mais en binaire :
un kilo (binaire) est 1 024 (2
10
),
un mga (binaire) 1 048 576 (2
20
),
un giga (binaire) 1 073 741 824 (2
30
),
un tra (binaire) 1 099 511 627 776 (2
40
).
ALLER PLUS LOIN La notation musicale
et la musique contemporaine
La comparaison des diffrentes mthodes de
reprsentation des sons permet de prendre cons-
cience de leurs spcificits. La notation musicale
prsente lavantage, sur les formats RAW ou
MP3, de pouvoir tre lue par un musicien. En
revanche, elle ne permet pas de reprsenter tous
les sons. Il est par exemple impossible de repr-
senter le bruit dune locomotive ou dune porte
qui grince en duo avec un flexaton. Si les musi-
ciens baroques ne pouvaient utiliser le bruit dune
locomotive, ou mme le barrissement dun l-
phant, dans lune de leurs compositions, les
magntophones, puis les instruments lectroni-
ques, ont permis aux compositeurs contempo-
rains de composer des Nocturne aux chemins
de fer et des Variations pour une porte et
un soupir, qui mettent en vidence certaines
limites de la notation musicale.
ALLER PLUS LOIN Prfixes
Pour distinguer ces prfixes des prfixes dci-
maux, certains ont propos dutiliser plutt les
prfixes kibi (Ki), mbi (Mi), gibi (Gi) et tbi (Ti).
Ainsi un mgaoctet (Mo) serait 1 000 000 octets
et un mbioctet (Mio) 1 048 576 octets. Ces pr-
fixes sont malheureusement peu souvent utiliss.
ManuelDowek.book Page 129 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
130
Exercice 9.6 (avec corrig)
On enregistre un son pendant 10 min avec 10 000 chantillons par seconde et
16 bits pour chaque chantillon, sans compresser les donnes. Quelle est la
taille du fichier ?
La taille du fichier est 10 60 10 000 16 bits = 96 000 000 bits, soit
91,55 mgabits (binaire) environ.
Exercice 9.7
On enregistre une image 10 cm 10 cm, avec 100 pixels par centimtre,
chaque pixel tant reprsent par trois nombres entiers, chacun cod sur un
octet. Quelle est la taille du fichier ?
Exercice 9.8
Exprimer les capacits des exercices prcdents en mgabits dcimaux. Que
constate-t-on ? Ces presque 5 % de marge entre les capacits exprimes en
dcimal et en binaire permettent quelques constructeurs de gonfler un peu
les capacits des disques ou des mmoires quils vendent. Voil une raison de
plus dtre vigilant quand on lit les donnes techniques des produits que lon
achte.
Exercice 9.9
Prendre une photo avec un petit appareil numrique, comme celui intgr
un tlphone. Observer la taille du fichier obtenu. Calculer la taille de limage
aprs stre renseign sur le nombre de pixels de lappareil et en supposant
quun pixel est exprim sur trois octets. Comparer la taille du fichier. En
dduire le taux de compression.
Recommencer avec dix photos en prenant soin de prendre la fois des vues
trs riches, avec beaucoup de petits dtails, et des vues sans rien : une feuille
blanche ou une photo sans flash dans le noir. Comparer les taux de compres-
sion obtenus.
SAVOIR-FAIRE Comprendre les tailles des donnes et les ordres
de grandeurs
Trois quantits peuvent entrer en jeu dans la taille dun fichier de donnes :
1 le nombre de bits utilis pour reprsenter une unit de donne : pixel, caractre
alphanumrique, chantillon sonore, etc. ;
2 ventuellement, selon le format, la frquence dchantillonnage : nombre dchan-
tillons par seconde, de pixels par centimtre, etc. ;
3 la taille de lobjet dans une unit concrte : dure du son en secondes, surface de
limage en centimtres carrs, etc.
ManuelDowek.book Page 130 Monday, July 9, 2012 4:58 PM
9 Reprsenter des images et des sons
Groupe Eyrolles, 2012
131
Exercice 9.10 (avec corrig)
Pour une photographie de vacances, peut-on accepter un format avec perte ? Si
on doit envoyer cette photo dans un courrier lectronique, quelle est la taille
maximale du fichier ? Quels logiciels utiliseront les rcepteurs de cette image ?
Pour une photographie de vacances, on peut accepter une lgre perte. Si le
fichier doit transiter par courrier, sa taille est limite quelques mgaoctets
chez la plupart des fournisseurs dadresses et il faut en gnral rechercher une
taille moindre pour que le rcepteur du fichier puisse y accder en un temps
raisonnable. A priori, on ne sait pas quels logiciels seront utiliss, il faut donc
employer un format lisible par le plus grand nombre de logiciels diffrents,
par exemple un format libre.
Exercice 9.11
Pour une courbe reprsentant les rsultats dun TP de physique que lon sou-
haite prsenter dans un expos, peut-on accepter un format avec perte ?
Quelle est la taille maximale du fichier ? Quels logiciels utilise-t-on pour lire
cette image ?
Exercice 9.12
Ouvrir un logiciel de traitement dimages tel que Gimp et y charger une photo.
Observer dans le logiciel sa taille en mmoire en choisissant la fonction Pro-
prit de limage dans le menu Image. Cette taille en mmoire est le produit du
nombre de pixels et de la taille des pixels. En dduire la taille, en octets, de
chaque pixel. Pour une photo en couleurs, le rsultat devrait tre 3 octets. Tou-
tefois, si le format de limage nest pas PPM, le rsultat peut tre diffrent.
Enregistrer cette image sous diffrents formats et diffrents niveaux de com-
pression (voir le chapitre 12). Comparer visuellement les rsultats obtenus.
Observer si le taux de compression propos correspond bien au rapport des
tailles des fichiers.
SAVOIR-FAIRE Choisir un format appropri par rapport un usage
ou un besoin, une qualit, des limites
Identifier les points suivants.
1 Les donnes doivent-elles tre stockes avec prcision ou un certain taux de perte
est-il acceptable ?
2 Quelle taille est acceptable pour le fichier ainsi cr ?
3 Quels logiciels devront pouvoir accder au fichier ?
Ai-je bien compris ?
Quelles sont les deux principales manires de reprsenter une image ?
Comment reprsente-t-on un son ?
En quelle unit se mesure typiquement la taille dun son ou dune image ?
ManuelDowek.book Page 131 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 132 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
10
Les fonctions
boolennes
Dans le Manoir de Bletchey Park,
quartier gnral des services de ren-
seignement britanniques, Thomas
Flowers (1905 - 1998) a construit
pendant la seconde guerre mondiale
la machine Colossus, premier calcula-
teur lectronique utiliser le systme
binaire. Si cette machine ntait pas
encore un ordinateur, elle a cass les
codes secrets (voir le chapitre 12) uti-
liss par larme allemande et a t
un lment essentiel dans la victoire
allie. Plusieurs milliers de personnes
ont travaill Bletchey Park, en parti-
culier Alan Turing.
Pour un oui ou pour un non ? Oui ou non ?
Les fonctions boolennes sont utilises partout : dans les
langages de programmation, en architecture des ordinateurs,
dans certains algorithmes cryptographiques
Elles peuvent tre dcrites par des tables ou de manire
symbolique et nous montrons comment passer dune
reprsentation une autre.
Nous nous concentrons dans ce chapitre sur les fonctions non,
ou et et qui permettent dexprimer toutes les autres.
ManuelDowek.book Page 133 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
134
Nous nous intressons, dans ce chapitre, aux fonctions boolennes, qui
associent un boolen, 0 ou 1, un ou plusieurs boolen(s).
Lexpression
des fonctions boolennes
Comme les fonctions dune variable relle, les fonctions boolennes peu-
vent sexprimer de manire symbolique : lexpression
(non(x) et y) ou (x et z) est btie sur le mme modle que lexpression
(sin(x) y) + (x z), sauf que les variables x, y et z y reprsentent des
boolens et non des nombres rels.
En revanche, contrairement aux fonctions dune variable relle, ces fonc-
tions ne peuvent pas sexprimer par des courbes. Nanmoins, elles peu-
vent sexprimer dune nouvelle manire : par des tables car, la
diffrence des nombres rels, les boolens sont en nombre fini.
Les fonctions non, et, ou
Les fonctions non, et et ou sont dfinies par les tables ci-contre.
Le nom de ces fonctions vient de la convention de lire 0 comme faux
et 1 comme vrai .
Ainsi, la fonction non transforme faux en vrai et vrai en faux : le boo-
len non(x) est donc gal 1 si et seulement si x nest pas gal 1.
De mme, le boolen x et y est gal 1 si et seulement si x est gal 1
et y est gal 1.
Le boolen x ou y est gal 1 si et seulement si au moins x ou y est
gal 1.
On remarquera que, quand x et y sont tous les deux gaux 1, x ou y est
gal 1. Ce ou est donc inclusif ; cest le ou qui apparat dans la phrase
Je viendrai sil y a un bus ou un mtro. et non le ou exclusif qui appa-
rat dans la phrase Tu dois choisir : aller la mer ou aller la
montagne. Pour le distinguer du prcdent, ce ou exclusif sera not oux.
non(x)
x non(x)
0 1
1 0
et(x,y) ou(x,y)
x y et(x,y) x y ou(x,y)
0 0 0 0 0 0
0 1 0 0 1 1
1 0 0 1 0 1
1 1 1 1 1 1
T Notation
De mme que lon crit x + y le nombre que lon
devrait, en toute rigueur, crire +(x,y), on crit
souvent x et y le boolen que lon devrait crire
et(x,y).
ManuelDowek.book Page 134 Monday, July 9, 2012 4:58 PM
10 Les fonctions boolennes
Groupe Eyrolles, 2012
135
Lexpression des fonctions
boolennes avec
les fonctions non, et, ou
On peut exprimer de manire symbolique toutes les fonctions boo-
lennes avec les seules fonctions non, et et ou.
Avant de voir comment le faire dans le cas gnral, on commence par
exprimer cinq fonctions particulires, qui seront utilises dans la suite.
La premire est la fonction multiplexeur, mux. Cette fonction de {0,1}
3
dans {0,1} est telle que si x vaut 0, alors mux(x,y,z) vaut y et si x vaut 1,
alors mux(x,y,z) vaut z. Elle est dfinie par la table ci-contre. Elle
sexprime avec les fonctions non, et et ou, par lexpression symbolique
mux(x,y,z) = (non(x) et y) ou (x et z).
Pour le montrer, on calcule ligne ligne la table de la fonction qui x, y
et z associe (non(x) et y) ou (x et z) en ajoutant des colonnes correspon-
dant aux calculs intermdiaires et on vrifie, ligne ligne, que cette table
est celle de la fonction mux :
Les quatre autres cas particuliers sont les quatre fonctions de {0,1} dans
{0,1} :
la fonction constante gale 0 () exprime, de manire symbolique,
par h(x) = x et non(x),
la fonction constante gale 1 () exprime par k(x) = x ou non(x),
l identit () exprime par i(x) = x, sans utiliser aucune fonction,
et la fonction non,
qui peuvent donc toutes les quatre tre exprimes avec des fonctions non,
et et ou.
x y z non(x) non(x) et y x et z (non(x) et y) ou (x et z)
0 0 0 1 0 0 0
0 0 1 1 0 0 0
0 1 0 1 1 0 1
0 1 1 1 1 0 1
1 0 0 0 0 0 0
1 0 1 0 0 1 1
1 1 0 0 0 0 0
1 1 1 0 0 1 1
mux(x,y,z)
x y z mux(x,y,z)
0 0 0 0
0 0 1 0
0 1 0 1
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 0
1 1 1 1

x h(x) x k(x) x i(x)
0 0 0 1 0 0
1 0 1 1 1 1
ManuelDowek.book Page 135 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
136
On peut maintenant voir comment exprimer toutes les fonctions de
{0,1}
n
dans {0,1} avec les fonctions non, et et ou. On procde par rcur-
rence sur n.
Dans le cas n = 1, la fonction exprimer est lune des fonctions h, k, i et
non, qui peuvent toutes sexprimer avec les fonctions non, et et ou.
On suppose maintenant que lon sait exprimer toutes les fonctions de
{0,1}
n
dans {0,1} avec les fonctions non, et et ou et on se donne une
fonction f de {0,1}
n+1
dans {0,1}. On dfinit les fonctions g et g de
{0,1}
n
dans {0,1} par :
et on remarque que la fonction f peut sexprimer de manire symbolique
avec les fonctions g, g et mux :
car, quand x
n+1
vaut 0, le membre de gauche et le membre de droite sont
tous les deux gaux g(x
1
,, x
n
) et, quand x
n+1
vaut 1, les deux mem-
bres sont gaux g(x
1
,, x
n
).
Par hypothse de rcurrence, on sait exprimer les deux fonctions g et g de
manire symbolique avec les fonctions non, et et ou, et comme on sait aussi
exprimer la fonction mux, on peut exprimer la fonction f en remplaant les
fonctions mux, g et g par leur expression en termes de non, et et ou.
g(x
1
, , x
n
) = f(x
1
,, x
n
,0)
g(x
1
,, x
n
) = f(x
1
,, x
n
,1)
f(x
1
,, x
n
, x
n+1
) = mux(x
n+1
, g(x
1
,, x
n
), g(x
1
,, x
n
))
SAVOIR-FAIRE Trouver une expression symbolique exprimant
une fonction partir de sa table
On identifie le nombre darguments de la fonction f. On extrait de la table de la
fonction f les tables des fonctions g et g dfinies par :
g(x
1
, , x
n
) = f(x
1
,, x
n
,0)
g(x
1
,, x
n
) = f(x
1
,, x
n
,1)
On trouve les expressions symboliques de ces deux fonctions et on construit celle de la
fonction f partir de ces deux expressions symboliques et de celle de la fonction multi-
plexeur.
ManuelDowek.book Page 136 Monday, July 9, 2012 4:58 PM
10 Les fonctions boolennes
Groupe Eyrolles, 2012
137
Exercice 10.1 (avec corrig)
Trouver une expression symbolique exprimant une fonction ou exclusif (oux)
dfinie par la table ci-contre.
Le boolen x oux y est gal 1 si et seulement si x est gal 1 ou y est gal
1, mais pas les deux.
Soit g la fonction dfinie par g(x) = x oux 0 et g la fonction dfinie par
g(x) = x oux 1. La table de la fonction g est et celle de la fonction g est .
On reconnat les tables de la fonction identit et de la fonction non. Donc
g(x) = x et g(x) = non(x), do on tire lexpression de la fonction oux :
x oux y = mux(y,x,non(x)) = (non(y) et x) ou (y et non(x))
Exercice 10.2
Trouver lexpression symbolique de la fonction de si et seulement si dfinie
par la table ci-contre.
Lexpression des fonctions
boolennes avec
les fonctions non et ou
On veut maintenant montrer quil est possible de se passer de la fonction et
et que toutes les fonctions boolennes peuvent sexprimer avec les fonc-
tions non et ou. Pour cela, il suffit de montrer que la fonction et elle-mme
peut sexprimer ainsi. Cette fonction sexprime de la manire suivante :
x et y = non (non(x) ou non(y))
En effet, la table de la fonction qui x et y associe non (non(x) ou non(y))
se calcule ligne ligne (voir ci-contre) et on reconnat la table de la
fonction et.
Exercice 10.3
Montrer que :
x ou y = non (non(x) et non(y))
En dduire que toutes les fonctions boolennes peuvent sexprimer avec les
fonctions non et et.
x y x oux y
0 0 0
0 1 1
1 0 1
1 1 0

x g(x) x g'(x)
0 0 0 1
1 1 1 0
x y x ssi y
0 0 1
0 1 0
1 0 0
1 1 1
x y non (non(x) ou non(y))
0 0 0
0 1 0
1 0 0
1 1 1
ManuelDowek.book Page 137 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
138
Exercice 10.4
La fonction de Sheffer exprime lincompatibilit de deux valeurs boolennes.
Elle est dfinie par la table ci-contre.
Montrer que S(x, y) = non(x et y).
Montrer, rciproquement, que non(x) = S(x,x) et x ou y = S(S(x,x),S(y,y)). En
dduire que toutes les fonctions boolennes peuvent sexprimer avec la fonc-
tion de Sheffer uniquement.
Le choix dexprimer les fonctions avec les fonctions non et ou nest donc quun
choix parmi dautres.
Exercice 10.5
Quand deux interrupteurs sont en parallle, la lumire sallume quand lun
deux est ferm. Quand ils sont en srie, la lumire sallume quand les deux
sont ferms. Quand ils sont en va-et-vient la lumire sallume quand les deux
sont ferms ou les deux sont ouverts. Donner la table de la fonction boo-
lenne dans ces trois cas et exprimer ces trois fonctions boolennes avec les
fonctions non et ou.
Exercice 10.6
Montrer que x et y = y et x. Est-ce la mme chose pour ou ? Calculer x et 1 et
x et 0. On appelle lment neutre dune fonction binaire f, un lment n tel
que pour tout x, f(x,n) = f(n,x) = x et lment absorbant un lment a tel que
pour tout x, f(x,a) = f(a,x) = a. La fonction et a-t-elle un lment neutre ? Et un
lment absorbant ? La fonction ou a-t-elle un lment neutre ? Et un l-
ment absorbant ?
Exercice 10.7
Med est content si Bob et Jon sont tous les deux l, mais sans Rut, ou si Rut est
l soit avec Bob, soit avec Jon. Construire une table avec en entre la prsence
de Rut, Bob et Jon et en sortie le boolen qui vaut 1 si Med est content.
Exprimer le choix de Med par une phrase plus simple.
Exercice 10.8
Soit f une fonction qui sexprime de manire symbolique avec la fonction ou
uniquement. Montrer que f(0,0,,0) = 0. Montrer que la fonction non ne peut
pas sexprimer avec la fonction ou uniquement.
x y S (x,y)
0 0 1
0 1 1
1 0 1
1 1 0
Ai-je bien compris ?
Quelles sont les deux principales manires de reprsenter une fonction boolenne ?
Quelle est la table de la fonction non ? Celle de la fonction et ? Celle de la fonction ou ?
Quelles sont les fonctions de base partir desquelles il est possible de construire
toutes les autres fonctions ?
ManuelDowek.book Page 138 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
11
Structurer
linformation
CHAPITRE AVANC
En 1989, Tim Berners-Lee (1955 ) a
propos un outil aux nombreux cher-
cheurs de lOrganisation euro-
penne pour la recherche nuclaire
(CERN) pour partager de grandes
quantits dinformations : insrer
dans des textes des liens vers dautres
textes, situs sur dautres ordinateurs,
auxquels on accde travers le
rseau Internet. Cette toile darai-
gne de liens a vite trouv un nom:
le Web. Tim Berners Lee est lauteur
du langage HTML et du premier
navigateur : Nexus.
Comment trouver son chemin dans une jungle
dinformations ?
Dans ce chapitre, nous voyons comment les informations
seffacent, se conservent, sorganisent, selon les usages que
nous voulons en faire, de la notion de fichier en arborescence
et de liens celle de base de donnes.
Nous insistons ici sur la notion de persistance des donnes
avec le danger de lhypermnsie et discutons les enjeux autour
de la gratuit de la copie ou diffusion de linformation.
ManuelDowek.book Page 139 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
140
La persistance des donnes
Reprenons lide de crer, comme au chapitre 3, un programme de ges-
tion dun rpertoire. Cependant, au lieu dtre dcids une fois pour
toutes au moment de lcriture du programme, les noms et les numros
de tlphone de ce rpertoire sont entrs par lutilisateur du programme.
Par exemple :
Le point qui nous intresse ici est que, quand on tape la commande q, le
programme se termine et les donnes entres sont perdues. Si on excute
nouveau ce programme, on doit nouveau entrer tous les contacts, ce
qui nest pas en gnral ce que lon souhaite faire quand on utilise un
rpertoire : on souhaite que les donnes soient persistantes, cest--dire
quelles demeurent un endroit accessible quand le programme se ter-
mine et mme quand on teint lordinateur sur lequel ce programme est
excut, voire quand on remplace cet ordinateur par un autre.
Cette question de la persistance des donnes se pose deux niveaux.
Cest dabord une question de matriel : les valeurs stockes dans les
variables dun programme sont physiquement stockes dans la mmoire
de lordinateur (voir le chapitre 14) et ces donnes sont perdues quand
lordinateur est teint et que la mmoire cesse dtre alimente en cou-
rant lectrique. Cela a men concevoir des priphriques, comme les
disques, ou les cls de mmoire flash aussi appeles cls USB, qui peuvent
stocker des donnes de manire persistante. La persistance des donnes
est ensuite une question de programmation, puisquil faut tre capable,
dans un programme, de stocker des donnes sur un tel priphrique et
dutiliser de telles donnes.
a Alice 060606060606
Contact ajout
3 On ajoute un numro.
a Bob 0606060607
Contact ajout
3 On ajoute un autre numro.
i Alice
60606060606
3 On interroge le rpertoire.
q 3 On quitte le programme.
ManuelDowek.book Page 140 Monday, July 9, 2012 4:58 PM
11 Structurer linformation
Groupe Eyrolles, 2012
141
La notion de fichier
Un texte en ASCII ou en HTML, une image au format PBM, PGM ou
PPM, un son au format RAW ou MP3, un programme en Java ou en C,
sont des exemples de donnes que lon souhaite faire persister, par
exemple en les stockant sur un disque.
Un disque stocke simplement une suite de bits, une suite de 0 et de 1. Le
nombre de bits quun disque peut stocker est appel sa capacit : par
exemple un disque dun traoctet (binaire) peut stocker 2
40
mots de 8 bits,
soit un peu plus de huit mille milliards de bits. On peut donc facilement
stocker un texte, une image, un son ou un programme sur un tel disque.
Cependant, comme on souhaite souvent stocker sur un disque plusieurs
images, textes, etc., il faut diviser les huit mille milliards de bits dont le
disque est constitu en plusieurs espaces plus petits, que lon appelle des
fichiers. Un fichier est simplement une suite de 0 et de 1, laquelle on
associe un nom. Par exemple, nous avons vu que le texte Je pense, donc je
suis. se reprsente en ASCII comme la suite de 184 bits suivante :
Il est possible de stocker cette suite de bits sur un disque en lui donnant
le nom cogito.txt, lextension txt indiquant que cette suite de bits
exprime un texte en ASCII.
Utiliser un fichier
dans un programme
Pour revenir lexemple du rpertoire, on commence par stocker les
contacts dans un fichier repertoire.txt qui peut avoir t crit la
main, en utilisant un diteur de texte ou un logiciel de traitement de
texte, ou t produit par un autre programme. Il a la forme suivante :
010010100110010100100000011100000110010101101110011100110110010
100101100001000000110010001101111011011100110001100100000011010
1001100101001000000111001101110101011010010111001100101110
Alice
0606060606
Bob
0606060607
ManuelDowek.book Page 141 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
142
Le programme dinterrogation du rpertoire est semblable celui du
chapitre 3, la diffrence prs que, au lieu de remplir les cases des
tableaux nom et tel avec des constantes, on transfre ces informations
depuis le fichier repertoire.txt dans les tableaux nom et tel. Pour cela,
on utilise une nouvelle fonction Isn.readStringFromFile (lire une
chane de caractres dans un fichier) en tout point semblable la fonc-
tion Isn.readString que lon a dj employe, sauf quau lieu dattendre
quune chane de caractres soit tape au clavier, elle la lit dans un fichier.
Avant de pouvoir lire dans un fichier, il faut tablir un canal de commu-
nication avec lui ; cest ce que lon appelle ouvrir le fichier. Cela se fait
avec la fonction Isn.openIn qui prend en argument une chane de carac-
tres, le nom du fichier, et qui retourne le canal de communication lui-
mme. Ensuite, la fonction Isn.readStringFromFile prend en argument
ce canal de communication et retourne la chane de caractres lue.
Quand la lecture est acheve, il faut fermer le canal de communication
avec linstruction Isn.closeIn. Le canal de communication lui-mme a
le type java.util.Scanner.
En rsum, le programme commence par allouer deux tableaux nom et
tel, ouvre un canal de communication f avec le fichier repertoire.txt,
lit les dix noms et les dix numros de tlphone sur ce canal de commu-
nication, puis ferme ce canal.
Charles
0606060608
Djamel
0606060609
tienne
0606060610
Frdrique
0606060611
Guillaume
0606060612
Hector
0606060613
Isabelle
0606060614
Jrme
0606060615
nom = new String [10];
tel = new String [10];
f = Isn.openIn("repertoire.txt");
for (i = 0; i <= 9; i = i + 1) {
nom[i] = Isn.readStringFromFile(f);
tel[i] = Isn.readStringFromFile(f);}
Isn.closeIn(f);
ManuelDowek.book Page 142 Monday, July 9, 2012 4:58 PM
11 Structurer linformation
Groupe Eyrolles, 2012
143
La suite du programme est similaire celui du chapitre 3. On demande
un nom lutilisateur, au clavier cette fois-ci, on recherche ce nom dans
le tableau nom laide dune boucle while et quand on la trouv, on
affiche le numro de tlphone correspondant.
On peut alors utiliser ce programme comme celui du chapitre 3 :
Exercice 11.1
Que se passe-t-il si lon ouvre et ferme le fichier chaque lecture ?
Exercice 11.2
crire un programme de rpertoire invers, qui demande lutilisateur un
numro de tlphone et recherche le nom associ.
crire dans un fichier se fait de manire similaire : on ouvre le fichier
avec linstruction Isn.openOut qui prend en argument une chane de
caractres et qui retourne un canal de communication. On crit dans le
fichier avec les instructions Isn.printToFile et Isn.printlnToFile qui
prennent en argument un canal de communication et un objet crire,
chane de caractres, nombre entier ou nombre virgule, et on ferme le
canal de communication avec linstruction Isn.closeOut. Un canal de
communication qui permet, non de lire, mais dcrire dans un fichier a le
type java.io.OutputStreamWriter.
Exercice 11.3
Adapter le programme, ci-avant, pour quil puisse enregistrer de nouveaux
numros. Le fichier sera entirement lu et rcrit chaque modification.
s = Isn.readString();
i = 0;
while (i < 10 && !Isn.stringEqual(s,nom[i])) {
i = i + 1;}
if (i < 10) {
System.out.println(tel[i]);}
else {
System.out.println("Inconnu");}
Hector
0606060613
ManuelDowek.book Page 143 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
144
Organiser des fichiers
en une arborescence
Quand un disque, ou une cl de mmoire flash, contient plusieurs
fichiers, il est possible den afficher la liste. La manire la plus courante
de le faire est de reprsenter chaque fichier par une icne dans une
fentre, la forme de licne variant en fonction du format du fichier.
On peut aussi simplement afficher la liste des fichiers par ordre alphab-
tique avec, dans une fentre terminal, une commande qui sappelle ls ou
dir selon le systme dexploitation.
Dcouper un disque en fichiers nest toutefois pas suffisant, car il est
probable que ce disque contiendra rapidement plusieurs milliers de
fichiers : des fichiers professionnels, comme les programmes que lon est
en train ou que lon a termin de dvelopper, des fichiers personnels,
comme des photos de vacances, etc. Il est donc ncessaire dorganiser ces
fichiers. Une manire de le faire est de regrouper ces derniers dans des
dossiers ; par exemple, tous les fichiers professionnels dans un dossier Pro
et tous les fichiers personnels dans un dossier Perso. lintrieur du dos-
sier Pro, on peut encore regrouper tous les fichiers qui concernent ce
cours dans un dossier Informatique, tous les fichiers qui concernent le
cours de physique dans un dossier Physique, etc. lintrieur du dossier
ls
Isn.java joconde.ppm Repertoire.java repertoire.txt Vinci.java
ManuelDowek.book Page 144 Monday, July 9, 2012 4:58 PM
11 Structurer linformation
Groupe Eyrolles, 2012
145
Informatique, on peut regrouper tous les fichiers qui concernent le projet
dcrire un programme de gestion de rpertoire dans un dossier Rper-
toire, etc. Si bien que le disque contient un dossier Pro, qui contient un
dossier Informatique, qui contient un dossier Rpertoire, qui contient
enfin le fichier Repertoire.java, et dautres. On appelle une telle orga-
nisation des fichiers une organisation arborescente, car on peut la visua-
liser sous la forme dun arbre.
Dans cet arbre, le chemin dun fichier est la liste des noms des nuds de
la branche qui va de la racine de larbre au fichier en question. Par
exemple, le chemin du fichier Repertoire.java est /DISQUE/Pro/
Informatique/Rpertoire/Repertoire.java.
SAVOIR-FAIRE Classer des fichiers sous la forme dune arborescence
Faire la liste des fichiers classer, les regrouper en catgories homognes, donner un
nom significatif chacune de ces catgories. ventuellement les regrouper elles-mmes
en catgories homognes. Crer les dossiers correspondant chacune de ces catgories.
Mettre chaque fichier dans le dossier appropri.
ManuelDowek.book Page 145 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
146
Exercice 11.4 (avec corrig)
Classer, sous la forme dune arborescence, les fichiers suivants :
des photos de vacances,
des photos de sa classe,
une page de tableur prsentant ses notes du trimestre,
des pages de Wikipdia prsentant des informations utiles pour son TPE,
des copies de mails personnels,
un fichier texte contenant les notes prises dans une runion prparatoire
au conseil de classe,
des fichiers de musique pour son baladeur,
des fichiers de musique tlchargs en prparation de son TPE.
On commence par donner un nom chacune de ces catgories : photos de
vacances, photos de classe, etc. On peut regrouper les dossiers contenant les
photos de vacances, les mails personnels et les fichiers pour son baladeur, dans
un dossier Perso, les photos de la classe et les notes prises en runion dans un
dossier Dlgu, puisque ces diffrentes informations sont lies cette fonc-
tion, les pages de Wikipdia et la musique tlcharge pour le TPE peuvent
tre rassembles dans un dossier TPE, enfin on peut regrouper le dossier
Dlgu, le dossier TPE et les notes du trimestre dans un dossier Pro. On
obtient alors larborescence suivante.
Exercice 11.5
Classer, sous la forme dune arborescence, les fichiers qui tranent dans son
rpertoire personnel sur les ordinateurs du lyce.
ManuelDowek.book Page 146 Monday, July 9, 2012 4:58 PM
11 Structurer linformation
Groupe Eyrolles, 2012
147
Liens et hypertextes
Lorganisation arborescente des fichiers nest pas le seul moyen de struc-
turer linformation : elle est en concurrence avec dautres mthodes,
parmi lesquelles lutilisation de liens hypertextes, notion qui na pas t
invente pour structurer linformation, mais pour simplifier la notion de
rfrence dans une page web (voir le chapitre 8).
Ainsi, une page web, crite au format HTML,
visualise dans un navigateur, apparat de la manire suivante :
Et en cliquant sur lun des mots en bleu et souligns, on accde directe-
ment au fichier Repertoire.java ou au fichier repertoire.txt. Il est
donc possible daccder un fichier sans savoir prcisment o il se
trouve dans larborescence, simplement en cliquant sur un lien.
Cette remarque mne une autre manire dorganiser les fichiers sur un
disque, o la place du fichier dans larborescence est moins importante que
la manire dy accder en cliquant sur un lien qui apparat dans une page.
Par exemple, au lieu de classer ses photos dans plusieurs dossiers, Anniver-
saire, Londres, etc. on laisse ses photos en vrac dans un dossier et on cre
une page web pour accder ses photos danniversaire, une autre pour
accder aux photos de son voyage Londres, etc. et une page web qui
permet daccder chacune de ces pages. Cette ide est la base du Web,
des logiciels de gestion de photos ou de fichiers son et des rseaux sociaux.
Le programme <a href =
"file:///DISQUE/Pro/Informatique/Rpertoire/
Repertoire.java">Repertoire.java</a> permet de rechercher un
nom dans un rpertoire, exprim sous forme d'un fichier texte,
comme le fichier
<a href =
"file:///DISQUE/Pro/Informatique/Rpertoire/
repertoire.txt">repertoire.txt</a>.
Le programme Repertoire.java permet de rechercher un nom dans un
rpertoire, exprim sous forme dun fichier texte, comme le fichier
repertoire.txt.
EN SAVOIR PLUS Structure darbre
et structure de graphe
Cette mthode permet aussi de dpasser facile-
ment les limites dun disque unique et de rf-
rencer des fichiers qui se trouvent ailleurs sur le
rseau. En outre, dans une structure arbores-
cente, si le dossier B est un lment du
dossier A, le dossier A ne peut pas son tour
tre un lment du dossier B. En revanche, avec
des liens hypertextes, rien nempche une
page A de contenir un lien vers une page B, qui
contient elle-mme un lien vers la page A.
une structure darbre se substitue donc une
structure de graphe (voir le chapitre 22).
ManuelDowek.book Page 147 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
148
Lhypermnsie
La persistance des donnes, qui est souvent souhaite, a aussi quelques
effets indsirables. Par exemple, quand un ordinateur hors dusage est
mis au grenier, son disque continue contenir des milliers de textes,
courriers, photos, etc. et il est possible que cent ans plus tard, ces infor-
mations soient encore accessibles. Les ordinateurs sont hypermnsiques :
ils noublient rien. Souhaite-t-on rellement que ses petits enfants puis-
sent accder toutes ses photos, la liste des sites web que lon a visits,
aux conversations que lon a eues sur le chat, aux mails que lon a
changs, etc. ?
Bien entendu, ce phnomne dhypermnsie existait avant les
ordinateurs : dans le mme grenier, un album de photos ou une liasse de
lettres manuscrites pouvaient aussi voyager dans le temps. La diffrence
est quun album de photos ou une liasse de lettres se voit et contient peu
dinformations. Un disque de un traoctet (binaire) peut stocker
2
40
caractres, soit un million de livres de cinq cents pages, sans que lon
voie, au premier abord, ce quil contient.
Si lon ny prend garde, on ira peut-tre vers un monde dans lequel rien
ne soubliera : chaque geste laissera une trace dans tout tat postrieur du
monde.
Cette hypermnsie des ordinateurs serait un problme facile rsoudre
si les ordinateurs ntaient pas connects en rseau : chacun devrait sim-
plement trier les informations quil souhaite garder et celles quil sou-
haite dtruire sur le disque de son ordinateur. Nanmoins, comme les
ordinateurs sont connects en rseaux, les courriers changs peuvent
aussi tre conservs par les fournisseurs de services de courrier. Il en va
de mme avec la liste des produits que lon achte et les magasins en
ligne, ou ceux dans lesquels on a une carte de fidlit, les images filmes
par les camras de surveillance et les entreprises qui installent et grent
ces camras, etc.
Ces problmes, qui sont nouveaux, ont dj reu des solutions partielles,
mais bien des solutions sont encore inventer. Parmi elles, certaines sont
individuelles : quand on met une photo en ligne, on peut la protger par
un mot de passe ou en restreindre laccs un petit nombre de
personnes ; ainsi elle ne sera pas archive par les moteurs de recherche.
Dautres sont collectives : par exemple, larticle 6 de la loi du
6 janvier 1978 (modifie plusieurs fois) indique que des donnes carac-
tre personnel ne peuvent tre conserves sous une forme permettant
lidentification des personnes concernes au-del de la dure ncessaire
aux finalits pour lesquelles elles ont t collectes.
SUJET DEXPOS Loi du 6 janvier 1978
Rechercher le texte de la loi du 6 janvier 1978
afin den prsenter les ides principales.
ManuelDowek.book Page 148 Monday, July 9, 2012 4:58 PM
11 Structurer linformation
Groupe Eyrolles, 2012
149
Alors que, dans les derniers millnaires, lhumanit a beaucoup cherch
laisser des traces de ses actions, elle commence juste prendre conscience
de limportance quil y a aussi parfois effacer certaines de ces traces.
Exercice 11.6
Chercher sur le Web la dfinition du droit loubli que certains cherchent
promouvoir comme un droit fondamental.
Pourquoi linformation
est-elle souvent gratuite ?
Si lon achte une pomme et si on la mange, cette pomme ne peut pas
aussi tre mange par quelquun dautre. De mme, si on achte un sac
de charbon pour chauffer sa maison, ce sac de charbon ne peut pas aussi
chauffer la maison de quelquun dautre. Et si lon achte les services
dun jardinier pour tondre sa pelouse, ce jardinier ne peut pas en mme
temps tondre la pelouse de quelquun dautre. Une pomme, un sac de
charbon ou les services dun jardinier sont des biens dont la consomma-
tion par une personne exclut la consommation par une autre. On dit que
de tels biens sont rivaux. Jusquau XX
e
sicle, presque tous les biens pro-
duits par lagriculture et lindustrie taient rivaux et notre conomie, en
particulier notre notion de proprit, est construite pour la production,
lchange et la consommation de tels biens.
Un fichier qui contient un texte, un morceau de musique, une image,
une vido ou un programme est, en revanche, un bien non rival. Reco-
pier un tel fichier ou le diffuser sur un rseau ne cote pratiquement
rien, si bien que le fait quune personne coute un morceau de musique
nempche nullement une autre personne dcouter le mme morceau.
Linformation est, par nature, un bien non rival. Un livre, un CD, une
photo, un DVD, un CD-ROM sont des biens rivaux, mais non un texte,
une pice de musique, une image, une vido ou un programme.
Si une mine produit un sac de charbon et le vend une personne qui luti-
lise pour chauffer sa maison et quune seconde personne souhaite aussi
acheter un sac de charbon pour chauffer la sienne, la mine doit produire
un second sac de charbon, ce qui lui cote de largent. De ce fait, la mine
na pas dautre choix que celui de vendre ce sac de charbon la seconde
personne. En revanche, si une entreprise produit une vido pour une per-
sonne et quune seconde personne souhaite aussi regarder cette vido,
SUJET DEXPOS La CNIL
Prsenter la Commission nationale de linforma-
tique et des liberts.
ManuelDowek.book Page 149 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
150
lentreprise peut, en thorie, donner cette vido gratuitement la seconde
personne, car, une vido tant un bien non rival, cela ne cote rien de plus
lentreprise de laisser une seconde personne en profiter galement.
Ce raisonnement mne cependant un paradoxe : pourquoi le premier
client paierait-il la vido, sil sait quil lui suffit dattendre que quelquun
dautre la paie pour tre le second ? Au cours de lhistoire, les producteurs
de biens non rivaux ont imagin diffrentes manires de rpondre cette
question.
Imiter le march des biens rivaux, cest--dire empcher les per-
sonnes qui ne le paient pas de consommer un bien, mme si cela ne
coterait rien de plus de les laisser le consommer. Ainsi laccs cer-
taines chanes de tlvision est interdit aux personnes qui ne paient
pas un abonnement, mme si laisser ces personnes regarder ces
chanes ne coterait rien de plus.
Faire payer chacun ce quil est prt payer pour ce bien. Cest par
exemple le cas de logiciels qui sont payants pour les entreprises, mais
beaucoup moins chers pour les particuliers, voire gratuits pour les
tudiants.
Faire payer chacun ce quil souhaite payer. Cest le cas de certaines
radios dans le monde, qui sont gratuites mais rappellent frquem-
ment lantenne que, si on ne leur envoie pas un chque de temps en
temps, elles finiront par fermer.
changer ce bien, non contre de largent, mais contre un bien dont
tout le monde dispose : du temps et de lattention. Cest la rponse
des chanes de tlvision ou des sites web qui sont gratuits, mais qui
demandent leurs consommateurs daccorder un peu de temps et
dattention des publicits.
Distribuer un bien gratuitement, car cela cre de la demande pour un
autre bien, rival cette fois-ci. Ainsi, certaines entreprises distribuent
un logiciel gratuitement, mais font payer les cours pour apprendre
sen servir.
Faire payer tout le monde, consommateur ou non, cest par exemple
le cas des chanes de tlvision publiques, qui sont payes par un
impt spcial. Cest galement le cas du service des pompiers qui est
pay par les impts.
Une dernire rponse est celles dentreprises qui dveloppent un logiciel
pour leur besoins propres et qui ensuite laissent tout le monde en pro-
fiter et aussi amliorer ce logiciel, ce dont elles bnficient en retour.
Plusieurs de ces rponses mnent donc distribuer gratuitement des
biens non rivaux, en particulier de linformation, ce quil est impossible
de faire avec des pommes, des sacs de charbons ou les services dun jardi-
nier qui, avant davoir un prix, ont un cot.
ManuelDowek.book Page 150 Monday, July 9, 2012 4:58 PM
11 Structurer linformation
Groupe Eyrolles, 2012
151
ALLER PLUS LOIN Les bases de donnes
Pour grer de grandes quantits de donnes, par
exemple lensemble des rservations de billets de train
ou davion que doit grer une compagnie ferroviaire ou
arienne, il nest pas possible dutiliser une simple struc-
ture arborescente ou base de liens hypertextes. On
doit utiliser des outils plus sophistiqus : un systme de
gestion de bases de donnes et un langage de manipula-
tion de donnes, comme le langage SQL.
Le rpertoire que nous avons construit ci-avant peut
tre dfini comme un ensemble fini de couples forms
dun nom et dun numro de tlphone
R = {(nom = Alice ; tel = 0606060606),
(nom = Bob ; tel = 0606060607),
(nom = Charles ; tel = 0606060608),
(nom = Djamel ; tel = 0606060609),
(nom = tienne ; tel = 0606060610),
(nom = Frdrique ; tel = 0606060611),
(nom = Guillaume ; tel = 0606060612),
(nom = Hector ; tel = 0606060613),
(nom = Isabelle ; tel = 0606060614),
(nom = Jrme ; tel = 0606060615)}
Un tel ensemble de couples, de triplets ou, plus gnra-
lement, de n-uplets, sappelle une relation et un
ensemble de relations sappelle une base de donnes.
Par exemple, si Alice, Bob, Charles, Djamel, tienne, Frd-
rique, Guillaume, Hector, Isabelle et Jrme sont des musi-
ciens, outre la relation ci-avant qui indique le numro de
tlphone de chacun, on peut dfinir une autre relation
qui indique les instruments dont chacun joue.
I = {(nom = Alice ; instrument = alto),
(nom = Bob ; instrument = contrebasse),
(nom = Charles ; instrument = cor),
(nom = Charles ; instrument = trompette),
(nom = Djamel ; instrument = piano),
(nom = tienne ; instrument = xylophone),
(nom = Frdrique ; instrument = harpe),
(nom = Guillaume ; instrument = basson),
(nom = Hector ; instrument = basson),
(nom = Hector ; instrument = contrebasson),
(nom = Isabelle ; instrument = hautbois),
(nom = Isabelle ; instrument = clarinette),
(nom = Jrme ; instrument = violon)}
et une autre qui indique la famille de chaque instrument
F = {(instrument = violon ; famille = cordes),
(instrument = hautbois ; famille = bois),
(instrument = clarinette ; famille = bois),
(instrument = xylophone ; famille = percussions), }
Lensemble de ces trois relations constitue une base de
donnes.
Un systme de gestion de bases de donnes est un systme
qui permet de crer de telles relations, dajouter ou de
retirer des n-uplets dans une relation et de rechercher
des n-uplets. Pour cela, on formule des requtes dans un
langage de gestion de donnes.
Par exemple, on peut formuler la requte de chercher
les instruments dont joue Hector, en cherchant les cou-
ples de la relation I dont la composante nom est Hector :
(nom = Hector ; instrument = basson)
(nom = Hector ; instrument = contrebasson)
On peut de mme chercher les joueurs de basson, en cher-
chant les couples de la relation I dont la composante ins-
trument est basson. On trouvera alors deux couples
(nom = Guillaume ; instrument = basson)
(nom = Hector ; instrument = basson)
On peut aussi fabriquer, partir des relations R et I, une
nouvelle relation qui est un ensemble de triplets forms
dun nom, dun numro de tlphone et dun instru-
ment. On appelle cela la jointure des relations R et I et il
est possible de chercher dedans comme dans les rela-
tions simples ; par exemple, on peut chercher ceux des
triplets de cette jointure dont la composante instrument
est basson. On obtiendra ainsi deux triplets
(nom = Guillaume ; tel = 0606060612 ; instrument = basson)
(nom = Hector ; tel = 0606060613 ; instrument = basson)
ce qui est linformation dont on a besoin quand on
cherche remplacer un bassoniste.
Quand on utilise un systme de gestion de bases de don-
nes, on exprime donc, dans un langage de haut niveau,
des requtes dont lexcution consulte et modifie des
fichiers. Toutefois, il nest plus ncessaire de connatre la
forme exacte de ces fichiers, car on ny accde plus que par
lintermdiaire du systme de gestion de bases de donnes.
ManuelDowek.book Page 151 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
152
ALLER PLUS LOIN Transformer, stocker et transmettre des informations
Lalgorithme de laddition en base deux (voir le chapitre 18) illustre une
manire dutiliser les ordinateurs pour transformer des informations :
les informations 10 et 11 sont transformes en 101. Ce chapitre illustre
quant lui une autre manire dutiliser des ordinateurs, non pour trans-
former des informations, mais pour les stocker et les retrouver plus tard.
Une troisime utilisation des ordinateurs consiste transmettre des
informations dun endroit un autre.
Les ordinateurs ont essentiellement t invents pour transformer des
informations. Le stockage et la transmission sont venus plus tard et ont
apport avec eux de nouveaux problmes et de nouveaux algorithmes,
par exemple pour interroger les bases de donnes ou pour mettre jour
des tables de routage (voir le chapitre 16).
Ai-je bien compris ?
Quelle est la diffrence entre une donne persistante et une donne non persistante ?
Quels sont les diffrents moyens dorganiser les informations ?
Que signifie le mot hypermnsie ?
ManuelDowek.book Page 152 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
12
Compresser,
corriger,
chiffrer
CHAPITRE AVANC
Ronald Rivest (1947-), Adi Shamir
(1952-) et Len Adleman (1945-) ont
conu, en 1978, une mthode de chif-
frement, la mthode RSA, fonde sur
lutilisation de deux cls : une cl
prive et une cl publique. La
mthode la plus rapide connue ce
jour pour retrouver la cl prive
partir de la cl publique est la dcom-
position dun nombre entier en un
produit de facteurs premiers, calcul
qui demande un temps trs long,
quand le nombre factoriser dpasse
quelques milliers de chiffres binaires.
Zhqm, zmgm, zmfm. ( Jules Csar, 47 av. J.-C.)
Nous voyons maintenant comment modifier lexpression
des donnes dans le but dconomiser de lespace, de corriger
des erreurs ou de les protger. Pour cela, nous utilisons
des formats beaucoup plus sophistiqus que ceux vus
aux chapitres 8 et 9.
Pour la compression, nous expliquons comment dfinir un
dictionnaire des mots utiliss et les coder selon leur frquence.
Pour dtecter et corriger les erreurs, nous expliquons comment
utiliser la redondance dinformations et exploiter des bits de
contrle de cohrence. Pour le chiffrement, nous expliquons
les mthodes cl et introduisons la notion de cl publique cl
prive.
ManuelDowek.book Page 153 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
154
Pour reprsenter des informations, par exemple un texte, sous la forme
dune suite de 0 et de 1, nous avons prsent les formats standards,
comme ASCII ou UTF-8 (voir le chapitre 8). Il est galement possible
dutiliser un format particulier pour rendre la suite de bits exprimant ces
informations moins volumineuse, ou intelligible mme en cas derreurs
de transmissions, ou au contraire inintelligible, sauf pour son destina-
taire. Un tel format sappelle un code.
Compresser
La phrase je pense, donc je suis. peut se reprsenter en ASCII par la
suite 106, 101, 32, 112, 101, 110, 115, 101, 44, 32, 100, 111, 110, 99,
32, 106, 101, 32, 115, 117, 105, 115, 46 (voir le chapitre 8). Chacun de
ces nombres est exprim sur 8 bits. Il faut donc 23 8 = 184 bits pour
reprsenter cette phrase en entier.
Toutefois, seuls 13 symboles sont utiliss dans cette phrase : le c , le
d , le e , le i , le j , le n , le o , le p , le s , le u puis
lespace, la virgule et le point. On peut donc modifier le code, en repr-
sentant chaque symbole sur 4 bits et il ne faut alors plus que
23 4 = 92 bits pour reprsenter cette phrase.
On peut faire encore mieux. Le mot je suivi dun espace est rpt
deux fois dans la phrase ; on peut donc reprsenter chaque symbole sur
4 bits, en convenant, de plus, que le mot entier je suivi dun espace
est reprsent galement par une suite de 4 bits. Il suffit dsormais de
19 4 = 76 bits.
Cette ide est la base des mthodes de compression par dictionnaire. Un
dictionnaire est une fonction qui associe des suites de bits non pas des
symboles isols, mais des suites de symboles. La suite de bits associe
par un dictionnaire une suite de symboles est appele sa rfrence. Rem-
placer, dans un texte, chaque suite de symboles par sa rfrence exprime
donc ce texte en binaire, et remplacer chaque rfrence par la suite
laquelle elle est associe permet de retrouver le texte original. En asso-
ciant une rfrence aux suites longues et rptes dans le texte original,
on obtient une suite de bits plus courte que si on avait exprim le texte
en binaire, caractre par caractre.
On peut encore amliorer le rsultat en tirant parti des diffrences de fr-
quence dapparition des symboles et suites de symboles. En effet, dans la
phrase je pense, donc je suis. , le s est utilis 3 fois, le n , lespace, le
T Compresser des informations
On appelle compresser des informations le fait
de les exprimer sous la forme dune suite de bits,
avec un code choisi pour rendre cette suite aussi
courte que possible.
ALLER PLUS LOIN
Joindre le dictionnaire au message
Un dictionnaire tant construit sur mesure pour
chaque message, il faut ladjoindre au message
pour rendre la lecture de ce dernier possible. Ce
cot est cependant vite amorti quand le mes-
sage est long.
ManuelDowek.book Page 154 Monday, July 9, 2012 4:58 PM
12 Compresser, corriger, chiffrer
Groupe Eyrolles, 2012
155
e et la squence de symboles je sont utiliss 2 fois chacun, tandis que
le c , le d , le i , le o , le p , le u , la virgule et le point sont
utiliss 1 fois seulement. On peut donc rduire encore la taille du message
en utilisant des rfrences plus courtes pour les suites les plus frquentes et
plus longues pour les suites les plus rares, par exemple :
s : 000
c : 00100
d : 00101
i : 00110
o : 00111
e : 010
je : 011
p : 1000
u : 1001
, : 1010
. : 1011
n : 110
: 111
Ainsi, la phrase je pense, donc je suis. se reprsente par la suite de
69 bits suivante : 0111000010110000010101011100101001111100010
01110110001001001100001011. Un code qui utilise ainsi des rfrences
de longueurs diffrentes est appel un code de Huffman.
Quand une suite de bits reprsente un texte en ASCII, la dcouper en
symboles est facile, puisque chaque symbole est reprsent sur huit bits.
En revanche, quand les symboles sont reprsents par des rfrences de
longueurs diffrentes, la tche est plus ardue. Par exemple, en Morse, o
la lettre e se code par . et la lettre i par .. , la suite .. peut
ou bien reprsenter le message i ou bien le message ee . On dit que
le code de la lettre e est un prfixe de celui de la lettre i , car cest le
dbut du code de la lettre i . Le code Morse est donc ambigu et il est
ncessaire dutiliser un sparateur pour lever cette ambigut : .. pour
i , et . / . pour ee , ce qui a linconvnient dallonger la reprsen-
tation du texte, alors quon cherche prcisment la raccourcir.
Cependant, avec le code ci-avant, on peut se passer de sparateurs, car
aucun symbole na pour rfrence un prfixe de la rfrence dun autre
symbole. Ainsi, quand on dcode la suite 0111000010110000
01010101110010100111110001001110110001001001100001011 par
exemple, aucun symbole nayant pour rfrence 0, 01, 0111 ou 01110, le
ManuelDowek.book Page 155 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
156
premier symbole cod ne peut tre que je dont la rfrence est 011.
Une fois ce premier symbole dcod, on peut enlever sa rfrence de la
suite de bits dcoder et dcoder le symbole suivant : aucun symbole
nayant pour rfrence 1, 10, 100 ou 10000, le deuxime symbole ne peut
tre que p , dont la rfrence est 1000, et ainsi de suite.
Exercice 12.1
Un indicatif tlphonique international est un indicatif que lon doit ajouter
devant un numro de tlphone, quand on appelle ce numro depuis un
autre pays. Lindicatif de la France est 33, celui de la Chine est 86, celui des
tats-Unis 1, celui de Monaco 377, etc. Expliquer pourquoi le code dun pays
nest jamais un prfixe du code dun autre pays.
Lutilisation de dictionnaires et de rfrences de longueurs diffrentes
sont les deux ides la base des algorithmes de compression les plus cou-
rants, comme ZIP utilis par le logiciel gzip.
Exercice 12.2 (avec corrig)
Crer un fichier a.txt form de la lettre a rpte mille fois et un fichier
alea.txt form de mille lettres minuscules tires au hasard. Compresser ces
deux fichiers avec le programme gzip. Comparer les tailles des fichiers.
Le programme suivant affiche mille lettres tires au hasard.
SAVOIR-FAIRE Utiliser un logiciel de compression
Il est judicieux de compresser un fichier quand :
ce fichier est de taille importante,
il nest pas dj dans un format compress, comme MP3,
il comporte beaucoup de rptitions, comme une image avec de grandes zones unies,
on na pas besoin dy accder souvent,
on doit stocker ce fichier dans un espace limit ou le transmettre travers un rseau
faible dbit.
On peut, par exemple, utiliser le logiciel gzip, distribu avec Linux. On compresse un
fichier fichier.txt avec la commande gzip fichier.txt ; le fichier fichier.txt est
remplac par le fichier fichier.txt.gz, que lon dcompresse avec la commande
gunzip fichier.txt.gz.
for (i = 1; i <= 1000; i = i + 1) {
System.out.print(Isn.asciiString ((int)
Math.floor(Math.random() * 26 + 97)));}
ls -l a.txt
1001
ls -l alea.txt
1001
ManuelDowek.book Page 156 Monday, July 9, 2012 4:58 PM
12 Compresser, corriger, chiffrer
Groupe Eyrolles, 2012
157
Les deux fichiers a.txt et alea.txt ont la mme taille : 1 001 octets. En
revanche, le premier se compresse en un fichier de 36 octets et le second en un
fichier de 652 octets.
Exercice 12.3
Crer deux fichiers PGM, contenant des images de mme taille, lune unie et
lautre alatoire. Compresser ces deux fichiers avec le programme gzip et
comparer les tailles des fichiers.
Exercice 12.4
On veut dterminer le type de fichiers textes sur lequel la mthode ZIP est la
plus efficace.
La compression ZIP est-elle importante ou non sur un fichier contenant :
un texte littraire,
un extrait dannuaire tlphonique,
des caractres taps au hasard,
la liste des publicits diffuses sur une chane de tlvision pendant une
journe,
un fichier trs court : quelques caractres seulement.
Crer ou rcuprer sur le Web de tels fichiers et tester ses prdictions
laide dun logiciel de compression, par exemple gzip.
Compresser avec perte
Les techniques de compression des informations prsentes ci-avant
sont sans perte dinformations : en dcompressant les informations com-
presses, on retrouve exactement les informations originales. Il existe
dautres techniques de compression dites avec perte dinformations : au
prix dune infime diffrence entre les informations originales et les infor-
mations compresses puis dcompresses, on arrive un codage moins
volumineux encore.
Un exemple simple est celui dune image entirement blanche, lexcep-
tion dun pixel noir. Cette image peut tre approxime par une image
entirement blanche : lil nu, la diffrence est invisible et cette
gzip a.txt
gzip alea.txt
ls -l a.txt.gz
36
ls -l alea.txt.gz
652
ManuelDowek.book Page 157 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
158
seconde image se laisse beaucoup mieux compresser. Cette ide est uti-
lise dans les algorithmes de compression usuels comme JPG pour les
images ou MP3 pour les sons.
Exercice 12.5
En utilisant le logiciel Gimp, ouvrir une image au format PNG, puis lenregis-
trer au format JPG en qualit de 40% (avec Enregistrer sous). Ouvrir les deux
images et les comparer lil nu. Voit-on des diffrences ? Ouvrir ensuite en
tant que calques les deux images au format JPG et PNG. Dans le mode de cal-
ques, par dfaut rgl Normal, choisir maintenant le mode Diffrence, qui
compare les deux images en affichant la valeur absolue de la diffrence de la
valeur de chaque pixel dune image et de lautre. Quobserve-t-on ? Sachant
que PNG est un format de compression dimage sans perte et que JPG est un
format de compression avec perte, que peut-on en dduire ? Effectuer la
mme manipulation en comparant limage au format PNG et limage au
format JPG avec une qualit 20, puis une qualit 90. Observer comment la
taille du fichier JPG varie et comment la diffrence avec limage au format
PNG augmente ou diminue.
Exercice 12.6
Un exemple courant de compression des informations est lutilisation de la
moyenne pour compresser la suite de notes dun lve au cours dun trimestre.
Cette compression est-elle avec ou sans perte ? Quels sont les avantages et
inconvnients de cette mthode ? Proposer des mthodes de compression
alternatives qui attnuent ces inconvnients.
Corriger
Les rseaux transportent de grandes quantits dinformations (des cen-
taines de traoctets par seconde) et les mmoires, DVD, BluRay, disques
durs, mmoire flash, permettent souvent de stocker des traoctets. Avec
de telles quantits dinformations, il est invitable que se produisent
quelques erreurs dues au bruit sur la ligne de transmission, des rayures
dusure sur un disque ou des composants lectroniques dfaillants.
Cest pourquoi des algorithmes pour dtecter et corriger ces erreurs ont
t invents.
Une mthode simple pour dtecter et corriger une erreur dans une suite de
bits est dy introduire une forme de redondance, en rptant chacun des bits
plusieurs fois. Ainsi, au lieu de transmettre sur un rseau la suite de bits
10110110, on transmet la suite de bits 111000111111000111111000, o
chaque bit est rpt trois fois. Pour retrouver le message original, il suffit
de lire les bits reus trois par trois, en remplaant les triplets 000 par des 0
et les triplets 111 par des 1. Si lun des triplets reu nest ni 111 ni 000, par
exemple si cest 010 ou 001, on peut tre certain quune erreur sest glisse.
ManuelDowek.book Page 158 Monday, July 9, 2012 4:58 PM
12 Compresser, corriger, chiffrer
Groupe Eyrolles, 2012
159
On peut mme corriger lerreur : les 0 tant majoritaires, le triplet original
tait sans doute 000, et lon peut interprter le triplet 010 ou 001 par 0. Ce
code permet donc de dtecter et corriger toutes les erreurs, condition
quil y ait au plus une erreur par triplet. En revanche, si plusieurs erreurs
sont commises sur le mme triplet, elles peuvent passer inaperues ou tre
mal corriges. Cette mthode fonctionne donc bien, mais elle est coteuse
car la longueur du message est triple.
Dans certains cas, dtecter les erreurs sans les corriger est suffisant. Par
exemple, quand on transmet un message sur un rseau, la machine qui
reoit le message a souvent la possibilit de le redemander celle qui la
envoy, sil est erron. Une manire peu coteuse pour dtecter des
erreurs dans une suite de bits transmise est dajouter un bit de contrle
tous les 100 bits transmis, indiquant si le nombre de 1 dans ce paquet de
100 bits est pair (0) ou impair (1). La longueur des messages est ainsi
augmente de 1 % seulement. Si une erreur se produit lors de la trans-
mission des 101 bits, cest--dire si un 0 est remplac par un 1, ou un 1
par un 0, la parit du nombre de 1 est change et lerreur est dtecte.
En revanche, si deux erreurs se produisent dans la mme suite de
101 bits, elles passeront inaperues.
Dans dautres cas, il est ncessaire de corriger les erreurs. Par exemple,
quand on lit un DVD et que lon dtecte une erreur, on veut pouvoir la
corriger au vol et non demander au spectateur daller acheter un autre
DVD pour voir la fin du film. Une mthode de correction des erreurs
moins coteuse que le triplement des bits dcrit ci-avant consiste ajouter
seulement 20 bits de contrle tous les 100 bits, de la manire suivante : on
organise le paquet de 100 bits en un tableau de 10 lignes sur 10 colonnes
et on ajoute un bit de contrle par ligne et un bit de contrle par colonne,
soit 20 bits au total. Ce bit indique simplement si le nombre de 1 dans la
ligne ou la colonne est pair ou impair. Quand on reoit le message, si on
dtecte une erreur dans la ligne l et une erreur dans la colonne c, on sait
que le bit erron est celui qui se trouve dans le tableau la ligne l et la
colonne c ; il suffit, pour corriger le message, de remplacer ce bit par un 1
si cest un 0 ou par un 0 si cest un 1. Si on dtecte une erreur dans une
ligne, mais aucune erreur dans les colonnes, ou le contraire, cest que
lerreur porte sur le bit de contrle lui-mme et il ny a donc rien corriger
dans le message. Cette mthode demande donc dallonger le message de
20 % et elle permet de corriger toutes les erreurs condition quune erreur
au plus se produise dans chaque suite de 120 bits.
T Code correcteur derreurs
On appelle code correcteur derreurs un code
qui permet de retrouver les informations codes
mme en cas derreurs de transmission, de lecture
ou dcriture.
ALLER PLUS LOIN Longueur des suites
Plutt que des suites de 100 bits, on peut
prendre des suites de 10 bits ou de 1 000 bits.
Plus la suite est longue, plus la mthode est co-
nome, mais plus la probabilit de voir deux
erreurs se produire dans la mme suite, et donc
passer inaperues, est leve.
ManuelDowek.book Page 159 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
160
Exercice 12.7
On utilise la mthode dcrite prcdemment pour transmettre 16 bits. Par
exemple, pour transmettre le message 0011010111010111 on construit le
tableau :
et on transmet la suite 0011010111010111 0011 1100.
De combien de bits de contrle a-t-on besoin ?
Montrer que si on reoit le message 00?10?0111010?11 001?1100, o les ?
reprsentent des bits inintelligibles, il est possible de reconstituer entirement
les donnes qui ont t envoyes, y compris les bits de contrle.
Est-il possible de reconstituer le message original si on reoit la squence
suivante : 0??10?0111010?11001?1100 ?
Montrer que le message suivant : 101001111001001000010100, transmis sui-
vant la mme mthode, est incohrent. Expliquer cette incohrence. Comment
y remdier ?
Chiffrer
Une mthode pour protger les informations contre les actions dune
personne malveillante qui veut y accder alors quelles ne lui sont pas
destines consiste les chiffrer.
Cette ide de chiffrement est ancienne puisquon sait que Jules Csar
avait dj mis au point un algorithme pour transmettre des ordres ses
armes de manire secrte. Pour cela, il utilisait le code de Csar, qui con-
sistait remplacer chaque lettre dun message par celle situe trois lettres
plus loin dans lalphabet : les a taient replacs par des d , les b
par des e , etc. Ainsi Veni, vidi, vici se chiffrait en Zhqm, zmgm,
zmfm attention, il ny a pas de j , de u , ni de w en latin.
Cette mthode nest en fait pas trs bonne. Dune part, une fois quon la
connat, on peut dchiffrer tous les messages trs simplement. Dautre
part, mme si on ne connat pas la correspondance entre les lettres, celle-
ci est facile deviner, car la frquence des lettres, dans une langue
donne, est peu prs constante dun texte un autre. Ainsi, si le mes-
Colonne de contrle
0 0 1 1 0
0 1 0 1 0
1 1 0 1 1
0 1 1 1 1
Ligne de contrle 1 1 0 0
T Sret et scurit
Dans la section prcdente, nous avons prsent
des mthodes qui permettent de protger les infor-
mations contre des erreurs accidentelles. Cela
sappelle augmenter la sret des informa-
tions, cest--dire la protger des erreurs involon-
taires, telles les erreurs de transmission.
linverse, on cherche dans cette section aug-
menter la scurit des informations, cest--
dire la protger contre laction de personnes
malveillantes.
T Chiffrer
On appelle chiffrer des informations le fait de les
exprimer sous la forme dune suite de bits, avec un
code choisi pour rendre cette suite aussi inintelli-
gible que possible, sauf pour son destinataire.
ManuelDowek.book Page 160 Monday, July 9, 2012 4:58 PM
12 Compresser, corriger, chiffrer
Groupe Eyrolles, 2012
161
sage est en franais, il suffit de remarquer que la lettre h est la plus
frquente dans les messages chiffrs pour deviner que cette lettre est le
code de la lettre e , lettre la plus frquente en franais.
Des mthodes plus robustes ont donc t dveloppes. Une delles est la
mthode du masque jetable, dans laquelle les deux interlocuteurs se mettent
daccord, avant dchanger un message, sur une cl qui dfinit les bits du
message que lexpditeur laissera identiques et ceux quil inversera, cest--
dire remplacera par un 1 si cest un 0 ou par un 0 si cest un 1. Par
exemple, pour changer un message long de huit bits, les interlocuteurs se
mettent daccord sur le fait que lexpditeur le chiffrera en inversant le pre-
mier, le deuxime, le troisime, le septime et le huitime bit et en laissant
les autres inchangs. Ainsi le message 01101101 sera chiffr en 10001110.
Le rcepteur du message, connaissant lui aussi la cl, naura qu inverser
les mmes bits pour retrouver le message original : 01101101.
La cl qui indique quels bits laisser en ltat et quels bits inverser est elle-
mme exprime par une suite de bits : 0 signifiant quon laisse le bit
inchang et 1 indiquant quon linverse. Ainsi, la cl ci-avant sexprime par
la suite de bits : 11100011. Une cl, dans cette mthode, sappelle aussi un
masque. Chiffrer le message consiste effectuer un ou exclusif, bit bit,
entre le message et le masque. En effet, effectuer un ou exclusif entre un
bit du message et un 0 du masque laisse ce bit inchang (0 oux 0 = 0,
1 oux 0 = 1) et effectuer un ou exclusif entre un bit du message et un 1 du
masque inverse ce bit (0 oux 1 = 1, 1 oux 1 = 0). Cette mme opration
permet de retrouver le message original partir du message chiffr.
Cette mthode a t employe par les diplomates et les services secrets
depuis le dbut du XX
e
sicle, mais elle prsente plusieurs inconvnients.
Le premier est que le masque doit avoir la mme longueur que le message
lui-mme, il doit tre compltement alatoire et il ne doit jamais tre ruti-
lis, do le nom de masque jetable. Cette mthode demande donc de fabri-
quer des masques alatoires de trs grande taille, ce qui est plus difficile quil
ny parat. Un second problme est que ce masque doit tre secrtement
chang entre les interlocuteurs, avant la transmission du message, ce qui
est difficile. Si une personne malveillante arrive intercepter un masque au
cours de cet change, elle pourra dchiffrer les messages changs.
Cela a men la conception de mthodes alternatives qui ne reposent
pas sur lchange pralable dune cl secrte entre les interlocuteurs : les
mthodes cl publique cl prive.
Une mtaphore aide saisir le principe de ces mthodes : deux per-
sonnes, lexpditeur et le destinataire, souhaitent changer un message
confidentiel, mais elles nont pas la possibilit de se mettre daccord au
pralable sur une cl secrte. Une possibilit est que le destinataire
envoie par poste lexpditeur un cadenas ouvert dont il garde la cl.
ManuelDowek.book Page 161 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
162
Lexpditeur met son message dans une bote, quil ferme avec le cadenas
reu, et envoie cette bote au destinataire, qui na plus qu ouvrir le
cadenas avec la cl quil a garde. aucun moment, il ne sest spar de
la cl, si bien que ni le facteur, ni personne lexception du destinataire,
na le moyen douvrir la bote. Le message reste donc confidentiel, si lon
est certain que le cadenas utilis est bien celui du destinataire.
Le fait de pouvoir fermer un cadenas sans avoir la cl qui permet de louvrir
est ce qui permet cette mthode de fonctionner. Les mthodes cl
publique cl prive reposent sur un mcanisme similaire : la possibilit de
chiffrer un message sans disposer de la cl qui permet de le dchiffrer.
Une telle mthode recourt deux cls : une cl publique, diffuse tous
par le destinataire pour le chiffrement des messages, et une cl prive,
quil garde secrte, permettant de les dchiffrer. On peut schmatiser ce
mcanisme ainsi :
La mthode cl publique cl prive la plus utilise est la mthode
RSA, qui doit son nom celui de ses inventeurs : Rivest, Shamir et
Adleman. Dans cette mthode, la cl prive est formes de trois nom-
bres, d, e et n tels que pour tout entier w infrieur n, (w
e
% n)
d
% n = w,
o lopration % est le reste de la division euclidienne. La cl publique
correspondante est forme des nombres e et n uniquement.
Un message transmettre est dabord exprim sous la forme dune suite
de bits, que lon interprte comme un nombre entier w, infrieur n.
Lexpditeur le chiffre en w = w
e
% n, puis envoie ce message chiffr w
au destinataire, qui le dchiffre en calculant w
d
% n, qui est donc gal
(w
e
% n)
d
% n, cest--dire w, le message original. Pour chiffrer un
message, lexpditeur na pas besoin de connatre la cl prive, car le
nombre d nest utilis que dans la phase de dchiffrement.
Si une personne malveillante a accs aux nombres e et n et un message
chiffr w, elle peut essayer de dduire d de e et n ou directement trouver un
nombre w tel que w
e
%n = w. Lun et lautre de ces calculs sont possibles,
mais ils sont trs longs, pour peu que e et n soient assez grands. Les mthodes
les plus rapides que lon connaisse aujourdhui demandent plusieurs annes
de calcul, quand n est de lordre de quelques milliers de chiffres binaires.
Le destinataire : Lexpditeur :
envoie la cl publique
chiffre son message avec cette cl publique
envoie le message chiffr
reoit le message chiffr
et le dchiffre avec la cl prive
ManuelDowek.book Page 162 Monday, July 9, 2012 4:58 PM
12 Compresser, corriger, chiffrer
Groupe Eyrolles, 2012
163
Les mthodes cl publique cl prive sont donc, en thorie, dun niveau
de scurit infrieur aux mthodes cls secrtes : quand on connat la
mthode de chiffrement et un message chiffr w, on peut, en thorie,
essayer de chiffrer tous les messages w possibles, jusqu en trouver un qui
se code en w. Toutefois, cela demande en pratique un temps de calcul
norme. Cest donc un inconvnient ngligeable cot de lavantage que
prsente le fait de ne pas avoir besoin dchanger secrtement une cl.
ALLER PLUS LOIN Construire une cl RSA
Pour construire une cl RSA, il suffit de choisir deux
nombres premiers et distincts p et q, par exemple
p = 3017642249 et q = 6644055791. On choisit ensuite un
nombre d premier avec (p - 1) (q - 1), par exemple
d = 2596516757 et un nombre e tel que (e d) %((p -
1) (q - 1)) = 1, par exemple e = 35661169403325998333.
On pose ensuite n = pq, dans cet exemple
n = 20049383459634713959. La cl prive est forme des
nombres, d, e et n et la cl publique des nombres e et n
uniquement.
On dmontre alors que pour tout entier w infrieur n,
(w
e
%n)
d
%n = w. Pour cela, on montre que w
ed
w est
un multiple de p, en utilisant le petit thorme de
Fermat : si p est un nombre premier et w un nombre qui
nest pas un multiple de p alors w
p-1
%p = 1. La
dmonstration ne demande que quelques lignes. On
montre de mme que w
ed
w est un multiple de q.
Comme p et q sont deux nombres premiers et diffrents,
w
ed
w est un multiple de n = pq. Donc w
ed
%n = w,
cest--dire (w
e
%n)
d
%n = w.
La mthode connue la plus rapide pour dchiffrer un
message, quand on ne connat pas la cl prive, consiste
la dduire de la cl publique en factorisant le
nombre n en un produit de deux nombres premiers, on
obtient ainsi p et q, donc (p - 1) (q - 1), puis en connais-
sant (p - 1) (q - 1) et e, on peut retrouver d. Toutefois,
factoriser un nombre de quelques milliers de chiffres
binaires demande plusieurs annes de calcul.
ALLER PLUS LOIN Authentifier
Les mthodes cl publique cl prive permettent
aussi une autorit dauthentifier un utilisateur, cest--
dire de vrifier son identit. Pour cela, il lui suffit de
dtenir la cl publique de la personne authentifier et
de vrifier quelle dtient bien sa cl prive en lui fai-
sant dcoder un message.
On voit donc ici que seul un utilisateur qui dtient la cl
prive peut dchiffrer le message de test, ce qui garantit
lauthentification, si on fait lhypothse que la cl
publique utilise est bien celle de lutilisateur, et non
celle dun imposteur.
Lutilisateur : Lautorit :
dtient la cl prive ; dtient la cl publique ;
demande tre
authentifi ;

fabrique un message ;
chiffre ce message
avec la cl publique ;
envoie le message ;
dchiffre le message
avec la cl prive ;
envoie le message
de test dcod ;
vrifie si le message de test
a t dchiffr.
ManuelDowek.book Page 163 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
164
Exercice 12.8
Utiliser la mthode du masque jetable pour transmettre un nombre
4 chiffres son voisin.
Exercice 12.9
Que se passerait-il si on dcouvrait un algorithme rapide pour factoriser un
nombre entier en un produit de nombres premiers ?
Exercice 12.10
Pour retirer de largent avec une carte de retrait, on doit entrer un code secret
compris entre 0000 et 9999 et la carte est avale au bout de trois erreurs :
quelle est la probabilit de russir utiliser une carte sans en avoir le code ? Et
si on pouvait, au bout de deux essais, aller essayer la carte dans un autre
distributeur ?
Exercice 12.11
Pour retirer de largent avec une carte de retrait, on doit entrer un code secret
compris entre 0000 et 9999. On suppose que lon peut essayer autant de codes
que lon veut, mais avec un dlai de 1 s entre le premier et le deuxime essai,
10 s entre le deuxime et le troisime, 100 s entre le troisime et le quatrime,
etc. Au bout de combien de temps est-on sr de pouvoir trouver le code ?
Quel est le temps moyen pour le trouver ? Cette mthode est utilise pour
protger les serveurs contre les attaques par des logiciels qui testent tous les
mots de passe possibles pour sauthentifier.
Exercice 12.12
Expliquer la mthode dauthentification prsente dans lencadr, avec la
mtaphore du cadenas, qui fait office de cl publique, et sa cl prive.
Exercice 12.13
Dans un univers imaginaire, Acha est la seule personne savoir factoriser
lexpression x
2
+ a x + b, mais tout le monde sait dvelopper lexpression (x -
u) (x - v). Imaginer une mthode qui permet Acha de recevoir dune autre
personne des messages chiffrs. Cette mthode permet-elle Acha denvoyer
des messages chiffrs ? Permet-elle lauthentification dAcha ou des autres
personnes de ce monde imaginaire ?
Ai-je bien compris ?
Quest-ce que compresser des informations ?
Quest-ce quun code correcteur derreurs ?
Quest-ce que chiffrer des informations ?
ManuelDowek.book Page 164 Monday, July 9, 2012 4:58 PM
TROISIME PARTIE
Machines
Dans cette troisime partie, nous voyons que derrire les
informations, il y a toujours des objets matriels : ordinateurs,
rseaux, robots, etc. Les premiers ingrdients de ces machines sont
des portes boolennes (chapitre 13) qui ralisent les fonctions
boolennes vues au chapitre 10. Ces portes demandent tre
compltes par dautres circuits, comme les mmoires et les
horloges, qui introduisent une dimension temporelle (chapitre 14).
Nous dcouvrons comment fonctionnent ces machines que nous
utilisons tous les jours (chapitre 15). Nous verrons que les rseaux,
comme les oignons, sorganisent en couches (chapitre 16*). Et nous
dcouvrons enfin les entrailles des robots, que nous apprenons
commander (chapitre 17*).
ManuelDowek.book Page 165 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 166 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
13
Les portes
boolennes
Frances Allen (1932-) est une pion-
nire de la paralllisation automa-
tique des programmes, cest--dire de
la transformation de programmes
destins tre excuts sur un ordi-
nateur squentiel contenant un
unique processeur en des pro-
grammes destins tre utiliss sur
un ordinateur parallle contenant
plusieurs processeurs. Elle est aussi
lorigine de nouvelles mthodes, fon-
des sur la thorie des graphes, pour
optimiser les programmes. Elle a reu
le prix Turing en 2006 pour ces tra-
vaux.
Au commencement tait le transistor,
puis nous crmes les portes boolennes
et, la fin de la journe, les ordinateurs.
Dans ce chapitre, nous voyons de quoi sont faits les ordinateurs
lchelle microscopique. Nous partons du transistor et
construisons successivement des circuits non et ou qui vont
nous permettre ensuite de construire les circuits de toutes les
fonctions boolennes, comme nous lavons vu au chapitre 10.
ManuelDowek.book Page 167 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
168
Nous connaissons des algorithmes depuis plus de quatre mille ans, pour-
tant nous navons pas cherch les exprimer dans des langages de pro-
grammation avant le milieu du XX
e
sicle. Cest en effet seulement ce
moment que les progrs de llectronique nous ont permis de construire
les premiers ordinateurs. La construction de ces machines a donc eu un
effet important sur la manire dont nous concevons aujourdhui les
notions dalgorithme, de langage et dinformation.
Le circuit NON
Comme beaucoup de systmes complexes, un ordinateur peut se dcrire
de nombreuses chelles. lchelle la plus petite, un ordinateur est un
assemblage de transistors. Un transistor est un circuit lectronique trois
fils appels le drain, la source et la grille. La rsistance entre le drain et la
source est ou bien trs petite ou bien trs grande en fonction de la ten-
sion applique entre la grille et la source. Quand cette tension est inf-
rieure un certain seuil, cette rsistance est trs grande, on dit que le
transistor est bloqu ; quand la tension est suprieure ce seuil, la rsis-
tance est trs petite, on dit que le transistor est passant. Avec un tran-
sistor, une rsistance et un gnrateur dont la tension est suprieure au
seuil de basculement du transistor, on peut construire le circuit .
Si on applique entre le point A et le point O une tension infrieure au seuil
de basculement du transistor, celui-ci est bloqu et le circuit est quivalent
au circuit , si bien que la tension entre les points B et O est gale la
tension dalimentation. Elle est donc suprieure au seuil de basculement.
Si, en revanche, on applique entre les points A et O une tension suprieure
au seuil de basculement du transistor, celui-ci est passant et le circuit est
quivalent au circuit , si bien que la tension entre les points B et O est
nulle. Elle est donc infrieure au seuil de basculement.
ALLER PLUS LOIN
Les circuits CMOS
Dans ce livre nous utilisons un seul type de tran-
sistors appels N-Mos. On construit aujourd'hui
plus souvent des circuits qui utilisent deux types
de transistors N-Mos et P-Mos, afin de mini-
miser la consommation d'lectricit et la pro-
duction de chaleur.

ManuelDowek.book Page 168 Monday, July 9, 2012 4:58 PM
13 Les portes boolennes
Groupe Eyrolles, 2012
169
Si on dcide quune tension infrieure au seuil de basculement reprsente
le bit 0 et quune tension suprieure ce seuil reprsente le bit 1, les deux
remarques prcdentes se reformulent ainsi : si on donne au circuit le
bit 0 en A, il donne le bit 1 en B ; si on lui donne le bit 1 en A, il donne
le bit 0 en B. Autrement dit, ce circuit calcule une fonction boolenne :
la fonction non.
Le circuit OU
Le circuit est construit selon les mmes principes, mais il a deux
entres A et B.
Si on donne aux deux entres A et B le bit 0, les deux transistors dans la
partie gauche du circuit sont bloqus, si bien que la tension entre les
points C et O est gale la tension dalimentation, suprieure au seuil de
basculement. Le transistor de droite est donc passant et la tension entre
les points D et O est nulle ; autrement dit le point D est dans ltat 0.
Si on donne lune ou lautre des entres A et B le bit 1, au moins lun
des deux transistors dans la partie gauche du circuit est passant, si bien
que la tension entre les points C et O est nulle. Le transistor de droite est
donc bloqu et la tension entre D et O est gale la tension dalimenta-
tion. Le point D est par consquent dans ltat 1.
La table de ce circuit est donc la suivante (voir ci-contre) o lon recon-
nat la table de la fonction ou.
On peut schmatiser ces circuits de manire plus succincte en rempla-
ant le morceau de dessin reprsentant le transistor et la rsistance enca-
drs dans la figure par un simple rectangle () et en remplaant de
mme le morceau de dessin reprsentant les trois transistors et les deux
rsistances encadrs dans la figure par un rectangle ().

A B D
0 0 0
0 1 1
1 0 1
1 1 1
ManuelDowek.book Page 169 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
170
On arrive ainsi une reprsentation, un autre niveau, du mme circuit.
Quelques autres portes
boolennes
Les circuits non et ou sappellent des portes boolennes ou parfois des portes
logiques.
Dans ce chapitre et le suivant, on constitue petit petit une bote outils
de circuits rutilisables pour concevoir des circuits plus sophistiqus. Les
portes non et ou sont les deux premiers lments de cette bote outils.
Bien souvent, quand on reprsente un circuit, on ne dessine pas le
gnrateur : il est implicite que chaque porte est alimente. On obtient
alors une troisime manire de reprsenter les circuits o le circuit est
reprsent comme sur le schma .


ManuelDowek.book Page 170 Monday, July 9, 2012 4:58 PM
13 Les portes boolennes
Groupe Eyrolles, 2012
171
Exercice 13.1 (avec corrig)
Quelle est la table du circuit suivant ?
Si on donne lune ou lautre des entres A et B le bit 1, au moins lun des
deux transistors dans la partie gauche du circuit est passant, si bien que le
point C est dans ltat 0. Sinon le point C est dans ltat 1.
La table de ce circuit est donc la suivante (voir ci-contre).
Il sagit de la table de la fonction boolenne qui A et B associe non (A ou B).
Exercice 13.2 (avec corrig)
Quelle est la table du circuit suivant ? Est-ce la table dune fonction boolenne
connue ?

A B C
0 0 1
0 1 0
1 0 0
1 1 0
ManuelDowek.book Page 171 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
172
La table de ce circuit est :
Cest celle de la fonction boolenne et.
Exercice 13.3
Construire un circuit ralisant la fonction boolenne ou exclusif, vue au
chapitre 10.
En plus des portes ou et non, on a dsormais dans sa bote outils les
portes et et oux :
Exercice 13.4 (avec corrig)
Construire un circuit ralisant la fonction multiplexeur vue au chapitre 10.
La fonction multiplexeur peut se dfinir par mux (A, B, C) = (non (A) et B)
ou (A et C). Un circuit, parmi dautres, ralisant cette fonction est donc :
On peut dsormais utiliser directement le circuit suivant, dont lunique sortie
transmet la valeur de B ou de C selon la valeur de A :
A B C
0 0 0
0 1 0
1 0 0
1 1 1
ManuelDowek.book Page 172 Monday, July 9, 2012 4:58 PM
13 Les portes boolennes
Groupe Eyrolles, 2012
173
Exercice 13.5 (avec corrig)
Construire le circuit ralisant le calcul de la fonction Cout dfinie par la table :
Quelle est cette fonction ?
On utilise la mthode de dcomposition par multiplexage (voir le chapitre 10).
La fonction Cout (Cin, A, B) scrit mux (Cin, g (A, B), g (A, B)), avec g (A, B) et
g (A, B) dfinies par les tables ci-contre :
On reconnat les tables des fonctions et et ou, respectivement. Si bien que
Cout (A, B , Cin) = mux (Cin, A et B, A ou B).
Un circuit calculant cette fonction est donc :
Cette fonction est la fonction chiffre des deuzaines de A + B + Cin, qui sert au
calcul de la retenue dans lalgorithme de laddition (voir le chapitre 18). Ce cir-
cuit porte le nom de Carry out (retenue sortante).
Exercice 13.6
Construire un circuit ralisant les oprations calculant la fonction chiffre des
units de A + B + Cin (voir le chapitre 18). Construire un circuit additionneur
un bit qui prend en entre deux nombres de un bit et donne en sortie leur
somme, sur deux bits.
Construire un circuit quatre entres et trois sorties, qui ajoute deux nombres
exprims sur deux bits.
Construire un circuit seize entres et neuf sorties qui ajoute deux nombres
binaires de huit bits.
A B Cin Cout
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1
g (A, B) g (A, B)
A B g A B g'
0 0 0 0 0 0
0 1 0 0 1 1
1 0 0 1 0 1
1 1 1 1 1 1
ManuelDowek.book Page 173 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
174
Exercice 13.7
Construire un circuit 9 entres A
0
A
7
et D et 8 sorties B
0
B
7
telles que :
lorsque D = 0, B
i
= A
i
pour i compris entre 0 et 7,
lorsque D = 1, B
i
= A
i-1
pour i compris entre 1 et 7 et B
0
= 0.
Quand D = 1, ce circuit ralise un dcalage gauche dun nombre exprim en
binaire sur huit bits, ce qui correspond la multiplication par 2 de ce nombre.
Dans cette multiplication, le chiffre le plus gauche, A
7
, est oubli afin de
faire tenir le rsultat sur huit bits.
Exercice 13.8
Construire un circuit 11 entres A
0
A
7
et D
0
D
2
et 8 sorties B
0
B
7
telles que B
i
= A
i-d
pour i entre d et 7 et B
i
= 0 pour i entre 0 et (d - 1), o d est
le nombre entre 0 et 7 reprsent en binaire par D
0
D
2
. Ce circuit ralise un
dcalage gauche de d bits dun nombre binaire de huit bits, ce qui corres-
pond la multiplication par 2
d
. Ce circuit est un composant important dun cir-
cuit ralisant une multiplication binaire.
lissue de ce chapitre, on dispose donc, parmi dautres, des circuits
boolens suivants dans sa bote outils :
les portes boolennes non, ou, et et oux,
le multiplexeur mux,
des additionneurs de nombres de diffrentes tailles,
des multiplieurs par 2 et par 2
d
.
ALLER PLUS LOIN Penser les systmes complexes
Au cours de ce chapitre, nous sommes partis dune
manire de dcrire des circuits forms de transistors et
de rsistances pour, peu peu, faire merger une autre
manire de dcrire certains de ces circuits, sous la forme
dassemblages de portes boolennes. Comme chaque
porte est constitue de plusieurs composants lectroni-
ques, cette description sous la forme dun assemblage
de portes boolennes est une description plus grande
chelle que celle sous forme de transistors et de rsis-
tances. Une question se pose alors : peut-on concevoir
des circuits en assemblant des portes boolennes et en
ignorant compltement la manire dont ces portes sont
ralises avec des transistors ?
Cette question demande une rponse nuance : com-
prendre la fois lchelle des portes boolennes et celle
des transistors permet parfois de raliser des circuits plus
petits, donc moins chers et plus rapides. Par exemple, si
on veut construire un circuit qui ralise lopration boo-
lenne qui A et B associe non (A ou B) et si lon sait uni-
quement associer des portes boolennes, on construira
le circuit suivant
qui, in fine, utilise quatre transistors, trois pour la porte
ou et un pour la porte non. Si, en revanche, on sait aussi
comment ces portes sont construites avec des transis-
tors, on peut remarquer que le circuit
qui ne comporte que deux transistors, convient. Rai-
sonner une petite chelle permet donc dconomiser
deux transistors. Il est souvent utile, quand on raisonne
une chelle donne, de faire une incursion lchelle
infrieure ou lchelle suprieure.
ManuelDowek.book Page 174 Monday, July 9, 2012 4:58 PM
13 Les portes boolennes
Groupe Eyrolles, 2012
175
Cela dit, il y a aussi des avantages construire des cir-
cuits avec des portes boolennes en ignorant, ou en fei-
gnant dignorer, les chelles infrieures. Par exemple, les
portes boolennes sont aujourdhui fabriques avec des
transistors, mais par le pass, elles ont t fabriques
avec dautres composants : des relais, des tubes vide,
etc. et il est possible que, dans le futur, elles soient rali-
ses avec dautres composants, aujourdhui non encore
invents. Raisonner lchelle des portes boolennes,
sans prendre en compte la manire dont elles sont fabri-
ques, permet de conserver la mme organisation des
circuits lchelle des portes, mme quand la manire
dont ces portes sont fabriques change.
De plus, il est illusoire desprer penser simultanment
un systme aussi complexe quun ordinateur toutes les
chelles. Sil est donc, bien entendu, utile davoir une
culture gnrale qui donne une ide de la manire dont
un ordinateur se dcrit toutes les chelles, il est aussi
souvent ncessaire de savoir penser une chelle
unique, en ignorant, ou en feignant dignorer, la
manire dont les composants que lon assemble sont
fabriqus. Ainsi, aux chapitres 14 et 15, on construira
des circuits de plus en plus labors en rutilisant les cir-
cuits prcdents comme de nouveaux composants.
ALLER PLUS LOIN Qui a invent lordinateur ?
Contrairement la pnicilline, il est trs difficile de dire
qui a invent lordinateur.
Sans remonter aux machines calculer du XVII
e
sicle de
Wilhelm Schickard, Blaise Pascal, Gottfried Wilhelm
Leibniz, etc., ou la machine analytique imagine au
XIX
e
sicle par Charles Babbage, lapparition de lordi-
nateur a t prpare par une grande crativit dans le
domaine de la construction de machines la fin du
XIX
e
sicle et au dbut du XX
e
sicle, avec, par exemple,
la machine recensement de Herman Hollerith cons-
truite en 1889 ou lanalyseur diffrentiel de Harold
Locke Hazen et Vannevar Bush construit entre 1928 et
1931, qui taient dj des machines polyvalentes.
La notion duniversalit a t dfinie mathmatique-
ment en 1936 par Alonzo Church et Alan Turing et il
semble que la premire machine universelle ait t le
Z3, construite en 1941 par Konrad Zuse, mme si on ne
sen est rendu compte qua posteriori. La premire
machine lectronique utiliser le binaire semble avoir
t la machine Colossus, construite par Thomas Flowers
au cours de la seconde guerre mondiale, mais cette
machine ntait pas universelle. La premire machine
conue pour tre universelle fut sans doute lENIAC,
construite en 1946 par John Mauchly, Presper Eckert et
John Von Neumann. Pour certains nanmoins, ce ntait
pas encore un ordinateur, son programme ntant pas
enregistr dans la mmoire. La premire machine pro-
gramme enregistr a sans doute t la machine Baby,
construite Manchester en 1948 par Frederic Williams,
Tom Kilburn et Geoff Tootill.
Il semble donc difficile dattribuer linvention de lordi-
nateur un inventeur unique. Il y a plutt eu un foison-
nement dinnovations de la fin des annes trente au
dbut des annes cinquante qui, chacune sa manire,
ont contribu linvention de lordinateur.
Ai-je bien compris ?
Comment raliser une porte non avec des transistors ?
Comment raliser une porte ou avec des transistors ?
Est-il ncessaire de savoir raliser une porte non et une porte ou avec des transistors
pour les assembler en des circuits plus complexes ?
ManuelDowek.book Page 175 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 176 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
14
Le temps
et la mmoire
Otto Schmitt (1913-1998) est un
pionnier du gnie biomdical. En
1934, en tudiant la propagation de
linflux nerveux dans les nerfs des cal-
mars, il a compris quun circuit en
boucle ferme positive cest--dire
dans lequel la sortie est connecte
lentre, sans inversion de valeur
avait deux tats stables et pouvait
donc tre utilis pour mmoriser une
grandeur. En lectronique, une bas-
cule de Schmitt est une forme de cir-
cuit bistable, qui utilise cette ide de
boucle ferme positive.
Le temps est ce qui permet dviter de tout faire
en mme temps.
Dans ce chapitre, nous voyons comment les circuits
lectroniques prennent le temps en compte. Nous voyons
dabord comment fabriquer un circuit mmoire. Puis,
comment un circuit particulier, lhorloge, permet
de synchroniser tous les autres.
ManuelDowek.book Page 177 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
178
Les circuits que nous avons vus au chapitre 13, par exemple le circuit
illustr ci-contre, ont des entres (deux gauche sur la figure) et des sor-
ties (une droite sur la figure) et ltat des sorties est dtermin par celui
des entres. Dans cet exemple, la sortie est dans ltat 1 quand les deux
entres sont dans ltat 1 et elle est dans ltat 0 quand au moins lune
des entres est dans ltat 0. Ltat des sorties un instant donn dpend
de ltat des entres ce mme instant, mais pas de ltat des entres une
seconde ou une minute plus tt. Un tel circuit, qui ignore le temps,
sappelle un circuit combinatoire. Il y a, autour de nous, beaucoup de cir-
cuits combinatoires. Par exemple, une lampe est allume quand son
interrupteur est ferm et elle est teinte quand cet interrupteur est
ouvert ; ltat de la lampe dpend de la position de linterrupteur, mais
pas de la position de linterrupteur une seconde ou une minute plus tt.
Cependant, il y a aussi autour de nous des circuits moins amnsiques,
dont ltat un instant donn dpend non seulement de ltat de ses
entres cet instant, mais aussi de leur tat pass. Par exemple, quand
nous appuyons sur la touche 1 dune calculatrice, le chiffre 1 apparat sur
lcran, mais quand nous relchons cette touche, le chiffre 1 ne disparat
pas : ltat de lcran un instant donn dpend donc non seulement de
ltat du clavier ce mme instant, mais aussi de toute lhistoire du cla-
vier. Un tel circuit sappelle un circuit squentiel. Les ordinateurs sont,
bien entendu, des circuits squentiels car, comme nous lavons vu au
chapitre 1, lexcution dun programme modifie un tat, qui est une des-
cription abstraite de ltat de lordinateur et dpend donc de toutes les
instructions excutes dans le pass.
La mmoire
Le circuit squentiel le plus simple est le circuit mmoire un bit qui permet
de mmoriser un 0 ou un 1. Construire un tel circuit nest pas difficile,
mais il faut procder en plusieurs tapes. La premire est de construire un
circuit qui a deux tats stables, par exemple celui de la figure ci-contre.
Ce circuit a deux tats stables car :
Si la sortie A de la premire porte non est dans ltat 0, alors lentre
de la seconde porte non, qui est A galement, est aussi dans ltat 0 ;
par consquent, sa sortie B est dans ltat 1, donc lentre de la pre-
mire porte, qui est B galement, est dans ltat 1, ce qui participe
perptuer le fait que sa sortie A soit dans ltat 0.

ManuelDowek.book Page 178 Monday, July 9, 2012 4:58 PM


14 Le temps et la mmoire
Groupe Eyrolles, 2012
179
Si, en revanche, la sortie A de la premire porte non est dans ltat 1,
alors lentre de la seconde porte non, qui est A galement, est aussi
dans ltat 1 ; par consquent, sa sortie B est dans ltat 0, donc
lentre de la premire porte, qui est B galement, est dans ltat 0, ce
qui participe perptuer le fait que sa sortie A soit dans ltat 1.
Autrement dit, les deux tats stables de ce circuit sont :
A = 0 et B = 1,
A = 1 et B = 0.
En supprimant la sortie B et en ne gardant que la sortie A () on
obtient un circuit qui a deux tats stables. La sortie A vaut 0 dans le pre-
mier et 1 dans le second. On peut donc dire que ce circuit mmorise la
valeur 0 dans le premier cas et la valeur 1 dans le second. Ce circuit est
donc un circuit mmoire.
Toutefois, ce circuit ayant une sortie, mais pas dentre, il nest pas pos-
sible de changer son tat et donc la valeur mmorise.
Pour ce faire, il faut construire un circuit , un peu plus complexe, en
ajoutant deux portes ou.
Tant que les entres X et Y sont dans ltat 0, tout se passe comme dans
le circuit prcdent. En effet, si la sortie A de la premire porte non est

ALLER PLUS LOIN La rupture de symtrie


Il est difficile de prdire ltat dans lequel se retrouve un
circuit mmoire un bit quand on le met sous tension. Il
se trouve dabord, pendant une courte dure, dans un
tat instable dans lequel les deux sorties A et B sont
dans ltat 0. Lentre des deux portes non est alors dans
ltat 0. Rapidement, lune delles produit un tat 1 en
sortie, un peu avant lautre, si bien que lautre, ayant
dsormais son entre dans ltat 1, garde sa sortie dans
ltat 0. Cest donc une diffrence de vitesse entre les
portes non qui dtermine ltat du circuit quand on le
met sous tension. Cette diffrence de vitesse est elle-
mme due une infime diffrence de temprature, de
longueur de fil, de puret des matriaux utiliss pour
construire les transistors, etc. Ce phnomne est un
exemple de rupture de symtrie. Dans le circuit, les points
A et B sont parfaitement symtriques, mais pour arriver
un tat ou un autre, il faut que cette symtrie soit
rompue. Les ruptures de symtrie sont frquentes en
physique. Par exemple, si on pose une balle de ping-
pong sur le sommet du filet, de manire parfaitement
symtrique, elle ne peut pas tomber dun cot ou de
lautre sans briser cette symtrie. Pourtant il est trs rare
quelle reste en quilibre au sommet du filet : elle finit
en gnral par tomber dun ct ou de lautre. Ici
encore, un souffle de vent, une petite secousse, ou une
imperfection dans la construction de la balle suffit
dcider de quel ct elle tombera.

ManuelDowek.book Page 179 Monday, July 9, 2012 4:58 PM


Troisime partie Machines
Groupe Eyrolles, 2012
180
dans ltat 0, alors le point D lentre de la seconde est dans ltat 0
galement, car 0 ou 0 = 0. Et si la sortie A est dans ltat 1, le point D est
dans ltat 1 galement, car 1 ou 0 = 1. Le point D est donc dans le
mme tat que la sortie A dans les deux cas. De mme, le point C
lentre de la premire porte non est dans le mme tat que B. Tout se
passe donc comme si les deux portes ou ntaient pas l.
En revanche, si pendant une courte dure on met lentre X dans ltat 1
tout en laissant lentre Y dans ltat 0, alors le point C passe dans ltat 1
quelle que soit la valeur de B car 1 ou 0 = 1 et 1 ou 1 = 1 ; la sortie A
passe donc dans ltat 0, le point D galement et le point B passe dans
ltat 1. On force donc le circuit se mettre dans ltat A = 0 et B = 1,
cest--dire mmoriser la valeur 0. Et quand lentre X sera revenue
la valeur 0, le circuit restera dans cet tat.
Au cours dtapes qui senchanent trs vite, ltat des points C, D, A et B
devient :
De mme, si pendant une courte dure, on met lentre Y dans ltat 1 tout
en laissant lentre X dans ltat 0, on force le circuit mmoriser la valeur 1.
Ce circuit mmorise donc une valeur 0 ou 1 et, en stimulant lentre X ou
lentre Y, on peut changer la valeur mmorise. Ce circuit sappelle une
bascule RS (Reset-Set) et on peut le reprsenter comme ci-contre.
la bote outils de circuits commence au chapitre 13, on peut donc
ajouter un premier circuit squentiel : la bascule RS.
On peut aller un peu plus loin et construire un troisime circuit qui
mmorise une valeur V quon lui fournit lorsquon stimule lentre S.
Exercice 14.1 (avec corrig)
Construire un circuit combinatoire deux entres V et S et deux sorties X
et Y tel que, si lentre S est dans ltat 0, alors X et Y sont dans ltat 0 et
si S est dans ltat 1, alors X est dans ltat non V et Y est dans ltat V.
Connecter ce circuit combinatoire avec la bascule RS ci-avant pour obtenir
un circuit qui :
quand S est dans ltat 0, ne change pas dtat et produit la valeur
mmorise sur la sortie A,
quand S est dans ltat 1 et V dans ltat 0, mmorise la valeur 0 et met
la sortie A dans ltat 0,
X Y C D A B
1 0
1 0 1
1 0 1 0
1 0 1 0 0
1 0 1 0 0 1
ManuelDowek.book Page 180 Monday, July 9, 2012 4:58 PM
14 Le temps et la mmoire
Groupe Eyrolles, 2012
181
quand S est dans ltat 1 et V dans ltat 1, mmorise la valeur 1 et met
la sortie A dans ltat 1.
Les tables des fonctions boolennes X et Y sont les suivantes :
o on reconnat les fonctions S et non (V) et S et V. Il suffit donc de cons-
truire les circuits correspondants.
On relie la sortie du circuit S et (non V) lentre X de la bascule RS et la
sortie du circuit S et V lentre Y de la bascule RS.
Ainsi, quand S est dans ltat 0, le circuit ne change pas dtat et quand S est
dans ltat 1, il mmorise la valeur V. On a donc enfin un vritable circuit
mmoire contrlable : mettre lentre S dans ltat 1 provoque la mmorisa-
tion de la valeur de lentre V. Cette valeur peut tre lue par la suite sur la
sortie A, jusqu ce que lon provoque la mmorisation dune nouvelle valeur.
Ce circuit sappelle un verrou D (D pour Donne ou Data).
Exercice 14.2
Quand on utilise plusieurs composants identiques dans un mme circuit, on
peut diffrencier leurs entres et sorties en leur donnant un numro : ainsi, si
lon a plusieurs verrous D, on appellera V
1
lentre V du premier, A
2
la sortie
du deuxime, etc.
On dfinit un circuit squentiel appel bascule D en reliant la sortie A
1
dun
premier verrou D avec lentre V
2
dun second verrou D, et en reliant
lentre S
1
du premier une porte non dont la sortie est raccorde
lentre S
2
du second.
Si lon considre ce circuit dans son intgralit, ses entres sont donc lentre V
1
du premier verrou D et une entre S unique qui alimente la fois S
1
directe-
ment et S
2
via la porte non. Sa sortie est la sortie A
2
du second verrou D.
Dessiner ce circuit.
Montrer que quand S est dans ltat 0, le second verrou met sa valeur jour,
mais pas le premier, et quand S est dans ltat 1, le premier verrou met sa
valeur jour, mais pas le second.
Ce circuit sappelle une bascule D.
S V X S V Y
0 0 0 0 0 0
0 1 0 0 1 0
1 0 1 1 0 0
1 1 0 1 1 1
Verrou D
Bascule D
ManuelDowek.book Page 181 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
182
Son intrt est que la valeur mmorise nest mise jour qu linstant prcis
o lentre S passe de ltat 1 ltat 0, alors quun simple verrou D laisse
passer les valeurs de V vers A tant que S reste 1. Il est ainsi plus facile de com-
mander lvolution de ce circuit dans le temps.
Exercice 14.3
On utilise un additionneur un bit (voir le chapitre 13) avec deux entres A et B
et deux sorties S et C, qui sont respectivement le chiffre des units et le chiffre
des deuzaines de A + B. On relie la sortie S de ladditionneur lentre V
1
dune premire bascule D, la sortie A
1
de cette bascule tant elle-mme relie
lentre A de ladditionneur. On relie galement la sortie C de ladditionneur
lentre V
2
dune deuxime bascule D. Enfin, on relie ensemble les entres S
1
et S
2
des deux bascules et on les alimente avec une entre commune S.
Dessiner ce circuit.
chaque fois que lentre S des bascules passe dans ltat 1 puis revient
ltat 0, les valeurs mmorises par les bascules D sont mises jour. Montrer
que le nouvel tat de la premire bascule est le chiffre des units de la somme
de son ancien tat et de lentre B. Montrer que le nouvel tat de la seconde
bascule est le chiffre des deuzaines de cette somme.
Exercice 14.4
En utilisant huit copies du circuit construit lexercice prcdent, construire un
compteur 8 bits comportant une entre I, tel que lentier 8 bits mmoris par
compteur soit augment dune unit chaque fois que lentre I passe dans
ltat 1 puis revient ltat 0.
Exercice 14.5
Modifier le circuit de lexercice prcdent de manire ajouter une entre R
telle que le nombre mmoris par ce compteur soit initialis 0 quand
lentre R est mise dans ltat 1.
Lhorloge
Quand on assemble des circuits squentiels qui interagissent les uns avec
les autres, on obtient un circuit asynchrone : ltat de chacun des circuits
volue dans le temps, en fonction de ltat des circuits auxquels il est
connect, mais de manire relativement dsordonne.
Beaucoup dinteractions que nous avons avec les autres sont asynchrones :
dans un grand magasin, par exemple, chaque client fait ses courses relati-
vement indpendamment des autres. Et quand plusieurs clients veulent
payer leurs courses en mme temps, il se forme une file dattente. De ce
fait, chaque client est peu prs sr quil finira par payer et sortir, mais il
na pas de garantie a priori sur le temps que cela prendra. linverse, un
petit nombre de nos interactions doivent tre synchrones : jouer dans un
orchestre demande non seulement de jouer toutes les notes de la partition
ManuelDowek.book Page 182 Monday, July 9, 2012 4:58 PM
14 Le temps et la mmoire
Groupe Eyrolles, 2012
183
dans un certain ordre, mais galement de les jouer un moment donn.
Les clients dun magasin peuvent faire leurs courses chacun son rythme,
mais les musiciens dun orchestre, les danseurs dune chorgraphie ou les
soldats qui marchent au pas, doivent agir dans une mme temporalit.
Une manire dobtenir cette synchronie est de confier lun des musi-
ciens, le chef dorchestre, le rle de battre la mesure.
En informatique, les machines de grande taille, par exemple les rseaux,
sont des machines asynchrones. Chaque utilisateur va son rythme et le
rseau finit par rpondre tout le monde, mais sans garantie du temps
que cela prendra. En revanche, les machines de petite taille, telles que les
processeurs, sont des machines synchrones. Cest pour cela quil y a dans
les ordinateurs un circuit, lhorloge, dont le rle est de battre la mesure
pour les autres circuits. Une horloge est simplement un circuit qui met
sur sa sortie un signal priodique, par exemple le signal suivant.
Chaque flche sur la figure marque le dbut dun cycle. Avec ce type
dhorloge, la sortie est 1 pendant la premire moiti du cycle et 0
pendant la seconde.
Chacun des circuits, en particulier les circuits mmoires, se synchronise
sur un signal dhorloge. Par exemple, si on connecte la sortie de lhorloge
sur lentre S dune bascule D, on obtient un circuit qui enregistre la
valeur de lentre V chaque cycle.
Exercice 14.6
Construire un circuit comportant un additionneur 8 bits, 16 entres et
9 sorties, dont chaque entre est relie la sortie A dun verrou D diffrent,
chaque sortie est relie lentre V dun verrou D diffrent, et dont toutes les
entres S de ces 25 verrous sont relies une horloge unique.
tablir un lien entre la frquence de lhorloge et le temps de propagation des
signaux lectriques portant les retenues des 8 additionneurs un bit composant
ladditionneur 8 bits.
Estimer le temps de propagation maximal par porte boolenne, suppos cons-
tant et uniforme, compatible avec une frquence de 1 GHz.
Exercice 14.7
Lorsque lon relie lentre S dune bascule D une horloge, montrer que la
sortie A se comporte comme lentre V, mais avec un cycle dhorloge de retard.
T Frquence dhorloge
La frquence dhorloge, qui est souvent indi-
que dans les caractristiques techniques des ordi-
nateurs, est le nombre de cycles par seconde. Par
exemple, quand la frquence dhorloge est 1 GHz,
la priode de lhorloge, cest--dire la longueur
dun cycle, est de 1 nanoseconde, un milliardime
de seconde.
ManuelDowek.book Page 183 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
184
ALLER PLUS LOIN La rversibilit
Le fonctionnement dun circuit squentiel est
dynamique : il se dcrit dans le temps. Comme chaque
fois que lon observe un phnomne dynamique, on
peut sinterroger sur sa rversibilit.
Par exemple, si on connat la position x et la vitesse v, un
instant t, dun point en mouvement rectiligne uniforme,
on peut prdire sa position et sa vitesse un instant t du
futur : sa position sera x = x + v (t - t) et sa vitesse sera
v = v. Rciproquement, si on connat sa position x et la
vitesse v linstant t, on peut aussi rtro-prdire sa
position et sa vitesse un instant t du pass : sa position
tait x = x - v (t - t) et sa vitesse tait v = v. La variation
de position et de vitesse dun point en mouvement recti-
ligne uniforme est un phnomne dit rversible.
En revanche, quand on mlange un litre de gaz la
temprature T
1
avec un litre de gaz la temprature T
2
,
on obtient deux litres de gaz la temprature
T = 2 T
1
T
2
/ (T
1
+ T
2
). Si on connat les tempratures T
1
et T
2
, on peut donc prdire la temprature T. En
revanche, si on connat la temprature T, il est impos-
sible de rtro-prdire les tempratures T
1
et T
2
: deux
litres de gaz 300 K peuvent avoir t obtenus en
mlangeant un litre 290 K et un litre 310.7 K, mais il
peuvent aussi avoir t obtenus en mlangeant un litre
280 K et un litre 323 K. Mlanger des gaz de temp-
ratures diffrentes est donc un phnomne dit irrver-
sible. Non seulement il est impossible de rejouer le film
en arrire et dobtenir les deux litres de gaz aux temp-
ratures T
1
et T
2
, mais il est de plus impossible de dfinir
ce que ces tempratures T
1
et T
2
doivent tre, puisquil y
a plusieurs solutions lquation 2 T
1
T
2
/ (T
1
+ T
2
) = T.
Les volutions des tats des circuits vues dans ce chapitre
sont des volutions irrversibles, comme le mlange de
deux volumes de gaz de tempratures diffrentes. Si
lentre V dun circuit mmoire est 0, au moment o lon
met son entre S 1, ce circuit enregistre la valeur 0. La
valeur prcdemment mmorise est irrmdiablement
dtruite. Il est donc impossible de rejouer le film lenvers
pour retrouver ltat initial du circuit, car les deux tats
initiaux possibles mnent au mme tat final.
La physique statistique et la thorie de linformation per-
mettent de mesurer le degr dirrversibilit de ces deux
phnomnes : la croissance de lentropie, ou la perte
dinformation, lors de la destruction dun bit dinforma-
tion est de 9,5 10
24
J/K et celle lors du mlange dun litre
dun gaz parfait monoatomique 10
5
Pa et 290 K avec un
litre de ce mme gaz cette mme pression et 310.7 K est
de 9,9 10
4
J/K, soit en comptant cette perte dinforma-
tion, non en J/K, mais en bits, 10
20
bits.
ALLER PLUS LOIN Transformation dnergie et production de chaleur
Un processeur consomme de llectricit et la trans-
forme essentiellement en chaleur. Llectricit con-
somme et la chaleur produite sont des facteurs
physiques limitant les performances des processeurs.
Le cot nergtique dun calcul a beaucoup diminu avec
le temps puisquon est pass dune production de calculs
denviron 400 calculs par kWh pour lENIAC, en 1946,
environ 1 million de milliards de calculs par kWh pour un
processeur actuel. Dans cette estimation, un calcul est
par exemple laddition de deux nombres entiers. Cepen-
dant, comme on fait beaucoup plus de calculs quen
1946, la quantit dlectricit consomme pour ce faire a
beaucoup augment pour arriver, en 2007, environ 1 %
de la production mondiale dlectricit. Cette estimation
ne tient compte que de lnergie transforme pour effec-
tuer les calculs et non de celle transforme pour fabri-
quer, transporter et recycler les machines utilises.
Les gros centres de serveurs de calcul ou de donnes ont
des besoins normes en lectricit et cherchent souvent
se rapprocher gographiquement des centrales lectri-
ques. Ils requirent de mme des systmes de climatisa-
tion de plus en plus sophistiqus, par exemple des
systmes de refroidissement qui utilisent de leau de mer.
Ai-je bien compris ?
Quelle est la diffrence entre un circuit combinatoire et un circuit squentiel ?
Quest-ce quune bascule RS ?
Quelle est la diffrence entre un circuit synchrone et un circuit asynchrone ?
ManuelDowek.book Page 184 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
15
Lorganisation
dun ordinateur
Dans les annes 1940, lUniversit
de Pennsylvanie, John von Neu-
mann (1903-1957) a conu, avec
Presper Eckert et John Mauchly, deux
des premiers ordinateurs : lENIAC,
puis lEDVAC. Ces ordinateurs taient
organiss selon larchitecture de von
Neumann, utilise dans la quasi-tota-
lit des ordinateurs conus depuis :
sparation du processeur et de la
mmoire, relis par un bus de com-
munication. LENIAC pesait vingt-sept
tonnes.
Pour fabriquer un ordinateur,
il suffit dun fer souder (ou presque).
Dans ce chapitre, nous voyons de quoi sont faits les ordinateurs
une chelle plus proche de la ntre et comment architecture
et langages sont lis. Nous dcrivons la manire dont sont
assembls le processeur de calcul, lorganisation de la mmoire
et les bus permettant la circulation des donnes. Nous voyons
comment programmer le processeur au moyen dun langage
machine simple et expliquons comment drouler une squence
dinstructions. Nous adjoignons enfin les priphriques
pour obtenir un ordinateur.
ManuelDowek.book Page 185 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
186
Aprs avoir dcrit le fonctionnement dun ordinateur lchelle du tran-
sistor puis de la porte boolenne, nous abordons, dans ce chapitre, une
troisime chelle de description, qui est celle qui va nous permettre de
vritablement en comprendre les principes dorganisation. Un ordina-
teur est principalement compos de deux grands circuits : le processeur et
la mmoire. Ces deux circuits sont relis entre eux par des fils qui consti-
tuent un ou plusieurs bus de communication, parmi lesquels un bus de don-
nes et un bus dadresses. Le processeur est compos de deux units.
Lunit de contrle lit en mmoire un programme et donne lunit de
calcul la squence des instructions effectuer. Le processeur dispose par
ailleurs de bus dentres et de sorties permettant daccder aux autres par-
ties de lordinateur, que lon nomme les priphriques. Cette organisation
gnrale, larchitecture de von Neumann, est tonnamment stable depuis
les annes quarante.
La mmoire est compose de plusieurs milliards de circuits mmoires un
bit. Ces circuits sont organiss en agrgats de huit, seize, trente-deux,
soixante-quatre bits, et parfois davantage, que lon appelle des cases
mmoires et qui peuvent donc mmoriser des mots de huit, seize, trente-
deux, soixante-quatre bits, etc. Le nombre de ces cases dfinit la taille de
la mmoire de lordinateur. Comme il faut distinguer ces cases les unes
des autres, on donne chacune un numro : son adresse. La mmoire
contient les donnes sur lesquelles on calcule et le programme qui dcrit le
calcul effectu, donn sous la forme dune squence dinstructions.
Le processeur, de son ct, na quun trs petit nombre de cases
mmoires, que lon appelle des registres. On peut imaginer, par exemple,
quil ne contient que deux registres, appels A et B. Les registres peuvent
contenir des donnes, mais aussi des adresses de cases mmoires.
ALLER PLUS LOIN
Taille de la mmoire
En gnral, on indique la taille de la mmoire en
prcisant le nombre doctets, cest--dire de
mots de huit bits, qui peuvent tre mmoriss.
Ainsi, une mmoire de 4 gigaoctets (binaires),
contient 4 2
30
8 = 34 359 738 368 circuits
mmoires un bit. Si la mmoire est organise en
mots de soixante-quatre bits, ces circuits sont
rpartis en 536 870 912 cases permettant de
mmoriser un mot chacune.
ALLER PLUS LOIN
Les processeurs 32 et 64 bits
Lorsque lon parle de processeurs 32 bits ou
64 bits, on fait rfrence la taille de ces regis-
tres.
ManuelDowek.book Page 186 Monday, July 9, 2012 4:58 PM
15 Lorganisation dun ordinateur
Groupe Eyrolles, 2012
187
Trois instructions
Pour changer des donnes avec la mmoire, le processeur utilise deux
procds qui permettent lun de transfrer ltat dun registre dans une case
mmoire et lautre de transfrer ltat dune case mmoire dans un registre.
Pour transfrer le contenu du registre A dans la case mmoire
dadresse n, le processeur met les diffrents fils qui composent le bus
dadresses dans un tat qui correspond lexpression en base deux du
nombre n et il met les diffrents fils qui composent le bus de donnes
dans un tat qui correspond au contenu du registre. Au signal dhorloge,
chaque case de la mmoire compare son propre numro au numro
arriv sur le bus dadresse ; seule la case numro n se reconnat et elle
met alors ses diffrentes entres S (voir le chapitre 14) dans ltat 1, de
manire enregistrer le mot arrivant sur le bus de donnes. Le procd
symtrique permet au processeur de rcuprer une valeur prcdemment
enregistre : les informations circulent toujours du processeur vers la
mmoire sur le bus dadresses, mais elles circulent dans lautre sens sur le
bus de donnes : cest la case n qui connecte sa sortie au bus de donnes
et cest le registre qui met ses entres S 1 de manire enregistrer le
mot qui arrive sur le bus de donnes.
Ces deux oprations sappellent le stockage (STA) et le chargement (LDA)
du contenu dune case mmoire dans le registre A (ST pour STore, LD
pour LoaD). Il y a bien entendu des oprations similaires pour le
registre B (STB et LDB).
Une autre opration que peut excuter le processeur est laddition des
contenus des registres A et B. Le rsultat de lopration peut tre stock
aussi bien dans le registre A (ADD A) que dans le registre B (ADD B). De
mme, DEC A dcrmente la valeur contenue dans le registre A, cest--dire
soustrait 1 la valeur contenue dans le registre A et stocke la valeur ainsi
obtenue dans le registre A et DEC B ralise le mme calcul sur la valeur
contenue dans le registre B.
Si, par exemple, le processeur effectue successivement les oprations ci-contre
et si, dans ltat initial, la case 7 de la mmoire contient le nombre 42, la
case 8 le nombre 68, la case 9 le nombre 47 et la case 10 le nombre 33,
lexcution des huit oprations a comme effet de :
LDA 7 charger le contenu de la case 7, soit 42, dans le registre A,
LDB 8 charger le contenu de la case 8, soit 68, dans le registre B,
ADD A additionner les contenus des registres A et B et mettre le
rsultat, 110, dans le registre A,
LDB 9 charger le contenu de la case 9, soit 47, dans le registre B,
LDA 7
LDB 8
ADD A
LDB 9
ADD A
LDB 10
ADD A
STA 11
ManuelDowek.book Page 187 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
188
ADD A additionner les contenus des registres A et B et mettre le
rsultat, 157, dans le registre A,
LDB 10 charger le contenu de la case 9, soit 33, dans le registre B,
ADD A additionner les contenus des registres A et B et mettre le
rsultat, 190, dans le registre A,
STA 11 stocker le contenu du registre A, soit 190, dans la case 11.
Au bout du compte, cette squence doprations additionne les quatre
nombres stocks dans les cases 7, 8, 9 et 10 de la mmoire et stocke le
rsultat dans la case 11.
Le langage machine
Un ordinateur doit tre capable dexcuter un programme. Il faut donc
un moyen dindiquer au processeur la squence des instructions quil doit
excuter ; par exemple, la squence LDA 7, LDB 8, ADD A, LDB 9, ADD A,
LDB 10, ADD A, STA 11. Dans les premires machines, des cartes perfores
ou un ruban perfor situ lextrieur de la machine indiquaient les op-
rations effectuer, comme les cartes dun orgue de Barbarie indiquent
les notes jouer lune aprs lautre. Puis cette ide a t abandonne au
profit dune autre : celle denregistrer le programme dans la mmoire
avec les donnes. Ainsi, on peut exprimer le programme prcdent en
binaire en dcidant par exemple que A scrit 0, B scrit 1 et les instruc-
tions LDA, LDB, STA, STB, ADD et DEC scrivent respectivement 0, 1, 2, 3, 4
et 5. Le programme de notre exemple scrit alors 0, 7, 1, 8, 4, 0, 1, 9,
4, 0, 1, 10, 4, 0, 2, 11, ce qui commence devenir assez difficile lire,
mme sil est facile de passer dune reprsentation lautre. On peut
ensuite stocker ce programme dans la mmoire, en commenant, par
exemple, la case 100 :
Il suffit maintenant dajouter au processeur un nouveau registre qui
dbute 100, le compteur de programme ou PC (program counter), et
chaque tape, le processeur :
charge le contenu des cases mmoires dadresses PC et PC + 1,
dcode le premier de ces nombres en une instruction (0 devient LDA,
1 LDB, etc.),
adresse
.. .. 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 .. ..
valeur
.. .. 0 7 1 8 4 0 1 9 4 0 1 10 4 0 2 11 .. ..
ManuelDowek.book Page 188 Monday, July 9, 2012 4:58 PM
15 Lorganisation dun ordinateur
Groupe Eyrolles, 2012
189
excute linstruction en question,
et ajoute 2 au registre PC.
Enregistrer les programmes en mmoire permet de faire trs simplement
des boucles et des tests. On ajoute aux instructions prcdentes une ins-
truction JMP (jump) telle que JMP n charge simplement le nombre n, ou
plutt le nombre n - 2 qui sera augment de 2 immdiatement aprs lex-
cution du JMP, dans le registre PC pour dtourner le programme de sa
route et le forcer continuer son excution ladresse n. De mme, lins-
truction JMPZ (jump if zero), qui effectue un saut si le contenu du registre A
est 0, permet de faire des tests. On ajoute enfin linstruction END, qui ter-
mine le programme. En langage machine, on suppose que JMP, JMPZ et END
scrivent respectivement 6, 7 et 8 et que END prend 0 comme argument
puisquil en faut un. Mais cet argument nest pas utilis.
Pour construire une boucle ou un test avec ces nouvelles instructions, il
faut tout dabord trouver une faon de traduire la condition du test ou la
condition darrt de la boucle par un test dgalit zro. Par exemple,
pour effectuer un test comme x == 2, on peut placer la valeur de x dans
le registre A, excuter deux fois linstruction DEC A et enfin tester si le
registre A contient 0. Ensuite, on crit les squences dinstructions qui
correspondent aux diffrentes branches du test ou au corps de la boucle,
et on utilise JMPZ et JMP pour diriger lexcution du programme dans
lune ou lautre de ces squences. Par exemple, un programme qui lit une
valeur x dans la case mmoire dadresse 11, puis recopie la case mmoire
dadresse 12 dans la case mmoire dadresse 20 si x vaut 2, ou la case
mmoire dadresse 13 dans la case mmoire dadresse 30 dans le cas con-
traire, peut scrire :
100 0 LDA 11 110 3 STB 30
101 11 111 30
102 5 DEC A 112 6 JMP 118
103 0 113 118
104 5 DEC A 114 1 LDB 12
105 0 115 12
106 7 JMPZ 114 116 3 STB 20
107 114 117 20
108 1 LDB 13 118 8 END
109 13 119 0
ALLER PLUS LOIN
Pourquoi sparer A et B pour ADD
et DEC mais pas pour LD et ST ?
Dans le langage machine que nous venons
dinventer, pour que le compteur de programme
fonctionne correctement, chaque instruction uti-
lise exactement deux cases mmoire : une pour
son nom et une pour son argument. Largument
des instructions ADD et DEC est le nom dun
registre. En revanche, comme les instructions de
chargement ont dj un argument (ladresse
mmoire o aller chercher la donne charger),
elle ne peuvent pas en avoir un second pour
indiquer le registre utilis. Cest pour cela que
lon a deux instructions LDA et LDB et de mme
deux instructions STA et STB.
ALLER PLUS LOIN
Calcul sur des structures de donnes
plus complexes
Les instructions que nous venons de prsenter
ne permettent daccder qu un nombre limit
de cases mmoire, dont les adresses sont les
constantes entires qui servent darguments aux
instructions LDA, STA, LDB et STB. Le calcul sur
des structures de donnes plus complexes,
comme des tableaux, ncessite dautres instruc-
tions pour accder une case mmoire dont
ladresse est elle-mme une donne, en particu-
lier le rsultat dun calcul. Les processeurs ont
bien dautres instructions encore : des opra-
tions boolennes, des oprations sur les nom-
bres entiers, des oprations sur les nombres
flottants, etc.
ManuelDowek.book Page 189 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
190
Exercice 15.1 (avec corrig)
crire une squence dinstructions qui multiplie par 5 le nombre contenu dans
la case mmoire dadresse 10 et stocke le rsultat dans la case mmoire
dadresse 11.
Pour multiplier par 5, on fait 4 additions, en accumulant le rsultat dans le
registre A. On note x le nombre rang ladresse 10.
La squence LDA 10, LDB 10, ADD A, ADD A, ADD A, ADD A, STA 11, scrit en
langage machine 0, 10, 1, 10, 4, 0, 4, 0, 4, 0, 4, 0, 2, 11. On la stocke par
exemple partir de ladresse 100 de la mmoire.
tat de la mmoire avant lexcution du programme :
tat de la mmoire aprs lexcution du programme :
Exercice 15.2
Expliquer ce que fait le programme suivant, crit en langage machine, en sup-
posant que le nombre x contenu dans la case mmoire dadresse 10 est stricte-
ment positif.
SAVOIR-FAIRE Savoir drouler lexcution dune squence dinstructions
Le principe est de suivre, instruction par instruction, lvolution du programme en
observant les effets sur les valeurs contenues dans les registres, y compris le compteur de
programme PC, et les valeurs contenues dans la mmoire, un peu comme on le ferait
pour ltat de lexcution dun programme crit en Java.
A B
LDA 10 x Charger dans A le nombre rang ladresse mmoire 10
LDB 10 x x Charger dans B le nombre rang ladresse mmoire 10
ADD A x+x x Additionner A et B, rsultat dans A
ADD A x+x+x x Additionner A et B, rsultat dans A
ADD A x+x+x+x x Additionner A et B, rsultat dans A
ADD A x+x+x+x+x x Additionner A et B, rsultat dans A
STA 11 x+x+x+x+x x Stocker le nombre contenu dans A ladresse mmoire 11
adresse
.. 10 11 .. .. 100 101 102 103 104 105 106 107 108 109 110 111 112 113 ..
valeur
.. x .. .. 0 10 1 10 4 0 4 0 4 0 4 0 2 11 ..
adresse
.. 10 11 .. .. 100 101 102 103 104 105 106 107 108 109 110 111 112 113 ..
valeur
.. x 5x .. .. 0 10 1 10 4 0 4 0 4 0 4 0 2 11 ..
adresse
.. 10 11 .. 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 ..
valeur
.. x y 0 10 1 10 7 112 5 0 4 1 6 104 3 11 8 0 ..
ManuelDowek.book Page 190 Monday, July 9, 2012 4:58 PM
15 Lorganisation dun ordinateur
Groupe Eyrolles, 2012
191
Exercice 15.3
crire un programme qui lit deux valeurs x et y contenues respectivement dans
les cases mmoires 11 et 12, calcule la diffrence y - x et stocke le rsultat
ladresse 13. On suppose que ces deux valeurs sont des nombres entiers positifs.
Complter ce programme pour quil stocke la valeur 0 ladresse 15 si x est
gal y, ou la valeur x sinon.
Exercice 15.4
crire un programme qui multiplie la valeur contenue la case mmoire 12
par celle contenue dans la case mmoire 13 et stocke le rsultat ladresse 14.
On suppose que ces valeurs sont des nombres entiers positifs.
Quel problme lcriture de ce programme pose-t-elle ? Quelle modification
du processeur permettrait de contourner ce problme et donc de simplifier le
programme ?
La compilation
Les premiers programmeurs crivaient des programmes en langage
machine qui ressemblaient LDA 7, LDB 8, ADD A, LDB 9, ADD A, LDB 10,
ADD A, STA 11, ou plus exactement 0, 7, 1, 8, 4, 0, 1, 9, 4, 0, 1, 10, 4, 0,
2, 11, ce qui tait trs fastidieux et offrait de nombreuses possibilits de
se tromper. On a alors cherch concevoir des langages dans lesquels ce
programme pouvait scrire :
ce qui a permis de dvelopper des programmes de manire plus rapide et
plus sre. Nanmoins, aujourdhui encore, les ordinateurs ne compren-
nent que les programmes de la forme 0, 7, 1, 8, 4, 0, 1, 9, 4, 0, 1, 10,
4, 0, 2, 11. Cest pourquoi quand on crit :
on doit ensuite utiliser un programme qui transforme les programmes crits
en langage volu en des programmes crits en langage machine : un com-
pilateur. Un programme existe donc toujours sous deux formes : le code
source crit en Java, C, etc. et le code compil crit en langage machine.
Le compilateur est un traducteur dun langage volu vers un langage
machine. Une manire simple de compiler un programme est de traduire
les instructions une une. Cependant, comme pour les circuits vus au
chapitre 13, le compilateur peut construire des programmes en langage
machine plus efficaces en se plaant aussi lchelle du langage machine.
Par exemple, le temps daccs une donne en mmoire peut tre une
centaine de fois suprieur au temps daccs un registre. Conserver une
e = a + b + c + d;
e = a + b + c + d;
ManuelDowek.book Page 191 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
192
valeur dans un registre entre deux instructions au lieu de la stocker pour
la recharger ensuite peut donc faire gagner beaucoup de temps de calcul.
Les priphriques
Outre un processeur, une mmoire, une horloge et des bus reliant le pro-
cesseur la mmoire, un ordinateur est galement constitu de
priphriques : crans, claviers, souris, disques, haut-parleurs, imprimantes,
scanners, cartes rseau, cls de mmoire flash, etc. qui permettent au pro-
cesseur dchanger des informations avec lextrieur : des tres humains,
travers par exemple lcran et le clavier, dautres ordinateurs, travers la
carte rseau, et des outils de stockage, par exemple des disques. On peut
grossirement classer les priphriques en priphriques dentre, qui per-
mettent au processeur de recevoir des informations de lextrieur, et pri-
phriques de sortie, qui lui permettent dmettre des informations vers
lextrieur. Toutefois, beaucoup de priphriques sont la fois des priph-
riques dentre et de sortie. Ainsi, un cran est a priori un priphrique de
sortie, mais un cran tactile est aussi un priphrique dentre.
Pour changer des informations avec les priphriques, le processeur pro-
cde dune manire trs similaire celle quil utilise pour changer des
informations avec la mmoire. Par exemple, on peut donner une adresse
chaque pixel dun cran noir et blanc, exactement comme on donne une
adresse chaque case de la mmoire ; stocker une valeur comprise entre 0
et 255 cette adresse, avec linstruction STA par exemple, aura pour effet
dallumer ce pixel lcran avec le niveau de gris correspondant. De mme
linstruction LDA permet de recevoir des informations dun priphrique de
sortie, par exemple la position de la souris. Selon les processeurs, ce sont les
instructions STA et LDA elles-mmes qui sont utilises, ou des instructions
voisines, spcialises pour la communication avec les priphriques.
Le systme dexploitation
La description des ordinateurs que lon a donne dans ce chapitre diffre
quelque peu de lexprience pratique quont tous ceux qui ont dj utilis un
ordinateur. Tout dabord, on saperoit que si on bouge la souris, le curseur
de souris bouge sur lcran, il semble donc y avoir un programme qui inter-
roge en permanence la souris pour connatre sa position et dessine un cur-
ManuelDowek.book Page 192 Monday, July 9, 2012 4:58 PM
15 Lorganisation dun ordinateur
Groupe Eyrolles, 2012
193
seur de souris lendroit correspondant de lcran. De mme, il est possible
dutiliser simultanment plusieurs programmes, alors que dans la descrip-
tion que nous avons donne, le processeur nen excute quun seul la fois.
Cela est d au fait que ds quon allume un ordinateur, un programme
spcial est lanc : le systme dexploitation. Ce programme, souvent gigan-
tesque, a plusieurs fonctions :
Il permet lexcution simultane de plusieurs programmes, selon le sys-
tme du temps partag : le systme dexploitation excute chacun des pro-
grammes tour de rle et pendant une courte dure, garantissant
chacun que ses donnes ne seront pas modifies par les autres ainsi,
mme si un programme croit utiliser les cases mmoire 1, 2 et 3, il se peut
quil utilise en fait les cases 4097, 4098 et 4099, car le systme dexploita-
tion a rserv les vritables cases 1, 2 et 3 pour un autre programme.
Il gre les priphriques ; ainsi, pour imprimer un caractre sur lcran,
il nest pas ncessaire dallumer chaque pixel lun aprs lautre, mais on
peut demander au systme dexploitation dafficher un A et celui-ci
traduira cette instruction en une suite dinstructions qui afficheront un
A pixel par pixel. La partie du systme dexploitation qui gre un
priphrique sappelle un pilote.
En particulier, il gre le disque, son dcoupage en fichiers, lattribu-
tion dun nom chaque fichier et leur organisation arborescente (voir
le chapitre 11).
Il gre aussi lcran, cest--dire son dcoupage en fentres, louver-
ture et la fermeture des fentres.
Dans certains systmes utiliss par plusieurs personnes, il gre
lauthentification de chaque utilisateur et les droits, en particulier de
lecture et dcriture des fichiers, associs chacun deux.
ALLER PLUS LOIN
Plusieurs systmes dexploitation
Il existe plusieurs systmes dexploitation : Unix,
Linux ou GNU/Linux, Windows, Mac OS, etc.
Toutefois, le dveloppement dun systme
dexploitation est une tche si coteuse en
temps, quil nexiste gure plus dune dizaine de
systmes dexploitation rellement utiliss.
ALLER PLUS LOIN Les ordinateurs parallles
Une manire de fabriquer des ordinateurs plus rapides
est de mettre dans un ordinateur plusieurs processeurs
qui calculent en parallle, cest--dire en mme temps.
Les ordinateurs qui ont plusieurs processeurs parallles
sont appels ordinateurs parallles ou multicurs. Cer-
tains algorithmes sont trs faciles parallliser : par
exemple pour augmenter la luminosit dune image en
niveaux de gris, il faut ajouter une constante chaque
pixel. Chaque pixel peut tre trait indpendamment
des autres et utiliser deux processeurs au lieu dun divise
le temps de calcul par deux. Toutefois, dautres algo-
rithmes sont plus difficiles parallliser.
La programmation des processeurs parallles est plus
difficile car, en plus dcrire des instructions, il faut pr-
voir sur quel processeur elles vont sexcuter.
Les processeurs peuvent se partager une mmoire ou
plusieurs. Si deux processeurs partagent la mme
mmoire et doivent se communiquer des donnes, il
faut sassurer que le premier ait bien fini de les calculer
et de les stocker en mmoire avant que le second ne les
lise. On dit que les deux processeurs doivent se synchro-
niser. Ils peuvent aussi avoir des mmoires diffrentes et
communiquer par un bus. Les processeurs peuvent fonc-
tionner sur la mme horloge ; on dit alors quils sont
synchrones. Ou bien chaque processeur peut avoir sa
propre horloge ; on dit quils sont asynchrones. Le paral-
llisme existe aussi lintrieur des processeurs, entre les
instructions du langage machine. Cette forme de paral-
llisme sappelle le paralllisme dinstructions.
ManuelDowek.book Page 193 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
194
ALLER PLUS LOIN La hirarchie mmoire
Il y a une vidente ressemblance entre les notions de
case de la mmoire dun ordinateur et de bote associe
une variable dans un tat de lexcution dun pro-
gramme. Toutefois, ces deux notions ne sont pas absolu-
ment identiques. Un programmeur peut faire comme si
une valeur stocke dans une bote de nom x tait
stocke au mme endroit de la mmoire dun bout
lautre de lexcution du programme. Cependant, cette
valeur peut en ralit changer de place. Elle peut tre
en mmoire, mais comme le systme dexploitation gre
plusieurs programmes en temps partag, il peut trs
bien attribuer la bote de nom x dabord une case de
la mmoire, puis une autre plus tard. Ce que le systme
dexploitation garantit est que, quoi quil se passe en
ralit, tout se passera de manire transparente pour le
programmeur, qui peut donc faire comme si le contenu
de cette bote tait toujours stock dans la mme case.
Si on utilise des processeurs parallles pour faire un
calcul, la valeur de la bote x peut tre dans la mmoire
dun processeur ou dun autre, voire dans plusieurs
mmoires en mme temps. On a vu aussi que la valeur
peut tre dans un registre au moment o elle est utilise
pour un calcul ou bien elle mme calcule si elle est le
rsultat dun autre calcul.
La ralit est encore un peu plus complexe car les pro-
cesseurs disposent de mmoires caches ou antmmoires.
Ce sont les mmoires L1 et L2 indiques dans les caract-
ristiques techniques des processeurs. Ces mmoires sont
daccs plus rapides que la mmoire ordinaire, mais
beaucoup moins grandes. Gnralement, laccs une
mmoire cache ne prend que quelques cycles dhorloge,
mais sa capacit est limite quelques kilooctets ou
mgaoctets. Pendant le calcul, la valeur de la bote x
peut aussi se trouver dans une de ces mmoires caches.
Un mcanisme matriel gre automatiquement ces deux
mmoires et les instructions du langage machine ne per-
mettent mme pas de choisir dutiliser lune ou lautre.
Toutefois, le principe retenir est que toute donne
rcemment utilise a de fortes chances dtre encore
dans un des caches. Donc viter de trop loigner les uti-
lisations dune mme variable dans un programme peut
faire gagner beaucoup de temps de calcul.
On a ici un nouvel exemple de la description dune
mme ralit diffrents niveaux dabstraction.
ALLER PLUS LOIN La distribution du code source dun logiciel
Certains auteurs et diteurs de programmes ne donnent
leurs utilisateurs que le code compil de leurs pro-
grammes. Ils peuvent ainsi garder leurs secrets de fabrica-
tion. Les usagers peuvent utiliser ces programmes, mais
ne peuvent pas comprendre comment ils fonctionnent.
Dautres, linverse, donnent leurs utilisateurs la fois
le code compil et le code source. Cela permet aux utili-
sateurs qui le souhaitent de comprendre comment le
programme est conu, de ladapter leurs propres
besoins si le programme ny rpond quimparfaitement,
ou de vrifier que le programme ne fait rien dindsi-
rable, par exemple quil ne contient pas despion qui
communique son insu des informations sur lutilisateur
lauteur du programme. Cela permet aussi aux utilisa-
teurs de contribuer lamlioration du programme, en
signalant des erreurs, en les corrigeant ou en ajoutant
des composants aux programmes.
Les partisans de la distribution du code source des logi-
ciels articulent leurs arguments sur deux plans : un plan
thique et philosophique et un plan scientifique et tech-
nique. Certains insistent sur limpratif moral de distri-
buer le code source de ses programmes, avec lobjectif
de diffuser tous des connaissances et de leur per-
mettre de se les approprier. Dautres insistent sur le fait
que permettre aux utilisateurs de contribuer aux logi-
ciels dvelopps en amliore la qualit. De fait, certains
logiciels tels les systmes dexploitation GNU/Linux sont
aujourdhui dvelopps par des milliers de contributeurs
de par le monde, ce qui serait impossible si le code
source ntait pas publi.
ManuelDowek.book Page 194 Monday, July 9, 2012 4:58 PM
15 Lorganisation dun ordinateur
Groupe Eyrolles, 2012
195
ALLER PLUS LOIN Des programmes auto-modifiants aux virus
Stocker le programme excuter dans la mmoire, avec
le reste des donnes, a permis de prendre conscience de
la possibilit pour un programme de se modifier lui-
mme, par une simple instruction STA, dans la partie de
la mmoire consacre au stockage du programme. Si
cette possibilit disparat dans les langages de program-
mation volus, elle est bien prsente dans les pro-
grammes directement crits en langage machine.
Cette possibilit de se dupliquer et de se transformer est
en particulier utilise par les virus informatiques. Un virus
est un programme qui est conu pour se dupliquer et se
propager dordinateur en ordinateur linsu de leurs
utilisateurs, par le rseau, ou tout autre support permet-
tant de transmettre de linformation : cl de mmoire
flash, CD-ROM, etc. Une fois install sur un ordinateur,
un virus peut espionner ses utilisateurs et communiquer
les informations collectes par le rseau. Il peut aussi
simplement utiliser la capacit de calcul de lordinateur
hte, par exemple pour envoyer des courriers en trs
grand nombre.
Ai-je bien compris ?
Quels sont les principaux circuits dun ordinateur ?
Quest-ce que le langage machine ?
Quest-ce que compiler un programme ?
ManuelDowek.book Page 195 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 196 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
16 Les rseaux
CHAPITRE AVANC
Vinton Cerf (1943-) et Robert Kahn
(1938-) ont invent, au dbut des
annes 1970, le protocole de trans-
mission de paquets de donnes IP
(Internet Protocol) et le protocole de
contrle de flux de donnes TCP
(Transmission Control Protocol). Il
sagit des deux principaux protocoles
du rseau Internet. Ils donnent ce
rseau sa fiabilit, sa robustesse en
cas de pannes ou de modifications et
sa capacit voluer. Cela a valu
leurs auteurs le surnom de pres
dInternet.
Les ordinateurs parlent aux ordinateurs.
Dans ce chapitre, nous voyons comment les ordinateurs
communiquent entre eux, et comment ces communications
se composent pour faire fonctionner le rseau Internet.
Ces mcanismes de communication de machine machine
sappellent des protocoles.
Les protocoles de la couche physique connectent les bus
des ordinateurs. Les protocoles de la couche lien organisent
un rseau local autour dun serveur et reprent les ordinateurs
par ladresse MAC de leur carte rseau. Les protocoles
de la couche rseau organisent les rseaux locaux de proche
en proche et reprent les ordinateurs par leur adresse IP.
Nous expliquons comment les informations sont achemines
au travers du rseau laide de routeurs.
ManuelDowek.book Page 197 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
198
Nous avons vu quun ordinateur pouvait se dcrire diffrentes chelles :
les transistors sassemblent en portes boolennes, qui sassemblent leur
tour en composants processeurs, mmoires, etc. qui sassemblent
leur tour en ordinateurs. Et nous pouvons continuer, car les ordinateurs
sassemblent leur tour en rseaux de diffrentes tailles : des rseaux les
plus simples, forms de deux ordinateurs relis par un cble ou par radio,
aux rseaux locaux connectant quelques ordinateurs entre eux les ordi-
nateurs dun lyce par exemple , qui sassemblent leur tour pour
former le plus grand des rseaux : Internet, lequel relie presque tous les
ordinateurs du monde.
Les protocoles
Si un programme P
A
, par exemple un logiciel de courrier lectronique, ex-
cut sur un ordinateur A, veut communiquer des informations un autre
programme P
B
, excut sur un ordinateur B, il sous-traite cette tche un
programme spcialis Q
A
, excut sur lordinateur A, qui met en uvre un
protocole. Ce programme Q
A
dialogue, suivant les spcifications de ce pro-
tocole, avec un programme homologue Q
B
excut sur lordinateur B, ce
qui permet ainsi la communication entre les programmes P
A
et P
B
.
En fait, le programme Q
A
sous-traite, son tour, certaines tches moins
sophistiques dautres programmes mettant en uvre dautres protocoles,
qui sous-traitent, de mme, certaines tches encore plus lmentaires
dautres protocoles, etc. On peut ainsi classer les protocoles en couches hi-
rarchiques, par le niveau de sophistication des tches quils excutent.
Ainsi, les informations envoyes par le programme de courrier lectro-
nique sont dabord confies un protocole de la couche application, qui
les confie un protocole de la couche transport, qui les confie un pro-
tocole de la couche rseau, qui les confie un protocole de la couche
lien, qui les confie un protocole de la couche physique, qui les transmet
effectivement vers lordinateur B.
Quand on confie une lettre un facteur, on doit la mettre dans une enve-
loppe et ajouter sur lenveloppe des informations supplmentaires :
ladresse du destinataire, sa propre adresse, une preuve de paiement, etc.
De mme, quand un protocole de la couche k+1 confie des informations
un protocole de la couche k, celui-ci ajoute ces informations un en-
tte H
k
qui contient des informations, comme ladresse de lordinateur
destinataire, utilises par le protocole de la couche k. On appelle cela
lencapsulation des informations. Quand les informations I confies par la
T Rseau
Un rseau est un ensemble dordinateurs et de
connexions qui permettent chaque ordinateur de
communiquer avec tous les autres, ventuellement
en passant par des intermdiaires.
T Protocole
Un protocole est un ensemble de rgles qui
rgissent la transmission dinformations sur un
rseau. Il existe de nombreux protocoles, chacun
spcialis dans une tche bien prcise.
T Couche
Une couche est un ensemble de protocoles qui
effectuent des tches de mme niveau. On dis-
tingue cinq couches appeles couche applica-
tion, couche transport, couche rseau,
couche lien et couche physique.
ManuelDowek.book Page 198 Monday, July 9, 2012 4:58 PM
16 Les rseaux
Groupe Eyrolles, 2012
199
couche application la couche transport arrivent un protocole de la
couche physique, plusieurs en-ttes H
4
, H
3
, H
2
, H
1
leur ont t ajouts.
Ces en-ttes sont supprims la rception : la couche k analyse puis
supprime H
k
avant de passer linformation la couche k+1. On appelle
cela la dcapsulation des informations.
Systme en couches,
piles de protocoles. Encapsulation
et dcapsulation de linformation.
ALLER PLUS LOIN Les normes
Des normes rgissent les rles de chaque couche, leurs interactions et les
spcifications de chaque protocole. Ces normes permettent au rseau
Internet de fonctionner lchelle mondiale et assurent la modularit du
systme : il est possible de modifier les protocoles luvre au sein dune
couche, sans modifier les protocoles des autres couches, et le systme con-
tinue fonctionner dans son ensemble. Cette modularit est analogue au
fait de pouvoir changer un composant matriel dun ordinateur, par
exemple sa carte graphique, sans devoir rien changer dautre. Cette
modularit est essentielle pour permettre au systme dvoluer.
ManuelDowek.book Page 199 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
200
La communication bit par bit :
les protocoles de la couche physique
Commenons la prsentation de ces protocoles par ceux de la couche
physique. Un protocole de la couche physique doit raliser une tche
extrmement simple : communiquer des bits entre deux ordinateurs
relis par un cble ou par radio.
Pour relier deux ordinateurs par un cble, et donc raliser le rseau le
plus simple qui soit, on pourrait prolonger le bus de lun des ordinateurs,
afin de le connecter au bus de lautre. Ainsi, le processeur du premier
ordinateur pourrait crire, avec linstruction STA, non seulement dans sa
propre mmoire, mais aussi dans celle du second. Le processeur du
second ordinateur pourrait alors charger, avec linstruction LDA, la
valeur crite par celui du premier.
La technique utilise en ralit nest pas beaucoup plus complique : le
processeur du premier ordinateur envoie des informations par le bus vers
lun de ses priphriques, la carte rseau, qui les transmet par un cble ou
par un autre support physique, par exemple par radio la carte rseau du
second ordinateur qui les transmet, par le bus, son processeur.
La transmission dune carte rseau lautre met en uvre un protocole,
appel protocole physique. Un exemple de protocole physique est la com-
munication par codes-barres deux dimensions, comme les picto-
grammes Flashcode utiliss par les tlphones, o chaque bit est exprim
par un carr noir ou blanc.
Transmission point point
Flashcode exprimant le nombre
5412082001000261
ManuelDowek.book Page 200 Monday, July 9, 2012 4:58 PM
16 Les rseaux
Groupe Eyrolles, 2012
201
Les protocoles physiques qui permettent deux ordinateurs de commu-
niquer par cble ou par radio ne sont pas trs diffrents. Cependant, au
lieu dutiliser des carrs noirs et blancs, ils reprsentent les informations
par des signaux lectromagntiques, par exemple des variations de lon-
gueur donde, de phase ou dintensit dune onde.
Exercice 16.1
On utilise un lien physique peu fiable : chaque fois que lon transmet un 0 ou
un 1, la probabilit que ce bit ne soit pas reconnaissable larrive est 3/10.
Pour pallier ce manque de fiabilit, on utilise une forme de redondance (voir
le chapitre 12) : quand lordinateur metteur demande sa carte rseau
denvoyer un 0, cette dernire envoie la suite de bits 0, 1, 0, 0, 1, qui est inter-
prte par la carte rseau de lordinateur rcepteur comme un 0. De mme,
quand lordinateur metteur demande sa carte rseau denvoyer un 1, elle
envoie la suite de bits 1, 0, 1, 1, 0 qui est interprte par la carte rseau de
lordinateur rcepteur comme un 1.
partir de combien de bits errons la suite de cinq bits envoye nest-elle
plus discernable de lautre suite ?
En dduire la probabilit quune suite de cinq bits envoye ne soit pas
reconnaissable larrive.
Quels sont les avantages et inconvnients de cette mthode ?
Les rseaux locaux :
les protocoles de la couche lien
Ltape suivante consiste construire un rseau local, cest--dire form
de quelques machines connectes, par un protocole physique, un ordi-
nateur central : un serveur. Pour envoyer des informations un autre
ordinateur, chaque ordinateur passe par le serveur.
De mme quil tait ncessaire de distinguer les diffrentes cases de la
mmoire dun ordinateur en donnant chacune un nom, son adresse, il
est ncessaire de distinguer les diffrents ordinateurs dun rseau local en
donnant chacun un nom : son adresse MAC (Medium Access Control).
Une adresse MAC est un mot de 48 bits que lon crit comme un sextu-
plet de nombres de deux chiffres en base seize, les seize chiffres scri-
vant 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f : par exemple
10:93:e9:0a:42:ac. Une adresse MAC unique est attribue chaque carte
rseau au moment de sa fabrication. Ladresse MAC dune carte rseau,
priphrique dun ordinateur, identifie ce dernier sur le rseau local.
SUJET DEXPOS Protocoles et codages
Chercher sur le Web quels sont les protocoles
utiliss dans les liaisons RS-232 dune part, et
dans les liaisons USB dautre part. Quels sont les
avantages dUSB par rapport RS-232 ? Cher-
cher de mme ce que sont les codages Man-
chester dune part et NRZI dautre part. Quels
sont les avantages du codage Manchester par
rapport au codage NRZI ?
ManuelDowek.book Page 201 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
202
Les protocoles grce auxquels diffrents ordinateurs, connects au mme
serveur, changent des informations entre eux sont appels des protocoles
de la couche lien. Un protocole simple consiste, pour le serveur, changer
des informations successivement avec chaque ordinateur du rseau.
Ainsi, chaque ordinateur a un crneau de temps pr-tabli qui lui est
ddi priodiquement pour communiquer avec le serveur, durant lequel
le protocole physique pelle bit bit linformation transmettre.
Toutefois, les protocoles lien les plus utiliss, par exemple Ethernet et
WiFi, utilisent un autre mcanisme qui autorise chaque ordinateur
envoyer des informations au serveur nimporte quel moment toujours
via un protocole physique. Ce mcanisme vite de rserver un crneau
pour un ordinateur qui na peut-tre rien communiquer au serveur.
Cependant, quand plusieurs ordinateurs envoient des informations en
mme temps, les messages se brouillent on dit quil y a une collision entre
les messages et le serveur nen reoit aucun. Pour rsoudre ce problme, on
utilise une forme de redondance : quand le serveur reoit les informations
envoyes par un ordinateur, il en accuse rception et tant quun ordinateur
na pas reu daccus de rception, il renvoie son message priodiquement.
Pour minimiser les risques de nouvelles collisions, ce message est en
gnral renvoy aprs un dlai de longueur alatoire. Ce protocole est un
exemple dalgorithme qui ne peut fonctionner sans ala.
Le rle des protocoles de la couche lien est galement de dfinir le
format des messages changs : de mme quun fichier PGM (voir le
chapitre 9) nest pas simplement une suite de pixels, mais contient aussi
dautres informations la largeur et la hauteur de limage, le nombre de
niveaux de gris, etc. et est structur selon un certain format standard,
Rseau local
T Paquet
Un paquet est une suite de bits structurs selon
un certain format, destine tre change sur le
rseau.
ManuelDowek.book Page 202 Monday, July 9, 2012 4:58 PM
16 Les rseaux
Groupe Eyrolles, 2012
203
les messages qui circulent sur les rseaux, les paquets, ne sont pas simple-
ment forms des bits transmis, mais contiennent des informations addi-
tionnelles et sont structurs selon un format standard.
Exercice 16.2
Un pictogramme nest pas simplement une suite de carrs blancs et noirs, mais
il contient aussi des informations qui permettent au tlphone den trouver
les bords et lorientation. Quelle est la partie du format de chacun de ces pic-
togrammes qui joue ce rle ?
En omettant ces dlimiteurs et en admettant quun carr blanc code un 0 et
quun carr noir code un 1, combien de pictogrammes diffrents existe-t-il
dans chacun de ces formats ? Comment ce nombre se compare-t-il au nombre
de pages existant sur le Web ?
Exercice 16.3 (avec corrig)
Trouver les adresses MAC des cartes rseau de son ordinateur.
Lorsquon tape la commande ifconfig ou ipconfig /all, diffrentes infor-
mations saffichent, relatives la connexion de son ordinateur au rseau. Ces
informations sont gnralement organises en paragraphes qui correspon-
dent diffrentes cartes rseaux : par exemple un paragraphe qui correspond
la carte Ethernet qui gre la connexion par cble et un autre qui correspond
la carte WiFi qui gre la connexion par radio. On reconnat dans chacun de
ces paragraphes une adresse de la forme 10:93:e9:0a:42:ac : un sextuplet de
nombres de deux chiffres en base seize. Il sagit de ladresse MAC de chacune
de ces cartes.
Exercice 16.4
Noter ladresse MAC dune carte rseau de son ordinateur. De quelle con-
nexion rseau sagit-il prcisment ? WiFi ? Ethernet ? Autre ? teindre, puis
rallumer lordinateur. Ladresse a-t-elle chang ?
SAVOIR-FAIRE Trouver les adresses MAC des cartes rseau dun ordinateur
Ouvrir une fentre terminal. Utiliser la commande ifconfig sous Linux, ou ipconfig /all
sous Windows.
ManuelDowek.book Page 203 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
204
Le rseau global : les protocoles
de la couche rseau
Utiliser un ordinateur central est possible pour un rseau de petite taille,
mais cette mthode ne peut pas sappliquer un rseau form de plu-
sieurs milliards dordinateurs, comme Internet : dune part, lordinateur
central serait vite surcharg, dautre part sil tombait en panne, ou sil
tait dtruit, les communications sur la Terre entire seraient interrom-
pues. Cest pour cela que lon a invent dautres protocoles pour les
rseaux de grande taille, appels les protocoles rseau, qui fdrent les
rseaux locaux de proche en proche et utilisent les protocoles lien pour
assurer les communications locales. Le plus utilis des protocoles rseau
est le protocole IP (Internet protocol).
Avec le protocole IP, chaque machine a une adresse, appele son adresse
IP. Contrairement ladresse MAC, celle-ci nest pas associe de
manire durable un ordinateur : quand un ordinateur est remplac par
un autre, le nouveau peut hriter de ladresse IP de lancien. linverse,
si un ordinateur est dplac dun lieu un autre, il change dadresse IP.
Les adresses IP classiques (IPv4) sont des mots de 32 bits crits sous
forme dun quadruplet de nombres compris entre 0 et 255, par exemple
216.239.59.104.
Exercice 16.5 (avec corrig)
Trouver les adresses IPv4 attribues son ordinateur.
Lorsquon tape la commande ifconfig ou ipconfig /all, diffrentes infor-
mations saffichent, relatives la connexion de son ordinateur au rseau. On
reconnat parmi ces informations des adresses de la forme 216.239.59.104 : un
quadruplet de nombres compris entre 0 et 255. Il sagit des adresses IPv4 attri-
bues chacune des cartes rseaux de lordinateur.
Exercice 16.6
Noter les adresses IP attribues aux cartes rseau de son ordinateur. teindre,
puis rallumer cet ordinateur. Ces adresses ont-elle chang ?
POUR ALLER PLUS LOIN DIPv4 IPv6
Il ny a donc que 2
32
adresses IPv4 possibles,
soit un peu plus de quatre milliards : cest peu
quand on sait que le rseau Internet contient
dj trois milliards dordinateurs. Cette pnurie
en adresses IP, due limprvoyance des pion-
niers dInternet, qui cherchaient seulement
connecter quelques dizaines dordinateurs sans
anticiper le succs de leur rseau, explique que
lon cherche aujourdhui les remplacer par des
adresses de 128 bits (IPv6).
SAVOIR-FAIRE Trouver ladresse IP attribue un ordinateur
Ouvrir une fentre terminal. Utiliser la commande ifconfig sous Linux ou ipconfig /
all sous Windows.
ManuelDowek.book Page 204 Monday, July 9, 2012 4:58 PM
16 Les rseaux
Groupe Eyrolles, 2012
205
Exercice 16.7
Soit un rseau connectant cinq ordinateurs : A, B, C, D et E. Est-il possible
didentifier chaque ordinateur de manire unique avec des adresses de 3 bits ?
Dcrire un tel plan dadressage : attribuer une adresse chaque ordinateur.
Est-il galement possible didentifier chaque ordinateur de manire unique
avec des adresses de 2 bits ?
Exercice 16.8
Combien y a-t-il dadresses IPv4 ? Combien y a-t-il dadresses IPv6 ? Combien y
a-t-il de numros de tlphone en France ?
Avec les protocoles rseau, la notion de serveur est remplace par celle de
routeur. Pour envoyer des informations une machine dont ladresse IP
est X, un ordinateur commence par les envoyer au routeur auquel il est
connect. En fonction de ladresse X, celui-ci lenvoie un autre routeur,
puis un autre, etc. jusqu ce que les informations arrivent destina-
tion. On appelle ce procd le routage.
Les routeurs nayant pour fonction que de relayer les paquets en direc-
tion de leur destination, ils ne mettent en uvre que des protocoles des
couches physique, lien et rseau, contrairement aux htes qui, eux, met-
tent en uvre des protocoles de toutes les couches.
La figure suivante illustre le routage dinformations dun hte un autre,
en passant par deux routeurs et trois cbles : en chemin, sur chaque
machine les traitant, les informations transmises sont successivement
encapsules quand elles passent dune couche la couche infrieure, puis
dcapsules quand elles passent dune couche une couche suprieure.
T Routeur
Un routeur est un ordinateur dont la seule fonc-
tion est dacheminer des informations sur le
rseau. Pour les distinguer des routeurs, on appelle
les autres ordinateurs du rseau des htes.
Rseau global. Routage de A B en passant
par les routeurs R1, R2, R3, R4, R5, R6, R7 et
R8.
ManuelDowek.book Page 205 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
206
On peut comparer le routage au systme du courrier postal. Si, Sydney,
un Australien expdie une lettre ladresse 2004, route des Lucioles,
Valbonne, France , le facteur australien napporte pas cette lettre directe-
ment son destinataire, contrairement ce que faisaient les facteurs au
XVII
e
sicle : il la met dans un avion en direction de Hong-Kong ou de
Los Angeles, o un autre facteur la met dans un avion en direction de
Francfort ou de Paris, o un autre facteur la met dans un avion en direc-
tion de Nice, o un facteur lapporte finalement en camionnette, au 2004
de la route des Lucioles, Valbonne.
Un routeur, qui reoit des informations envoyer une adresse IP X, doit
choisir le routeur suivant, en direction de X. De mme que le facteur aus-
tralien sait quune lettre pour Valbonne, ou plus gnralement pour la
France, peut passer par Hong-Kong, le routeur a un rpertoire, appel
table de routage, qui indique que la premire tape dun chemin vers
ladresse X est le routeur dont ladresse IP est B, auquel il est directement
connect. Il envoie donc ces informations vers le routeur B, qui consulte
son tour sa propre table de routage, et ainsi de suite jusqu arriver lordi-
nateur dont ladresse est X. Comme dans un jeu de piste, on ne connat
pas le chemin lavance, mais, chaque tape, on dcouvre la suivante.
Pour construire et maintenir jour leurs tables de routage, les routeurs
utilisent un algorithme de routage, par exemple lalgorithme de Bellman-
Ford : outre acheminer des informations dun point un autre, chaque
routeur envoie priodiquement chaque routeur auquel il est connect
directement par un protocole lien, la liste des adresses IP vers lesquelles
il connat un chemin, dont bien entendu sa propre adresse, et la longueur
Les protocoles luvre lors du routage.
Chemin suivi par linformation travers les
couches sur chaque machine.
ManuelDowek.book Page 206 Monday, July 9, 2012 4:58 PM
16 Les rseaux
Groupe Eyrolles, 2012
207
de ce chemin. Grce cet algorithme et au fur et mesure quil reoit
des listes, chaque routeur dcouvre peu peu ltat du rseau et, ce fai-
sant, les chemins les plus courts pour atteindre les destinations prsentes
dans le rseau. Ainsi, un routeur qui reoit du routeur B linformation
que B a reu du routeur C linformation que C est directement connect
lordinateur X, met jour sa table de routage en mmorisant quun
chemin pour accder lordinateur X, en passant par deux interm-
diaires, commence par le routeur B.
Cette mise jour dynamique des tables de routage est ce qui donne sa sou-
plesse au rseau Internet. Si par exemple le cble entre les routeurs B et C est
dtruit, les tables de routage se mettent graduellement jour en dcouvrant
dautres chemins pour acheminer les informations vers la machine X.
lorigine, cette ide servait donner une robustesse au rseau en temps de
guerre : tant que deux points restaient connects par un chemin dans le
graphe des routeurs, il leur tait possible de communiquer. Par la suite, on
sest rendu compte que cette souplesse tait de toutes faons ncessaire dans
un rseau de trois milliards dordinateurs, o il est invitable que des ordina-
teurs soient en permanence ajouts ou supprims du rseau.
Si les protocoles rseau sont trs souples, ils sont en revanche peu
fiables : quand un routeur est satur par trop dinformations trans-
mettre, il en dtruit tout simplement une partie. En outre, quand des
informations ont t envoyes dun routeur un autre trop longtemps
sans arriver destination, elles sont galement dtruites.
Exercice 16.9 (avec corrig)
Trouver un chemin entre son ordinateur et lordinateur associ au nom de
domaine www.google.fr.
Dans une fentre terminal, on tape la commande ping www.google.fr et une
adresse IP saffiche, par exemple 173.194.34.55. Cest ladresse dun ordinateur
de Google. On tape ensuite la commande traceroute 173.194.34.55 ou
tracert 173.194.34.55 et une liste saffiche des routeurs qui forment un
chemin entre sa machine et celle de Google.
SAVOIR-FAIRE Dterminer le chemin suivi par linformation
Dans une fentre terminal, la commande ping suivie dun nom de domaine affiche
ladresse IP associe ce nom de domaine. La commande traceroute sous Linux ou
tracert sous Windows, suivie dune adresse IP, affiche les routeurs dun chemin menant
de son ordinateur celui dont ladresse IP est indique.
ManuelDowek.book Page 207 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
208
Exercice 16.10 (avec corrig)
Dterminer ladresse IP du routeur par lequel son ordinateur est connect
Internet.
On tape la commande netstat -r ou ipconfig /all. Dans les informations
affiches, on recherche la passerelle par dfaut (default gateway) indique,
qui est le routeur. Ce dernier est identifi soit directement par son adresse IP,
soit par un nom de la forme gw.adalovelace.fr ; dans ce second cas, on peut
trouver ladresse IP associe ce nom avec la commande ping.
Exercice 16.11
Un algorithme de routage. On attribue chaque lve une nouvelle adresse
mail, par exemple anonyme1@adalovelace.fr, anonyme2@adalovelace.fr,
etc. Chaque lve garde cette adresse secrte et il la marque sur une feuille de
papier. Ces feuilles sont mlanges dans un chapeau et chacun tire une
adresse en sassurant quil ne tire pas la sienne propre. Chaque lve a unique-
ment le droit denvoyer des courriers ladresse quil a tire dans le chapeau
et de rpondre lenvoyeur de tout courrier quil reoit son adresse .
Chaque lve envoie un courrier ladresse quil a tire, dans lequel il indique
son propre nom. Par exemple, Alice enverrait :
Chaque lve construit une table de routage qui indique, pour chaque lve
dont il a entendu parler, ladresse de la personne par qui il en a entendu parler
pour la premire fois. Par exemple, la table de routage dAlice peut avoir cette
forme :
chaque fois quun lve reoit un message, il le lit, met jour sa table de
routage et y rpond en copiant, dans le corps du message ltat de sa table de
routage mise jour. Alice enverrait par exemple :
SAVOIR-FAIRE Dterminer ladresse IP du serveur par lequel un
ordinateur est connect Internet
Dans une fentre terminal, la commande netstat -r sous Linux ou ipconfig /all sous
Windows affiche diffrentes informations relatives la connexion de son ordinateur au
rseau, en particulier la passerelle par dfaut (default gateway) qui est le routeur par lequel
cet ordinateur est connect Internet.
sujet : Hello
corps du message :
Alice (par -)
Alice (par -)
Djamel (par anonyme2@adalovelace.fr)
Frdrique (par anonyme2@adalovelace.fr)
Hector (par anonyme7@adalovelace.fr)
sujet : Hello
corps du message :
Alice (par -)
ManuelDowek.book Page 208 Monday, July 9, 2012 4:58 PM
16 Les rseaux
Groupe Eyrolles, 2012
209
Au bout dune dizaine de minutes, on arrte denvoyer et de rpondre aux
messages.
On passe alors la seconde phase de lexercice : un lve essaie denvoyer un
vritable message un autre lve. Pour cela, il envoie son message ladresse
correspondant au nom de son destinataire dans sa table de routage.
Par exemple :
Alice envoie ladresse anonyme2@adalovelace.fr le message suivant :
Si un lve autre que son destinataire reoit ce message, il le renvoie
ladresse correspondant au nom de son destinataire dans sa propre table de
routage, et ainsi de suite jusqu ce que le message arrive destination.
quelle condition un message arrive-t-il bien son destinataire ?
La rgulation du rseau global :
les protocoles de la couche transport
Les programmes que lon utilise tous les jours, par exemple les navigateurs
web ou les programmes de gestion du courrier lectronique, ne peuvent
pas directement utiliser le protocole IP, principalement pour deux raisons :
dune part, le protocole IP ne permet de transfrer dun ordinateur un
autre que des informations de taille fixe : des paquets contenant au
maximum 1 500 octets. Dautre part, comme on la vu, IP est un protocole
peu fiable : ds quun serveur est surcharg, il dtruit des informations qui
narrivent donc pas leur destinataire. On utilise donc un type supplmen-
taire de protocole : les protocoles de transport, dont le plus utilis est le pro-
tocole TCP (Transmission Control Protocol). Les protocoles de transport
utilisent les protocoles rseau pour acheminer des informations contenues
dans des paquets IP, dun bout lautre du rseau, et assurent que tout
paquet IP envoy est arriv bon port.
Pour poursuivre la comparaison avec le service postal, si on attache une
importance particulire une lettre, on lenvoie en recommand et on
attend un accus de rception, qui permet de savoir que sa lettre a bien
t reue. La couche transport sassure que la communication a bien lieu
de bout en bout, comme prvu.
Djamel (par anonyme2@adalovelace.fr)
Frdrique (par anonyme2@adalovelace.fr)
Hector (par anonyme7@adalovelace.fr)
Sujet : message pour Frdrique
Corps du message : Noublie pas de me rapporter lexemplaire de
Madame Bovary que je tai prt il y a six mois. Merci. Alice.
ManuelDowek.book Page 209 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
210
Comme les protocoles de la couche lien, TCP utilise une forme de redon-
dance pour fiabiliser les communications. Il utilise les protocoles rseaux
pour envoyer des paquets IP dun ordinateur un autre et pour envoyer un
accus de rception du destinataire lexpditeur. Tant que laccus de
rception narrive pas, le mme paquet est renvoy priodiquement. Si trop
daccuss de rception narrivent pas, TCP ralentit la cadence denvoi des
paquets pour sadapter une congestion ventuelle du rseau global, puis
r-acclre la cadence quand les accuss de rception arrivent.
Une autre fonction de TCP est de dcouper les informations transmettre
en paquets de 1 500 octets. Par exemple, pour envoyer une page web de
10 000 octets, TCP dcoupe ces 10 000 octets en paquets plus petits,
chacun de taille standard, et les envoie lun aprs lautre. lautre bout du
rseau, quand tous ces paquets standards sont arrivs, TCP les remet dans
lordre et r-assemble leurs contenus pour reconstruire la page web.
Exercice 16.12
Taper la commande ping www.google.fr dans une fentre terminal et
observer ce qui se passe. En dduire la valeur dun temps dattente adquat
aprs lequel TCP devrait considrer que laccus de rception dun paquet
envoy www.google.fr est perdu. Quelle serait la consquence dutiliser un
temps dattente plus court ? Quelle serait la consquence dutiliser un temps
dattente plus long ?
Exercice 16.13
On suppose que la dure attendre entre lenvoi dun paquet et la rception
dun accus de rception pour ce paquet est 1 seconde en moyenne, et que les
paquets peuvent chacun contenir jusqu 1 500 octets de donnes. On consi-
dre les deux configurations suivantes pour TCP.
Configuration A. TCP est configur pour nenvoyer un nouveau paquet
quaprs avoir reu laccus de rception du paquet prcdent.
Configuration B. TCP est autoris envoyer des grappes de 20 paquets la
suite et accuser rception avec un seul accus de rception pour toute la
grappe, au lieu dun accus de rception pour chaque paquet. En cons-
quence, un paquet perdu entrane labsence daccus de rception pour la
grappe laquelle il appartient, et donc demande de renvoyer la grappe
entire au lieu du seul paquet perdu.
Combien de temps faut-il au minimum pour envoyer 1 Mo destination
avec la configuration A ? Avec la configuration B ? Pour simplifier, on sup-
pose que le temps pass envoyer 20 paquets la suite est ngligeable par
rapport 1 seconde.
On suppose maintenant quen moyenne, 1% des paquets envoys vers une
destination se perdent en chemin. En moyenne, combien de paquets
faudra-t-il faire transiter sur le rseau pour transfrer le fichier de 1 Mo
destination avec la configuration A ? Avec la configuration B ? Pour simpli-
fier, on considre qu la deuxime fois quon envoie un paquet, il arrive
destination coup sr, et quun accus de rception envoy arrive gale-
ment coup sr.
Quels sont les avantages et inconvnients de la configuration B par rap-
port la configuration A ?
ALLER PLUS LOIN Le port
Comme plusieurs programmes peuvent utiliser
TCP en mme temps et sur la mme machine,
TCP attribue chacun deux un numro : un
port. Un numro de port permet TCP de distin-
guer les paquets correspondant aux diffrents
programmes qui communiquent en mme temps.
ManuelDowek.book Page 210 Monday, July 9, 2012 4:58 PM
16 Les rseaux
Groupe Eyrolles, 2012
211
Exercice 16.14
Sachant que chaque paquet envoy par TCP est identifi avec un numro de
squence exprim sur 4 octets, et en admettant que chaque paquet envoy
peut contenir 1 500 octets de donnes transmettre, quelle est la taille
maximum dun fichier transmettre partir de laquelle TCP devrait rutiliser
un numro de squence dj utilis au dbut de lenvoi de ce mme fichier ?
Mme question si on dcompte des 1 500 octets les informations de contrle
ncessaires au fonctionnement de chaque couche, par exemple 20 octets den-
tte TCP, 24 octets den-tte IP et 34 octets den-ttes WiFi et couche physique.
Exercice 16.15
Chercher sur le Web ce quest le protocole UDP. Quelles sont les diffrences
entre UDP et TCP ? Quels sont les principaux avantages et inconvnients de
chacun de ces protocoles ? Citer des exemples de programmes qui utilisent
UDP, dautres qui utilisent TCP, et expliquer ces choix.
Programmes utilisant le rseau :
la couche application
Les protocoles des couches physique, lien, rseau et transport fournis-
sent le socle dInternet : ils permettent de transmettre de manire fiable
des fichiers de toutes tailles, dune machine nimporte quelle autre
machine connecte Internet. En plus de ce socle, on distingue nan-
moins un dernier type de protocoles, qui utilisent les services de la
couche transport pour le compte de certains programmes que lon utilise
tous les jours, comme les navigateurs web ou les logiciels de courrier
lectronique. Il sagit des protocoles dapplication.
Les logiciels de courrier lectronique utilisent par exemple le protocole
dapplication SMTP (Simple Mail Transfer Protocol), les navigateurs web
utilisent le protocole dapplication HTTP (HyperText Transfer Protocol)
etc. Un autre protocole dapplication important est DNS (Domain Name
System) qui, aux adresses IP, associe des noms de domaines comme
www.moi.fr.
Quand un navigateur cherche accder une page web situe sur un
autre ordinateur, il utilise DNS pour trouver ladresse IP de lordinateur
hte sur lequel cette page web se trouve, puis le protocole HTTP pour
demander cette page lordinateur hte. Si cette page est par exemple la
page daccueil dun annuaire lectronique, elle contiendra des champs
remplir, et cest nouveau le protocole HTTP qui acheminera les infor-
SUJET DEXPOS DNS
Prsenter les principes de base de DNS.
ManuelDowek.book Page 211 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
212
mations renseignes vers lordinateur hte, qui, en fonction de ces infor-
mations, renverra en gnral une autre page avec la rponse la requte.
Au bout du compte, pour transfrer une page web dun ordinateur un
autre, HTTP confie cette page web au protocole TCP, qui la dcoupe en
paquets et confie chaque paquet au protocole IP, qui choisit un lien
utiliser en direction de la destination, puis confie chaque paquet au pro-
tocole de lien en vigueur sur ce dernier, par exemple WiFi, qui le confie
enfin au protocole physique, qui gre lacheminement des bits codant ces
paquets travers ce lien. Chaque protocole, son niveau, contribue la
communication. Chaque protocole est simple ; cest de leur interaction
qui nat la complexit.
Quelles lois sappliquent
sur Internet ?
Jusquau milieu du XX
e
sicle, quand un livre ou un journal tait publi,
il ltait dans un pays particulier et sa publication tait rgie par les lois
de ce pays. Quand un objet tait vendu, il ltait dans un pays particulier
et cette vente tait rgie par les lois de ce pays. Ainsi, la publication de
certains textes ou la vente de certains objets tait autorise dans certains
pays, mais interdite dans dautres.
Parce que cest un rseau mondial, Internet permet de publier, dans un
pays, des textes qui peuvent tre lus dans le monde entier et, de mme,
de vendre des objets qui peuvent tre achets dans le monde entier. Ds
lors, quelle loi appliquer ? cette question, qui est nouvelle, plusieurs
rponses ont t imagines, sans que personne ne sache encore laquelle
simposera sur le long terme :
lapplication des lois du pays dans lequel le texte est publi ou lobjet
mis en vente,
lapplication des lois du pays dans lequel le texte peut tre lu ou
lobjet achet ce qui obligerait, par exemple, un hbergeur de site
web bloquer laccs certains sites depuis certains pays,
ou lmergence dun minimum de rgles universelles.
SUJET DEXPOS
Laffaire LICRA contre Yahoo!
Quest-ce que larticle R.645-1 du Code Pnal
franais ? Quest-ce que le premier amende-
ment de la Constitution des tats-Unis ? En quoi
sont-ils contradictoires ? Chercher des docu-
ments sur laffaire de la LICRA contre
Yahoo!, relative la vente aux enchres
dobjets nazis sur Internet (de lordonnance du
Tribunal de Grande Instance de Paris du
20 novembre 2000, jusqu la dcision de la
Cour Suprme des tats-Unis du 30 mai 2006).
Montrer en quoi cette affaire illustre le pro-
blme de lapplication de lgislations diffrentes
selon les pays pour la vente sur Internet.
ManuelDowek.book Page 212 Monday, July 9, 2012 4:58 PM
16 Les rseaux
Groupe Eyrolles, 2012
213
Qui gouverne Internet ?
Quelques rgles dorganisation dInternet doivent tre universellement
acceptes. Par exemple, pour que les ordinateurs du monde entier puissent
communiquer, il est ncessaire quils utilisent les mmes protocoles et pour
quil ny ait pas de confusion entre les adresses IP, il faut que deux ordinateurs
distincts naient jamais la mme adresse. Internet nest donc pas entirement
dcentralis : un petit nombre de dcisions doivent tre prises en commun.
Ici, plusieurs modes dorganisation sont en concurrence, nouveau sans
que personne ne sache lequel simposera sur le long terme :
lmergence dorganisations internationales rgies par des traits entre tats,
lmergence dorganisations internationales informelles, dont la lgiti-
mit vient uniquement de la confiance qui leur est accorde,
lmergence dorganisations propres aux pays o Internet est le plus
dvelopp (cette dernire solution ayant linconvnient daugmenter les
diffrences de dveloppement dInternet entre les pays).
SUJET DEXPOS Que sont
lInternet Engineering Task Force (IETF),
lInternet Corporation for Assigned
Names and Numbers (ICANN),
lInternet Society (ISOC),
le World Wide Web Consortium (W3C),
le WhatWG,
et lUnion Internationale des Tlcoms
(UIT) ?
Quel est le rle et quel est le statut de chacune
de ces organisations ?
ALLER PLUS LOIN Calculer dans les nuages (cloud computing)
Au cours de lhistoire de linformatique, des modes cen-
tralisatrices et dcentralisatrices se sont succdes. Ainsi,
jusquaux annes 1970, les entreprises navaient quun
seul ordinateur, auquel taient connects de nombreux
terminaux, par exemple forms dun clavier et dun
cran, qui permettaient diffrentes personnes deffec-
tuer des calculs sur cet ordinateur. partir des annes
1980, ces terminaux ont t remplacs par des micro-
ordinateurs, connects par un rseau un serveur. Les
calculs ntaient alors plus effectus par un ordinateur
central, mais par chacun de ces micro-ordinateurs.
Depuis le milieu des annes 2000, on voit apparatre un
retour de la centralisation. Des entreprises, qui ven-
daient nagure des programmes des clients qui les uti-
lisaient pour effectuer des calculs sur leurs ordinateurs,
proposent dsormais ces mmes clients deffectuer
elles-mmes ces calculs leur place. Les clients ont juste
besoin de communiquer leurs donnes ces entreprises,
qui font les calculs sur leurs propres ordinateurs et
envoient le rsultat de ces calculs leurs clients. Cest ce
quon appelle le calcul dans les nuages (cloud computing).
Par exemple, au lieu dinstaller un logiciel de courrier
lectronique sur son ordinateur et de lutiliser pour
envoyer des courriers, on peut, chaque fois que lon
souhaite envoyer un courrier, se connecter un ordina-
teur distant, en gnral au moyen dune page web, et
communiquer le texte de son courrier cet ordinateur,
qui se chargera de lenvoyer ; cest lide du Webmail. De
mme, au lieu dacheter un logiciel de comptabilit et
de lutiliser, une entreprise peut se connecter, chaque
fois quelle souhaite effectuer une opration comp-
table, une machine distante qui effectue cette opra-
tion pour lentreprise. Lordinateur local ne sert plus
qu communiquer des informations cette machine
distante, comme jadis les terminaux.
Utiliser des programmes sur une machine distante sim-
plifie beaucoup de choses. Il nest plus ncessaire dins-
taller des logiciels sur son ordinateur, de les mettre jour
de temps en temps, etc. De plus, il devient possible
denvoyer un courrier depuis nimporte quel ordinateur :
dun web caf de Bogota ou de Caracas, comme de son
bureau. Pour une entreprise, cela permet de diminuer la
taille du service informatique, puisquil lui suffit dsor-
mais davoir quelques ordinateurs relis au rseau.
Cependant, cette volution prsente aussi un risque de
dpossession des utilisateurs de leur pouvoir : au lieu
davoir ses programmes, ses courriers, ses photos, sa
comptabilit, etc. sur son ordinateur, on prfre les con-
fier des entreprises et des ordinateurs distants. En
outre, on a parfois une garantie assez faible de leur con-
servation sur le long terme, de son pouvoir de les
effacer ou de son contrle sur les usages que ces entre-
prises peuvent faire de ces donnes.
ManuelDowek.book Page 213 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
214
Ai-je bien compris ?
Quest-ce quun protocole ? Quest-ce quune couche ?
Quelles sont les cinq couches de protocoles dont sont composs les rseaux ?
Comment fabriquer un protocole fiable en utilisant un protocole peu fiable ?
ManuelDowek.book Page 214 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
17 Les robots
CHAPITRE AVANC
Norbert Wiener (1894-1964) est le
fondateur, la fin des annes 1940, de
la science du pilotage ou cybern-
tique. Entour dun groupe interdisci-
plinaire de mathmaticiens, logiciens,
anthropologues, psychologues, co-
nomistes, il a cherch comprendre
les processus de commande et de
communication chez les tres vivants,
dans les machines et dans les socits.
Le concept central de la cyberntique
est celui de causalit circulaire ou con-
trle en boucle ferme (feedback).
Un robot ? Cest un ordinateur deux roues.
Dans ce chapitre, nous introduisons de nouveaux objets :
les robots, qui sont essentiellement des ordinateurs munis
de capteurs et dactionneurs. Nous voyons comment
les grandeurs captes sont numrises et comment le principe
de la boucle ferme permet de contrler une action.
Enfin, nous voyons comment programmer un robot
laide dune boucle infinie dans laquelle les capteurs
sont interrogs et les actionneurs activs.
ManuelDowek.book Page 215 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
216
Les composants
dun robot
Comme un ordinateur ou un tlphone, un robot est form dun proces-
seur, dune mmoire et de priphriques. Ces derniers se divisent en
priphriques de sortie, ou actionneurs, qui permettent au robot de se
mouvoir et dagir sur son environnement, et ses priphriques dentre,
ou capteurs, qui lui permettent danalyser cet environnement.
Dans ce chapitre, nous utilisons le robot mOway, mais les connaissances
que nous prsentons ne sont pas propres ce robot et peuvent facilement
se transposer dautres.
Les actionneurs du robot mOway sont deux moteurs qui font tourner ses
roues et diverses diodes lectroluminescentes que lon peut allumer ou
teindre. Quand on fait tourner les deux roues du robot la mme
vitesse, il avance en ligne droite. Quand on ralentit ou acclre une roue
par rapport lautre, il tourne.
Les capteurs du robot mOway sont les suivants :
Quatre dtecteurs dobstacles qui mettent rgulirement de
brves impulsions de lumire infrarouge. Quand le robot est proche
dun obstacle, cette lumire est rflchie par lobstacle et dtecte par
le robot.
Un capteur de luminosit , qui identifie la direction et lintensit
dune source lumineuse.
Deux capteurs de couleur de sol , qui analysent la rflexion dune
lumire infrarouge sur le sol et permettent, par exemple, dy reprer
une ligne.
Un capteur dont la rsistance lectrique varie avec la temprature.
Un microphone qui dtecte la prsence ou labsence dun son dont la
frquence est comprise entre 100 Hz et 20 kHz, et aussi lintensit de
ce son.
Un acclromtre qui mesure lacclration linaire du robot et la gra-
vit. Cest le mme composant que sur les manettes de jeux et cer-
tains tlphones : une acclration dforme deux plaques souples
dun condensateur, ce qui fait varier sa capacit. Cet acclromtre
indique la direction verticale, ce qui permet, par exemple, de savoir si
le robot sest retourn.
Il est possible dajouter dautres priphriques , grce des bus simi-
laires ceux que nous avons dcrits au chapitre 15.

ManuelDowek.book Page 216 Monday, July 9, 2012 4:58 PM


17 Les robots
Groupe Eyrolles, 2012
217
Le robot contient une batterie rechargeable qui le rend autonome, mais
il peut dialoguer avec un ordinateur par radio ou par un rseau WiFi
(voir le chapitre 16).
Tous les capteurs et actionneurs sont raccords deux micro-contrleurs.
Un micro-contrleur est un circuit qui contient plusieurs composants, en
particulier un processeur et de la mmoire (voir le chapitre 15). Le
micro-contrleur principal, appel PIC18F86J50 sur la figure ci-aprs,
excute un programme charg dans sa mmoire. Nous reviendrons plus
tard sur le rle du micro-contrleur secondaire.
La numrisation des grandeurs captes
Les capteurs mesurent des grandeurs physiques : intensit lumineuse,
intensit sonore, etc. et expriment en gnral ces grandeurs sous la forme
dune tension lectrique. Pour que ces grandeurs puissent tre utilises par
un processeur, cette tension doit, son tour, tre exprime par un nombre
reprsent en binaire, comme le sont le niveau de gris dun pixel quand on
numrise une image ou la pression quand on numrise un son (voir le
chapitre 9). Pour cela, deux composants sont utiliss : un chantillonneur-
bloqueur et un convertisseur analogique-numrique. Le premier bloque la
tension une valeur stable, pendant que le second mesure cette valeur et
produit un nombre, reprsent en binaire, qui est la valeur de cette tension.
Par exemple, quand la valeur analogique est comprise entre 0 et 5 V et la
valeur numrique comprise entre 0 et 1 023 (cest--dire reprsente sur
10 bits), la tension est mesure par pas de 5 / 1 023 = 4,88 mV. Cette
ManuelDowek.book Page 217 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
218
valeur est appele la rsolution du convertisseur. Pour trouver la valeur
numrique dune tension, un convertisseur analogique-numrique nuti-
lise que des comparaisons entre cette tension et des multiples entiers de
la rsolution en procdant par dichotomie (voir le chapitre 20).
Exercice 17.1
Si un convertisseur analogique-numrique transforme une tension comprise
entre 0 et 5 V en un nombre compris entre 0 et 1 023, quelles valeurs analo-
giques correspondent les valeurs numriques 512, 256 et 768 ?
Exercice 17.2
Si un convertisseur analogique-numrique transforme une tension comprise
entre 0 et 5 V en un nombre compris entre 0 et 1 023, en procdant par dicho-
tomie, combien de comparaisons sont ncessaires pour dterminer la valeur
numrique correspondante ?
Exercice 17.3
Si on numrise une tension comprise entre 0 et 5 V, dfinie avec une prcision
de 20 mV, par un nombre compris entre 0 et 1 023, tous les bits de la valeur
numrique ont-ils une signification ? Sur combien de bits suffirait-il de num-
riser cette valeur ?
ManuelDowek.book Page 218 Monday, July 9, 2012 4:58 PM
17 Les robots
Groupe Eyrolles, 2012
219
Le contrle de la vitesse : la mthode
du contrle en boucle ferme
Pour faire tourner un moteur une vitesse dtermine, il ne suffit pas de fixer
la tension dalimentation du moteur, car la vitesse dpend aussi de la masse du
robot, de la nature du terrain sur lequel le robot se dplace, des conditions cli-
matiques si le robot est lextrieur, etc. La mthode appele contrle en boucle
ferme utilise un capteur pour mesurer la vitesse du moteur, compare cette
dernire la vitesse souhaite et rajuste la commande du moteur en fonction
de lcart constat : si cette vitesse est infrieure la vitesse souhaite, on aug-
mente la tension dalimentation du moteur, si elle est suprieure, on la
diminue. Mesurer en permanence la vitesse des moteurs et adapter leur ten-
sion dalimentation en fonction de lcart, par rapport la consigne, est le rle
du micro-contrleur secondaire, appel PIC16F687 sur la figure.
Pour mesurer la vitesse de la roue du robot, on utilise un capteur de vitesse
form dun disque qui alterne des zones opaques et transparentes, fix sur
laxe du moteur et clair par une source de lumire. On calcule la vitesse
du moteur en comptant le nombre de fois que la lumire est occulte par
unit de temps. La frquence de ce clignotement est proportionnelle la
vitesse. On utilise donc un circuit qui convertit cette frquence en valeur
de vitesse, de faon pouvoir la contrler.
Exercice 17.4
Pour le contrleur de vitesse que lon vient de dcrire, quelle est la vitesse de
la roue en fonction de la frquence de clignotement, du nombre dencoches
sur la roue et du rayon de la roue ? Pour une roue de 2 cm de rayon et conte-
nant 64 encoches, quelle vitesse correspond la frquence 128 Hz ? Quelle
frquence correspond la vitesse 0,4 m/s ? Expliquer comment on peut
exprimer la vitesse sous forme numrique, en utilisant un compteur num-
rique qui augmente dune unit chaque impulsion lumineuse.
ManuelDowek.book Page 219 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
220
Programmer un robot :
les actionneurs
On programme le robot mOway en chargeant dans sa mmoire un pro-
gramme, depuis un ordinateur ordinaire. Comme on la vu, ce pro-
gramme est ensuite excut par le microcontrleur principal. Ce
programme doit tre crit, non en Java, mais en C. Cependant, le frag-
ment de C, utilis dans ce chapitre, est trs similaire Java.
On commence donc par crire un programme et le compiler. On utilise
pour cela lenvironnement de dveloppement MPLAB. On le transmet
ensuite au robot laide dun cble USB et du programme mOwayGUI
(mOway Graphic User Interface).
Pour crire un programme, on utilise des fonctions qui interrogent les
capteurs et commandent les actionneurs. Ces fonctions ne font pas
partie du langage C lui-mme, mais dune extension de C fournie par le
fabricant du robot. On indique que lon utilise cette extension en ajou-
tant au dbut de son programme les commandes :
Pour faire avancer le robot, on utilise la fonction MOT_STR. Par exemple, lins-
truction MOT_STR(50,FWD,TIME,100); fait avancer le robot la vitesse 50, en
marche avant, pendant 10 secondes (100 diximes de seconde).
Le premier argument de cette fonction est la vitesse laquelle on fait
avancer le robot. Il est compris entre 0 et 100 ; 0 correspond 0 cm/s, 25
11 cm/s, 50 13 cm/s, 75 15 cm/s et 100 17 cm/s. Le deuxime, FWD
ou BACK, dfinit le sens de la marche : avant ou arrire. Le troisime argu-
ment indique si lon souhaite spcifier une dure ou une distance. Dans ce
chapitre, nous spcifierons toujours une dure et cet argument sera TIME.
Le quatrime argument, compris entre 0 et 255, est la dure du mouve-
ment exprime en diximes de secondes. On peut aussi faire avancer le
robot pendant un temps infini en donnant, conventionnellement, la
valeur 0 comme dure.
De mme, pour faire tourner le robot, on utilise la fonction MOT_ROT. Par
exemple, linstruction MOT_ROT(25,FWD,CENTER,LEFT,ANGLE,50); fait tourner
le robot gauche, la vitesse angulaire 25, dun angle de 180 degrs
(50 centimes de tour).
Le premier argument de cette fonction est la vitesse angulaire laquelle
on fait tourner le robot. Il est compris entre 0 et 100 ; 0 correspond
#include "lib_mot_moway.h"
#include "lib_sen_moway.h"
ALLER PLUS LOIN Un programme sans fin
Contrairement beaucoup de programmes qui
calculent un rsultat et se terminent, un pro-
gramme commandant un robot, un tlphone,
un rseau et, plus gnralement, un objet qui
interagit avec son environnement, doit ne
jamais se terminer, car le robot ou le tlphone
ne cessent jamais dinteragir avec leur environ-
nement. Quand un tel programme se termine,
on dit que le robot ou le tlphone est en
panne, car il ne rpond plus aux sollicitations
de son environnement et, bien souvent, on
relance ce programme.
ManuelDowek.book Page 220 Monday, July 9, 2012 4:58 PM
17 Les robots
Groupe Eyrolles, 2012
221
0 tour/s, 25 0,52 tour/s, 50 0,62 tour/s, 75 0,73 tour/s et 100
0,80 tour/s. Les deux arguments suivants permettent de choisir si lon
fait tourner le robot autour de son centre ou autour de lune de ses roues.
Dans ce chapitre, nous le ferons toujours tourner autour de son centre et
ces arguments seront toujours FWD et CENTER. Le quatrime argument,
LEFT ou RIGHT, dfinit le sens de rotation du robot : vers la gauche ou vers
la droite. Le cinquime argument peut prendre deux valeurs, ANGLE ou
TIME ; il indique si lon souhaite spcifier langle de rotation ou la dure
de la rotation. Le sixime argument est, en fonction de la valeur du cin-
quime, langle de la rotation exprim en centimes de tour ou sa dure
exprime en diximes de secondes. Il est compris entre 0 et 100 dans le
premier cas et entre 0 et 255 dans le second. nouveau, on peut aussi
faire tourner le robot pendant un temps infini, en donnant, convention-
nellement, la valeur 0 comme dure.
Quand on excute une telle instruction MOT_STR ou MOT_ROT, on initie un
mouvement, puis on passe linstruction suivante. Le robot continue
alors son mouvement jusqu la fin, moins que ce mouvement ne soit
interrompu par linitiation dun autre mouvement.
En effet, si la poursuite de lexcution du programme initie un second
mouvement, alors le premier mouvement est interrompu. Par exemple,
quand on excute linstruction :
on commence par excuter linstruction MOT_STR(50,FWD,TIME,100); qui initie
un mouvement rectiligne de 10 s, puis on excute tout de suite la seconde
instruction MOT_ROT(25,FWD,CENTER,LEFT,ANGLE,50); qui interrompt le mou-
vement en cours et initie un mouvement de rotation dun angle de
180 degrs. Le mouvement rectiligne est interrompu quelques fractions de
secondes seulement aprs avoir t initi. Il nest donc pas effectu.
Si on souhaite effectuer le mouvement rectiligne en entier, avant de
passer la rotation, on doit utiliser la variable MOT_END qui prend la
valeur 0 (quivalent de false en C) quand le robot est en mouvement et
la valeur 1 (quivalent de true en C) quand le robot est immobile. Ainsi,
quand on excute linstruction :
on initie un mouvement rectiligne de 10 s, on attend que le robot rede-
vienne immobile, cest--dire que le mouvement rectiligne soit achev,
puis on initie le mouvement de rotation.
MOT_STR(50,FWD,TIME,100);
MOT_ROT(25,FWD,CENTER,LEFT,ANGLE,50);
MOT_STR(50,FWD,TIME,100);
while(!MOT_END){}
MOT_ROT(25,FWD,CENTER,LEFT,ANGLE,50);
ManuelDowek.book Page 221 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
222
Pour allumer et teindre la diode lectroluminescente, situe lavant du
robot, on utilise les instructions LED_FRONT_ON(); et LED_FRONT_OFF();.
Pour faire clignoter la diode lectroluminescente verte, situe sur le
robot, on utilise linstruction LED_TOP_GREEN_ON_OFF(); Ici, le fait dallumer
une diode ninterrompt pas le mouvement du robot, les deux actions sont
effectues en mme temps.
Pour attendre quelques secondes entre deux instructions, on utilise la
fonction Delay10KTCYx, par exemple linstruction Delay10KTCYx(200); inter-
rompt lexcution du programme pendant 2 s. Largument de cette fonc-
tion est le temps du dlai exprim en centimes de seconde.
Enfin, il faut excuter au dbut de chaque programme les instructions
SEN_CONFIG(); et MOT_CONFIG(); pour configurer les capteurs et les moteurs.
Par exemple, le programme :
attend 2 s avant de commencer, fait clignoter la diode verte, fait avancer
le robot pendant 10 s, le fait tourner de 180 degrs et boucle linfini,
afin que le programme ne se termine pas. Dans ce cas, la non-termi-
naison est un peu artificielle et sert surtout viter, comme on la
expliqu, que le programme soit relanc.
Exercice 17.5
crire un programme qui fait avancer le robot en marche avant la vitesse 100
pendant 5 s, puis le fait reculer la vitesse 15 pendant 2 s.
Programmer un robot :
les capteurs
Dautres fonctions interrogent les capteurs. Par exemple, lexpression
SEN_OBS_DIG(OBS_CENTER_L) prend la valeur 1 (true) quand le capteur avant
gauche dtecte un obstacle, et la valeur 0 sinon. De mme, les expressions
main () {
SEN_CONFIG();
MOT_CONFIG();
Delay10KTCYx(200);
LED_TOP_GREEN_ON_OFF();
MOT_STR(50,FWD,TIME,100);
while(!MOT_END) {}
MOT_ROT(25,FWD,CENTER,LEFT,ANGLE,50);
while(1) {}}
ManuelDowek.book Page 222 Monday, July 9, 2012 4:58 PM
17 Les robots
Groupe Eyrolles, 2012
223
SEN_OBS_DIG(OBS_CENTER_R), SEN_OBS_DIG(OBS_SIDE_L) et SEN_OBS_DIG(OBS_SIDE_R)
renvoient des valeurs similaires pour les capteurs avant droit, ct gauche et
ct droit respectivement.
De mme, lexpression SEN_LINE_DIG(LINE_L) prend la valeur 0 si le cap-
teur de couleur de sol situ sur la gauche du robot capte une couleur
claire et 1 sil capte une couleur sombre. Le fonctionnement est le mme
pour le capteur de couleur de sol, situ sur la droite du robot, avec
lexpression SEN_LINE_DIG(LINE_R).
la diffrence des actionneurs que lon commande quand on le sou-
haite, il faut interroger les capteurs de manire rgulire, afin dtre pr-
venu de tous les vnements quils dtectent. Une mthode pour ce faire
est dorganiser le programme sous la forme dune grande boucle qui,
chaque tour, interroge les capteurs et commande les actionneurs.
Le programme suivant par exemple fait clignoter la diode verte, puis initie
un mouvement du robot en marche avant pour un temps infini. Si jamais
le robot dtecte un obstacle, on allume la diode situe lavant du robot,
on initie un mouvement de rotation de 180 degrs, ce qui interrompt le
mouvement rectiligne, puis quand le mouvement de rotation est achev,
on relance le robot en marche avant pour un temps infini. Sinon, on teint
la diode situe lavant du robot, si jamais elle est allume.
void main() {
SEN_CONFIG();
MOT_CONFIG();
LED_TOP_GREEN_ON_OFF();
MOT_STR(50,FWD,TIME,0);
while (1) {
if (SEN_OBS_DIG(OBS_CENTER_L)){
LED_FRONT_ON();
MOT_ROT(25,FWD,CENTER,LEFT,ANGLE,50) ;
while(!MOT_END){}
MOT_STR(50,FWD,TIME,0);}
else{
LED_FRONT_OFF();}}
SAVOIR-FAIRE crire un programme pour commander un robot
Identifier les actionneurs et les capteurs utiliser.
crire les tests sur les valeurs des capteurs et les instructions initiant les actions dans
une grande boucle infinie.
Insrer les temporisations permettant aux actions de seffectuer compltement si cela
est ncessaire.
Initialiser les capteurs et les actionneurs avant le dbut de la boucle.
ManuelDowek.book Page 223 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
224
Exercice 17.6 (avec corrig)
crire un programme qui pilote un robot le long dune ligne sombre dessine
sur un sol clair.
Les actionneurs utiliss sont, bien entendu, les moteurs que lon commande
avec instructions MOT_STR et MOT_ROT. Les capteurs utiliss sont les capteurs de
couleur de sol que lon interroge avec les instructions SEN_LINE_DIG(LINE_L) et
SEN_LINE_DIG(LINE_R).
On cherche ce que le robot suive le ct gauche de la ligne, cest--dire que son
capteur gauche soit lextrieur de la ligne et son capteur droit lintrieur.
Tant que cela est le cas, le robot avance tout droit. En revanche, si les deux
capteurs sont hors de la ligne, cela signifie que le robot est trop gauche : il
doit tourner droite. Si les deux capteurs sont sur la ligne, le robot est trop
droite : il doit tourner gauche. Si le capteur gauche est lintrieur de la
ligne et le capteur droit lextrieur, cela signifie que le robot est dans le mau-
vais sens, il doit faire demi-tour. On utilise ici la mme mthode que pour le
contrle de la vitesse du moteur : la mthode de contrle en boucle ferme.
Il est important de placer le robot sur le bord de la ligne au moment o on le
lance, sinon il ne fera que tourner sur lui-mme.
Exercice 17.7
Mettre le robot dans une enceinte avec un mur carr de 50 cm de ct, o il
ny a pas dautres obstacles que les murs. Utiliser le dtecteur dobstacles pour
le faire aller vers lun des murs, puis tourner sans fin dans le sens des aiguilles
dune montre.
Exercice 17.8
Dans un espace sans limite avec deux robots face face, crire un programme qui
fait danser ensemble les robots en les faisant tourner lun autour de lautre.
Exercice 17.9
On imagine un robot aspirateur dans une enceinte avec un mur carr de 50 cm
de ct, o il ny a pas dautres obstacles que les murs. crire un programme
pour que le robot passe laspirateur sur tout le sol. Essayer diffrentes
mthodes : par des allers-retours, en spirale, etc. Essayer ces programmes.
void main () {
Delay10KTCYx(200);
SEN_CONFIG();
MOT_CONFIG();
while(1) {
if (SEN_LINE_DIG(LINE_L)==0 && SEN_LINE_DIG(LINE_R)==1) {
MOT_STR(80,FWD,TIME,0);}
else {
if (SEN_LINE_DIG(LINE_L)==0 && SEN_LINE_DIG(LINE_R)==0) {
MOT_ROT(50,FWD,CENTER,RIGHT,TIME,0);}
else {
if (SEN_LINE_DIG(LINE_L)==1 && SEN_LINE_DIG(LINE_R)==1) {
MOT_ROT(50,FWD,CENTER,LEFT,TIME,0);}
else {
MOT_ROT(50,FWD,CENTER,RIGHT,TIME,0);}}}}}

ManuelDowek.book Page 224 Monday, July 9, 2012 4:58 PM


17 Les robots
Groupe Eyrolles, 2012
225
ALLER PLUS LOIN Les interruptions
Organiser un programme en une grande boucle qui teste
les capteurs en permanence est possible, mais souvent
malcommode. On a donc introduit dans les langages de
programmation des outils qui permettent dexprimer la
mme chose de manire plus simple. Le programme
dcrit dune part ce quil faut faire quand tout se passe
normalement, par exemple avancer tout droit, et dautre
part des conditions qui dfinissent des interruptions, par
exemple le fait quun dtecteur signale un obstacle, et
des instructions excuter en cas dinterruption, par
exemple faire tourner le robot. Ces diffrentes instruc-
tions sont ensuite traduites automatiquement en un pro-
gramme qui, de manire rpte, interroge les capteurs
et, selon quune interruption est dclenche ou non, ex-
cute une instruction ou une autre.
Cette manire ractive de programmer, permet de
mieux prendre en compte les alas de lenvironnement :
dune excution dun programme une autre, un robot
rencontre rarement deux fois la mme situation et il
doit sadapter sil rencontre une tache dhuile sur le sol,
des obstacles nouveaux, etc.
ALLER PLUS LOIN Les mots robot et robotique
Le mot robot , driv dun mot qui signifie
esclave , a t cr par lcrivain Tchque Karel Capek
en 1920 et le mot robotique par un autre crivain,
Isaac Asimov, en 1942. Lorigine littraire de ces deux
mots nest pas due au hasard. Le fait que les ordinateurs
imitent certaines facults humaines, comme effectuer
des multiplications ou jouer aux chec, a suscit le rve
de machines intelligentes. Mais la conception de robots,
cest--dire dordinateurs mobiles et autonomes, rejoint,
de plus, une figure littraire ancienne, qui du Golem
Pinocchio et du monstre de Frankenstein WALL-E, pose
la question de la frontire entre lanim et linanim.
ALLER PLUS LOIN Les robots sont partout
Dans lindustrie, les robots sont utiliss dans les chanes
de montage de nombreuses usines. En mdecine, ils sont
utiliss pour effectuer des oprations chirurgicales
micro-invasives, pour effectuer des analyses, pour rem-
placer des membres paralyss, pour assister des per-
sonnes dpendantes, etc. Ils sont aussi utiliss dans
lexploration spatiale et sous-marine ou pour intervenir
dans les zones inaccessibles, par exemple de centrales
nuclaires. Des robots sont aussi utiliss dans des taches
plus quotidiennes comme passer laspirateur, nettoyer
une piscine ou garer une voiture.
Thyrodectomie assiste par un robot - CHU de Nmes
Le robot industriel Robolab recopiant la Bible
Ai-je bien compris ?
Quels sont les composants dun robot ?
Quest-ce que le principe de la boucle ferme ?
Comment organise-t-on un programme pour que les capteurs soient interrogs
priodiquement ?
ManuelDowek.book Page 225 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 226 Monday, July 9, 2012 4:58 PM
QUATRIME PARTIE
Algorithmes
Dans cette quatrime partie, nous apprenons quelques-uns des
savoir-faire les plus utiles au XXI
e
sicle : ajouter des nombres
exprims en base deux (chapitre 18), dessiner (chapitre 19),
retrouver une information par dichotomie (chapitre 20*), trier des
informations (chapitre 21*) et parcourir un graphe (chapitre 22*).
ManuelDowek.book Page 227 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 228 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
18
Ajouter deux
nombres exprims
en base deux
Ada Lovelace (1815-1852) est
lauteur du premier algorithme des-
tin tre excut par une machine.
Cet algorithme, qui permettait de
calculer une suite de nombres de Ber-
nouilli, devait tre excut sur la
machine analytique conue par
Charles Babbage. Malheureusement,
Babbage na jamais russi terminer
sa machine. Ada Lovelace est parfois
considre comme le premier pro-
grammeur de lhistoire. Le langage
de programmation Ada est ainsi
nomm en son honneur.
Pour faire une addition, l ordinateur fait comme on
lui a appris sur les bancs de l cole.
Dans ce chapitre, nous dtaillons lalgorithme de laddition
en base deux, ce qui est surtout un prtexte pour comprendre
comment dmontrer quun algorithme est correct.
Lalgorithme est le mme que celui que nous utilisons
couramment lorsque nous effectuons une addition ordinaire,
cest--dire en base dix. Nous dmontrons ensuite
que lalgorithme que nous avons programm calcule bien
la somme de deux nombres. Pour cela, nous utilisons la notion
importante dinvariant de boucle qui est une proprit vraie
chaque tour de boucle. Nous montrons un telle proprit
par rcurrence sur le numro du tour de boucle.
ManuelDowek.book Page 229 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
230
Nous revenons dans ce chapitre sur lun des premiers algorithmes que
nous ayons appris lcole, celui qui permet dajouter deux nombres
entiers, pour nous poser deux questions : comment adapter cet algo-
rithme aux nombres exprims en base deux ? Et pourquoi cet algorithme
calcule-t-il bien la somme des deux nombres ?
Laddition
Commenons par rappeler cet algorithme sur un exemple. On veut
ajouter les nombres 728 et 456.
On commence par ajouter les chiffres des units, 8 et 6. La table de
laddition indique que la somme de ces deux chiffres est 14 ; on pose le
chiffre des units, 4, et on retient le chiffre des dizaines, 1. On ajoute
ensuite les chiffres des dizaines et cette retenue, 2, 5 et 1. La table de
laddition indique que la somme de ces trois chiffres est 8 ; on pose le
chiffre des units, 8, et on retient le chiffre des dizaines, 0. On ajoute
ensuite les chiffres des centaines et cette retenue, 7, 4 et 0. La table de
laddition indique que la somme de ces trois chiffres est 11 ; on pose le
chiffre des units, 1, et on retient le chiffre des dizaines, 1. Finalement,
on pose cette retenue dans la colonne des milliers.
Une irrgularit de cette mthode est que, lors de la premire itration,
on ajoute deux chiffres, alors quen rgime permanent, on en ajoute trois.
On peut corriger cela en commenant par poser la retenue gale 0. La
premire itration se formule alors de la manire suivante : on com-
mence par ajouter les chiffres des units et la retenue, 8, 6 et 0, etc.
Ainsi, cet algorithme nutilise quune seule table, qui indique la somme
de chacun des triplets (a ; b ; c) o a, b et c sont des chiffres compris
entre 0 et 9, table quen gnral on connat par cur.
ManuelDowek.book Page 230 Monday, July 9, 2012 4:58 PM
18 Ajouter deux nombres exprims en base deux
Groupe Eyrolles, 2012
231
Laddition pour les nombres
exprims en base deux
Voyons maintenant comment on ajoute des nombres exprims en base
deux, par exemple 101 et 111, cest--dire 5 et 7.
On commence, comme en base dix, par ajouter les chiffres des units et
la retenue, 1, 1 et 0. La table de laddition indique que la somme de ces
deux chiffres est 10 ; on pose le chiffre des units, 0, et on retient le
chiffre des deuzaines, 1. On ajoute ensuite les chiffres des deuzaines et
cette retenue, 0, 1 et 1. La table de laddition indique que la somme de
ces trois chiffres est 10 ; on pose le chiffre des units, 0, et on retient le
chiffre des deuzaines, 1. On ajoute ensuite les chiffres des quatraines et
cette retenue, 1, 1 et 1. La table de laddition indique que la somme de
ces trois chiffres est 11 ; on pose le chiffre des units, 1, et on retient le
chiffre des deuzaines, 1. Finalement, on pose cette retenue dans la
colonne des huitaines. Le rsultat est donc 1100, cest--dire 12.
Cette mthode utilise une table qui indique la somme de chacun des tri-
plets (a ; b ; c) o a, b et c sont des chiffres compris entre 0 et 1. Cette
table ne contient donc que huit lignes :
a b c a + b + c
0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 10
1 0 0 1
1 0 1 10
1 1 0 10
1 1 1 11
ManuelDowek.book Page 231 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
232
En fait, cette mthode se formule mieux en utilisant deux tables. La pre-
mire indique le chiffre des units de a + b + c :
La seconde indique le chiffre des deuzaines de a + b + c :
Il sagit l des tables de deux fonctions boolennes trois arguments.
Comme toutes les fonctions boolennes, elles peuvent sexprimer avec
les fonctions non, et et ou (voir le chapitre 10). Une manire, parmi
dautres, de les exprimer est la suivante :
Pour se convaincre de la correction de ces expressions, il suffit de vrifier
quelles donnent bien les chiffres des units et des deuzaines de a + b + c
dans chacun des huit cas des tables prcdentes. Par exemple, dans le cas
a = 0, b = 1 et c = 1, lexpression a et non(b) et non(c) prend la valeur 0, les
expressions non(a) et b et non(c), non(a) et non(b) et c et a et b et c pren-
nent elles aussi la valeur 0 et donc lexpression (a et non(b) et non(c)) ou
(non(a) et b et non(c)) ou (non(a) et non(b) et c) ou (a et b et c) prend la
a b c Units de a + b + c
0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 0
1 1 1 1
a b c Deuzaines de a + b + c
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1
units(a,b,c)
= (a et non(b) et non(c)) ou (non(a) et b et non(c))
ou (non(a) et non(b) et c) ou (a et b et c)
deuzaines(a,b,c) = (a et b) ou (b et c) ou (a et c)
ManuelDowek.book Page 232 Monday, July 9, 2012 4:58 PM
18 Ajouter deux nombres exprims en base deux
Groupe Eyrolles, 2012
233
valeur 0 galement, ce qui est bien le chiffre des units de a + b + c. De
mme, les expressions a et b, b et c et a et c prennent respectivement les
valeurs 0, 1 et 0 et donc lexpression (a et b) ou (b et c) ou (a et c) prend la
valeur 1, ce qui est bien le chiffre des deuzaines de a + b + c.
On peut, par exemple, programmer cette mthode pour ajouter deux
nombres de dix chiffres binaires. Le rsultat sera donc un nombre de
onze chiffres. On choisit de reprsenter les nombres ajouter x et y par
deux tableaux de boolens de dix cases n et p, et le rsultat par un tableau
de boolens r de 11 cases. On choisit le boolen true pour le chiffre 1 et
le boolen false pour le chiffre 0. La case 0 dun tableau contient le
chiffre des units du nombre reprsent, la case 1 le chiffre des deu-
zaines et la case 9, le chiffre des cinq-cent-douzaines. Le rsultat r qui
a un chiffre de plus a aussi une case 10 pour les mille-vingt-quatraines.
La retenue c est dabord initialise 0 (). Puis on calcule les chiffres du
rsultat lun aprs lautre par une boucle dont lindice i varie de 0 9.
chaque tape, on dfinit le chiffre a comme le i-me chiffre du
nombre n () et b comme le i-me chiffre du nombre p (), puis on
affecte la case i du tableau r () avec le chiffre des units de a + b + c.
Enfin, on affecte la retenue c avec le chiffre des deuzaines de
a + b + c (). Et une fois la boucle termine, on affecte la case 10 du
tableau r avec la dernire des retenues ().
Exercice 18.1
On utilise ce programme pour ajouter les nombres x = 1011001101 et
y = 1101101011. Excuter linstruction c = false; linitialisation de la
variable i et le tour 0 de la boucle revient excuter la squence daffecta-
tions suivante :
Si on excute cette squence dans ltat , la premire affectation
c = false; donne ltat .
c = false;
for (i = 0; i <= 9; i = i + 1) {
a = n[i];
b = p[i];
r[i] = (a && !b && !c) || (!a && b && !c) || (!a && !b && c)
|| (a && b && c);
c = (a && b) || (b && c) || (a && c);}
r[10] = c;
c = false;
i = 0;
a = n[0];
b = p[0];
r[0] = (a && !b && !c) || (!a && b && !c) || (!a && !b && c)
|| (a && b && c);
c = (a && b) || (b && c) || (a && c);
i = i + 1;
ManuelDowek.book Page 233 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
234
Dessiner les tats successifs produits par lexcution de chacune de ces affecta-
tions. Quel est ltat final produit par lexcution du tour 0 de la boucle ?
Montrer que dans cet tat :
excuter le tour 1 de la boucle revient excuter la squence daffectations
suivante :
Quel est ltat produit par lexcution de ce tour de boucle ?

(r[0] 2
0
) + c 2
1
= (n[0] 2
0
) + (p[0] 2
0
)
a = n[1];
b = p[1];
r[1] = (a && !b && !c) || (!a && b && !c) || (!a && !b && c)
|| (a && b && c);
c = (a && b) || (b && c) || (a && c);
i = i + 1;
ManuelDowek.book Page 234 Monday, July 9, 2012 4:58 PM
18 Ajouter deux nombres exprims en base deux
Groupe Eyrolles, 2012
235
Montrer que dans cet tat :
La dmonstration de
correction du programme
Quand on conoit un tel programme, une question se pose
naturellement : comment sait-on quil calcule la somme des deux nom-
bres entiers ?
Une premire manire de sassurer quun programme fait bien ce quon
attend de lui est de le tester (voir le chapitre 1). Il faut essayer diffrentes
valeurs pour les nombres x et y et vrifier que le programme affiche bien la
valeur x + y dans tous les cas. On estime, en gnral, que le cot du test
dun programme est du mme ordre de grandeur que celui de son dvelop-
pement. Cependant, le test prsente deux limites importantes : la premire
est que lon ne peut pas tester le programme sur toutes les valeurs dentre
possibles, qui sont souvent trs nombreuses, voire en nombre infini. La
seconde est que pour tester un programme, il faut savoir ce que lon attend
de lui. Or, ce nest pas le cas quand on crit, par exemple, un programme
qui calcule la millime dcimale du nombre , ou la position de la Lune
dans mille ans, car la raison pour laquelle on crit un tel programme est
prcisment que lon ignore la millime dcimale du nombre ou la posi-
tion de la Lune dans mille ans. De ce fait, comment le tester ?
Une autre manire de sassurer quun programme fait bien ce quon
attend de lui est de le dmontrer. Par exemple, on peut dmontrer que le
programme prcdent calcule bien la somme des nombres x et y. Plus
prcisment, on veut dmontrer que si, au moment o lon excute ce
programme, les tableaux n et p contiennent la reprsentation binaire de
deux entiers de dix chiffres, cest--dire si :
et :
(r[0] 2
0
+ r[1] 2
1
) + c 2
2
= (n[0] 2
0
+ n[1] 2
1
) + (p[0] 2
0
+ p[1] 2
1
)
x = n[0] 2
0
+ n[1] 2
1
+ + n[8] 2
8
+ n[9] 2
9
y = p[0] 2
0
+ p[1] 2
1
+ + p[8] 2
8
+ p[9] 2
9
ManuelDowek.book Page 235 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
236
alors la fin de lexcution de ce programme, le tableau r contient un
nombre de onze chiffres qui est la reprsentation binaire de x + y, cest-
-dire que :
Le programme qui ajoute deux nombres exprims en binaire est form
dune boucle, dans laquelle on calcule dabord le chiffre des units, puis
les chiffres des deuzaines, des quatraines, etc. du rsultat. Aprs avoir
achev les tours 0, i - 1 et au moment de commencer le tour i, on a
donc calcul la somme des deux nombres forms des i - 1 premiers
chiffres, en partant de la droite, des nombres x et y. Cest linvariant que
lon va montrer par rcurrence. la fin de la boucle, linvariant indiquera
que lalgorithme a effectu laddition souhaite.
Par exemple, si au cours de laddition de x = 1011001101 et
y = 1101101011 () on sarrte aprs avoir effectu les tours 0 et 1 de la
boucle et avant de commencer le tour 2, on a dj calcul la somme des
nombres 01 et 11, cest--dire 1 et 3 . Le rsultat de cette addition
nest pas exactement le nombre reprsent par les deux chiffres dj
poss 00, car il faut tenir compte de la retenue. La proprit exacte est
que si on pose la retenue dans la colonne i, ce qui donne dans cet
exemple le nombre 100 cest--dire 4, on obtient la somme des deux
nombres forms des i - 1 premiers chiffres des nombres x et y.
Autrement dit, au moment de commencer le tour i de la boucle, ltat
vrifie la proprit :
On dmontre maintenant cette proprit.
la premire excution, i = 0, la somme (r[0] 2
0
+ + r[i-1] 2
i-1
) ne
contient aucun terme ; elle vaut donc 0. Il en est de mme pour les sommes
(n[0] 2
0
+ + n[i-1] 2
i-1
) et (p[0] 2
0
+ + p[i-1] 2
i-1
).
Comme par ailleurs, la retenue c vaut 0, les deux membres de lgalit sont
nuls.
x + y = r[0] 2
0
+ r[1] 2
1
+ + r[9] 2
9
+ r[10] 2
10
.
T Invariant
Un invariant dune boucle est une proprit qui
est vrifie chaque excution du corps de cette
boucle. En gnral, pour la dernire excution,
cette proprit traduit le fait que la boucle ralise
bien la tche souhaite. On montre quune pro-
prit est un invariant dune boucle par un raison-
nement par rcurrence :
on montre que la proprit est vrifie la pre-
mire excution du corps de la boucle,
on montre que si linvariant est vrifi une
excution donne du corps de la boucle, il est
encore vrifi lexcution suivante.
Linvariant est alors vrifi la fin de boucle, qui
fournit donc le rsultat attendu.

(r[0] 2
0
+ + r[i-1] 2
i-1
) + c 2
i
= (n[0] 2
0
+ + n[i-1] 2
i-1
) + (p[0] 2
0
+ + p[i-1] 2
i-1
)
ManuelDowek.book Page 236 Monday, July 9, 2012 4:58 PM
18 Ajouter deux nombres exprims en base deux
Groupe Eyrolles, 2012
237
On suppose maintenant que cette proprit est vrifie dans ltat dans lequel
sexcute le tour i de la boucle et on veut montrer quelle est encore vrifie
dans ltat dans lequel sexcute le tour suivant. Au dbut du tour i, on a :
et donc en ajoutant n[i] 2
i
+ p[i] 2
i
dans les deux membres de
lgalit on obtient que, au dbut du tour i de la boucle :
Au cours de ce tour de la boucle, on ajoute les trois chiffres n[i], p[i]
et c, et le rsultat de cette addition a pour chiffre des units r[i] et pour
chiffre des deuzaines la nouvelle valeur de c, si bien que, dans ltat
atteint la fin de ce tour de la boucle :
cest--dire :
Au dbut du tour suivant, la variable i a t augmente de 1, si bien que :
La proprit est donc encore vrifie au dbut du tour suivant. Elle est
donc vrifie chacun des tours de boucles : cest un invariant de la boucle.
la fin du dernier tour, i est gal 10 et donc :
On affecte alors la case 10 du tableau r avec la retenue si bien que, quand
lexcution est termine :
Cest ce quil fallait dmontrer : le tableau r contient la reprsentation
binaire du nombre x + y.
(r[0] 2
0
+ + r[i-1] 2
i-1
) + c 2
i
= (n[0] 2
0
+ + n[i-1] 2
i-1
) + (p[0] 2
0
+ + p[i-1] 2
i-1
)
(r[0] 2
0
+ + r[i-1] 2
i-1
) + (n[i] + p[i] + c) 2
i
= (n[0] 2
0
+ + n[i] 2
i
) + (p[0] + + p[i] 2
i
)
(r[0] 2
0
+ + r[i-1] 2
i-1
) + (r[i] + 2 c) 2
i
= (n[0] 2
0
+ + n[i] 2
i
) + (p[0] 2
0
+ + p[i] 2
i
)
(r[0] 2
0
+ + r[i] 2
i
) + c 2
i+1
= (n[0] 2
0
+ + n[i] 2
i
) + (p[0] 2
0
+ + p[i] 2
i
)
(r[0] 2
0
+ + r[i-1] 2
i-1
) + c 2
i
= (n[0] 2
0
+ + n[i-1] 2
i-1
) + (p[0] 2
0
+ + p[i-1] 2
i-1
)
(r[0] 2
0
+ + r[9] 2
9
) + c 2
10
= (n[0] 2
0
+ + n[9] 2
9
) + (p[0] 2
0
+ + p[9] 2
9
)
= x + y
r[0] 2
0
+ + r[10] 2
10
= x + y
ManuelDowek.book Page 237 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
238
ALLER PLUS LOIN Lautonomie de la notion dalgorithme
Dans ce chapitre, nous avons tudi un programme,
crit en Java, qui additionne deux nombres crits en
base deux. Il est possible dcrire des programmes trs
similaires dans dautres langages de programmation. La
mthode pour ajouter deux nombres en base deux est
indpendante dun langage de programmation
particulier : cest une mthode abstraite qui peut
sexprimer dans divers langages. Une telle mthode sys-
tmatique qui permet de rsoudre un problme
sappelle un algorithme. Il est important de distinguer
un algorithme, mthode indpendante de tout langage,
dun programme, qui est lincarnation dun algorithme
dans un langage particulier.
Cette distinction entre les notions dalgorithme et de
programme doit galement son importance au fait que
nous ayons utilis des algorithmes pour faire des addi-
tions dans diverses bases depuis des millnaires, bien
avant que nous ayons pens exprimer cet algorithme
dans un langage de programmation. Nous avons mme
utilis des algorithmes, transmis de gnration en gn-
ration par observation et imitation, pour fabriquer des
objets en cramique, tisser des toffes, nouer des cor-
dages, prparer les aliments, etc. avant linvention de
lcriture.
ALLER PLUS LOIN Dfinitions algorithmiques et non algorithmiques
Lapprentissage des mathmatiques commence par
lapprentissage dalgorithmes qui permettent deffec-
tuer des additions, des soustractions, etc.
Mme au-del de ces mathmatiques lmentaires,
beaucoup de dfinitions mathmatiques sont algorith-
miques. Par exemple, la dfinition du nombre n - m
comme le nombre obtenu en mettant n cailloux dans un
sac, en en tant m et en comptant ceux qui restent est
algorithmique. Mais la dfinition du nombre n - m
comme le nombre p tel que p + m = n ne lest pas : con-
trairement la premire, cette dfinition ne dit pas ce
que lon doit faire pour connatre le nombre n - m
quand on connat les nombres n et m.
De mme, la dfinition selon laquelle deux vecteurs non
nuls du plan, donns par leurs coordonnes (x
1
; y
1
) et
(x
2
; y
2
) dans une base, sont colinaires quand
x
1
y
2
= x
2
y
1
est algorithmique, mais pas celle selon
laquelle ces deux vecteurs sont colinaires sil existe un
facteur de proportion k tel que x
1
= k x
2
et y
1
= k y
2
. Si
deux vecteurs sont donns par leurs coordonnes dans
une base, par exemple (4 ; 10) et (6 ; 15), la premire
dfinition donne une mthode pour dterminer sils
sont colinaires, puisquil suffit de calculer 4 15 et
10 6 et de vrifier que lon obtient bien le mme
nombre dans les deux cas, mais pas la seconde, qui
demande de trouver le facteur de proportion, sans indi-
quer de mthode pour le faire.
Ai-je bien compris ?
En quelles bases lalgorithme de laddition peut-il tre utilis ?
Que veut-on dire lorsquon affirme que lalgorithme de laddition est correct ?
Quest-ce quun invariant ?
ManuelDowek.book Page 238 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
19 Dessiner
Ivan Sutherland (1938-) est un des
pionniers de linformatique gra-
phique. Il est lauteur du logiciel Sket-
chpad (1963) qui est lun des premiers
logiciels de conception assiste par
ordinateur. Ivan Sutherland a aussi
t lorigine de lun des premiers
systmes de ralit virtuelle muni
dun visiocasque. Il est lun des pion-
niers des architectures dordinateurs
spcialises pour le temps rel et le
graphisme.
Ou comment devenir Botticelli sans se tacher
les doigts.
Dans ce chapitre, nous voyons comment programmer un
ordinateur pour dessiner ou modifier une image sans utiliser
un logiciel de retouche photo ! Nous voyons comment ouvrir
une fentre graphique, crer une image, dessiner en trois
dimensions, lire et produire des fichiers contenant des images,
transformer des images.
ManuelDowek.book Page 239 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
240
Dessiner dans une fentre
Deux instructions permettent douvrir une fentre graphique (cest--dire
une fentre dans laquelle on peut dessiner) et dy dessiner un pixel.
Excuter linstruction Isn.initDrawing("Mon premier dessin",x,y,largeur,
hauteur); a pour effet douvrir une fentre de largeur pixels de large, sur
hauteur pixels de haut, qui porte le nom Mon premier dessin et dont le
coin en haut gauche est au pixel de coordonnes (x ; y) de lcran.
Excuter linstruction Isn.drawPixel(x,y,rouge,vert,bleu); a pour effet de
dessiner un pixel dans la x-me colonne et la y-me ligne de cette fentre,
dont la couleur est dcrite par les nombres rouge, vert et bleu (voir le
chapitre 9). La coordonne x varie entre 0 et largeur - 1 et la coordonne y
entre 0 et hauteur - 1. Les nombres rouge, vert et bleu varient entre 0 et 255.
Exercice 19.1 (avec corrig)
Dans une fentre de 400 pixels sur 400 pixels, dessiner un carr rouge form
des points dont labscisse est comprise entre 100 et 250 et lordonne comprise
entre 50 et 200.
Un pixel de coordonnes (x ; y) appartient ce carr si et seulement si
100 <= x && x <= 250 && 50 <= y && y <= 200. On obtient donc le
programme :
Dans ce cas, il nest cependant pas ncessaire de balayer toute la fentre gra-
phique et un autre programme possible est :
ATTENTION Axe vertical
De mme que les Anglais roulent gauche,
laxe vertical, en gomtrie algorithmique, est
orient vers le bas.
SAVOIR-FAIRE Crer une image
1 tablir une condition sur les coordonnes dun pixel qui permette de dcider sil
appartient ou non la figure tracer.
2 crire une instruction qui balaye la fentre graphique, au moyen de deux boucles
imbriques, lune sur les abscisses et lautre sur les ordonnes.
3 Dans le corps de la boucle la plus interne, affecter la couleur approprie chaque pixel,
selon quil appartient ou non la figure.
Isn.initDrawing("Carr rouge",10,10,400,400);
for (x = 0; x <= 399; x = x + 1) {
for (y = 0; y <= 399; y = y + 1) {
if (100 <= x && x <= 250 && 50 <= y && y <= 200) {
Isn.drawPixel(x,y,255,0,0);}}}
Isn.initDrawing("Carr rouge",10,10,400,400);
for (x = 100; x <= 250; x = x + 1) {
for (y = 50; y <= 200; y = y + 1) {
Isn.drawPixel(x,y,255,0,0);}}
ManuelDowek.book Page 240 Monday, July 9, 2012 4:58 PM
19 Dessiner
Groupe Eyrolles, 2012
241
Exercice 19.2
crire un programme qui dessine ce mme carr mais sans le remplir.
Exercice 19.3
crire un programme qui dessine un disque de centre (a ; b) et de rayon r

.
Exercice 19.4
Tracer un segment pixel par pixel est facile quand ce segment est horizontal
ou vertical, mais cela est un peu plus difficile quand il est oblique. Pour tracer
un segment qui va du point (x ; y) au point (x ; y) quand |y - y| |x - x|, cest-
-dire quand le segment est plutt horizontal, on cherche dessiner un pixel
dans chaque colonne dabscisse comprise entre x et x.
Dterminer une quation cartsienne de la droite passant par les points de
coordonnes (x ; y) et (x ; y).
En supposant que x x, montrer que le point de la droite dabscisse X a
pour ordonne y + (X - x)(y - y) / (x - x). Dans la pratique, pour dessiner
effectivement le pixel, ce nombre sera arrondi lentier le plus proche.
crire un programme qui trace ainsi un segment de type plutt
horizontal . On prendra soin de prvoir le cas o x x.
De mme, quand le segment est plutt vertical, cest--dire quand |x -
x| |y - y|, on cherche dessiner un pixel dans chaque ligne dordonne
comprise entre y et y. Dterminer labscisse du point de la droite dont
lordonne est y et complter lalgorithme pour le cas des segments plutt
verticaux.
Rechercher sur le Web ce quest lalgorithme de Bresenham et comment il
amliore celui que lon vient de construire.
Exercice 19.5
Tracer un cercle de centre (a ; b) et de rayon r en balayant les abscisses x de a - r
a + r et en calculant les valeurs de y partir de lquation (x - a)
2
+ (y - b)
2
= r
2
.
Mme question en balayant les ordonnes. Comment viter les discontinuits ?
Exercice 19.6
Tracer, pour t variant de 0 10 000, la courbe dfinie par
x(t) = 256 + 250 cos(0,0015 t) et y(t) = 256 + 250 sin(kt), avec k = 0,0045, ceci
dans une fentre de 512 pixels sur 512 pixels. Cest une courbe de Lissajous.
Faire varier k de 0,0015 0,0090 et explorer les diffrentes courbes obtenues.
Dautres instructions dessinent des segments, des cercles et des disques, sans
avoir le faire pixel par pixel.
Linstruction Isn.drawLine(x1,y1,x2,y2,rouge,vert,bleu); trace un segment,
de couleur rouge, vert, bleu, qui va du point (x1 ; y1) au point (x2 ; y2).
Linstruction Isn.drawCircle(x,y,rho,rouge,vert,bleu); trace un cercle, de
couleur rouge, vert, bleu, de centre (x ; y) et de rayon rho.
Linstruction Isn.paintCircle(x,y,rho,rouge,vert,bleu); trace un disque, de
couleur rouge, vert, bleu, de centre (x ; y) et de rayon rho.
ManuelDowek.book Page 241 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
242
Dessiner en trois
dimensions
Les mthodes que lon utilise aujourdhui pour dessiner des images en
trois dimensions remontent la Renaissance quand, bien avant que les
ordinateurs existent, les peintres ont commenc mettre au point diff-
rentes mthodes de reprsentation de lespace en perspective et les uti-
liser dans leurs tableaux. Ces peintres sont finalement arrivs une
conclusion qui, en langage moderne, sexprime assez simplement : un
point de lespace de coordonnes (x ; y ; z) o laxe des x va de gauche
droite, laxe des y de bas en haut et celui des z de proche loin, doit tre
reprsent sur un tableau par un point de coordonnes X = x / z et Y = y /
z. Par exemple, le point de coordonnes (0 ; 1 ; 2) est reprsent sur le
tableau par le point de coordonnes (0 ; 1/2). Dans ce systme de repr-
sentation, la coordonne z doit toujours tre strictement positive : les
points dont la coordonne z est ngative correspondent aux points de
lespace qui sont dans le dos du peintre et quil ne reprsente donc pas.
Les points de coordonnes (0 ; 0 ; 1) et (0 ; 1 ; 1), qui sont une
distance 1 dans lespace, sont reprsents par deux points (0 ; 0) et (0 ; 1),
qui sont aussi une distance 1 sur le tableau. En revanche, les points de
coordonnes (0 ; 0 ; 2) et (0 ; 1 ; 2) qui sont aussi une distance 1 dans
lespace, sont reprsents par deux points (0 ; 0) et (0 ; 1/2), qui sont
une distance 1/2 sur le tableau : plus un objet est loin, plus sa reprsenta-
tion sur le tableau est petite.
Si lon veut maintenant reprsenter un tableau o les points sont reprs
par des coordonnes (X ; Y) qui varient entre -1 et 1 dans une fentre
ALLER PLUS LOIN Taille du tableau
La taille du tableau est dtermine par la partie de lespace que lon
veut reprsenter. Si lon dcide, par exemple, que x et y varient entre -1
et 1 et z entre 1 et linfini, alors les coordonnes sur le tableau varient
entre -1 et 1 : un objet peut tre lextrieur du tableau parce quil est
trop gauche, trop droite, trop en haut, trop en bas ou trop prs, mais
pas parce quil est trop loin. Cela est souvent rappel dans les tableaux
de la Renaissance : quand le peintre reprsente une scne qui se passe
dans une pice, il laisse souvent une porte ou une fentre ouverte sur
une petite scne beaucoup plus loin. Cest, par exemple, le cas de cette
Annonciation de Botticelli.
ManuelDowek.book Page 242 Monday, July 9, 2012 4:58 PM
19 Dessiner
Groupe Eyrolles, 2012
243
graphique o les points sont reprs par des coordonnes (i ; j) qui
varient entre 0 et 399, il faut faire un changement de repre et repr-
senter le point du tableau de coordonnes (X ; Y) par le pixel de coor-
donnes i = 200 + 200 X et j = 200 - 200 Y. Le signe - est d au fait que
laxe vertical est orient vers le haut dans le tableau et vers le bas dans la
fentre graphique. Au bout du compte, le point de lespace de coordon-
nes (x ; y ; z) est reprsent par le pixel de coordonnes
i = 200 + 200 x / z et j = 200 - 200 y / z.
Par exemple, on dessine le cube dont une face ABCD est dans le plan
z = 2 et une autre face ABCD est plus loin, dans le plan z = 4 :
A = (-1 ; -1 ; 2), B = (-1 ; 1 ; 2), C = (1 ; 1 ; 2), D = (1 ; -1 ; 2) ;
A = (-1 ; -1 ; 4), B = (-1 ; 1 ; 4), C = (1 ; 1 ; 4), D = (1 ; -1 ; 4).
On commence par calculer les coordonnes des pixels reprsentant
chacun de ces points en utilisant les formules i = 200 + 200 x / z et
j = 200 - 200 y / z :
A : (100 ; 300), B : (100 ; 100), C : (300 ; 100), D : (300 ; 300) ;
A : (150 ; 250), B : (150 ; 150), C : (250 ; 150), D : (250 ; 250).
Il ne reste plus qu tracer les quatre segments de la premire face ([AB],
[BC], [CD] et [DA]), les quatre de la seconde ([AB], [BC], [CD] et
[DA]) et les quatre qui relient chaque sommet dune face au sommet
homologue de lautre ([AA], [BB], [CC], [DD]).
On obtient alors limage o la face du cube la plus proche est repr-
sente par le grand carr, la face la plus lointaine par le petit carr et les
quatre autres par des trapzes. Dans ce dessin, on suppose que la face
antrieure du cube est transparente, si bien que lon voit lintrieur du
cube. Si on lavait suppose opaque, il aurait fallu ne pas dessiner la
partie du dessin cache par cette face.
// Face avant
Isn.drawLine(100,300,100,100,0,0,0);
Isn.drawLine(100,100,300,100,0,0,0);
Isn.drawLine(300,100,300,300,0,0,0);
Isn.drawLine(300,300,100,300,0,0,0);
// Face arrire
Isn.drawLine(150,250,150,150,0,0,0);
Isn.drawLine(150,150,250,150,0,0,0);
Isn.drawLine(250,150,250,250,0,0,0);
Isn.drawLine(250,250,150,250,0,0,0);
// Artes fuyantes
Isn.drawLine(100,300,150,250,0,0,0);
Isn.drawLine(100,100,150,150,0,0,0);
Isn.drawLine(300,100,250,150,0,0,0);
Isn.drawLine(300,300,250,250,0,0,0);

ManuelDowek.book Page 243 Monday, July 9, 2012 4:58 PM


Quatrime partie Algorithmes
Groupe Eyrolles, 2012
244
On peut imaginer que ce cube reprsente une pice : la face infrieure est
le sol, la face suprieure est le plafond et les trois faces verticales, repr-
sentes par les deux trapzes latraux et le petit carr sont les murs. Le
quatrime mur est suppos ouvert, ou transparent, ou derrire le peintre,
afin que lon puisse voir lintrieur de la pice.
On peint maintenant chacune de ces faces. On peut commencer par
peindre les murs latraux en ambre jaune (r = 240, v = 195, b = 0). Il faut
pour cela colorier tous les pixels contenus lintrieur du trapze : lcri-
ture des deux boucles imbriques est alors un peu plus complexe que
pour le carr rouge prcdent, car toutes les colonnes du trapze nont
pas la mme hauteur. Pour traduire cela, les bornes entre lesquelles
lordonne j des pixels colorier varie dpendront de labscisse i : on
retrouve ici les quations, j = i et j = 400 i, des droites qui reprsentent
les artes fuyantes du cube.
On peint de mme le plafond en jaune bouton dor (r = 246, v = 220,
b = 18). Cette fois, le trapze a ses bases horizontales. Cest donc
lordonne j qui est choisie en premier dans la boucle externe, et les
bornes de labscisse i qui dpendent de j :
On obtient ainsi limage .
On peut dessiner un carrelage sur le sol de la pice que lon vient de des-
siner, cest--dire la face infrieure du cube. Un point de coordonnes
(x ; -1 ; z) de cette face infrieure est reprsent par un pixel de la fentre
graphique de coordonnes i = 200 + 200 x / z et j = 200 + 200 / z.
Rciproquement, le pixel de coordonnes (i ; j) reprsente le point de
coordonnes x = (i - 200) / (j - 200), y = -1, z = 200 / (j - 200).
La coordonne x varie entre -1 et 1 et la coordonne z entre 2 et 4. Si on
lon dcoupe ce rectangle en 400 dalles carres de 0,1 de cot, le point de
coordonnes (i ; j) appartient la dalle situe dans la colonne [10 ((i -
200) / (j - 200) + 1)], o [x] est la partie entire de x, cest--dire
[10 (i + j - 400) / (j - 200)], et dans la ligne [10 (200 / (j - 200) - 2)],
cest--dire [10 (600 - 2 j) / (j - 200)].
for (i = 100; i <= 150; i = i + 1) {
for (j = i; j <= 400 i; j = j + 1) {
Isn.drawPixel(i,j,240,195,0);}}
for (i = 250; i <= 300; i = i + 1) {
for (j = 400 i; j <= i; j = j + 1) {
Isn.drawPixel(i,j,240,195,0);}}
for (j = 100; j <= 150; j = j + 1) {
for (i = j; i <= 400 j; i = i + 1) {
Isn.drawPixel(i,j,246,220,18);}}

REMARQUE Carrelages et perspective


Les peintres de la Renaissance peignaient sou-
vent des carrelages, comme Botticelli dans son
Annonciation, car les carrelages sont faciles
reprsenter et ils soulignent la perspective.
ManuelDowek.book Page 244 Monday, July 9, 2012 4:58 PM
19 Dessiner
Groupe Eyrolles, 2012
245
Pour construire un carrelage en damier, il suffit de choisir une couleur pour
les dalles dont la somme des numros de ligne et de colonne est paire et une
autre pour celles dont la somme est impaire. Il faut donc dessiner le pixel
(i ; j) dune couleur si [10 (i + j - 400) / (j - 200)] + [10 (600 - 2 j) / (j -
200)] est pair et dune autre couleur quand ce nombre est impair :
En alternant des dalles alezan (r = 167, v = 103, b = 38) et jaunes
(r = 255, v = 255, b = 0), on obtient limage . Il ne reste plus qu
peindre le mur du fond en beurre frais (r = 255, v = 244, b = 141), en
laissant, comme les peintres de la Renaissance, une fentre ouverte sur le
ciel bleu ciel (r = 119, v = 181, b = 254) :
pour terminer limage et obtenir .
Exercice 19.7
On considre un repre (O; i; j; k) tel que lil du peintre soit en O et le
tableau soit dans le plan z = 1. Soit un point A de coordonnes (x ; y ; z).
Trouver une reprsentation paramtrique de la droite (AO) support du rayon
lumineux qui va du point A lil du peintre. On reprsente ce point A sur le
tableau par le point A intersection de cette droite avec le plan du tableau
z = 1. Montrer que les coordonnes du point A sont (x / z , y / z , 1).
Produire un fichier
au format PPM
Si au lieu de dessiner cette image dans une fentre graphique, on veut
lenregistrer dans un fichier, par exemple au format PPM (voir le
chapitre 9), afin de pouvoir linclure dans une page web ou lattacher un
for (j = 250; j <= 300; j = j + 1) {
for (i = 400 j; i <= j; i = i + 1) {
if ((10 * (i + j 400) / (j 200) + 10 * (600 2*j)
/ (j 200))%2 == 0) {
Isn.drawPixel(i,j,167,103,38);}
else {
Isn.drawPixel(i,j,255,255,0);}}}
for (i = 150; i <= 250; i = i + 1) {
for (j = 150; j <= 250; j = j + 1) {
if (160 <= i && i <= 210 && 160 <= j && j <= 220) {
Isn.drawPixel(i,j,119,181,254);}
else {
Isn.drawPixel(i,j,255,244,141);}}}

ManuelDowek.book Page 245 Monday, July 9, 2012 4:58 PM


Quatrime partie Algorithmes
Groupe Eyrolles, 2012
246
courrier, on doit dabord reprsenter cette image dans un tableau, au sens
que lon a donn ce mot au chapitre 3, puis produire un fichier au format
PPM partir de ce tableau. Pour reprsenter une image en niveaux de gris,
il suffit dutiliser un tableau bidimensionnel t, dont la case t[i][j] con-
tient la valeur du pixel de coordonnes (i ; j). Pour reprsenter une image
en couleurs, on utilise trois tableaux bidimensionnels rouge, vert et bleu,
les cases rouge[i][j], vert[i][j] et bleu[i][j] contenant les trois compo-
santes de la couleur du pixel de coordonnes (i ; j).
On peut alors transformer le programme prcdent en remplaant toutes
les instructions Isn.drawPixel(i,j,r,v,b); par
Par exemple, le dessin du carrelage scrit dsormais :
Une fois le dessin termin, on peut lenregistrer au format PPM, qui est
un fichier texte de la forme ci-contre.
La premire ligne contient les caractres P3 pour indiquer que cest un fichier
au format PPM, la deuxime est un commentaire, la troisime la largeur de
limage, la quatrime sa hauteur, la cinquime la valeur 255 pour indiquer
que les valeurs des pixels vont de 0 255, puis sur les lignes suivantes les trois
valeurs rouge, vert et bleu en numrant les pixels de gauche droite et de
haut en bas. Le programme qui cre un tel fichier scrit :
rouge[i][j] = r;
vert[i][j] = v;
bleu[i][j] = b;
for (j = 250; j <= 300; j = j + 1) {
for (i = 400 j; i <= j; i = i + 1) {
if ((10 * (i + j 400) / (j 200) + 10 * (600 2*j)
/ (j 200))%2 == 0) {
rouge[i][j] = 167;
vert[i][j] = 103;
bleu[i][j] = 38;}
else {
rouge[i][j] = 255;
vert[i][j] = 255;
bleu[i][j] = 0;}}}
fichier = Isn.openOut("botticelli.ppm");
Isn.printlnToFile(fichier,"P3");
Isn.printlnToFile(fichier,"#");
Isn.printlnToFile(fichier,400);
Isn.printlnToFile(fichier,400);
Isn.printlnToFile(fichier,255);
for (j = 0; j <= 399; j = j + 1) {
for (i = 0; i <= 399; i = i + 1) {
Isn.printlnToFile(fichier,rouge[i][j]);
Un fichier PPM
P3
#
400
400
255
rouge[0][0]
vert[0][0]
bleu[0][0]
rouge[1][0]
vert[1][0]
bleu[1][0]

ManuelDowek.book Page 246 Monday, July 9, 2012 4:58 PM


19 Dessiner
Groupe Eyrolles, 2012
247
Lire un fichier au format
PPM
Inversement, on peut crire un programme qui lit un fichier au format
PGM ou PPM dans un tableau ou dans trois, selon que limage est en
niveaux de gris ou en couleurs.
La seule difficult, pour lire un tel fichier, est due au fait quil est possible
dinsrer des commentaires dans un fichier au format PGM ou PPM,
cest--dire des lignes qui commencent par le caractre # et qui doivent
tre ignores. En pratique cependant, les fichiers au format PGM et
PPM nont gnralement quun seul commentaire, la deuxime ligne.
On se limite donc des fichiers de cette forme si bien que les fichiers
PGM que lon lit sont de la forme suivante :
deux lignes qui peuvent tre ignores,
la largeur de limage, suivie dun retour la ligne ou dun espace,
la hauteur de limage, suivie dun retour la ligne ou dun espace,
la valeur maximale utilise pour exprimer les niveaux de gris, suivie
dun retour la ligne ou dun espace,
la liste des pixels, ligne par ligne, de haut en bas et de gauche droite,
spars par des retours la ligne ou des espaces.
On peut lire un tel fichier avec le programme suivant :
Isn.printlnToFile(fichier,vert[i][j]);
Isn.printlnToFile(fichier,bleu[i][j]);}}
Isn.closeOut(fichier);
fichier = Isn.openIn("maison.pgm");
s = Isn.readStringFromFile(fichier);
s = Isn.readStringFromFile(fichier);
largeur = Isn.readIntFromFile(fichier);
hauteur = Isn.readIntFromFile(fichier);
max = Isn.readIntFromFile(fichier);
gris = new int [largeur][hauteur];
for (j = 0; j <= hauteur - 1; j = j + 1) {
for (i = 0; i <= largeur - 1; i = i + 1) {
gris[i][j] = Isn.readIntFromFile(fichier);}}
Isn.closeIn(fichier);
P2
# une photo prise au Louvre
181
279
255
86
94
103

ManuelDowek.book Page 247 Monday, July 9, 2012 4:58 PM


Quatrime partie Algorithmes
Groupe Eyrolles, 2012
248
et ensuite afficher cette image dans une fentre :
La lecture et laffichage dune image en couleurs, au format PPM sont
similaires, sauf quil faut lire trois nombres pour chaque pixel et les
stocker dans trois tableaux : rouge, vert et bleu.
Transformer les images
Une fois une image reprsente dans un tableau, il est facile de la trans-
former. Par exemple, on peut inverser la quantit de chaque couleur :
ce qui transforme limage en limage .
Exercice 19.8 (avec corrig)
crire un programme qui transforme une image en couleurs en une image en
niveaux de gris.
Isn.initDrawing("Pgm",10,10,largeur,hauteur);
for (i = 0; i <= largeur - 1; i = i + 1) {
for (j = 0; j <= hauteur - 1; j = j + 1) {
valeurgris = gris[i][j] * 255 / max;
Isn.drawPixel(i,j,valeurgris,valeurgris,valeurgris);}}
for (j = 0; j <= hauteur - 1; j = j + 1) {
for (i = 0; i <= largeur - 1; i = i + 1) {
rougebis[i][j] = max rouge[i][j];
vertbis[i][j] = max vert[i][j];
bleubis[i][j] = max bleu[i][j];}}

SAVOIR-FAIRE Transformer une image en couleurs en une image
en niveaux de gris
On remplace chaque pixel de couleur r, v, b par un pixel dont le niveau de gris est la
moyenne des nombres r, v et b.
for (i = 0; i <= largeur - 1; i = i + 1) {
for (j = 0; j <= hauteur - 1; j = j + 1) {
gris[i][j] = (rouge[i][j] + bleu[i][j] + vert[i][j])/3;}}
ManuelDowek.book Page 248 Monday, July 9, 2012 4:58 PM
19 Dessiner
Groupe Eyrolles, 2012
249
Exercice 19.9
crire un programme qui transforme une image en couleurs en une image en
niveaux de gris, non pas en faisant la moyenne, mais en gardant un seul des
trois nombres r, v et b et en ignorant les autres. Comparer le rsultat obtenu
avec le rsultat de lexercice 19.8.
Exercice 19.10 (avec corrig)
crire un programme qui augmente le contraste dune image en se fixant
comme seuil la valeur max / 5.
Exercice 19.11
crire un programme qui augmente le contraste dune image en se fixant
comme seuil la valeur 4 max / 5. Ce programme est-il bien adapt pour les
images claires ou les images sombres ?
Exercice 19.12
partir dune image en niveaux de gris, produire les images suivantes.
SAVOIR-FAIRE Augmenter le contraste dune image en niveaux de gris
On fixe un seuil et on remplace tous les pixels plus clairs que ce seuil par un pixel blanc et
tous les pixels plus sombres que ce seuil par un pixel noir.
for (i = 0; i <= largeur - 1; i = i + 1) {
for (j = 0; j <= hauteur - 1; j = j + 1) {
if (gris[i][j] <= max/5) {
grisbis[i][j] = 0;}
else {
grisbis[i][j] = max;}}}
ManuelDowek.book Page 249 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
250
Exercice 19.13 (avec corrig)
crire un programme qui ajoute max / 4 tous les pixels dune image en
niveaux de gris, en remplaant les valeurs qui dpassent la valeur maximale
par la valeur maximale elle-mme.
Exercice 19.14
crire un programme qui augmente la luminance dune image en couleurs.
Exercice 19.15
crire un programme qui multiplie toutes les valeurs des pixels de limage par
un nombre g positif en remplaant les valeurs qui dpassent la valeur maxi-
male par la valeur maximale elle-mme. Ce programme modifie-t-il la lumi-
nance ou le contraste de limage ? Que se passe-t-il quand le coefficient
multiplicateur g est trs petit ? Et quand il est trs grand ? Au lieu de trans-
former la valeur v en g * v, la transformer en 128 + g * (v - 128), toujours
en gardant la mme valeur maximale et en remplaant les valeurs qui la
dpassent par la valeur maximale elle-mme, et celles qui dpassent 0 par 0.
Que se passe-t-il quand g est trs grand ?
Exercice 19.16
Prendre une photo sombre, par exemple avec un tlphone, et utiliser la
transformation qui v associe 255.0 * Math.pow(v / 255.0, gamma) avec
0 < gamma < 1. Que se passe-t-il ? quoi peut servir cette transformation ?
Exercice 19.17 (avec corrig)
crire un programme qui double la taille dune image en niveaux de gris, en
remplaant chaque pixel par un carr de deux pixels sur deux pixels du mme
niveau de gris.
SAVOIR-FAIRE Modifier la luminance dune image
On ajoute ou on retranche une constante la valeur de chacun des pixels.
diff = max / 4;
for (x = 0; x <= largeur - 1; x = x + 1) {
for (y = 0; y <= hauteur - 1; y = y + 1) {
grisbis[x][y] = Math.min(gris[x][y] + diff,max);}}
SAVOIR-FAIRE Changer la taille dune image
On calcule la nouvelle image pixel par pixel.
largeurbis = 2*largeur;
hauteurbis = 2*hauteur;
grisbis = new int [largeurbis][hauteurbis];
for (i = 0; i <= largeurbis - 1; i = i + 1) {
for (j = 0; j <= hauteurbis - 1; j = j + 1) {
grisbis[i][j] = gris[i/2][j/2];}}
ManuelDowek.book Page 250 Monday, July 9, 2012 4:58 PM
19 Dessiner
Groupe Eyrolles, 2012
251
Exercice 19.18
crire un programme qui divise la taille dune image par deux, en remplaant
chaque carr de deux pixels sur deux pixels par un pixel dont la couleur est la
moyenne de celles des quatre pixels quil remplace.
Exercice 19.19 (avec corrig)
crire un programme qui fusionne deux images en niveaux de gris. Attention
au cas o les images nont pas la mme taille ou nutilisent pas la mme valeur
maximale pour exprimer les niveaux de gris.
SAVOIR-FAIRE Fusionner deux images
On calcule la nouvelle image pixel par pixel, la valeur de chaque pixel tant le maximum
des valeurs des pixels correspondant dans chacune des images fusionner.
// Calcul des dimensions maximales des deux images
if (largeur1 >= largeur2) {
largeur3 = largeur1;}
else {
largeur3 = largeur2;}
if (hauteur1 >= hauteur2) {
hauteur3 = hauteur1;}
else {
hauteur3 = hauteur2;}
// Calcul du niveau de gris maximal
if (max1 >= max2) {
max3 = max1;}
else {
max3 = max2;}
// Calcul de l'image fusionne
gris3 = new int [largeur3][hauteur3];
for (j = 0; j <= hauteur3 - 1; j = j + 1) {
for (i = 0; i <= largeur3 - 1; i = i + 1) {
// Si un pixel est en dehors d'une image on lui affecte
// la valeur maximale
if (i < largeur1 && j < hauteur1) {
valeur1 = max3 * gris1[i][j] / max1;}
else {
valeur1 = max3;}
if (i < largeur2 && j < hauteur2) {
valeur2 = max3 * gris2[i][j] / max2;}
else {
valeur2 = max3;}
if (valeur1 < valeur2) {
gris3[i][j] = valeur1;}
else {
gris3[i][j] = valeur2;}}}
ManuelDowek.book Page 251 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
252
Exercice 19.20
quoi peut correspondre la soustraction de deux images en niveaux de gris,
cest--dire limage obtenue en soustrayant la valeur de chaque pixel de la
premire image la valeur du pixel correspondant de la seconde ? On sinspi-
rera du schma ci-aprs. Prendre deux photos dun objet sur une table en bou-
geant un peu lobjet entre les deux photos et calculer la valeur absolue de la
diffrence pixel pixel. Quelle peut tre une application de cet algorithme ?
Exercice 19.21 (avec corrig)
crire un programme qui lisse une image. Attention au fait que les pixels sur le
bord gauche de limage nont pas de pixel leur gauche, ceux du bord droit,
pas de pixel leur droite, etc.
Et si on rpte lopration plusieurs fois, limage sera de plus en plus lisse mais
aussi plus floue, comme illustr ici avec limage initiale gauche et limage
lisse droite en appliquant lopration prcdente 20 fois.
SAVOIR-FAIRE Lisser une image pour liminer ses petits dfauts
et en garder les grands traits
La valeur dun pixel de la nouvelle image est la moyenne des valeurs de ce pixel et des
pixels qui lentourent ( gauche, droite, au-dessus et en-dessous).
for (x = 0; x <= largeur - 1; x = x + 1) {
for (y = 0; y <= hauteur - 1; y = y + 1) {
grisbis[x][y] = (gris[x][y]
+ gris[Math.max(x - 1,0)][y]
+ gris[Math.min(x + 1,largeur - 1)][y]
+ gris[x][Math.max(y - 1,0)]
+ gris[x][Math.min(y + 1,hauteur - 1)])/5;}}
ManuelDowek.book Page 252 Monday, July 9, 2012 4:58 PM
19 Dessiner
Groupe Eyrolles, 2012
253
Il existe des algorithmes plus complexes qui, pour une image couleur, font la
moyenne sur les petites variations pour gommer les dtails les moins impor-
tants, mais pas sur les plus grands traits, permettant ainsi de bien les faire res-
sortir, on obtient alors de meilleurs rsultats.
Exercice 19.22
Considrer limage qui suit avec des valeurs de pixels entre 0 et 9. Remplacer la
valeur de chaque pixel par la moyenne des valeurs des pixels sa gauche et
sa droite. On arrondit la valeur entire la plus proche chaque fois. On
prendra 0 au bord de limage.
Dessiner le rsultat obtenu. On conomisera beaucoup de calculs en tenant
compte des symtries.
Exercice 19.23
Reprendre lexercice prcdent, mais en recommenant encore deux fois.
Commenter le rsultat obtenu. Que se passe-t-il si on recommence
indfiniment ?
Exercice 19.24
crire un programme qui extrait les contours dune image gris en niveaux de
gris. Pour cela, on fixe un seuil et on construit une image dont le pixel (i ; j) est
noir si lintensit varie fortement autour du pixel (i ; j) de gris, cest--dire si
Math.abs(gris[i+1][j] - gris[i][j]) + Math.abs(gris[i][j+1] - gris[i][j])
est suprieur au seuil fix, et blanc si ce nest pas le cas.
Exercice 19.25
Dessiner une image dau moins 200 pixels par 200 pixels, o la valeur de chaque
pixel est alatoire. Observer le rsultat obtenu : ny a-t-il pas quelques
rgularits ? Elles sont videmment dues au hasard : il faut se mfier de surinter-
prter un phnomne alatoire dans lequel on croit apercevoir des rgularits.
0000000000
0088888800
0880000880
0800000080
0800000080
0800000080
0800000080
0880000880
0088888800
0000000000
ManuelDowek.book Page 253 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
254
ALLER PLUS LOIN Comment sont dessines nos maisons ?
Les algorithmes gomtriques que lon a vus dans ce chapitre sont, bien
entendu, utiliss par lindustrie du dessin anim, mais ils sont galement
utiliss dans beaucoup dautres secteurs de lindustrie, pour la conception
assiste par ordinateur de voitures, de bateaux, davions, de btiments, etc.
Il y a encore quelques dizaines dannes, les architectes dessinaient la
main les plans des btiments quils concevaient la planche dessin sur
du papier calque. Effacer un trait demandait alors de gratter le papier
avec une lame de rasoir : il valait donc mieux viter de se tromper deux
fois. Les planches dessin ont t remplaces par des logiciels de concep-
tion assiste par ordinateur, qui permettent de dessiner des plans avec
une prcision beaucoup plus grande et surtout de les modifier ad libitum.
Ils ont par la suite t complts par des logiciels de dessin en trois dimen-
sions, qui reprsentent les btiments sous forme de maquettes virtuelles,
beaucoup plus lisibles que des plans, surtout pour les non spcialistes.
Les ingnieurs dessinaient ensuite dautres plans et faisaient des notes de
calcul la main ou en utilisant une calculatrice. Ils utilisent aujourdhui,
pour ces calculs, des logiciels fonds sur la mthode des lments finis, qui
dcomposent les btiments en des milliers de petits morceaux et calculent
les forces exerces sur chacun de ces morceaux.
Des volutions rcentes vont vers lutilisation dun format unique de des-
cription des btiments, utilis la fois par les architectes, les ingnieurs de
conception et les ingnieurs qui organisent le travail sur les chantiers.
Ces transformations ont permis de concevoir et de calculer des btiments
beaucoup plus complexes que par le pass, comme le muse Guggenheim
de Bilbao. Ainsi, on comprend rtrospectivement que la raison pour
laquelle beaucoup de btiments taient, par le pass, de simples parall-
lpipdes, est que les paralllpipdes sont faciles dessiner et calculer.
Ces mthodes ont aussi permis une prsentation plus lisible des btiments
dans lesquels il est dsormais possible de se promener avant mme quils
ne soient construits. Enfin, elles favorisent une meilleure communication
entre les diffrents corps de mtier. Par exemple, quand un btiment
demande la dcoupe dune pice sur mesure, le fichier de commande de
la machine numrique qui dcoupe cette pice peut tre produit directe-
ment partir des logiciels de conception assiste par ordinateur.
Ai-je bien compris ?
De quelles instructions a-t-on besoin pour dessiner lcran ?
Quel est le principe du dessin en trois dimensions ?
Quelles sont les principales transformations dune image ?
ManuelDowek.book Page 254 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
20 La dichotomie
CHAPITRE AVANC
Donald Knuth (1938-) est un des
fondateurs de lalgorithmique, la
partie de linformatique qui tudie
les proprits des algorithmes, ind-
pendamment de leur expression dans
un langage de programmation parti-
culier. Le troisime volume de son
livre The art of computer program-
ming, intitul Sorting and searching
est entirement consacr aux algo-
rithmes de tri et de recherche en
table. Pour crire ce livre, il a dabord
crit un logiciel de traitement de
texte : TeX, dont le nom est form
des trois premires lettres du mot
techn, qui signifie la fois art et
technique .
Ou diviser pour rgner.
Dans ce chapitre, nous voyons une mthode algorithmique
gnrale qui permet, entre autres choses, de trouver
rapidement un mot dans un dictionnaire : ouvrir
le dictionnaire au milieu et sinterroger : la premire lettre
du mot cherch est-elle avant ou aprs ? .
Cette mthode fonctionne plus gnralement ds que nous
cherchons retrouver un lment dans un tableau ordonn
selon une relation dordre total, notion que nous dfinissons.
Cette mthode est rapide et sapplique de nombreux
problmes : la recherche dun lment dans une table
ordonne, la conversion dune valeur analogique en une valeur
numrique, la recherche dun zro dune fonction continue
et strictement monotone, etc.
ManuelDowek.book Page 255 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
256
La recherche en table
Au chapitre 3, nous avons crit un programme qui gre un rpertoire
constitu de deux tableaux, contenant lun des noms et lautre des
numros de tlphone. Ce programme attend en entre un nom et
indique le numro de tlphone correspondant, ou bien indique que ce
nom nappartient pas au rpertoire.
Ce problme est un exemple dun problme important en algorithmique : la
recherche en table. En effet, beaucoup de systmes informatiques, tels les dic-
tionnaires, les moteurs de recherche, les systmes dinformation des banques
et des administrations, servent essentiellement, comme ce rpertoire,
stocker des informations et les restituer quand on les interroge. Le pro-
gramme que nous avons crit au chapitre 3 est le suivant :
Ce programme recherche, dans le tableau nom, lindice de la chane s
entre par lutilisateur, en comparant cette chane successivement tous
les lments du tableau. Il suffit ensuite dafficher llment de mme
indice du tableau tel. On peut instrumenter ce programme en ajoutant
une instruction System.out.print("."); dans la boucle afin de visualiser
le nombre de comparaisons effectues.
On obtient alors trois points ... quand on cherche le numro de tl-
phone de Charles, qui est plutt au dbut du tableau, mais dix
points .......... quand on cherche celui de Jrme, qui est la fin.
Si on utilisait cette mthode pour chercher un mot dans un dictionnaire,
on ouvrirait celui-ci la premire page et on comparerait le mot
recherch au premier mot du dictionnaire, puis au deuxime, puis au
s = Isn.readString();
i = 0;
while (i < 10 && !Isn.stringEqual(s,nom[i])) {
i = i + 1;}
if (i < 10) {
System.out.println(tel[i]);}
else {
System.out.println("Inconnu");}
s = Isn.readString();
i = 0;
while (i < 10 && !Isn.stringEqual(s,nom[i])) {
System.out.print(".");
i = i + 1;}
System.out.println(".");
if (i < 10) {
System.out.println(tel[i]);}
else {
System.out.println("Inconnu");}
ManuelDowek.book Page 256 Monday, July 9, 2012 4:58 PM
20 La dichotomie
Groupe Eyrolles, 2012
257
troisime, etc. jusqu trouver le mot recherch, ou arriver au dernier mot
du dictionnaire. Un dictionnaire courant contenant 60 000 mots et une
comparaison prenant une demi-seconde, il faudrait, dans le pire des cas,
30 000 secondes, soit huit heures et vingt minutes, pour trouver le mot
recherch ou se convaincre quil nappartient pas au dictionnaire.
Bien entendu, ce nest pas ainsi que lon procde : on ouvre le diction-
naire au milieu, on compare le mot recherch au mot mdian. Si le mot
recherch est avant le mot mdian dans lordre alphabtique, on limine
la seconde moiti du dictionnaire, sans mme la regarder ; sil est aprs le
mot mdian, on limine la premire moiti. En recommenant avec le
demi-dictionnaire restant, on limine ensuite un demi-demi-diction-
naire et on continue jusqu trouver le mot en question ou obtenir
lensemble vide, auquel cas le mot recherch nest pas dans le diction-
naire. Cette algorithme de recherche dun lment dans une table
sappelle la recherche par dichotomie (tomia, couper, dikha, en deux).
Si on cherche un terme dans un dictionnaire de 60 000 mots :
Aprs 1 comparaison, on le cherche dans un ensemble dau plus 30 000 mots.
Aprs 2 comparaisons, on le cherche dans un ensemble dau plus 15 000 mots.
Aprs 3 comparaisons, on le cherche dans un ensemble dau plus 7 500 mots.
Aprs 4 comparaisons, on le cherche dans un ensemble dau plus 3 750 mots.
Aprs 5 comparaisons, on le cherche dans un ensemble dau plus 1 875 mots.
Aprs 6 comparaisons, on le cherche dans un ensemble dau plus 937 mots.
Aprs 7 comparaisons, on le cherche dans un ensemble dau plus 468 mots.
Aprs 8 comparaisons, on le cherche dans un ensemble dau plus 234 mots.
Aprs 9 comparaisons, on le cherche dans un ensemble dau plus 117 mots.
Aprs 10 comparaisons, on le cherche dans un ensemble dau plus 58 mots.
Aprs 11 comparaisons, on le cherche dans un ensemble dau plus 29 mots.
Aprs 12 comparaisons, on le cherche dans un ensemble dau plus 14 mots.
Aprs 13 comparaisons, on le cherche dans un ensemble dau plus 7 mots.
Aprs 14 comparaisons, on le cherche dans un ensemble dau plus 3 mots.
Aprs 15 comparaisons, on le cherche dans un ensemble dau plus 1 mot.
Au bout de 16 comparaisons seulement, on a trouv le mot dans le dic-
tionnaire, ou on sait quil ny est pas : 8 secondes suffisent donc, contre
8 heures et 20 minutes, soit un temps de recherche divis par 3 750.
Au cours dune recherche par dichotomie, soit on tombe sur le rsultat,
soit on divise par deux la taille de lensemble dans lequel on recherche le
mot, ceci chaque comparaison. De ce fait, le nombre de comparaisons
ncessaires pour trouver un lment dans une table est, dans le pire des
cas, le logarithme entier de la taille de la table.
T Logarithme entier
On rappelle que le logarithme entier elog(x)
dun nombre x suprieur ou gal 1 est le nombre
de fois quil faut le diviser par deux pour obtenir
un nombre infrieur ou gal 1.
ManuelDowek.book Page 257 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
258
Le gain qui consiste passer dun nombre de comparaisons proportionnel au
nombre dlments un nombre de comparaison proportionnel son loga-
rithme entier est immense. Quand le nombre dlments atteint quelques
millions ou quelques milliards, son logarithme entier ne vaut que 20 ou 30 :
La dichotomie permet, par exemple, de rechercher en un maximum de
26 tapes, le nom de quelquun dans lannuaire des 60 millions de Franais.
Bien entendu, cet algorithme de recherche par dichotomie ne fonctionne
que parce que, dans un dictionnaire, les mots sont ordonns par ordre alpha-
btique. Si les mots avaient t dans le dsordre, il aurait fallu tout fouiller.
De manire gnrale, il faut que lon ait dfini, sur le type des lments de la
table, une relation dordre total, cest--dire une relation qui soit :
rflexive : un lment x est avant lui-mme, au sens large x x
anti-symtrique : si x est avant y alors y nest pas avant x, sauf sils sont
gaux si x y et y x alors x = y
transitive : si x est avant y et y avant z, alors x est avant z si x y et
y z alors x z
et totale : de deux lments, lun est toujours avant lautre, x y ou
y x.
La relation dordre habituelle sur les nombres entiers et lordre alphab-
tique sur les chanes de caractres sont deux exemples de relations
dordre totales.
Il faut, par ailleurs, que la table soit ordonne relativement cette rela-
tion, cest--dire que si x est avant y dans la table, alors x y.
On peut alors crire un programme qui exprime lalgorithme de recherche
par dichotomie. Deux variables i et j dfinissent lintervalle du tableau nom,
auquel lindice de la chane de caractres s recherche appartient, si jamais
cette chane est dans la table. Tant que cet intervalle contient au moins
deux lments, cest--dire tant que i < j, on calcule llment mdian k de
lintervalle et on compare les chanes de caractres s et nom[k]. Si ces deux
chanes de caractres sont identiques, on rduit lintervalle au singleton
[k, k], de manire provoquer la fin du calcul. Si s est avant nom[k] dans
lordre alphabtique, on rduit lintervalle [i, k - 1] et si s est aprs
nom[k] dans lordre alphabtique, on rduit lintervalle [k + 1, j].
On sarrte quand lintervalle contient moins de deux lments. Comme
on va le voir, lintervalle [i, j] est alors ou bien de la forme [i, i], qui est
un singleton, ou bien de la forme [i,i - 1], qui est vide puisque i est plus
grand que i - 1. Et i est toujours compris entre 0 et 9. Si la chane de
n 1 2 4 8 16 .. 256 .. 1024 .. Million .. Milliard
Logarithme entier de n 0 1 2 3 4 .. 8 .. 10 .. 20 .. 30
ManuelDowek.book Page 258 Monday, July 9, 2012 4:58 PM
20 La dichotomie
Groupe Eyrolles, 2012
259
caractres nom[i] est identique s, on a trouv lindice de la chane s dans
le tableau nom ; si ce nest pas le cas, la chane s nest pas dans la table.
On doit se convaincre de deux choses : dune part que lalgorithme se
termine aprs un certain nombre ditrations, dautre part que la rponse
donne par lalgorithme est correcte.
Le fait que la boucle se termine est d au fait que le nombre j - i + 1
dlments dans lintervalle [i, j] est au moins divis par deux chaque
itration. Aprs un nombre ditrations infrieur au logarithme entier du
nombre dlments dans la table, ce nombre est infrieur ou gal 1 et la
boucle se termine. En instrumentant le programme prcdent pour
compter le nombre de comparaisons, on saperoit que ce nombre est
toujours infrieur ou gal 4, qui est le logarithme entier de 10.
Ensuite, pour dmontrer que la rponse donne par lalgorithme est cor-
recte, on commence par montrer que si la chane de caractres s est dans la
table, alors son indice appartient toujours lintervalle [i, j]. Cette pro-
prit est un invariant de la boucle, cest--dire une proprit qui reste
vraie chaque excution du corps de la boucle. Ici, quand on rduit linter-
valle [i, j] lintervalle [i, k - 1] par exemple, cest parce que lon sait
que la chane s est avant la chane nom[k] dans lordre alphabtique et
donc que lindice de la chane s, sil existe, nest pas dans lintervalle [k, j].
La proprit reste donc vraie jusqu la fin de lexcution de la boucle.
Enfin, on montre que quand on sort de la boucle, lintervalle [i, j] est soit
le singleton [i, i], soit lintervalle vide [i, i - 1]. Dans les deux cas, i est
compris entre les valeurs minimale et maximale de dpart, ici 0 et 9. Pour
cela, on montre un autre invariant de la boucle : si lintervalle [i, j] nest
pas vide, alors ses bornes i et j sont comprises entre les valeurs minimale
et maximale de dpart, et sil est vide, alors sa borne infrieure i est com-
prise entre les valeurs minimale et maximale de dpart.
s = Isn.readString();
i = 0;
j = 9;
while (i < j) {
k = (i + j) / 2;
if (Isn.stringEqual(s,nom[k])) {
i = k;
j = k;}
else {
if (Isn.stringAlph(s,nom[k])) {
j = k-1;}
else {
i = k+1;}}}
if (Isn.stringEqual(s,nom[i])) {
System.out.println(tel[i]);}
else {
System.out.println("Inconnu");}
ManuelDowek.book Page 259 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
260
Si lintervalle [i, j] contient au moins trois points, cest--dire si
i + 2 j, il nest pas difficile de montrer que les nombres k - 1 et
k + 1, o k = (i + j) / 2, sont tous les deux compris entre i et j au
sens large. Le nouvel intervalle [k, k], [i, k - 1] ou [k + 1, j] est con-
tenu dans [i, j] et donc ses bornes sont comprises entre les valeurs
minimale et maximale de dpart.
Si lintervalle [i, j] contient deux points, cest--dire si j = i + 1, alors
k = (i + j) / 2 est gal i. Le nombre k + 1 est gal j : il est compris
entre i et j au sens large. En revanche, le nombre k - 1 est gal i - 1.
Dans ce cas, le nouvel intervalle est [i, i] ou [j, j] dont les bornes sont
comprises entre les valeurs minimale et maximale de dpart, ou linter-
valle vide [i, i - 1] dont la borne infrieure i est comprise entre les
valeurs minimale et maximale de dpart.
On sort de la boucle quand lintervalle [i, j] contient zro ou un point.
Dans un cas comme dans lautre, lindice i est compris entre les valeurs
minimale et maximale de dpart. Si la chane de caractres nom[i] est
identique s, on a trouv lindice de la chane s dans le tableau nom ; si ce
nest pas le cas, la chane s nest pas dans la table.
Exercice 20.1
On suppose que lon a un annuaire qui contient les sept milliards dtres
humains dans lordre alphabtique de leurs nom, prnom, lieu de naissance et
date de naissance. Combien de comparaisons sont ncessaires pour retrouver
une personne dans cet annuaire ?
Exercice 20.2
Programmer lalgorithme de recherche en table par dichotomie de faon
rcursive.
Exercice 20.3
crire un programme qui joue au jeu du plus petit - plus grand cest--dire
qui propose un utilisateur de deviner un nombre entre 0 et 100 en lui indi-
quant chaque tentative si le nombre propos par lutilisateur est plus petit
ou plus grand que le nombre deviner. En combien dtapes au plus peut-on
deviner le nombre si on connat le principe de la dichotomie ? crire un autre
programme qui cherche deviner le nombre.
Exercice 20.4
On suppose que lon a un dictionnaire qui contient n mots en vrac, sans aucun ordre.
Peut-on trouver une mthode plus rapide que la comparaison avec chacun
des mots du dictionnaire ?
On suppose que lon cherche au hasard dans ce dictionnaire un mot donn,
sans noter les mots dj essays. Quelle est la probabilit de trouver le mot
du premier coup ? Quelle est la probabilit de trouver le mot au k-me coup,
cest--dire dchouer aux k - 1 premiers coups et de russir au k-me ?
Quelle est la probabilit de ne pas encore avoir trouv le mot aprs k coups ?
partir de combien de coups cette probabilit devient-elle infrieure 1/2 ?
ALLER PLUS LOIN Ajouter un lment
en temps logarithmique
Cet algorithme de recherche par dichotomie
permet donc la recherche rapide dun lment
dans une table, puisque le nombre de comparai-
sons, et par consquent le temps dexcution du
programme, est proportionnel au logarithme de la
taille de la table et non la taille de la table elle-
mme. En revanche, ajouter ou supprimer un l-
ment de la table demande un temps de calcul pro-
portionnel la taille de la table, et non son
logarithme, puisque quand on ajoute ou supprime
un lment au dbut du tableau, il faut dcaler
tous les autres lments. Ce nest pas trs grave
quand la table change peu, comme un diction-
naire, mais cela peut devenir un problme si elle
change souvent. Cest pour cela quil existe
dautres manires, plus complexes, de pro-
grammer la recherche en table, qui rendent loga-
rithmiques aussi bien la recherche, que lajout et
la suppression dun lment de la table. Bien que
plus complexes, ces mthodes sont fondes sur
les mmes ides que celles que nous avons vues
dans cet exemple.
ManuelDowek.book Page 260 Monday, July 9, 2012 4:58 PM
20 La dichotomie
Groupe Eyrolles, 2012
261
Rechercher sur le Web des informations sur la loi gomtrique et sur son
esprance et en dduire le nombre moyen de coups ncessaires pour
trouver le mot dans le dictionnaire, sil y est. Le rsultat est surprenant : il
faut en moyenne n coups.
Que se passe-t-il si on cherche au hasard le mot, sans noter les mots dj
essays, et quil nest pas dans la bote ?
La conversion analogique-
numrique
Nous nous intressons maintenant un tout autre problme : celui de la
conversion analogique-numrique, par exemple dune tension (voir le
chapitre 17).
Il nest pas difficile de raliser un circuit qui compare deux tensions et
indique laquelle est la plus grande. Il nest pas non plus trop difficile de
raliser un circuit de conversion numrique-analogique, qui produit une
tension donne par un nombre exprim en binaire. Beaucoup de conver-
tisseurs analogique-numrique procdent alors en comparant la tension
numriser successivement plusieurs valeurs de rfrence pour, de
proche en proche, cerner la valeur de la tension. Ici encore, ces convertis-
seurs procdent par dichotomie, en divisant lespace de recherche par
deux chaque mesure. Cela permet datteindre trs rapidement une
bonne prcision, le millime en 10 tapes, le millionime en 20, etc.
Trouver un zro
dune fonction
Voici encore un autre problme : trouver un zro dune fonction f con-
tinue et strictement monotone dans un intervalle [a, b], cest--dire
rsoudre une quation de la forme f (x) = 0, a x b.
Une mthode consiste comparer le signe de f (a) et f (b). Si ces deux
signes sont identiques, alors la fonction f tant strictement monotone,
elle ne sannule pas sur lintervalle [a, b]. Sinon, elle sannule une fois
ManuelDowek.book Page 261 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
262
exactement sur cet intervalle. Cest le cas par exemple de la fonction
sinus qui sannule sur lintervalle [2.0, 4.0].
Ici encore, une recherche par dichotomie permet de trouver une valeur
approche de ce zro. On cherche une valeur approche e = 10
-5
prs.
Ce programme donne la valeur m = 3.1416015625.
Exercice 20.5
Montrer que ce programme se termine. Montrer que, quand on sort de la
boucle, le nombre m est soit une approximation en x de la solution, cest--dire
un nombre m tel quil existe un nombre z tel que f(z) = 0 et |m - z| e, soit une
approximation en y de la solution, cest--dire un nombre m tel que |f(m)| e.
Exercice 20.6
Lexercice 20.5 suppose que le calcul de la fonction f sur des nombres virgule
soit exact. Or, on a vu que cest rarement le cas : les calculs sur les nombres
virgule sont presque toujours des calculs approchs. Donner un exemple dans
lequel cet algorithme ne fonctionne pas cause des approximations sur le
calcul de la fonction f. Montrer que si lerreur sur le calcul de la fonction f est
toujours strictement infrieure e, alors cet algorithme fonctionne toujours.
Exercice 20.7
Si la fonction nest pas monotone, lalgorithme continue-t-il de se terminer ou
risque-t-il de boucler indfiniment ?
Exercice 20.8
Soit = b - a la taille de lintervalle initial. Montrer que, aprs n itrations,
lintervalle de recherche est de taille / 2
n
. En dduire que le nombre ditra-
tions ncessaires pour trouver une approximation de la solution est infrieur
au logarithme entier de / e.
Exercice 20.9
Programmer cet algorithme de recherche du zro dune fonction de manire
rcursive.
e = 1E-5;
a = 2.0;
b = 4.0;
m = (a + b) / 2;
while (b - a > e && Math.abs(Math.sin(m)) > e) {
if (Math.sin(a) * Math.sin(m) <= 0) {
b = m;}
else {
a = m;}
m = (a + b) / 2;}
Ai-je bien compris ?
Que signifie le mot dichotomie ?
Combien de comparaisons faut-il faire pour trouver un mot dans un dictionnaire ?
Quelles sont les autres applications du principe de dichotomie prsentes dans ce chapitre ?
ManuelDowek.book Page 262 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
21 Trier
CHAPITRE AVANC
Philippe Flajolet (1948-2011) est un
des pionniers de lanalyse de la com-
plexit des algorithmes, cest--dire
du temps que dure leur excution et
de la quantit de mmoire quelle
demande. Il a montr lutilit, dans
ce domaine, de plusieurs thories
mathmatiques : la combinatoire et
le dnombrement, la thorie des pro-
babilits et la thorie des fonctions
dune variable complexe. Il a aussi eu
conscience trs tt de lapport des
logiciels de calcul formel pour effec-
tuer les calculs, parfois fastidieux,
que cette analyse demande.
Dans une trs grande bibliothque, il faut classer
les livres pour les retrouver.
Dans ce chapitre, nous voyons deux algorithmes de tri, ce qui
est surtout un prtexte pour nous interroger sur la complexit
des algorithmes.
Nous prsentons le tri par slection et le tri par fusion et nous
nous interrogeons sur lefficacit de ces deux algorithmes,
en valuant leur temps dexcution.
ManuelDowek.book Page 263 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
264
Nous avons expliqu que la recherche dun lment dans une table est
plus rapide quand celle-ci est ordonne. Cest une chose que nous savons
depuis quil existe des bibliothques et des bibliothcaires : mme si cela
est long et fatigant, il vaut mieux ranger les livres dune bibliothque une
fois pour toutes, par exemple dans lordre alphabtique, plutt que les
laisser en vrac et arpenter des kilomtres de rayonnages chaque fois que
lon cherche un volume. Cela mne naturellement un nouveau
problme : comment ordonner une table ?
Ce problme est un cas particulier dun problme plus gnral : si lon se
donne n objets, par exemple, n nombres, n chanes de caractres, etc. et
une relation rflexive, transitive et totale (voir le chapitre 20), comment
trier ces n objets, cest--dire les disposer dans un certain ordre de faon
ce que si un lment a est avant un lment b dans la table alors a

b ?
Limportance de ce problme fait que plusieurs dizaines dalgorithmes
diffrents ont t proposs pour trier des objets. Ce chapitre est consacr
deux dentre eux : le tri par slection et le tri par fusion. Comme nous
allons le voir, ces deux algorithmes sont dune efficacit trs diffrente.
Par souci de simplicit, nous supposerons dans tout ce chapitre que les
objets trier sont des nombres entiers et quils sont donns dans un tableau.
Le but dun algorithme de tri est donc de calculer un nouveau tableau, ou
de modifier le tableau initial, de manire ce quil contienne les mmes
nombres que le tableau initial, mais que ces lments soient ordonns.
Le tri par slection
Lalgorithme de tri par slection est volontiers utilis pour trier des
objets, comme des cartes jouer, des livres, etc. la main. On commence
par chercher, parmi les objets trier, un lment plus petit que tous les
autres. Cet lment sera le premier du tableau tri. On cherche ensuite,
parmi ceux qui restent, un lment plus petit que tous les autres, qui sera
le deuxime du tableau tri, etc.
Par exemple, pour trier ainsi le tableau , on slectionne dabord le plus
petit lment, 11, que lon met au dbut du tableau rsultat et que lon sup-
prime du tableau trier (). On cherche ensuite le plus petit parmi ceux qui
restent, 14, on le met dans le tableau rsultat et on le supprime du tableau
trier () et on continue ainsi jusqu avoir puis le tableau trier.
ALLER PLUS LOIN Lantisymtrie
On ne suppose pas la relation ncessairement
antisymtrique, cest--dire que lon suppose
possible davoir la fois x

y et y

x, sans que
x et y soient identiques. Cela permet par
exemple de trier des points du plan par abscisse
croissante. En effet, la relation avoir une abs-
cisse infrieure ou gale est rflexive, transi-
tive et totale, mais elle nest pas
antisymtrique ; par exemple, (1 ; 2) a une abs-
cisse infrieure ou gale (1 ; 3) et (1 ; 3) a une
abscisse infrieure ou gale (1 ; 2), mais ces
deux points sont distincts. Quand on trie par
exemple les points (1 ; 2), (2 ; 0), (0 ; 2) et (1 ; 3)
par abscisse croissante, deux rsultats sont
possibles : (0 ; 2), (1 ; 2), (1 ; 3), (2 ; 0) et (0 ; 2),
(1 ; 3), (1 ; 2), (2 ; 0).
ManuelDowek.book Page 264 Monday, July 9, 2012 4:58 PM
21 Trier
Groupe Eyrolles, 2012
265
Quand on programme cet algorithme, il faut dfinir comment exprimer
le fait que les cases 3 et 13 du tableau trier sont dsormais vides. Une
solution parmi dautres est dy mettre les deux derniers lments, 36
et 67, ou les deux premiers, 42 et 63, de manire garder les lments
trier contigus, si bien quil suffit de se souvenir des deux extrmits du
segment du tableau o se trouvent les lments trier.
Pour se souvenir que les lments trier sont maintenant dans les cases 2
15, et non 0 15, du tableau initial, il suffit dutiliser une variable i qui
vaut 2 et qui indique la fois le nombre dlments dj tris et lindice
du tableau o commencent ceux qui restent trier.
Comme les deux premires cases du tableau initial ne servent plus rien,
on peut les utiliser pour stocker le dbut du tableau dj tri, si bien que
lon vite le recours un tableau auxiliaire.
Si lon doit trier 16 lments, rangs dans un tableau dont lindice varie
entre 0 et 15, le tri par slection se programme de la manire suivante :

for (i = 0; i <= 14; i = i + 1) {


k = i + 1;
ManuelDowek.book Page 265 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
266
Lindice i de la boucle principale varie entre 0 et 14. Pour chaque valeur
de i, on cherche, dans la partie du tableau comprise entre i et 15,
lindice k dun lment minimal :
puis on change dans le tableau llment dindice i avec celui
dindice k :
Quand la boucle est acheve, quinze lments ont t slectionns dans
lordre croissant et placs dans les quinze premires cases du tableau. Le
seizime lment qui reste est plus grand que tous les autres. Le tableau
est donc tri.
Exercice 21.1
Effectuer la main un tri par slection des tableaux :
Exercice 21.2
Dans un tableau tab dj tri, on souhaite insrer un nouvel lment e de
sorte que le nouveau tableau soit galement tri.
Proposer un algorithme qui dtermine la position laquelle il faut insrer
ce nouvel lment.
Si lon souhaite conserver les lments tris dans le mme tableau tab, que
faudra-t-il faire avant de pouvoir insrer e sa place ? Dans quel cas cette
opration demandera-t-elle beaucoup de temps ?
for (j = i + 2; j <= 15; j = j + 1) {
if (tab[j] <= tab[k]) {
k = j;}}
z = tab[i];
tab[i] = tab[k];
tab[k] = z;}
k = i + 1;
for (j = i + 2; j <= 15; j = j + 1) {
if (tab[j] <= tab[k]) {
k = j;}}
z = tab[i];
tab[i] = tab[k];
tab[k] = z;
ManuelDowek.book Page 266 Monday, July 9, 2012 4:58 PM
21 Trier
Groupe Eyrolles, 2012
267
Exercice 21.3
Si lon interrompt lexcution de lalgorithme du tri par slection aprs
k tapes, on obtient un tableau qui contient les k premiers lments du
tableau final calcul par lalgorithme. Cet algorithme procde en calculant
successivement le premier lment du tableau final, puis les deux premiers l-
ments du tableau final, puis les trois premiers, etc. Un autre algorithme, le tri
par insertion, trie dabord le premier lment du tableau initial, puis les deux
premiers, puis les trois premiers, etc. Si lon interrompt lexcution de lalgo-
rithme du tri par insertion aprs k tapes, on obtient un tableau qui contient,
non les k premiers lments du tableau final, mais un tableau ordonn qui
contient les k premiers lments du tableau initial.
Chercher sur le Web une description prcise de cet algorithme et le pro-
grammer.
Exercice 21.4
Lalgorithme du tri bulles consiste trier un tableau en ne sautorisant qu
changer deux lments conscutifs de ce tableau. On peut dmontrer que
lalgorithme suivant :
1 chercher deux lments conscutifs rangs dans le dsordre,
2 si deux tels lments existent, les changer et recommencer,
3 sinon arrter,
trie nimporte quel tableau.
Effectuer la main un tri bulles du tableau :
Quel est le temps dexcution du tri bulles sur un tableau ordonn ?
tait-ce le cas pour le tri par slection ?
Les tableaux sur lesquels le tri bulles est le moins efficace sont ceux qui
sont rangs dans lordre dcroissant, par exemple :
Si lon commence par essayer de placer le nombre n la position correcte,
combien de permutations sont ncessaires pour y arriver ?
Ensuite, combien de permutations sont ncessaires pour placer n - 1 au
bon endroit ? Et le nombre n - 2 ?
mettre une conjecture sur le nombre total de permutations ncessaires
pour trier un tableau de taille n rang initialement en ordre dcroissant.
Dmontrer cette conjecture par rcurrence.
Proposer une description plus prcise de cet algorithme : ltape chercher
deux lments conscutifs rangs dans le dsordre pouvant tre traite
de faons assez varies. Programmer cet algorithme.
ManuelDowek.book Page 267 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
268
Le tri par fusion
Comme nous le verrons plus loin, les algorithmes de tri par slection, par
insertion ou bulles sont trs lents. Lalgorithme de tri par fusion fait la
mme chose que ces trois algorithmes, mais beaucoup plus rapidement.
Il est plus simple de prsenter cet algorithme avec un tableau dont la
taille est une puissance de 2, comme 8, 16, 32, etc. Cela nest pas relle-
ment une limitation, car si lon veut trier 25 lments par exemple, il
suffit dajouter 7 lments avec une trs grande valeur dans le tableau
trier, puis de supprimer les 7 derniers lments du tableau tri.
Le cur de lalgorithme est un autre algorithme qui permet de fusionner
deux tableaux tris. Par exemple, si le tableau tab1 contient les lments
5, 9, 11 et 17, dans cet ordre, et si le tableau tab2 contient les lments 3,
4, 11 et 13, alors leur fusion est un tableau qui contient ces huit lments
dans lordre, cest--dire 3, 4, 5, 9, 11, 11, 13 et 17. Pour fusionner deux
tels tableaux, le principe gnral est de transfrer les diffrents lments
dans un troisime tableau dans lordre croissant, llment suivant tant
toujours forcment situ au dbut dun des deux tableaux initiaux. On
peut pour cela utiliser le programme suivant :
Ce programme est essentiellement constitu dune boucle qui dtermine
lun aprs lautre les lments du tableau rsultat tab3. Lindice i dsigne
la prochaine case remplir dans ce tableau. Au dpart, tab3 est vide et
lindice i vaut 0. Les indices x et y dsignent le prochain lment des
tableaux tab1 et tab2 non encore recopis.
x = 0;
y = 0;
for (i = 0; i <= 7; i = i + 1) {
if ((x <= 3 && y <= 3 && tab1[x] <= tab2[y]) || (y == 4)) {
tab3[i] = tab1[x];
x = x + 1;}
else {
tab3[i] = tab2[y];
y = y + 1;}}
ManuelDowek.book Page 268 Monday, July 9, 2012 4:58 PM
21 Trier
Groupe Eyrolles, 2012
269
Au cours du premier tour de boucle, on compare llment x du tableau
tab1 llment y du tableau tab2. Cest ce second lment qui est plus
petit. On le recopie dans la case i du tableau tab3 et on augmente de 1 la
valeur des indices y et i.
Cest encore llment y du tableau tab2 qui est le plus petit ; cest encore
lui quon recopie dans le tableau tab3 au tour suivant de la boucle.
Cest dsormais llment x du tableau tab1 qui est le plus petit ; cest lui
quon recopie dans le tableau tab3 au tour suivant de la boucle.
Et on continue ainsi jusquau septime tour de la boucle, o lon recopie
le dernier lment du tableau tab2 dans le tableau tab3. Il nest alors plus
ncessaire de comparer les lments plus petits et non encore recopis
des deux tableaux. Cest dans le premier quon prendra dsormais tous
les lments recopier.
ManuelDowek.book Page 269 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
270
Au huitime tour de boucle, on recopie le dernier lment du tableau tab1.
et la construction du tableau tab3 est acheve.
Exercice 21.5
Modifier ce programme pour fusionner trois tableaux, chacun tant de
taille 4.
Au lieu dutiliser deux tableaux tab1 et tab2, on peut aussi utiliser deux
segments du mme tableau tab par exemple, le segment qui va de la
case 0 la case 3 et le segment qui va de la case 4 la case 7.
Le programme scrit alors de la manire suivante :
Maintenant, comment utiliser cet algorithme de fusion pour trier un
tableau ? On commence avec un tableau non tri, dont le nombre dl-
ments est une puissance de deux, par exemple 16. Chaque case du tableau
est un mini-segment form dune case unique. Puisquil ne comporte quune
case, chacun de ces mini-segments est ordonn. On les regroupe alors deux
par deux et on fusionne, lune aprs lautre, ces huit paires de segments.
x = 0;
y = 4;
for (i = 0; i <= 7; i = i + 1) {
if ((x <= 3 && y <= 7 && tab[x] <= tab[y]) || (y == 8)) {
tab3[i] = tab[x];
x = x + 1;}
else {
tab3[i] = tab[y];
y = y + 1;}}
ManuelDowek.book Page 270 Monday, July 9, 2012 4:58 PM
21 Trier
Groupe Eyrolles, 2012
271
On obtient alors huit segments ordonns de deux cases. On les regroupe
deux par deux et on fusionne lune aprs lautre ces quatre paires de seg-
ments de deux lments.
On obtient alors quatre segments ordonns de quatre cases. On les
regroupe deux par deux et on fusionne lune aprs lautre ces deux paires
de segments de quatre lments.
On obtient alors deux segments ordonns de huit cases et on fusionne
cette paire de segments de huit lments.
et on obtient le tableau ordonn.
Exercice 21.6
Effectuer la main un tri par fusion des tableaux :
Le programme scrit ainsi :
s = 1;
while (s <= 15) {
b = 0;
x = 0;
y = s;
for (i = 0; i <= 15; i = i + 1) {
if ((x < b + s && y < b + 2 * s && tab[x] < tab[y])
|| (y == b + 2 * s)) {
tab1[i] = tab[x];
x = x + 1;}
ManuelDowek.book Page 271 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
272
Dans la boucle qui va des lignes 6 16, on parcourt le tableau tab et on
fusionne des petits segments de taille s en segments de taille 2 s. On
commence par poser b = 0 et par fusionner les segments [b, b + s - 1]
et [b + s, b + 2 s - 1], cest--dire [0, s - 1] et [s, 2 s - 1], en choisis-
sant, comme prcdemment, les lments alternativement dans un seg-
ment et dans lautre, en augmentant dune unit la variable x ou bien la
variable y, selon le segment choisi, jusqu ce que x soit gal b + s et
y b + 2 s. ce moment, on a fini de fusionner les deux premiers seg-
ments, on pose b = 2 s et on continue, dans la mme boucle, fusionner
les deux segments suivants : [b, b + s - 1] et [b + s, b + 2 s - 1], cest-
-dire [2 s, 3 s - 1] et [3 s, 4 s - 1], etc.
Quand cette boucle est acheve, le tableau tab1 est form de segments
tris de taille 2 s. On le recopie dans le tableau tab, on multiplie s par 2
et on recommence fusionner les segments de taille suprieure : cest le
rle de la boucle while la plus externe.
Exercice 21.7
Modifier le programme donn pour pouvoir effectuer un tri par fusion
dun tableau dont la taille est une puissance de 2 quelconque,
dun tableau de taille quelconque en utilisant la mthode propose au dbut
de cette section pour se ramener une taille qui est une puissance de 2.
Lefficacit des algorithmes
Comme on la dj vu plusieurs fois, pour traiter un mme problme, il
existe souvent plusieurs algorithmes. Par exemple, on peut trier un tableau
par slection, par fusion, etc. Quand on doit choisir parmi plusieurs algo-
rithmes, lun des critres est celui du temps dexcution. Pour un logiciel
interactif, par exemple, un temps de rponse court est un lment essentiel
du confort de lutilisateur. De mme, certains programmes industriels doi-
vent tre utiliss un grand nombre de fois dans un dlai trs court et mme
else {
tab1[i] = tab[y];
y = y + 1;}
if (x == b + s && y == b + 2 * s) {
b = b + 2 * s;
x = b;
y = b + s;}}
for (i = 0; i <= 15; i = i + 1) {
tab[i] = tab1[i];}
s = s * 2;}
ManuelDowek.book Page 272 Monday, July 9, 2012 4:58 PM
21 Trier
Groupe Eyrolles, 2012
273
un programme qui nest excut quune seule fois, par exemple un pro-
gramme de simulation crit pour tester une hypothse de recherche, est
inutilisable sil demande des mois ou des annes de calcul.
En gnral, on cherche dterminer comment le temps dexcution dun
algorithme varie en fonction de la taille des donnes. Le temps dexcution
dune recherche en table dpend de la taille de cette table. Comme on la
vu, selon lalgorithme, ce temps peut tre proportionnel la taille de la table
ou au logarithme de cette taille. De mme, quand on sinterroge sur leffica-
cit dun algorithme de tri, on cherche comprendre comment le temps
dexcution de cet algorithme varie en fonction du nombre dobjets trier.
Lvaluation du temps mis par un algorithme pour sexcuter est un
domaine de recherche part entire, car elle se rvle quelquefois trs
difficile. Nanmoins, dans de nombreux cas, cette valuation peut se
faire en appliquant quelques rgles simples.
SAVOIR-FAIRE Sinterroger sur lefficacit dun algorithme
Une affectation ou lvaluation dune expression ont un temps dexcution petit.
Cette dure constitue souvent lunit de base dans laquelle on mesure le temps dex-
cution dun algorithme.
Le temps pris pour effectuer une squence p q est la somme des temps pris pour ex-
cuter les instructions p puis q.
Le temps pris pour excuter un test if (b) p else q est infrieur ou gal au
maximum des temps pris pour excuter les instructions p et q, plus une unit qui cor-
respond au temps dvaluation de lexpression b.
Le temps pris pour excuter une boucle for (i = 1; i <= m; i = i + 1) p est m fois
le temps pris pour excuter linstruction p. En particulier, quand deux boucles sont
imbriques, le corps de la boucle interne est rpt cause de cette boucle, mais aussi
parce quelle-mme est rpte dans son intgralit. Ainsi, si les deux boucles sont rp-
tes respectivement m et m fois, alors le corps de la boucle interne est excut
m m fois en tout. Quand le nombre de rptitions dune boucle ne dpend pas des
entres de lalgorithme, le temps pris pour excuter cette boucle est une constante.
Le cas des boucles while est plus complexe traiter puisque le nombre de rptitions
nest en gnral pas connu a priori.
ManuelDowek.book Page 273 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
274
Exercice 21.8 (avec corrig)
Comment le temps dexcution des algorithmes exprims par les programmes
suivants varie-t-il en fonction de n ?
Cet algorithme affiche la table de multiplication de n. La boucle est toujours
excute 10 fois, quel que soit n, et donc le temps dexcution ne dpend pas
de lentre n.
Cet algorithme affiche la suite des carrs des nombres entiers jusqu n
2
. La
boucle est excute n fois et le temps dexcution est donc proportionnel n.
Cet algorithme construit une table de multiplication pour tous les entiers de 1
n en donnant tous leurs multiples jusquau n-ime. Il comprend deux boucles
imbriques, chacune effectuant n rptitions de son corps. Le temps dexcu-
tion total est donc proportionnel n
2
.
Exercice 21.9
Comment le temps dexcution de lalgorithme exprim par le programme sui-
vant varie-t-il en fonction de n ?
Lefficacit des algorithmes de tri
par slection et par fusion
Pour valuer le temps que demande lalgorithme de tri par slection pour
trier un tableau, on compte le nombre de fois quest excut le corps de
la boucle la plus interne :
n = Isn.readInt();
for (i = 0; i <= 10; i = i + 1) {
System.out.println(i * n);}
n = Isn.readInt();
for (i = 1; i <= n; i = i + 1) {
System.out.println(i * i);}
n = Isn.readInt();
for (i = 1; i <= n; i = i + 1) {
for (j = 1; j <= n; j = j + 1) {
System.out.println(i * j);}}
n = Isn.readInt();
for (i = 1; i <= n; i = i + 1) {
System.out.println(i * 2);}
for (j = 1; j <= n; j = j + 1) {
System.out.println(3 * j);}
ManuelDowek.book Page 274 Monday, July 9, 2012 4:58 PM
21 Trier
Groupe Eyrolles, 2012
275
Cette instruction est excute 15 fois la premire fois que la boucle interne
est excute, puis 14 fois, puis 13 fois, , puis 1 fois. Au total, cette ins-
truction est excute 15 + 14 + + 1 = 120 fois.
Plus gnralement, quand on trie un tableau de n lments, cette instruc-
tion est excute (n - 1) + (n - 2) + + 1 fois, cest--dire n (n - 1) /
2 = (1 / 2) n
2
- (1 / 2) n fois. Dans cette valuation, le terme (1 / 2) n
devient beaucoup plus petit que (1 / 2) n
2
quand n devient grand et on
peut donc le ngliger. De mme, on peut ngliger le temps pris pour
changer les lments dindices i et k du tableau, car cette opration est
rpte n fois et elle prend donc un temps proportionnel n, ce qui peut
tre nglig devant (1 / 2) n
2
. Au bout du compte, linformation quil est
important de retenir est que le temps dexcution de cet algorithme est
quasiment proportionnel au carr du nombre dlments du tableau trier.
Lalgorithme de tri par fusion est lui aussi compos de deux boucles
imbriques. On pourrait donc sattendre ce que le temps dexcution de
cet algorithme soit proportionnel au carr du nombre dlments trier.
Et de fait, la boucle for la plus interne, qui fusionne tous les segments de
taille s en des segments de taille 2 s, demande un temps proportionnel
au nombre n dlments trier puisquelle est excute n fois, son indice
variant de 0 15 dans notre exemple et de 0 n - 1 dans le cas gnral.
Cependant, la boucle while la plus externe est excute un nombre de
fois qui est proportionnel, non au nombre n dlments trier, mais au
logarithme entier de ce nombre car, chaque fois, on double la taille s
des segments fusionns. Ainsi, dans notre exemple, s vaut successive-
ment 1, 2, 4 et 8 et la boucle est excute 4 fois, ce qui est le logarithme
entier de 16. Ainsi, le temps ncessaire pour trier un tableau de taille n
est proportionnel, non pas au carr de n, mais au produit de n par son
logarithme entier : n elog n.
Prenons un exemple : pour trier un tableau dun million dlments,
lalgorithme de tri par slection demande un temps de lordre de
n
2
= (10
6
)
2
= 10
12
, mille milliards. Le logarithme entier de 10
6
est 20
puisque 10
6
/ 2
20
= 0.953 Le temps demand par lalgorithme de tri
par fusion est donc de lordre de 10
6
20, vingt millions. Le tri par
fusion est plus rapide que le tri par slection dun facteur de lordre de
50 000 dans cet exemple. Si un ordinateur excute le corps de la boucle
interne en une milliseconde, un algorithme mettra un temps de lordre
de vingt secondes et lautre dun million de secondes, soit un peu plus de
dix jours, pour trier ce tableau.
if (tab[j] <= tab[k]) {
k = j;}
ManuelDowek.book Page 275 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
276
ALLER PLUS LOIN Le tri par fusion programm rcursivement
Comme de nombreux autres algorithmes, le tri par fusion peut se pro-
grammer de manire rcursive. Il peut se dcrire simplement en disant
que pour trier un segment dun tableau de plus de deux lments, il
faut trier la premire moiti, trier la seconde, puis fusionner les deux
segments obtenus. Cela mne la fonction suivante, qui trie le segment
du tableau tab, allant de n p :
static void tri (int [] tab, int n, int p) {
int k,i;
int [] tab1;
if (n < p) {
k = (n + p)/2;
tri(tab,n,k);
tri(tab,k+1,p);
tab1 = new int [p+1];
fusion(tab,n,k,k+1,p,tab1,n);
for (i = n; i <= p; i = i + 1) {
tab[i] = tab1[i];}}}
Outre les deux appels rcursifs la fonction tri elle-mme, ce pro-
gramme utilise un appel la fonction fusion qui fusionne deux seg-
ments du tableau tab, allant de n m et de p q en mettant le rsultat
dans le tableau tab1, partir de lindice i. Cette fonction peut elle-
mme se programmer avec une boucle, ou alors rcursivement :
static void fusion (int [] tab,int x,int n,int y,int p,int tab1
[],int i) {
if (x <= n && (y > p || tab[x] < tab[y])) {
tab1[i] = tab[x];
fusion(tab,x+1,n,y,p,tab1,i+1);}
else if (y <= p) {
tab1[i] = tab[y];
fusion(tab,x,n,y+1,p,tab1,i+1);}}
Dans le programme principal, il ne reste plus qu remplir le tableau tab
avec les nombres trier et appeler la fonction tri :
tri(tab,0,15);
Ces deux manires de programmer lalgorithme de tri par fusion illus-
trent, nouveau, la diffrence entre algorithme et programme, dis-
cute au chapitre 18. Mme en restant dans le mme langage de
programmation, lalgorithme de tri par fusion peut sincarner dans des
programmes trs diffrents, selon que lon utilise des boucles ou la
rcursivit pour lexprimer.
Ai-je bien compris ?
Quels sont les principaux algorithmes de tri prsents dans ce chapitre ?
Quest-ce que la complexit dun algorithme ?
Quel est lalgorithme de tri le plus rapide parmi ceux prsents dans ce chapitre ?
ManuelDowek.book Page 276 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
22
Parcourir
un graphe
CHAPITRE AVANC
Joseph Sifakis (1946-) est un cher-
cheur franais dorigine grecque qui
a reu le prix Turing en 2007, avec
Edmund Clarke et Allen Emerson,
pour la mthode dnumration et
de vrification des modles. Cette
mthode se fonde sur une descrip-
tion des systmes informatiques par
des systmes tats et transitions et
sur une analyse des tats accessibles
dans ces systmes, qui sinspire des
algorithmes de parcours de graphes.
Il est le premier scientifique franais
avoir reu ce prix.
O on trouve enfin la sortie du labyrinthe.
Dans ce dernier chapitre, nous voyons un algorithme
de parcours de graphe qui permet par exemple, de chercher
la sortie dun labyrinthe, en vitant de tourner en rond en
conservant chaque tape une liste des chemins prolonger.
Diverses variantes de cette mthode permettent de parcourir
le graphe en profondeur ou en largeur.
Partant de lexemple des labyrinthes, nous dfinissons la
notion de graphe. Cette notion est importante car les graphes
permettent de modliser nombre de problmes, par exemple
de nombreux jeux, o les sommets reprsentent les tats
possibles du jeu et les artes reprsentent les coups possibles.
ManuelDowek.book Page 277 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
278
Un algorithme de parcours de graphe est, peu de choses prs, un algo-
rithme qui permet de trouver la sortie dun labyrinthe. Si la systmatisa-
tion et ltude de ces algorithmes est rcente, la notion de graphe elle-
mme est trs ancienne, puisquon a retrouv des labyrinthes dessins
dans des tombes datant de la prhistoire.
La liste des chemins prolonger
Commenons par un exemple.
On entre dans ce labyrinthe par le point A en haut gauche, on avance de
carrefour en carrefour, et on cherche la sortie Z, en bas droite.
En partant de lentre A, on na gure dautre choix que davancer droit
devant soi jusquau carrefour B, o deux possibilits se prsentent :
tourner droite ou continuer tout droit. Si on continue tout droit, vers le
carrefour C, et que cela se rvle un mauvais choix, il faudra plus tard
explorer lautre possibilit : revenir en B et prendre la galerie qui mne
au carrefour M. Tout le temps que dure lexploration de la premire pos-
sibilit, on doit donc garder en mmoire que la seconde reste explorer.
Au carrefour C se pose nouveau le choix entre deux galeries qui
mnent lune au carrefour D et lautre au carrefour K. Si on prend la
galerie qui mne au carrefour D, on doit garder en mmoire que, en plus
du chemin A-B-C-D, il y a dsormais deux autres chemins dont on doit
explorer les prolongements : A-B-M et A-B-C-K.
chaque tape de son exploration, il faut donc se souvenir dune liste de
chemins prolonger. On peut se reprsenter cette liste comme les cailloux
du Petit Poucet ou le fil dAriane qui, en marquant le chemin parcouru,
mettent en vidence ceux qui restent explorer lorsquil faudra revenir
sur ses pas. Au dpart, la liste contient un chemin unique, form dun
carrefour unique, qui est lentre du labyrinthe :
Cette liste des chemins prolonger devient ensuite :
puis
A
A-B
A-B-C
A-B-M
ManuelDowek.book Page 278 Monday, July 9, 2012 4:58 PM
22 Parcourir un graphe
Groupe Eyrolles, 2012
279
On choisit alors un chemin ou lautre et on le prolonge. Si on choisit le
premier, cette liste devient :
Si on choisit de prolonger encore le premier chemin, elle devient :
puis :
Si on choisit encore de prolonger le premier chemin A-B-C-D-E-F, on
rencontre une situation nouvelle, car le carrefour F est une impasse. On
supprime donc simplement le chemin A-B-C-D-E-F de la liste des che-
mins prolonger, qui devient donc :
et on entame alors lexploration dun autre chemin de cette liste, par
exemple A-B-C-D-E-G.
De manire gnrale, chaque tape, on transforme la liste de chemins
prolonger en choisissant un chemin c, par exemple le premier de la liste,
et en le remplaant par tous les chemins obtenus en ajoutant c un carre-
four accessible depuis son dernier carrefour. Un cas particulier est celui
o ce dernier carrefour est une impasse. Dans ce cas, on remplace le
chemin c par zro chemin, cest--dire quon le supprime de la liste des
chemins prolonger.
Il y a cependant deux exceptions. Si le dernier carrefour du chemin c est la
sortie du labyrinthe, lalgorithme sarrte et retourne le chemin c qui va de
lentre la sortie du labyrinthe. Si la liste des chemins prolonger est vide,
lalgorithme sarrte galement : tous les chemins ont t explors sans
succs, mais il ny en a aucun qui conduise de lentre la sortie.
A-B-C-D
A-B-C-K
A-B-M
A-B-C-D-E
A-B-C-D-K
A-B-C-K
A-B-M
A-B-C-D-E-F
A-B-C-D-E-G
A-B-C-D-K
A-B-C-K
A-B-M
A-B-C-D-E-G
A-B-C-D-K
A-B-C-K
A-B-M
ManuelDowek.book Page 279 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
280
viter de tourner en rond
Cette mthode fonctionne pour certains labyrinthes, mais pas pour tous.
Dans le cas de notre exemple prcdent, par exemple, elle peut chouer, ou
plus prcisment se lancer dans des calculs infinis, sans jamais trouver le
chemin A-B-M-Z qui mne de lentre la sortie. Au carrefour C, en
effet, on peut continuer vers le carrefour D, puis prendre droite vers le
carrefour K et encore droite, ce qui ramne au carrefour C. On peut alors
nouveau prendre droite vers le carrefour D, et ainsi de suite linfini :
ce labyrinthe comporte un cycle. En appliquant la mthode dcrite, on
peut remplacer le chemin A-B-C-D, par des chemins parmi lesquels figure
A-B-C-D-K, que lon remplace son tour par des chemins parmi lesquels
figure A-B-C-D-K-C, que lon remplace son tour par des chemins parmi
lesquels figure A-B-C-D-K-C-D, et ainsi de suite linfini.
Pour trouver la sortie dun labyrinthe, il faut donc certes explorer systma-
tiquement tous les chemins possibles, mais aussi viter de tourner en rond.
En fait, il nest mme pas ncessaire que le labyrinthe comporte un cycle
pour que la mthode dcrite se lance dans un calcul infini. On a dit que,
arriv au carrefour C, on a deux possibilits : continuer tout droit vers le
carrefour D ou tourner droite vers le carrefour K. Stricto sensu, il y a
une troisime possibilit : revenir sur ses pas vers B. Si on inclut cette
possibilit, la mthode peut se lancer dans un calcul infini, en allant de B
C, puis de C B, etc.
Il y a plusieurs manires dviter que cette mthode tourne ainsi en rond. La
plus simple consiste ne pas ajouter la liste les chemins obtenus en ajou-
tant un carrefour dj inclus dans le chemin c et qui forment donc un cycle.
Cette mthode est correcte, mais il est possible de faire mieux. En effet,
comme on la vu, quand on arrive au carrefour D, la liste des chemins
prolonger est :
Lexploration du chemin A-B-C-D est longue puisquil faut parcourir
toute la partie du labyrinthe en vert sur la figure.
Cependant, cette longue exploration ne mne qu des impasses, si bien
que la liste des chemins prolonger devient finalement :
A-B-C-D
A-B-C-K
A-B-M
A-B-C-K
A-B-M
ManuelDowek.book Page 280 Monday, July 9, 2012 4:58 PM
22 Parcourir un graphe
Groupe Eyrolles, 2012
281
partir de K, on ne peut pas revenir en C, car ce carrefour appartient au
chemin A-B-C-K, mais rien nempche daller en D ou en L, si bien
quon doit explorer nouveau toute la partie du labyrinthe en vert, alors
quen arrivant en K, on pourrait se rendre compte que lon est dj pass
par l et quil nest pas ncessaire de continuer.
Pour viter la fois de tourner en rond et dexplorer plusieurs fois les
mmes parties du labyrinthe, une solution consiste marquer les carre-
fours que lon visite pour ne jamais repasser par eux. Lalgorithme auquel
on aboutit ainsi utilise donc, dune part, une liste des chemins pro-
longer et, dautre part, une liste des carrefours dj visits.
Ainsi, au dpart, la liste des chemins prolonger contient un seul chemin
form dun seul carrefour, qui est le point dentre du labyrinthe :
et la liste des carrefours dj visits est vide. Puis, chaque tape, on
transforme la liste de chemins explorer de la manire suivante : on
choisit un chemin c dans la liste des chemins prolonger. Si le dernier
carrefour x de ce chemin appartient la liste des carrefours dj visits,
on supprime simplement le chemin c. Sinon, on le remplace par les che-
mins obtenus en ajoutant c un carrefour accessible depuis x et on
ajoute x la liste des carrefours dj visits.
Ainsi, dans notre exemple, quand on a fini lexploration du chemin A-B-
C-D, la liste des chemins prolonger devient :
et la liste des carrefours dj visits contient A, B, C, D, E, F, G, H, I, J,
K et L.
K est dans la liste des carrefours dj visits ; il est donc inutile dy
retourner et la liste des chemins prolonger devient :
Il est facile de montrer que cet algorithme se termine, car le nombre de
carrefours dj visits augmente chaque tape et il ne peut pas aug-
menter au-del du nombre total de carrefours du labyrinthe.
Il est, en revanche, plus dlicat de montrer que cet algorithme trouve tou-
jours un chemin vers la sortie quand un tel chemin existe, car il faut montrer
quen vitant ainsi lexploration de nombreux chemins, on noublie pas
dexplorer celui qui mne de lentre la sortie. On montre, pour cela, que
sil existe au dpart, dans la liste des chemins prolonger, un chemin prolon-
geable vers la sortie, alors cette proprit est prserve chaque tape de lex-
A
A-B-C-K
A-B-M
A-B-M
ManuelDowek.book Page 281 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
282
cution de lalgorithme : cest un invariant. Un chemin est dit prolongeable
vers la sortie sil se termine par un carrefour y et sil existe un chemin form
de carrefours distincts et non encore visits, qui mne de y la sortie.
Ltape lmentaire de lalgorithme consiste transformer la liste des chemins
prolonger en remplaant un chemin c

par tous les chemins obtenus en lui
ajoutant un carrefour accessible depuis son dernier carrefour x. On ajoute
alors x la liste des carrefours visits. Si le chemin c est lui-mme prolon-
geable vers la sortie, alors il y a videmment, parmi les nouveaux chemins, un
qui est prolongeable vers la sortie. Si, en revanche, c nest pas prolongeable
vers la sortie, alors un autre chemin c de la liste lest. Il faut montrer que ce
chemin reste prolongeable vers la sortie, bien qu cette tape on ajoute x la
liste des carrefours dj visits. Cela est d au fait que, comme il ny a pas de
chemin

form de carrefours distincts et non encore visits qui mne du
carrefour x la sortie, le carrefour x ne peut appartenir aucun chemin form
de carrefours distincts et non encore visits qui mne du dernier carrefour
de c la sortie. Le chemin c reste donc prolongeable vers la sortie bien que
lon ajoute x la liste des carrefours visits.
La recherche en profondeur
et la recherche en largeur
La mthode dcrite au paragraphe prcdent est encore incomplte, car elle
nindique pas dans quel ordre on doit traiter les chemins prolonger. Or,
selon lordre que lon choisit, on aboutit diffrents algorithmes. La manire
la plus simple de procder est celle que nous avons employe dans les
exemples : on choisit toujours de traiter le premier chemin de la liste et,
quand on le remplace par les chemins obtenus en lui ajoutant un carrefour
accessible depuis son dernier carrefour, on met ces chemins au dbut de la
liste galement. Par exemple, quand on avait la liste de chemins prolonger :
on a choisi le premier de la liste, A-B-C, et on la prolong en deux chemins A-
B-C-D et A-B-C-K que lon a placs au dbut de la liste :
puis on a choisi nouveau le premier de la liste : A-B-C-D.
A-B-C
A-B-M
A-B-C-D
A-B-C-K
A-B-M
ManuelDowek.book Page 282 Monday, July 9, 2012 4:58 PM
22 Parcourir un graphe
Groupe Eyrolles, 2012
283
Cet algorithme sappelle lalgorithme de parcours en profondeur ou dfs (depth-
first search), car on explore dabord en profondeur les prolongements possi-
bles du chemin A-B-C, avant de commencer explorer ceux du second, A-
B-M, si jamais la premire exploration choue. Cette manire de faire est la
plus naturelle : cest la fois la plus simple programmer et celle que lon
utilise spontanment quand on est perdu dans un labyrinthe.
Une autre manire de faire est de traiter les chemins plus quitablement :
pour cela, on choisit toujours le chemin le plus court. Ainsi, quand on a
remplac le chemin A-B-C par les deux chemins A-B-C-D et A-B-C-K, on
choisit, non lun de ces deux-l, mais le chemin A-B-M qui est plus court.
Une manire simple de faire cela est de mettre les deux chemins A-B-C-D
et A-B-C-K la fin, et non au dbut, de la liste des chemins prolonger :
puis dexplorer le premier chemin de la liste : A-B-M et de mettre les
deux chemins obtenus la fin de la liste des chemins prolonger :
Cet algorithme, qui sappelle lalgorithme de parcours en largeur ou bfs
(breadth-first search), a lavantage de trouver le chemin le plus court qui
va de lentre la sortie du labyrinthe, ou lun parmi les plus courts sil y
en a plusieurs.
Le parcours dun graphe
Ces algorithmes sont bien entendu utiliss pour rsoudre de nombreux pro-
blmes autres que la recherche de la sortie dun labyrinthe. De manire
gnrale, ils servent pour parcourir des graphes. Un graphe est simplement
un ensemble dobjets, que lon appelle des sommets, et un ensemble dartes,
chaque arte reliant deux sommets entre eux. Dans le cas dun labyrinthe, les
sommets sont les carrefours et les artes les galeries qui relient les carrefours.
Dautres exemples de graphes sont les cartes routires ou ferroviaires : les
programmes qui trouvent un chemin allant dune ville une autre, ou
A-B-M
A-B-C-D
A-B-C-K
A-B-C-D
A-B-C-K
A-B-M-N
A-B-M-Z
ALLER PLUS LOIN Le chemin de poids minimal
On peut aussi prendre en compte la longueur
des galeries. On obtient alors un troisime algo-
rithme qui cherche un chemin vers la sortie de
poids minimal, le poids tant une grandeur
abstraite associe chaque galerie, par exemple
sa longueur. Il suffit pour cela de toujours traiter
en premier, dans la liste des chemins pro-
longer, celui dont le poids est le plus petit.
ManuelDowek.book Page 283 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
284
dune gare une autre, utilisent des algorithmes de parcours de graphe,
cherchant en gnral des chemins de poids minimaux.
Les labyrinthes que lon a parcourus sont des graphes non orients, cest-
-dire que la mme arte relie le sommet A au sommet B et le sommet B
au sommet A. Dans dautres graphes, dits orients, une arte relie soit A
B, soit B A, et si on veut relier la fois A B et B A, il faut utiliser
deux artes. On aurait, par exemple, d utiliser un graphe orient, sil y
avait eu des sens uniques dans les labyrinthes dont on cherchait la sortie.
Les algorithmes tudis prcdemment stendent sans difficult aux
graphes orients.
tats et transitions
Beaucoup dobjets peuvent se modliser comme des graphes, en particulier,
toutes les situations qui peuvent se dcrire laide dun ensemble dtats et
dun ensemble de transitions entre ces tats. Cest le cas de nombreux jeux,
comme le Solitaire ou le Tic-tac-toe. La figure suivante reprsente un tout
petit bout du graphe o le joueur bleu a deux choix pour placer un rond,
lun des deux le conduisant perdre la partie.
Un tat du plateau indique quelle pice se trouve sur quelle case et les
rgles du jeu dfinissent des transitions possibles dun tat un autre. On
peut alors dfinir un graphe dont les sommets sont les tats du plateau et
les artes les coups possibles. Un simple parcours de graphe permet de
trouver une solution au jeu du Solitaire, par exemple. Les rgles des jeux
plusieurs joueurs, comme le Tic-tac-toe, les checs ou le Monopoly,
peuvent aussi se dfinir comme des transitions entre tats. Comme il y a
plusieurs joueurs, et parfois du hasard, trouver une stratgie pour ces jeux
demande des algorithmes plus complexes quun simple parcours de gra-
phes, mais ces algorithmes reposent sur des ides similaires.
ManuelDowek.book Page 284 Monday, July 9, 2012 4:58 PM
22 Parcourir un graphe
Groupe Eyrolles, 2012
285
DEVINETTE Le chou, la chvre et le loup
Une devinette classique raconte lhistoire dun berger
qui possde un chou, une chvre et un loup. En sa pr-
sence, la chvre nose pas manger le chou, pas plus que
le loup nose manger la chvre, mais ils nhsiteraient
pas satisfaire leurs apptits si lhomme tournait le dos.
Ce berger doit traverser une rivire avec sa petite
troupe et il ne dispose que dune barque, dans laquelle
il ne peut naviguer quavec un seul de ses compagnons.
Comment doit-il sy prendre ?
Ce problme peut lui aussi se modliser comme un par-
cours de graphe. Tout dabord, chacun des quatre prota-
gonistes pouvant se trouver sur une rive ou lautre, il y a
seize tats possibles :
Les tats 3, 6, 7, 8, 9 et 12 doivent tre limins, car dans
chacun deux le loup et la chvre, ou la chvre et le
chou, sont sur une rive sans le berger. Il reste donc dix
tats que lon peut nommer en fonction des protago-
nistes prsents sur la rive de dpart :

chou
chvre
loup
chou, loup
chvre, berger
chou, chvre, berger
chou, loup, berger
chvre, loup, berger
chou, chvre, loup, berger
Dfinissons les transitions entre tats : on ne peut pas
passer directement de ltat chou, chvre, loup, berger
ltat car cela signifierait que le berger emporte la
fois le chou, la chvre et le loup sur sa barque. En
revanche, on peut passer de ltat chvre, loup, berger
ltat chvre, car cela signifie que le berger emmne le
loup sur sa barque de la rive de dpart la rive darrive.
On peut de mme passer de ltat chvre ltat chvre,
loup, berger, car cela signifie que le berger ramne le
loup sur sa barque de la rive darrive la rive de dpart.
De manire gnrale, on peut passer dun tat qui con-
tient le berger un tat dans lequel il nest plus, ainsi
quun ou zro de ses compagnons, et vice-versa.
Sur ces bases, on dfinit le graphe () dont les sommets
sont les dix tats possibles et les artes les transitions
entre ces tats. Il ne reste plus qu utiliser un algo-
rithme de parcours de graphe pour chercher un chemin
qui mne de la configuration initiale chou, chvre, loup,
berger, la configuration finale - ().

rive de dpart rive darrive


0 chou, chvre, loup, berger
1 chou chvre, loup, berger
2 chvre chou, loup, berger
3 chou, chvre loup, berger
4 loup chou, chvre, berger
5 chou, loup chvre, berger
6 chvre, loup chou, berger
7 chou, chvre, loup berger
8 berger chou, chvre, loup
9 chou, berger chvre, loup
10 chvre, berger chou, loup
11 chou, chvre, berger loup
12 loup, berger chou, chvre
13 chou, loup, berger chvre
14 chvre, loup, berger chou
15 chou, chvre, loup, berger
ManuelDowek.book Page 285 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
286
Exercice 22.1
Chercher sur le Web qui tait Lonard Euler et dcrire le problme des ponts
de Knigsberg, premier problme explicitement exprim avec un graphe dans
lhistoire des sciences.
Exercice 22.2
Dcrire les objets suivants comme des graphes :
un rseau dordinateurs,
des maisons avec des botes aux lettres,
le mtro parisien,
une ville, dans laquelle il ny a plus ni radio ni tl, et dans laquelle se pro-
page par SMS linformation de larrive dune star,
une population au sein de laquelle se propage une pidmie.
Que sont les sommets ? Que sont les artes ? quoi correspond la longueur
du plus court chemin entre deux points ? Trouver dautres exemples.
Exercice 22.3
Dcrire un rseau social comme un graphe. Que sont les sommets ? Que sont
les artes ?
Exercice 22.4
Imaginer un rseau social o ne sont en lien que les filles et les frres et
surs : quel est le chemin minimal pour que deux garons, qui ne sont pas de
la mme famille se passent un message travers les artes ?
Exercice 22.5
Imaginer un autre rseau o chaque personne a dix amis. Combien de per-
sonnes au maximum un message diffus aux amis des amis des amis, etc. peut-
il atteindre en une heure, si le dlai entre la rception et le rediffusion dun
message est de cinq minutes ? Que nous apprend ce rsultat sur le risque de
propagation dune rumeur sur un rseau social ?
Le chemin le plus court comporte sept artes, ce qui
oblige le berger faire quatre allers et trois retours :
Il emmne dabord la chvre sur lautre rive, ce qui
correspond larte qui va du sommet chou, chvre,
loup, berger au sommet chou, loup.
Il revient seul.
Il emmne le loup sur lautre rive.
Il revient avec la chvre.
Il emmne le chou.
Il revient seul.
Il emmne enfin la chvre une seconde fois.
Bref, lalgorithme a devin que la solution consiste
faire revenir la chvre avec le berger pour ne jamais la
laisser ni avec le loup ni avec le chou.
ManuelDowek.book Page 286 Monday, July 9, 2012 4:58 PM
22 Parcourir un graphe
Groupe Eyrolles, 2012
287
Exercice 22.6
Sur le plus grand rseau social du monde, il y a environ un milliard de per-
sonnes connectes chacune cent autres personnes environ. Un chemin de
deux artes ami dami connecte donc une personne environ
100 100 = 10 000 autres personnes, si on nglige les amis communs et,
disons, environ 100 50 = 5 000 si lon tient compte des amis communs. Un
chemin de trois artes ami dami dami connecte une personne environ
100 50 50 = 250 000 autres personnes. En supposant grossirement quon
ne gagne ainsi que la moiti de nouveaux contacts chaque arte, combien
de personnes environ est-on connect avec un chemin de six artes ? Dans un
tel rseau social, quelle est la distance maximale entre deux personnes ? Il se
trouve que ce calcul approximatif donne un rsultat trs proche de la ralit.
ALLER PLUS LOIN Quest-ce quun algorithme fondamental ?
Beaucoup de problmes peuvent se formuler comme des problmes de
tri ; de mme, on a vu dans ce chapitre que beaucoup de problmes
peuvent se ramener des problmes de graphes. Cela fait des algo-
rithmes de tris et ceux de parcours de graphes des algorithmes fonda-
mentaux. Dautres exemples dalgorithmes fondamentaux, que lon peut
rechercher sur le Web, sont ceux de multiplication de matrices, de rso-
lution dquations boolennes, dunification... Quand on essaie de
rsoudre un problme, une bonne attitude consiste souvent chercher
quel problme connu on peut se ramener et quel algorithme fonda-
mental on peut utiliser.
Ai-je bien compris ?
Que faut-il viter quand on cherche la sortie dun labyrinthe ?
Quel est lavantage de chercher la sortie dun labyrinthe en largeur dabord ?
Quels objets peut-on dcrire comme des graphes ?
ManuelDowek.book Page 287 Monday, July 9, 2012 4:58 PM
TMOIGNAGE Jonathan, 24 ans
Jai commenc la programmation avec une (mauvaise) rplique de Mastermind qui permettait
de jouer contre lordinateur. Aprs quelques essais manqus, quelques programmes ici et l, je
dcouvre le Web : cest le coup de foudre je nai jamais dcroch depuis. Dabord des sites web en
PHP, puis le monde de Mozilla Firefox. De cette rencontre, nat un livre paru chez Eyrolles,
rdig pendant mon temps libre en terminale. Quelques annes plus tard, je reprends linforma-
tique lcole Normale Suprieure en section informatique : jy dcouvre le lambda calcul et la
programmation fonctionnelle. Je suis maintenant en thse Inria, dans lquipe qui conoit le
langage OCaml, et je continue damliorer le code de Firefox et de Thunderbird sur mon temps
libre au sein de la communaut Mozilla.
TMOIGNAGE Grgoire, 27 ans
Tomb dans la marmite de llectronique et de la bidouille , grce son papa, Grgoire passe
rapidement linformatique et dcide dapprendre le C. Sensuit une vraie passion pour les technolo-
gies dites nouvelles, et pour le lien intime et complexe entre matriel et logiciel. Math-sup, math-sp
(pour faire plaisir maman !), puis une formation dingnieur, et un rve amricain, concrtis lors
dun stage dans la Silicon Valley travailler sur une puce dencodage vido. Grgoire revient ensuite
en France et, Paris, met sa crativit profit pour inventer la set-top box de demain, qui tient
au creux de la main et propose une exprience visuelle digne des derniers jeux vidos. titre per-
sonnel, il songe des manires de simplifier linformatique et la programmation, mais sans perdre le
lien avec le matriel, et dveloppe secrtement le concept de Software Atoms .
Convaincu que la valeur et linnovation sont ports par ceux qui crent (les programmeurs et les pas-
sionns), il milite pour le dveloppement de hirarchies dentreprise moins verticales, pour la revalori-
sation du dveloppement logiciel en France et de la crativit technologique.
ManuelDowek.book Page 288 Monday, July 9, 2012 4:58 PM
Un gnrateur dexercices de calcul mental
Programmer un gnrateur dexercices de calcul mental :
le programme choisit alatoirement une opration et deux
nombres, et vrifie la rponse de lutilisateur. On peut
ensuite poser une srie de questions et compter le score
total. On pourra enfin prvoir plusieurs niveaux de diffi-
cult selon les oprations proposes ou la taille des nom-
bres calculer, et laisser lutilisateur choisir son niveau de
difficult ou attribuer des scores variables aux rponses.
Mastermind
crire un programme qui lit deux tableaux de quatre
lments au clavier et indique le nombre dlments en
commun dans ces deux tableaux. crire un programme
qui joue au Mastermind : tire au hasard la combinaison
secrte et rpond aux propositions de lautre joueur.
Brin dARN
Chercher sur le Web ce quest un brin dARN messager
et comment il code pour une protine. crire un pro-
gramme qui dtermine la protine pour laquelle un brin
dARN messager code.
Bataille navale
crire un programme de bataille navale avec plusieurs
bateaux.
Cent mille milliards de pomes
Chercher sur le Web, ou dans une bibliothque, ce
quest le recueil Cent mille milliards de pomes de Ray-
mond Queneau. crire un programme qui affiche ces
cent mille milliards de pomes.
Site de rencontres
Programmer le moteur dun site de rencontres, sur le
principe suivant :
Chaque personne inscrite sur le site rpond un
questionnaire de personnalit dont les rponses sont
des entiers entre 1 et 10.
On stocke les rponses dans un tableau double
entre : la case de la ligne i et de la colonne j contient
la rponse de linscrit numro i la question numro j.
Pour mettre en relation un nouvel inscrit avec une per-
sonne dj inscrite, on parcourt ce tableau en recher-
chant la ligne qui contient les rponses les plus
proches de celles donnes par le nouvel inscrit. Pour
dterminer si des rponses sont proches, on pourra par
exemple compter le nombre de rponses identiques ou
calculer le total des diffrences.
On pourra enfin, partir dun tableau dj rempli,
chercher former autant de couples que possible.
Ides de projets
ManuelDowek.book Page 289 Monday, July 9, 2012 4:58 PM
TMOIGNAGE Christine
Quand jtais adolescente, il ny avait dordinateurs ni lcole, ni la maison. Pourtant nos
cours comportaient de nombreuses activits lies linformatique : reprsenter la mme informa-
tion dans plusieurs formats, laborer diffrentes mthodes pour raliser le mme objectif (je me sou-
viens de cartes perfores et daiguilles tricoter pour trier) ou encore raisonner et calculer partir
dun ensemble donn de rgles.
Ma premire calculatrice ? Je ne lai eue quaprs le baccalaurat et, si elle tait programmable,
ctait partir dun jeu dinstructions trs lmentaire. Cela nen tait quun dfi plus intressant.
Face une srie de problmes rsoudre, laborer la bonne squence dinstructions qui permettra
dobtenir toutes les solutions sans effort est gratifiant, et aussi distrayant que de rsoudre un casse-
tte. Contrairement un jeu tout fait, le champ des possibles est immense : les moyens de calcul, de
communication, et les donnes, sont notre porte pour pouvoir les explorer.
crire soi-mme un programme qui marche requiert connaissances, exprience, et imagination.
La satisfaction est immense davoir cr un nouvel objet.
Ce plaisir que jai eu transformer les problmes en programmes est encore intact aprs 25 ans de
carrire de chercheuse au CNRS puis de professeur luniversit. Jai choisi linformatique comme
mtier (assez tardivement) grce un professeur qui ma fait dcouvrir tout ce que cette discipline
nouvelle offrait dopportunits en termes de mtier et dactivit. Jy ai trouv une voie qui rpon-
dait mes gots et comptences. Aujourdhui, jessaie de donner aux tudiantes et tudiants les cls
thoriques et pratiques du monde numrique quils consomment chaque jour, pour quils sachent
ladapter leurs besoins et contribuent lenrichir.
ManuelDowek.book Page 290 Monday, July 9, 2012 4:58 PM
Ides de projets
291
Tracer la courbe reprsentative
dune fonction polynme du second degr
crire un programme qui, tant donn une fonction
polynme du second degr, trace sa courbe reprsenta-
tive lcran en adaptant automatiquement la fentre
pour faire apparatre le sommet de la parabole et les
ventuels zros. On pourra faire raliser les calculs
intermdiaires dans des fonctions spares.
Grer le score au tennis
crire un programme qui gre automatiquement le
score au tennis :
1 quelles conditions un joueur gagne-t-il un jeu ?
2 Dfinir une fonction qui compte les points au cours
dun jeu. En entre, on demande rptitivement
quel joueur, 1 ou 2, gagne le point ; au fur et
mesure, on calcule et on affiche le score. Le pro-
gramme sarrte ds quun joueur gagne le jeu, aprs
avoir affich le nom du vainqueur.
3 Pour faciliter les tests, crire une seconde version de
cette fonction avec pour seule entre une chane de
caractres qui contient les numros successifs des
joueurs marquant les points ; la fonction lit cette
chane caractre par caractre pour compter les
points. Ainsi, lentre 211222 sera comprise
comme : le joueur 2 gagne un point, puis le joueur 1
en gagne deux, puis le joueur 2 en gagne trois et le
joueur 2 gagne donc le jeu.
4 crire une deuxime fonction qui compte les jeux au
cours dun set et sarrte lorsquun joueur gagne le
set. Cette fonction fera appel la prcdente pour
savoir qui gagne les jeux. On noubliera pas de pr-
voir le cas particulier du jeu dcisif.
5 crire une troisime fonction qui compte les sets et
sarrte lorsquun joueur gagne le match. On pourra,
avant de commencer le match, demander en com-
bien de sets gagnants il est jou.
Automatiser les calculs de chimie
Programmer une bote outils pour automatiser les dif-
frents calculs que lon a loccasion de faire en chimie :
dure dune raction, pH dune solution, masses et con-
centrations, quilibre dune quation-bilan simple
Tours de Hano
Chercher sur le Web ce que sont les tours de Hano et
crire un programme qui trouve une solution ce jeu.
Tortue Logo
Chercher sur le Web ce quest une tortue Logo. Pro-
grammez ses principales fonctionnalits. Chercher sur
le Web ce quest le flocon de Von Koch et dessiner ce
flocon laide de cette tortue.
Dessins de plantes
Programmer des dessins de plantes suivant un modle
rcursif, par exemple une fougre. On pourra introduire un
lment alatoire dans lalgorithme, afin de varier les rsul-
tats obtenus. On pourra utiliser une tortue Logo pro-
gramme par soi-mme ou par un camarade, ou fournie
dans une bibliothque du langage de programmation utilis.
Langage CSS
Rechercher sur le Web comment le langage CSS
permet de donner une prsentation diffrente des
informations, selon quelles sont lues sur un ordinateur
ou sur lcran dun tlphone. Construire un site Web
sur le sujet de son choix qui peut ainsi tre consult sur
un cran ou un autre.
Calcul sur des entiers de taille arbitraire
En reprsentant chaque nombre par un tableau qui
contient la suite de ses chiffres, crire une bibliothque
de fonctions calculant sur des entiers de taille arbitraire,
sans les dpassements de capacit quengendre lutilisa-
tion du type int.
ManuelDowek.book Page 291 Monday, July 9, 2012 4:58 PM
TMOIGNAGE Raphal, 35 ans
Linformatique, je suis tomb dedans trs jeune, et mon premier programme en BASIC, qui affi-
chait une carte de France, ma fait dcouvrir le plaisir de dominer lordinateur. Avec un peu
dattention, on peut lui faire faire ce que lon veut. Aprs avoir dcouvert Windows, je suis
devenu un grand fan de Bill Gates. Mais alors que jtais au lyce, Internet est arriv et grce
lui, jai redcouvert linformatique sous un nouvel angle. Je suis entr dans un nouvel univers,
celui du logiciel libre. Finis les bricolages : il tait dsormais possible de diagnostiquer tous les pro-
blmes, voire de les corriger grce laccs au code source. Lorsque cela dpassait mes comptences,
je pouvais contacter lauteur du logiciel et obtenir un correctif en lespace de quelques jours.
Trs rapidement, jai ressenti le besoin de mimpliquer dans cette communaut pour apporter ma
pierre ldifice. Cest ainsi que je suis devenu dveloppeur Debian, distribution GNU/Linux,
alors que jentrais lINSA de Lyon. Deux ans aprs avoir obtenu mon diplme dingnieur en
informatique, jcrivais le premier livre franais sur Debian et je lanais ma propre socit,
Freexian, pour faire de ma passion, mon activit principale.
ManuelDowek.book Page 292 Monday, July 9, 2012 4:58 PM
Ides de projets
293
Calcul en valeur exacte sur des fractions
Proposer un type reprsentant une fraction en valeur
exacte. crire une bibliothque de fonctions pour effectuer
des calculs en valeur exacte sur des fractions. Rechercher
sur le Web ce quest la mthode de Hron pour calculer
une valeur approche dune racine carre et la programmer
en utilisant la bibliothque de calcul sur les fractions.
Reprsentation des dates et heures
Les systmes numriques passent automatiquement
lheure dt et dtectent quand on change de fuseau
horaire. Chercher sur le Web des informations sur la
reprsentation des dates et heures : la norme ISO 8601
et le Network Time Protocol. crire un programme qui
donne lheure dans diffrents pays.
Transcrire dans lalphabet latin
Choisir une langue qui utilise un autre alphabet que
lalphabet latin (par exemple le chinois, larabe, le japo-
nais, lhbreu ou le grec) et une trentaine de mots crits
dans cette langue. Associer chaque syllabe de lun de
ces mots une transcription phontique crite dans
lalphabet latin. crire un programme dapprentissage
qui tire au hasard des mots dans cette liste, les affiche
lcran et demande lutilisateur de les lire, cest--dire
de les transcrire dans lalphabet latin.
Correcteur orthographique
Raliser un correcteur orthographique. Un tel pro-
gramme prend en entre un fichier texte, le dcoupe en
mots, cherche chaque mot dans un dictionnaire et
donne la liste des mots qui ne sy trouvent pas.
Daltonisme
Rechercher sur le Web ce quest le daltonisme et quelles
en sont les diffrentes formes. crire un programme qui
lit une image dans un fichier au format PPM et
laffiche lcran comme la verrait une personne
atteinte de chacune des formes de daltonisme.
Systme audio par syllabe
Enregistrer un fichier audio par syllabe ba , be ,
bi , bo , bu , bou , bon , etc. Utiliser ces
fichiers pour crire un programme qui envoie une
squence de ces grains sonores au systme audio, en fonc-
tion dun texte crit phontiquement bon , jou ,
re , i , l , ne , ve , re . Comparer le rsultat
avec un systme professionnel de synthse vocale et mettre
en lumire les difficults dun tel mcanisme.
Dchiffrer automatiquement un message cod
selon la mthode de Csar
crire un programme qui dchiffre automatiquement
un message cod selon la mthode de Csar sans con-
natre a priori la valeur du dcalage. Rechercher ce
quest le chiffre de Vigenre et crire un programme qui
code un message selon ce principe. Rechercher une
mthode pour dcoder un message cod selon ce prin-
cipe sans connatre la cl utilise, et crire un pro-
gramme qui effectue ce dcodage.
Logisim
Pour construire et simuler des circuits, on peut utiliser
logiciel Logisim disponible ladresse :
http://ozark.hendrix.edu/~burch/logisim/
Ce logiciel libre fonctionne sur la plupart des ordinateurs.
Il nest pas encore traduit en franais, mais il est trs bien
document : on peut commencer sa lecture par le tutoriel.
En utilisant ce logiciel, on peut par exemple construire le
multiplexeur et les circuits de dcalage dfinis au
chapitre 13 et le compteur huit bits dfini au chapitre 14.
Banc de registres
Rechercher sur le Web ce quest un banc de registres,
ainsi que les notions de port de lecture et de port dcri-
ture sur un banc de registres. laide de lhorloge et des
circuits vus aux chapitres 13 et 14, raliser un banc de
8 registres 8 bits et dessiner le circuit correspondant.
ManuelDowek.book Page 293 Monday, July 9, 2012 4:58 PM
TMOIGNAGE Pierre, 24 ans
Jtais en sixime, lorsque mon premier ordinateur est arriv la maison, mais je dois recon-
natre que pendant bien longtemps, il navait dutilit pour moi que comme simple console de jeux.
Cest en classes prparatoires, sur les conseils de mon professeur de mathmatiques de lpoque, que
jai choisi de prendre loption Informatique plutt que Sciences Industrielles. Je navais aucune
ide encore de ce que pouvait tre un langage de programmation ni mme de la manire dont fonc-
tionnait un ordinateur en gnral. Se lancer dans une matire totalement inconnue alors quon a
un emploi du temps dj charg nest pas un choix ais. Il sest cependant rvl judicieux : jtais
alors port sur les mathmatiques mais jai retrouv dans lenseignement de linformatique cer-
tains concepts (ensembles, fonctions), tout en vitant le calcul (et les erreurs qui vont avec) que
je dtestais. Cest en cole dingnieur que mon choix de spcialisation sest dfinitivement port
sur linformatique. Au fil de mes lectures diverses je me faisais (enfin) une ide de ce que je vou-
drais faire plus tard : de la logique, comprendre comment sont construits le raisonnement et les
objets des mathmatiques. Jai donc commenc ma qute dans le dpartement de mathmatiques o
lon ma expliqu que ces aspect taient plutt tudis dans le laboratoire d ct L, jai
retrouv un professeur qui mavait impressionn lanne prcdente en prsentant les modifica-
tions des cases mmoires dun ordinateur, laide de boites chaussures. Aprs un master de
recherche en informatique, jai commenc ma thse dans le cadre dun partenariat entre Inria et la
NASA. Je dveloppe un algorithme pour amliorer la prcision des calculs sur les ordinateurs.
ManuelDowek.book Page 294 Monday, July 9, 2012 4:58 PM
Ides de projets
295
Simuler le comportement dun processeur
crire un programme simulant le comportement du
processeur lorsquil doit excuter un des programmes
crits en langage machine dcrits au chapitre 15. Ce
programme lira dans un fichier le contenu de la
mmoire, qui contient galement le programme ex-
cuter. Il affichera ltat de la mmoire et des registres au
fur et mesure de lexcution.
Effectuer des calculs sur les adresses
de cases mmoires
Le langage machine dcrit au chapitre 15 ne permet
daccder qu un ensemble fini de cases mmoires,
dont les adresses sont fournies dans le code des instruc-
tions LDA, STA, etc. Pour effectuer des calculs com-
plexes, et notamment pour manipuler des tableaux, on
doit pouvoir effectuer des calculs sur les adresses de
cases mmoires elles-mmes. Proposer une extension
du langage machine pour effectuer de tels calculs, en
dfinissant la syntaxe des nouvelles instructions, en
choisissant leur code machine (binaire) et en expliquant
leur fonctionnement. Programmer des boucles simples
ralisant des calculs sur des tableaux, par exemple : la
somme des lments dun tableau, le compteur du
nombre dlments positifs, etc.
Utilisation du logiciel Wireshark
Installer et lancer le logiciel Wireshark. Capturer des
paquets Ethernet ou WiFi depuis la carte rseau et affi-
cher leur contenu lcran. Quelles sont les adresses
MAC utilises pour la destination et la source de
chaque paquet ? Quels ordinateurs sont identifis par
ces adresses ? Quelle est la taille de chaque paquet ?
Algorithme de pledge
Chercher sur le site web interstices.info ce quest lalgo-
rithme de pledge. Programmer cet algorithme. Expli-
quer son utilit et en quoi il se distingue de lalgorithme
de sortie dun labyrinthe du chapitre 22.
Algorithme calculant le successeur
dun nombre entier naturel n
On considre un algorithme qui calcule le successeur dun
nombre entier naturel n, cest--dire le nombre n + 1. Cet
algorithme est similaire celui de laddition, mais il
sapplique un unique nombre : il procde de la droite
vers la gauche en posant un chiffre et en propageant une
retenue chaque tape. Identifier les fonctions boo-
lennes qui un chiffre binaire et une retenue associent le
chiffre poser et la retenue propager. Programmer cet
algorithme et dmontrer sa correction en suivant les
lignes de la dmonstration de correction de lalgorithme
de laddition (voir le chapitre 18). Pour aller plus loin :
dessiner un circuit boolen (voir le chapitre 13) qui
ajoute 1 un nombre binaire de quatre bits.
Le jeu de la vie
Sur un damier carr, on dispose des cratures de
manire alatoire. La population volue dun tat au
suivant selon les rgles suivantes :
Une crature survit si elle a 2 ou 3 voisines dans les
8 cases adjacentes et elle meurt cause de son isole-
ment ou de la surpopulation.
Une crature nat dans une case vide sil y a exacte-
ment 3 cratures dans les 8 cases voisines, et rien ne
se passe dans cette case sinon.
Par exemple, en partant de ltat initial , la popula-
tion volue ltat , puis ltat , etc.
crire un programme qui simule le dveloppement
dune population.

ManuelDowek.book Page 295 Monday, July 9, 2012 4:58 PM
TMOIGNAGE Dominique, 36 ans
Je suis artisan de profession ; mon mtier consiste programmer des ordinateurs.
Javais 9 ans lorsque mon pre, professeur de mathmatiques, rapporta une calculatrice TI-57 la
maison. Je me souviens encore de mon tout premier programme, expliqu dans le manuel avec des
organigrammes dessins sous la forme de petites voies ferres que la locomotive-microprocesseur
parcourt : [LRN] ("Learn" - Passer en mode programmation), [+], [1], [=], [RST] (revenir au
dbut), [LRN], [RST], [R/S] (Run / Stop). Et cest parti, la calculatrice compte 1, 2, 3, 4
Lexercice suivant programmer le jeu de devine un nombre me vit mettre en uvre toute
mon habilet et mon astuce pour tenir dans les 40 pas de programme disponibles dans lappareil.
Jtais pris au jeu ! Et de MO-5 en Atari ST, et puis de Logo en Turbo Pascal, jai appris pro-
grammer. Le temps a pass, et matriels et logiciels ont progress pas de gant.
Vous qui apprenez linformatique aujourdhui, vous vous moquerez peut-tre gentiment de la TI-
57. Vous auriez tort, car programmer le jeu de devine un nombre dans le langage de votre
choix est le genre de question quon pourrait vous poser lors dun entretien tlphonique pour une
embauche chez Google (o je travaille depuis fin 2007). Les admirables fondements mathmati-
ques de la discipline nous enseignent que les ordinateurs se ressemblent tous ; mais pas les humains
qui sen servent ou qui les programment. Ces derniers se distinguent des premiers parce quavec
lignorance disparat la peur de linstrument qui rvolutionne nos vies ; et les programmeurs se
distinguent entre eux par leurs centres dintrt parmi les nombreuses spcialits de linforma-
tique, leurs langages et styles de programmation prfrs, et le but quils poursuivent titre per-
sonnel ou professionnel. Mais tous les programmeurs, ou presque, partageons le got dapprendre,
lattention au travail bien fait et lesprit de gomtrie, cher Blaise Pascal.
Que vous souhaitiez ou non en faire votre mtier, je ne saurais trop vous recommander daborder la
programmation comme jai abord la guitare (et non le violon) : en commenant par vous amuser,
puis en continuant par vous perfectionner, comme un forgeron qui cent fois sur son enclume remet son
ouvrage. La perfection existe en informatique ; cest mme une joie inpuisable que de se mettre sa
qute, en parcourant un territoire immense et encore si largement inexplor !
ManuelDowek.book Page 296 Monday, July 9, 2012 4:58 PM
Ides de projets
297
Une balle
Dessiner une balle qui rebondit sur les parois de la fentre
graphique. crire pour cela une fonction qui dessine une
balle sphrique un endroit donn de limage, une autre
fonction qui calcule si cette balle touche le bord de la
fentre ou non, une troisime qui calcule sa position sui-
vante selon quelle rebondit sur le bord ou non. On pourra
prendre en compte la gravit, le ralentissement de la balle
cause des frottements, etc. Produire une suite de quel-
ques centaines dimages et agglomrer cette suite sous la
forme dun film en utilisant un logiciel de cration de
vidos ou de GIF anims.
Gnrateur duvres alatoires
Trouver des tableaux sur le site web dun muse.
Choisir alatoirement un petit dtail dun de ces
tableaux et agrandir ce dtail en un nouveau tableau.
Changer les couleurs, le contraste, mlanger des dtails
issus de deux tableaux diffrents, etc. Vrifier la licence
de ces images et comprendre sil est possible de publier
ses rsultats ou non.
Dtecteur de mouvement visuel
laide dune webcam, prendre deux photos successives
avec un dlai minimal entre les deux, soustraire pixel
pixel ces deux photos et stocker limage obtenue. crire
un programme qui utilise un seuil pour dtecter dans
cette image un mouvement non ngligeable et qui
donne la taille en pixels de la tache de mouvement
obtenue. Tester ce procd en situation relle. Quelles
en sont les possibilits et les limites ? Appliquer ce pro-
cd un objet qui donne un coup de boule la
camra, cest--dire qui sen approche vitesse cons-
tante le long de son axe optique. Avec un modle go-
mtrique trs simple, o lon considre lobjet comme
un rectangle plat parallle la camra, calculer le temps
restant avant la collision avec la camra. Vrifier expri-
mentalement les rsultats obtenus.
Qui est-ce ?
Crer une version numrique et graphique du jeu de
socit Qui est-ce ? . Quelle est lutilit de la notion
de dichotomie pour jouer ce jeu ?
Un joueur de Tic-tac-toe
Le Tic-tac-toe est un jeu o deux joueurs placent tour
de rle lun des ronds O et lautre des croix X sur un
plateau de trois cases sur trois cases, jusqu ce que lun
des joueurs ait align trois symboles ou que les neuf
cases soient remplies. Cest le joueur O qui commence.
Dcrire ce jeu sous forme dun ensemble dtats et dun
ensemble de transitions. Combien y a-t-il dtats
possibles ? Un tat du jeu peut tre gagnant pour O,
gagnant pour X, match nul ou en cours de jeu.
Exprimer chacun des 3
9
tats laide dun nombre
entier. Construire un tableau qui, pour chacun de ces
tats, indique sil est gagnant pour lun des joueurs, nul
ou en cours de jeu et, dans ce cas, les transitions possi-
bles pour chacun des joueurs. Calculer ensuite, de
proche en proche, les tats dans lesquels :
le joueur O est certain de gagner,
le joueur X est certain de gagner,
le joueur O est certain de gagner ou de faire match nul,
le joueur X est certain de gagner ou de faire match nul.
crire un programme qui joue contre un joueur
humain.
ManuelDowek.book Page 297 Monday, July 9, 2012 4:58 PM
Informatique et sciences du numrique
298
Enveloppe convexe
crire un programme qui dessine lenveloppe convexe
dun ensemble fini de points du plan.
Une manire de faire consiste trier ces points par
angle polaire croissant (), relier entre eux les points
conscutifs (), puis supprimer lun aprs lautre les
angles rentrants ().
Chemins les plus courts
Lalgorithme de parcours dun graphe en largeur dabord
permet de dterminer sil existe un chemin entre deux som-
mets dun graphe et de calculer un plus court chemin, si ces
deux sommets sont effectivement relis. Lalgorithme de
Roy-Warshall-Floyd va plus loin en dterminant une fois
pour toutes sil existe un chemin entre toutes les paires de
sommets dun graphe et en calculant un plus court chemin
pour chaque paire de sommets effectivement relis.
Plus prcisment, cet algorithme calcule deux tableaux :
un tableau L tel que L[x][y] soit la longueur du plus
court chemin reliant le sommet x au sommet y si ces
deux sommets sont effectivement relis et sinon,
un tableau R tel que R[x][y] soit le premier sommet
aprs x sur un plus court chemin reliant x y, si ces
deux sommets sont effectivement relis, et si le plus
court chemin les reliant nest pas de longueur nulle,
cest--dire si x est diffrent de y.
Comme dans un jeu de pistes, on peut retrouver lint-
gralit de ce chemin en partant de x, en allant en
R[x,y], puis en R[R[x,y],y], etc. jusqu arriver en y.
Pour calculer ces deux tableaux, on commence par ini-
tialiser le tableau L en mettant dans la case L[x][y] la
valeur 0 si x est gal y, la valeur 1 si x est diffrent de y
et sil y a une arte qui relie x y, et la valeur sinon.
On initialise de mme le tableau R en mettant dans la
case R[x][y] la valeur y.
Ensuite, on imbrique trois boucles :
pour tous les sommets intermdiaires z,
pour tous les sommets de dpart x,
pour tous les sommets darrive y,
si L[x][z] + L[z][y] < L[x][y], cest--dire si aller de
x y en passant par z est strictement plus court que le
plus court chemin connu, on remplace L[x][y] par
L[x][z] + L[z][y] et R[x][y] par R[x][z].
Il nest pas difficile de montrer que, aprs avoir effectu les
tours de la boucle la plus externe correspondant aux som-
mets z
1
, , z
k
, la case L[x][y] du tableau L contient la
longueur du plus court chemin qui relie x y en passant
possiblement par les sommets z
1
, , z
k
, mais pas par les
autres sommets du graphe et que la case R[x][y] du
tableau R contient le premier sommet de ce chemin, si un
tel chemin existe et sil nest pas de longueur nulle.
Programmer cet algorithme et lappliquer un rseau de
mtro ou de bus.
Utilisation des rseaux sociaux
En utilisant le rseau social le plus rpandu dans sa classe,
et avec laccord des personnes concernes, construire le
graphe qui a pour sommets les lves de sa classe et pour
artes la relation est lami de . Au fur et mesure de
lanalyse, on pourra raffiner ses donnes en considrant des
sommets collectifs, par exemple la participation un club.
Entrer ces donnes dans un tableau bidimensionnel dont
chaque ligne et colonne correspond un sommet et
chaque case une arte et calculer les composantes con-
nexes de ce graphe, cest--dire les sous-ensembles maxi-
maux de sommets connects. Dterminer le nombre de
composantes connexes. Ce projet doit tre ralis en res-
pectant lanonymat des personnes.

ManuelDowek.book Page 298 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2011
299
Index
&& 19
A
accolades 19
Ada 229
addition 230
en base 2 231
adresse IP 204, 208
adresse MAC (Medium Access
Control) 201
affectation 12, 17
Alan Turing 133
algorithme 97, 238, 263
bfs (breadth-first search) 283
dfs (depth-first search) 283
efficacit 272, 274
fondamental 287
mthode alpha-bta 55
Roy-Warshall-Floyd 298
algorithmique 255
Allen Emerson 277
arborescence 144, 147
architecture de von Neumann 186
argument de fonction 58
ASCII (American Standard Code for
Information Interchange) 112,
123124, 154
authentifier 163
B
bascule de Schmitt 177
base de donnes 151
base des nombres 99, 102103
Bernouilli 229
bit 98
boucle 24
cas de base 80
for 24
while 28
bus de communication 186
C
C 8, 11
Caml 8, 35
CAO (Conception assiste par
ordinateur) 254
caractre 112
CERN 139
chane de caractres 113
chane de caratres 50
Charles Babbage 229
chiffrement
RSA 153
chiffrer 160
authentifier 163
cl 161
masque jetable 161
RSA 162163
circuit
mmoire un bit 178
cl
prive 153
publique 153
cloud computing 213
Cobol 7
code 111, 154
ASCII (American Standard Code for
Information
Interchange) 116, 126
auto-modifiant 195
compil 194
distribution 194
secret 133
source 194
Unicode 112
Colossus 133
commenter 30
compilation 191
compresser
avec perte 157
sans perte 154
compression 154
conception assiste par ordinateur 254
constante 17
conversion analogique-numrique 261
correction dun programme 235
corriger les erreurs 158
couche de protocoles 198
application 211
lien 201
norme 199
physique 200
rseau 204
transport 209
cyberntique 215
ManuelDowek.book Page 299 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2011
300
Informatique et sciences du numrique
D
dcapsulation des informations 199
dclaration 36
dessiner 240
perspective 242
trois dimensions 242
dichotomie 257
dictionnaire 154
DNS (Domain Name System) 211
E
chantillonnage 128
Edmund Clarke 277
encapsulation des informations 198
entier naturel 99
entier relatif 105
tat de lexcution dun programme 12
expression 17
F
feedback 215
fentre graphique 240
fichier 141
fonction 56, 78
argument 58, 71
boolenne 134
cas de base 80
constante gale 0 135
constante gale 1 135
en-tte 60
et 134, 137
identit 135
multiplexeur 135
mux 135
non 134
ou 134
passage par valeur 71, 7374
rcursive 79
valeur de retour 58
format 91
format de fichier 123, 131
GIF (Grphics Interchange
Format) 123
HTML (HyperText Markup
Language) 116
JPEG (Joint Photographic Experts
Group) 123
MIDI (Musical Instrument Digital
Interface) 128
PBM (Portable BitMap) 123
PGM (Portable GreyMap) 123124,
247
PICT 123
PNG (Portable Network
Graphics) 123
PPM (Portable PixMap) 123, 125,
245, 247
PS (Post Script) 123
TIFF (Tagged Image File
Format) 123
Fortran 7
G
gnie biomdical 177
Grard Huet 23
graphe 147, 283
chemin prolonger 278
tat 284
orient / non orient 284
parcours 283
parcours bfs 283
parcours dfs 283
parcours en largeur 283
parcours en profondeur 283
recherche en largeur 282
recherche en profondeur 282
transition 284
H
hasard 19
Haskell 35
horloge 182
frquence 183
hte (ordinateur) 205
HTML (HyperText Markup
Language) 118, 139
HTTP (HyperText Transfer
Protocol) 211
hypermnsie 148
I
idographie 85
image 122
augmenter le contraste 249
couleur 124
fusion de deux images 251
lissage 252
luminance 250
niveau de gris 124
numriser 126
reprsentation bitmap 122
reprsentation vectorielle 122
synthse soustractive 127
taille 129, 250
transformation 248
imbrication 26
indentation 21
initialisation
variable 43
instruction 17
d'entre 12
de sortie 12
instructions 186
Internet
lois 212
invariant 236
IP (Internet Protocol) 197, 204, 208
J
Java 8
L
langage de programmation 8
langage formel 8688
grammaire 89
smantique 91
langage machine 187188
langue naturelle 86
licence logicielle 76
lien hypertexte 118, 147
Lisp 55
logarithme entier 257
M
main 62
mmoire 9, 178, 186, 194
Mentor 23
Michael Rabin 77
ML 35
mOway 216
N
Nexus 139
nombre virgule 108
non-terminaison 31
O
oprations 18
ordinateur hte 205
ordinateurs parallles 193
P
paquet de donnes 203
priphrique 186, 192
persistance des donnes 140, 148
ManuelDowek.book Page 300 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2011
301
Index
pixel 122
port 210
porte boolenne
additionneur un bit 173
multiplieur 174
non 168
ou 169
TCP (Transmission Control
Protocol) 210
prfixe des units 129
prix Turing 35, 167, 277
processeur 186
unit de calcul 186
unit de contrle 186
programme
main 62
mettre au point 52
principal 62
programme correct 235
protocole 197198
DNS (Domain Name System) 211
HTTP (HyperText Transfer
Protocol) 211
IP (Internet Protocol) 197, 204, 208
SMTP (Simple Mail Transfer
Protocol) 211
TCP (Transmission Control
Protocol) 197
Python 8
R
ralit virtuelle 239
recherche en table 256
rcursivit 79
registres 186
reprsentation
caractre 112
entier naturel 99
entier relatif 105
image 122
nombre virgule 108
son 128
texte enrichi 116
texte simple 113
rseau 198
couche de protocoles 198
protocole 198
rivalit de linformation 149
robot 216
actionneur 216, 220
capteur 216217, 222
contrle en boucle ferme 219
micro-controleur 217
micro-contrleur 219
routage
table de 206
routage des informations 205
routeur 205
RSA 153
S
scurit 160
smantique 23
squence 12
Sketchpad 239
SMTP (Simple Mail Transfer
Protocol) 211
son 128
chantillonner 128
notation musicale 129
taille 129
sret 160
systme dexploitation 192
T
table de routage 206
tableau 74
bidimensionnel 48
TCP (Transmission Control Protocol) 197
test 12
TeX 255
texte
taille 129
texte enrichi 116
texte simple 113
tri
bulles 267
par fusion 268, 274
par insertion 267
par slection 264, 274
type 35, 37
boolean 37
changer 39
double 37
int 37
string 37
tableau 44, 48
U
Unicode 116
unit de calcul 186
UTF-8 154
V
valeur 17
variable 17
globale 6263, 73
initialiser 43
locale 62
porte 41, 62, 65, 69
type 37
variable 17
virus 195
W
web 139
Z
zro dune fonction 261
ManuelDowek.book Page 301 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 302 Monday, July 9, 2012 4:58 PM
Le code de la proprit intellectuelle du 1
er
juillet 1992 interdit en effet expressment la photocopie usage collectif sans autorisation des ayants droit.
Or, cette pratique s`est gnralise notamment dans les tablissements d`enseignement, provoquant une baisse brutale des achats de livres, au point que la
possibilit mme pour les auteurs de crer des ouvres nouvelles et de les faire diter correctement est aujourd`hui menace.
En application de la loi du 11 mars 1957, il est interdit de reproduire intgralement ou partiellement le prsent ouvrage, sur quelque support que ce soit,
sans l`autorisation de l`diteur ou du Centre Franais d`exploitation du droit de copie, 20, rue des Grands Augustins, 75006 Paris.
Groupe Eyrolles, 2012, ISBN : 978-2-212-13543-5
EDITIONS EYROLLES
61, bd Saint-Germain
75240 Paris Cedex 05
www.editions-eyrolles.com
Ouvrage publi avec le concours
de l`association EPI - Enseignement Public et Informatique,
de la SIF - Socit Informatique de France,
et de l`lnstitut public de recherche en sciences du numrique - Inria.
Remerciements Anne Bougnoux (relecture) et Cal 1homas (maquette),
ainsi qu' Raphal Hertzog, Pierre Aron, Christine Paulin, Crgoire Pan, 1onathan Protzenko
et Dominique Quatravaux pour leurs tmoignages.
Merci Randall Munroe du site XKCD pour les dessins d'ouverture de partie adapts de l'anglais
ainsi qu' Rmi Cieplicki de www.Dans1onChat.com pour nous avoir autoriss utiliser leur logo.
Illustrations de Camille Jorng (cactus, botes, arborescences),
Laurne Cibaud et Bernard Sullerot (circuits logiques, oprations binaires, schmas, labyrinthes)
Photographies d'ouvertures de chapitres
Alan Turing (aimable autorisation de la Sherborne School, merci a Rachel Hassall),
John Backus (PIerre.Lescanne, CC-BY-SA-3.0), Grace Hopper (James S. Davis, domaine public),
Gilles Kahn (marcstephanegoldberg Flickr), Gordon Plotkin (merci a lui davoir accepte de nous fournir une photographie),
John McCarthv (null0 Flickr, CC BY 2.0), Robin Milner (http.//www.cl.cam.ac.uk/archive/rm135/),
Dana Scott (Andref Bauer http.//andref.com/mathematicians), Claude Shannon (Tekniska museet Flickr, CC BY-SA 2.0),
Tim Berners-Lee (Paul Clarke, CC-BY-2.0), Ronald Rivest (carback1, CC BY 2.0),
Adi Shamir (Ira Abramov de Even Yehuda, Israel, CC-BY-SA-2.0), Len Adleman (len adlmen, CC-BY-SA-3.0),
Frances Allen (Rama, CC-BY-SA-2.0-fr), John Jon Neumann (LANL, domaine public),
Jinton Cerf et Robert Kahn (Paul Morse, domaine public), Ada Lovelace (Alfred Edward Chalon, domaine public),
Ivan Sutherland (Dick Lvon, CC-BY-SA-3.0), Donald Knuth (Jacob Appelbaum, CC-BY-SA-2.5),
Philippe Flafolet (Luc Devrove, CC-BY-SA-3.0), Joseph Sifakis (Rama, CC-BY-SA-2.0-fr),
Christopher Strachev (http.//www.rutherfordfournal.org/article040101.html), Gottlob Frege (inconnu, domaine public),
Muhammad al-Khwari:mi et Samuel Morse (inconnu, domaine public),
Thomas Flowers (http.//www.ithistorv.org/honorroll/fame-detail.php?recordID444 merci a lequipe de IT Historv pour leur
aimable autorisation), Otto Schmitt (http.//160.94.102.47/index.htm), Norbert Wiener (Konrad Jacobs, CC-BY-SA-2.0-de)
Autres images
Qui est-ce est un feu developpe par la societe Theora Design (http.//theoradesign.com)
et distribue en France par MB (Idees de profets)
La Joconde, tableau de Leonard de Jinci (chapitre 19) et L`Annonciation, tableau de Sandro Botticelli (chapitre 19)
Robolab . par Mirko Tobias Schfer (chapitre 17)
Thvrodectomie assistee par un robot . CHU de Nimes (http.//www.chu-nimes.fr/espace-presse-galerie-photos.html) (chapitre 17)
Robot mOwav . http.//www.mowav-robot.com, http.//www.adrirobot.it/mowav/mowavcircuito.htm (chapitre 17)
Copyright_Dowek.indd 1 10/07/12 14:12
DANS LA COLLECTION NOIRE
P. CEGIELSKI. - Conception de systmes d`exploitation. Le cas Linux.
NG11479, 2
e
dition, 2004, 680 pages.
J. ENGELS. HTML5 ET CSS3. Cours et exercices corrigs.
N13400, 2012, 550 pages.
G. SWINNEN. Apprendre programmer avec Python 3.
N13434, 3
e
dition, 2012, 435 pages.
H. BERSINI. La programmation oriente objet. Cours et exercices en
UML 2 avec Java 6, C# 4, C++, Python, PHP 5 et LinQ.
N12806, 5
e
dition, 2011, 644 pages.
E. SARRION. jQuery et jQuery UI.
N12892, 2011, 132 pages.
A. BRILLANT. XML - Cours et exercices.
N12691, 2
e
dition, 2010, 336 pages.
CHEZ LE MME DITEUR
Crer son site web avec un CMS
F.-X. ET L. BOIS. - WordPress 3 pour le blogueur efhcace.
N12829, 2011, 358 pages.
H. COCRIAMONT. Russir son premier site Joomla! 2.5.
N13425, 2012, 250 pages environ.
T. PARISOT. - Russir son blog professionnel.
N12768, 2
e
dition, 2010, 322 pages.
V. ISAKSEN, T. TARDIF. - Joomla 2.5 et Virtuemart 2. Russir sa
boutique en ligne.
N12804, 3
e
dition paratre, 2012, 350 pages environ.
Y. BRAULT, prface d`Edwy PLENEL. - Concevoir et dployer ses sites
web avec Drupal 6 et 7.
N12780, 2
e
dition, 2010, 420 pages.
Dvelopper soi-mme son site web avec HTML, CSS, PHP, JavaScript
R. RIMEL. - HTML5.
N12982, 2011, 600 pages.
F. DRAILLARD. - Premiers pas en CSS et HTML.
N13338, 2011, 464 pages.
R. GOETTER. - CSS avances. Vers HTML5 et CSS3.
N13405, 2
e
dition, 2012, 385 pages.
R. GOETTER. - CSS 2 : pratique du design web.
N12461, 3
e
dition, 2009, 340 pages.
R. RIMEL. - Mmento HTML5.
N13420, 2012, 14 pages.
R. GOETTER. - Mmento CSS 3.
N13281, 2011, 14 pages.
. DASPET et C. PIERRE DE GEYER. PHP 5 avanc.
N13435, 6
e
dition, 2012, 870 pages.
C. PORTENEUVE. - Bien dvelopper pour le Web 2.0.
N12391, 2
e
dition, 2008, 674 pages.
Dvelopper pour le Web mobile
F. DAOUST, D. HAZAL-MASSIEUX. - Bonnes pratiques pour le Web
mobile. Conception et dveloppement.
N12828, 2011, 300 pages.
T. BAILLET. Crer son thme WordPress mobile en HTML5 et CSS3.
N13441, 2012, 128 pages.
E. SARRION. XHTML/CSS et 1avaScript pour le Web mobile.
Developpement iPhone et Android avec et iUI et XUI.
N12775, 2010, 274 pages.
. SARRION. - jQuery Mobile.
N13388, 2012, 601 pages.
Ressources autour du Web : design, ergonomie, bonnes pratiques
A. BOUCHER. - Ergonomie web. Pour des sites web effcaces.
N13215, 3
e
dition, 2011, 380 pages.
A. BOUCHER. - Ergonomie web illustre. 60 sites la loupe.
N12695, 2010, 302 pages (Design & Interface).
A. BOUCHER. - Mmento Ergonomie web.
N12698, 2
e
dition, 2010, 14 pages.
E. SLOM. - Mmento Sites web. Les bonnes pratiques.
N12802, 3
e
dition, 2010, 18 pages.
O. ANDRIEU. - Russir son rfrencement web.
N13396, 2012, 480 pages.
I. CANIVET. - Bien rdiger pour le Web. Stratgie de contenu pour
amliorer son rfrencement.
N12883, 2
e
dition, 2011, 540 pages.
pII_Dowek.indd 1 10/07/12 14:04