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
dowek titre 4/07/12 17:53 Page 1

Gilles Dowek
Jean-Pierre Archambault, Emmanuel Baccelli, Claudio Cimelli,
Albert Cohen, Christine Eisenbeis, Thierry Viville et Benjamin Wack
Prface de Grard Berry, professeur au Collge de France

Informatique
et sciences du
numrique
Spcialit ISN en terminale S
Avec des exercices corrigs
et ides de projets
ManuelDowek.book Page V Monday, July 9, 2012 4:58 PM

Prface

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

Groupe Eyrolles, 2012


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

Informatique et sciences du numrique

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

VI Groupe Eyrolles, 2012


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

Table des matires

PRFACE ...................................................................... V SAVOIR-FAIRE crire un programme utilisant une boucle while 29


SAVOIR-FAIRE Commenter un programme 30
AVANT-PROPOS ............................................................ 1 La non-terminaison 31
Structure de louvrage 2 La boucle for, cas particulier de la boucle while 31
Parcours possibles 4 SAVOIR-FAIRE Choisir entre une boucle for et la boucle while
Remerciements 4 pour crire un programme 33
Ai-je bien compris ? 34
PREMIRE PARTIE
3. LES TYPES ..................................................................35
LANGAGES .........................................................5 Les types de base 37
1. LES INGRDIENTS DES PROGRAMMES .............................. 7 SAVOIR-FAIRE Diffrencier les types de base 39
Un premier programme 8 SAVOIR-FAIRE Changer le type dune expression 39
La description du programme 9 La porte et linitialisation des variables 41
SAVOIR-FAIRE Modifier un programme existant pour obtenir SAVOIR-FAIRE Dclarer les variables avec des types
un rsultat diffrent 11 et des portes appropris 43
Les ingrdients dun programme 12 SAVOIR-FAIRE Initialiser les variables 43
SAVOIR-FAIRE Comprendre un programme et expliquer Les tableaux 44
ce quil fait 14 SAVOIR-FAIRE Utiliser un tableau dans un programme 46
SAVOIR-FAIRE crire un programme 15 Les tableaux bidimensionnels 48
SAVOIR-FAIRE Mettre un programme au point en le testant 16 Les chanes de caractres 50
Les instructions et les expressions 17 SAVOIR-FAIRE Calculer avec des chanes de caractres 50
Les oprations 18 La mise au point des programmes 52
Les accolades 19 SAVOIR-FAIRE Mettre au point un programme
SAVOIR-FAIRE Indenter un programme 21 en linstrumentant 52
Ai-je bien compris ? 22 Ai-je bien compris ? 54

2. LES BOUCLES .............................................................. 23 4. LES FONCTIONS (AVANC) ............................................55


La boucle for 24 Isoler une instruction 56
SAVOIR-FAIRE crire un programme utilisant une boucle for 26 Passer des arguments 58
SAVOIR-FAIRE Imbriquer deux boucles 26 Rcuprer une valeur 59
La boucle while 28 SAVOIR-FAIRE crire len-tte dune fonction 60

Groupe Eyrolles, 2011 VII


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

Informatique et sciences du numrique

SAVOIR-FAIRE crire une fonction 61 SAVOIR-FAIRE Trouver la reprsentation en base k


Le programme principal 62 dun entier naturel donn en base dix 103
La porte des variables et les variables globales 62 SAVOIR-FAIRE Trouver la reprsentation en base dix
SAVOIR-FAIRE Identifier la porte des variables dun entier naturel donn en base k 104
dans un programme comportant des fonctions 65 La reprsentation des entiers relatifs 105
SAVOIR-FAIRE Choisir une porte adapte aux diffrentes SAVOIR-FAIRE Trouver la reprsentation binaire sur n bits
variables dun programme comportant des fonctions 69 dun entier relatif donn en dcimal 106
Le passage par valeur 71 SAVOIR-FAIRE Trouver la reprsentation dcimale
SAVOIR-FAIRE dun entier relatif donn en binaire sur n bits 106
Choisir entre un passage par valeur et une variable globale 73 SAVOIR-FAIRE Calculer la reprsentation p de loppos
Le passage par valeur et les tableaux 74 dun entier relatif x partir de sa reprsentation p,
Ai-je bien compris ? 76 pour une reprsentation des entiers relatifs sur huit bits 106
La reprsentation des nombres virgule 108
5. LA RCURSIVIT (AVANC) ........................................... 77 SAVOIR-FAIRE Trouver la reprsentation en base dix
Des fonctions qui appellent des fonctions 78 dun nombre virgule donn en binaire 108
Des fonctions qui sappellent elles-mmes 79 Ai-je compris ? 110
SAVOIR-FAIRE Dfinir une fonction rcursive 81
Des images rcursives 83 8. REPRSENTER DES CARACTRES ET DES TEXTES .............111
Ai-je bien compris ? 84 La reprsentation des caractres 112
La reprsentation des textes simples 113
6. LA NOTION DE LANGAGE FORMEL (AVANC)................... 85 SAVOIR-FAIRE Trouver la reprsentation en ASCII binaire
Les langages informatiques et les langues naturelles 86 dun texte 113
Les anctres des langages formels 87 SAVOIR-FAIRE Dcoder un texte reprsent en ASCII binaire 114
Les langages formels et les machines 88 La reprsentation des textes enrichis 116
La grammaire 89 SAVOIR-FAIRE crire une page en HTML 118
La smantique 91 Ai-je bien compris ? 120
Redfinir la smantique 92
9. REPRSENTER DES IMAGES ET DES SONS ......................121
Ai-je bien compris ? 93
La reprsentation des images 122
La notion de format 123
DEUXIME PARTIE
SAVOIR-FAIRE Identifier quelques formats dimages 124
INFORMATIONS ................................................95 La reprsentation des images en niveaux de gris et en couleurs 124
7. REPRSENTER DES NOMBRES ENTIERS ET VIRGULE ........ 97 SAVOIR-FAIRE Numriser une image sous forme dun fichier 126
La reprsentation des entiers naturels 99 La reprsentation des sons 128
La base cinq 100 La taille dun texte, dune image ou dun son 129
SAVOIR-FAIRE Trouver la reprsentation en base cinq SAVOIR-FAIRE Comprendre les tailles des donnes et les ordres
dun entier naturel donn en base dix 100 de grandeurs 130
SAVOIR-FAIRE Trouver la reprsentation en base dix SAVOIR-FAIRE Choisir un format appropri par rapport
dun entier naturel donn en base cinq 101 un usage ou un besoin, une qualit, des limites 131
La base deux 102 Ai-je bien compris ? 131
SAVOIR-FAIRE Trouver la reprsentation en base deux 10. LES FONCTIONS BOOLENNES ....................................133
dun entier naturel donn en base dix 102
Lexpression des fonctions boolennes 134
SAVOIR-FAIRE Trouver la reprsentation en base dix
Les fonctions non, et, ou 134
dun entier naturel donn en base deux 102
Lexpression des fonctions boolennes
Une base quelconque 103
avec les fonctions non, et, ou 135

VIII Groupe Eyrolles, 2011


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

Table des matires

SAVOIR-FAIRE Trouver une expression symbolique exprimant Les priphriques 192


une fonction partir de sa table 136 Le systme dexploitation 192
Lexpression des fonctions boolennes Ai-je bien compris ? 195
avec les fonctions non et ou 137
Ai-je bien compris ? 138 16. LES RSEAUX (AVANC) ...........................................197
Les protocoles 198
11. STRUCTURER LINFORMATION (AVANC) .................... 139 La communication bit par bit : les protocoles de la couche
La persistance des donnes 140 physique 200
La notion de fichier 141 Les rseaux locaux :
Utiliser un fichier dans un programme 141 les protocoles de la couche lien 201
Organiser des fichiers en une arborescence 144 SAVOIR-FAIRE Trouver les adresses MAC des cartes rseau
SAVOIR-FAIRE Classer des fichiers sous la forme dun ordinateur 203
dune arborescence 145 Le rseau global : les protocoles de la couche rseau 204
Liens et hypertextes 147 SAVOIR-FAIRE Trouver ladresse IP attribue un ordinateur 204
Lhypermnsie 148 SAVOIR-FAIRE Dterminer le chemin suivi par linformation 207
Pourquoi linformation est-elle souvent gratuite ? 149 SAVOIR-FAIRE Dterminer ladresse IP du serveur par lequel
Ai-je bien compris ? 152 un ordinateur est connect Internet 208
La rgulation du rseau global : les protocoles de la couche
12. COMPRESSER, CORRIGER, CHIFFRER (AVANC)............ 153 transport 209
Compresser 154 Programmes utilisant le rseau : la couche application 211
SAVOIR-FAIRE Utiliser un logiciel de compression 156 Quelles lois sappliquent sur Internet ? 212
Compresser avec perte 157 Qui gouverne Internet ? 213
Corriger 158 Ai-je bien compris ? 214
Chiffrer 160
Ai-je bien compris ? 164 17. LES ROBOTS (AVANC).............................................215
Les composants dun robot 216
TROISIME PARTIE La numrisation des grandeurs captes 217
MACHINES .....................................................165 Le contrle de la vitesse : la mthode du contrle en boucle
ferme 219
13. LES PORTES BOOLENNES......................................... 167 Programmer un robot : les actionneurs 220
Le circuit NON 168 Programmer un robot : les capteurs 222
Le circuit OU 169 SAVOIR-FAIRE crire un programme pour commander un robot 223
Quelques autres portes boolennes 170 Ai-je bien compris ? 225
Ai-je bien compris ? 175

14. LE TEMPS ET LA MMOIRE........................................ 177


QUATRIME PARTIE
La mmoire 178 ALGORITHMES ............................................... 227
Lhorloge 182 18. AJOUTER DEUX NOMBRES EXPRIMS EN BASE DEUX .....229
Ai-je bien compris ? 184 Laddition 230
15. LORGANISATION DUN ORDINATEUR ......................... 185 Laddition pour les nombres exprims en base deux 231
Trois instructions 187 La dmonstration de correction du programme 235
Le langage machine 188 Ai-je bien compris ? 238
SAVOIR-FAIRE Savoir drouler lexcution dune squence 19. DESSINER ...............................................................239
dinstructions 190 Dessiner dans une fentre 240
La compilation 191

Groupe Eyrolles, 2011 IX


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

Informatique et sciences du numrique

SAVOIR-FAIRE Crer une image 240 Mastermind 289


Dessiner en trois dimensions 242 Brin dARN 289
Produire un fichier au format PPM 245 Bataille navale 289
Lire un fichier au format PPM 247 Cent mille milliards de pomes 289
Transformer les images 248 Site de rencontres 289
SAVOIR-FAIRE Transformer une image en couleurs Tracer la courbe reprsentative dune fonction polynme
en une image en niveaux de gris 248 du second degr 291
SAVOIR-FAIRE Augmenter le contraste dune image Grer le score au tennis 291
en niveaux de gris 249 Automatiser les calculs de chimie 291
SAVOIR-FAIRE Modifier la luminance dune image 250 Tours de Hano 291
SAVOIR-FAIRE Changer la taille dune image 250 Tortue Logo 291
SAVOIR-FAIRE Fusionner deux images 251 Dessins de plantes 291
SAVOIR-FAIRE Lisser une image pour liminer Langage CSS 291
ses petits dfauts et en garder les grands traits 252 Calcul sur des entiers de taille arbitraire 291
Ai-je bien compris ? 254 Calcul en valeur exacte sur des fractions 293
Reprsentation des dates et heures 293
20. LA DICHOTOMIE (AVANC) ....................................... 255
Transcrire dans lalphabet latin 293
La recherche en table 256
Correcteur orthographique 293
La conversion analogique-numrique 261
Daltonisme 293
Trouver un zro dune fonction 261
Logisim 293
Ai-je bien compris ? 262
Banc de registres 293
21. TRIER (AVANC) ..................................................... 263 Simuler le comportement du processeur 295
Le tri par slection 264 Utilisation du logiciel Wireshark 295
Le tri par fusion 268 Algorithme de pledge 295
Lefficacit des algorithmes 272 Algorithme calculant le successeur dun nombre entier
SAVOIR-FAIRE Sinterroger sur lefficacit dun algorithme 273 naturel n 295
Lefficacit des algorithmes de tri par slection et par fusion 274 Le jeu de la vie 295
Ai-je bien compris ? 276 Une balle 297
Gnrateur duvres alatoires 297
22. PARCOURIR UN GRAPHE (AVANC) ............................ 277
Dtecteur de mouvement visuel 297
La liste des chemins prolonger 278
Qui est-ce ? 297
viter de tourner en rond 280
Un joueur de Tic-tac-toe 297
La recherche en profondeur et la recherche en largeur 282
Enveloppe convexe 298
Le parcours dun graphe 283
Chemins les plus courts 298
tats et transitions 284
Utilisation des rseaux sociaux 298
Ai-je bien compris ? 287
ChemiUtilisation des rseaux sociaux 299
IDES DE PROJETS ..................................................... 289
INDEX ......................................................................299
Un gnrateur dexercices de calcul mental 289

X Groupe Eyrolles, 2011


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

Avant-propos

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,
En 1936, soit quelques annes
accdons la connaissance, avant la construction des premiers
faisons de la science, ordinateurs, Alan Turing (1912-
1954) et en mme temps que lui
crons et diffusons des uvres dart, Alonzo Church a tudi les liens
organisons les entreprises, entre les notions dalgorithme et
administrons les tats, de raisonnement mathmatique.

etc. Cela la men imaginer un pro-


cd de calcul, les machines de
Si les ordinateurs ont tout transform, cest parce quils sont polyvalents, Turing, et suggrer que ce pro-
ils permettent de traiter des informations de manires trs diverses. Cest cd de calcul puisse tre universel,
en effet le mme objet qui permet dutiliser des logiciels de conception cest--dire capable dexcuter tous
assiste par ordinateur, des machines commande numrique, des logi- les algorithmes possibles.
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.

Groupe Eyrolles, 2012


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

Informatique et sciences du numrique

Un procd systmatique qui permet de traiter des informations sappelle un


ALLER PLUS LOIN De la bote outils au
couteau suisse algorithme. Ainsi, on peut parler dalgorithmes de recherche dun mot dans
un dictionnaire, dalgorithmes de chiffrement et de dchiffrement, dalgo-
Cette polyvalence sillustre aussi par le nombre
doutils que les ordinateurs ont remplac :
rithmes pour faire des additions et des multiplications, etc. De manire plus
machines crire, tlphones, machines cal- gnrale, un algorithme est un procd systmatique qui permet de faire
culer, tlvisions, appareils photos, lectro- quelque chose. Par exemple une recette de cuisine est un algorithme.
phones, mtiers tisser
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-
T Traiter des informations parer des aliments.
Traiter des informations signifie appliquer, Le bouleversement survenu au milieu du XXe sicle tient ce que les
dune manire systmatique, des oprations des hommes ont cess dutiliser exclusivement ces algorithmes la main ; ils
symboles. La recherche dun mot dans un diction- ont commenc les faire excuter par des machines, les ordinateurs.
naire, le chiffrement et le dchiffrement dun mes-
sage secret, laddition et la multiplication de deux Pour y parvenir, il a fallu exprimer ces algorithmes dans des langages de
nombres, la fabrication des emplois du temps des programmation, accessibles aux ordinateurs. Ces langages sont diffrents
lves dun lyce ou des pilotes dune compagnie des langues humaines en ce quils permettent la communication non pas
arienne, le calcul de laire dune parcelle agricole entre tres humains, mais entre les tres humains et les machines.
ou encore le compte des points des leves dun
joueur au Tarot sont des exemples de traitements Linformatique est donc ne de la rencontre de quatre concepts trs anciens :
dinformations. machine,
information,
algorithme,
ALLER PLUS LOIN Des algorithmes aussi vieux langage.
que lcriture
Ces concepts existaient tous avant la naissance de linformatique, mais linfor-
Il y a quatre mille ans, les scribes et les arpen-
matique les a profondment renouvels et articuls en une science cohrente.
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
Structure de louvrage
transformer.
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) :

2 Groupe Eyrolles, 2012


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

Avant-propos

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*). REMARQUE Chapitres lmentaires
Dans la quatrime partie, Algorithmes , nous apprendrons quel- et chapitres avancs*
ques-uns des savoir-faire les plus utiles au XXIe sicle : ajouter des Les chapitres avancs sont nots ici dun ast-
nombres exprims en base deux (chapitre 18), dessiner (chapitre 19), risque. Il sagit des deux ou trois derniers chapi-
retrouver une information par dichotomie (chapitre 20*), trier des tres de chaque partie. Ils sont signals en dbut
de chapitre.
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 Exercices difficiles
capacits essentielles ;
des exercices, avec leur corrig lorsque ncessaire. Les exercices nots dun cactus sont dun niveau
plus difficile.

Groupe Eyrolles, 2012 3


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

Informatique et sciences du numrique

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.

4 Groupe Eyrolles, 2012


ManuelDowek.book Page 5 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 6 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 7 Monday, July 9, 2012 4:58 PM

Les ingrdients
des 1
programmes

Un ordinateur peut faire bien des choses,


mais il faut dabord les lui expliquer.
John Backus (1924-2007) est
lauteur de lun des premiers lan-
gages de programmation : le lan-
gage Fortran (1954). Il a par la suite
Apprendre la programmation, ce nest pas seulement savoir propos, avec Peter Naur, la notation
de Backus et Naur qui permet de
crire un programme, cest aussi comprendre de quoi il est fait, dcrire des grammaires, en particu-
comment il est fait et ce quil fait. Un programme est lier celles des langages de program-
essentiellement constitu dexpressions et dinstructions. mation (voir le chapitre 6).

Nous introduisons dans ce premier chapitre les trois premires Grace Hopper (1906-1992) est, elle
instructions fondamentales que sont laffectation, la squence aussi, lauteur dun des premiers lan-
et le test. Pour mettre en vidence leur structure, nous gages de programmation : le lan-
indentons les programmes et utilisons les accolades lorsque gage Cobol (1959). Avant cela, elle a
t lune des premires pro-
lcriture est ambigu. Nous tudions les instructions grammer le Harvard Mark I de
en observant les transformations quelles oprent sur ltat Howard Aiken, lun des tous premiers
de lexcution du programme, cest--dire sur lensemble calculateurs lectroniques.
des botes pouvant contenir des valeurs, avec leur nom
et leur valeur, le cas chant.

Groupe Eyrolles, 2012


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

Premire partie Langages

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 :
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");}}

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

8 Groupe Eyrolles, 2012


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

1 Les ingrdients des programmes

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. DANS DAUTRES LANGAGES
Texas Instruments et Casio
Exercice 1.2
Ce mme algorithme peut sexprimer dans de
Modifier ce programme afin que le bateau soit sur la case de coordonnes (6 ; 9).
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

La description 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.
du programme Texas Instruments
PROGRAM:BATAILLE
Commenons par observer ce programme pour essayer den comprendre :4 A
:7 B
la signification. La premire ligne contient linstruction a = 4;. Pour :Disp " vous de jouer"
comprendre ce quil se passe quand on excute cette instruction, il faut :Input X
imaginer que la mmoire de lordinateur que lon utilise est compose :Input Y
:If X = A et Y = B
dune multitude de petites botes. Chacune de ces botes porte un nom et
:Then
peut contenir une valeur. Excuter linstruction a = 4; a pour effet de :Disp "Coul"
mettre la valeur 4 dans la bote de nom a. :Else
:If X = A ou Y = B
:Then
:Disp "En vue"
:Else
:Disp " l'eau"
:End
:End
Aprs avoir excut cette instruction, on excute b = 7;, ce qui a pour Casio
effet de mettre la valeur 7 dans la bote de nom b. ======BATAILLE ======
4 A
7 B
" vous de jouer"
? X
? Y
If X = A And Y = B
Then "Coul"
On excute ensuite linstruction System.out.println(" vous de Else
jouer");, ce qui a pour effet dafficher lcran vous de jouer. If X = A Or Y = B
Then "En vue"
On excute ensuite linstruction x = Isn.readInt();, ce qui a pour effet Else " l'eau"
dinterrompre le droulement du programme jusqu ce que lutilisateur IfEnd
IfEnd
tape un nombre au clavier. Ce nombre est alors mis dans la bote de nom x.

Groupe Eyrolles, 2012 9


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

Premire partie Langages

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 :
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");}}

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 :
if (x == a || y == b) {
System.out.println("En vue");}
else {
System.out.println(" l'eau");}

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

10 Groupe Eyrolles, 2012


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

1 Les ingrdients des programmes

Exercice 1.3
En C, le mme extrait de programme scrit ainsi :

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");}}

Quelles sont les ressemblances et les diffrences entre Java et C ?

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.

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

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

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

Groupe Eyrolles, 2012 11


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

Premire partie Langages

clavier. Il faut donc prvoir lentre correspondante. Voici donc le nouveau pro-
gramme avec, en gras, les lments ajouts ou modifis :

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

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 :
T tat de lexcution dun programme
des affectations de la forme v = e; o v est une variable et e une
On appelle tat de lexcution dun pro- expression,
gramme le triplet form par le nombre de botes
utilises, le nom de chacune delles et la valeur des instructions dentre de la forme v = Isn.readInt(); o v est une
quelle contient. 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.

12 Groupe Eyrolles, 2012


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

1 Les ingrdients des programmes

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 :
x = 8;
y = 9;
COMPRENDRE Une instruction
dans ltat excute linstruction x = 8; ce qui produit ltat puis compose mais unique
linstruction y = 9; ce qui produit ltat .
Attention, linstruction :
x = 8;
y = 9;
est une unique instruction, savoir une
squence de deux instructions plus petites :
x = 8;
et
y = 9;
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 :

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

Groupe Eyrolles, 2012 13


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

Premire partie Langages

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 :
if (x < 7) {
System.out.println("un peu");}

dans ltat affiche un peu, alors quexcuter cette instruction dans


ltat naffiche rien.

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.

Exercice 1.6 (avec corrig)


Que fait ce programme ?

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);}

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 ?

a = Isn.readInt();
b = Isn.readInt();
c = Isn.readInt();

14 Groupe Eyrolles, 2012


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

1 Les ingrdients des programmes

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);}

Exercice 1.8
Lexcution de linstruction :

x = 4;
y = x + 1;
x = 10;
System.out.println(y);

produit-elle laffichage de la valeur 5 ou de la valeur 11 ?

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.

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

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));}}

Groupe Eyrolles, 2012 15


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

Premire partie Langages

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.

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.

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.

16 Groupe Eyrolles, 2012


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

1 Les ingrdients des programmes

Les instructions et les expressions


Laffectation x = y + 3; est une instruction. Elle est compose dune
T Une expression
variable x et dune expression y + 3.
Une expression est un lment de programme
On attribue une valeur chaque expression. Pour les expressions sans qui peut tre de diffrentes formes :
variables, comme (2 + 5) * 3, dont la valeur est 21, la valeur sobtient une variable, par exemple x, y ;
simplement en effectuant les oprations prsentes dans lexpression, dans une constante, par exemple, 3, 3.14,
cet exemple une addition et une multiplication. La valeur dune expression 6.02E23, true, "Coul" ;
qui contient des variables, par exemple (2 + x) * 3, se dfinit de la mme une expression de la forme e + e', e * e',
e == e' forme dune opration comme +,
manire, mais dpend de ltat dans lequel on calcule cette valeur. *, == et dune ou plusieurs expressions, par
Par exemple, la valeur de lexpression (2 + x) * 3 dans ltat est 15, exemple y + 3.
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.

Groupe Eyrolles, 2012 17


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

Premire partie Langages

Les oprations
Les expressions sont formes en utilisant les oprations suivantes :
+ Addition entire <= Infrieur ou gal.
Soustraction entire < Infrieur strictement.
* Multiplication entire >= Suprieur ou gal.
/ Quotient de la division euclidienne. Attention > Suprieur strictement.
cette division est inhabituelle pour les Isn.stringEqual Prend en argument deux chanes de
nombres ngatifs : -5 / 2 vaut -2 et non caractres et renvoie la valeur true si ces
-3, et -5 / -2 vaut 2. deux chanes sont gales et la valeur false
% Reste de la division euclidienne. Attention sinon.
encore aux nombres ngatifs : -5 % 2 vaut Isn.stringAlph Prend en argument deux chanes de
-1 et -5 % -2 aussi. caractres et renvoie la valeur true si la
+ Addition dcimale premire chane est avant la seconde dans
Soustraction dcimale lordre alphabtique, et la valeur false
sinon.
* Multiplication dcimale
Isn.stringLength Prend en argument une chane de caractres
/ Division dcimale et renvoie un entier qui est sa longueur.
Math.pow Puissance Isn.stringNth Prend en argument une chane de caractres
Math.sqrt Racine s et un entier n, compris entre 0 et la
longueur de la chane moins 1, et renvoie la
Math.PI
chane de caractres forme dun seul
Math.sin Sinus caractre qui est le n-ime de la chane s.
Math.cos Cosinus Isn.asciiString Prend en argument un entier n et retourne
Math.exp Exponentielle une chane de caractres qui contient un
unique caractre dont le code ASCII (voir le
Math.log Logarithme nprien
chapitre 8) est n.
Math.abs Valeur absolue
Isn.stringCode Fonction inverse de la prcdente, qui prend
Math.min Minimum en argument une chane de caractres s et
Math.max Maximum retourne le code ASCII du premier caractre
de cette chane.
Math.floor Partie entire
+ Concatnation. Sapplique deux chanes de
Math.random Nombre alatoire dcimal entre 0 et 1, selon caractres et construit une unique chane
la loi uniforme forme de la premire, suivie de la deuxime.
== gal. Sapplique aux valeurs numriques et ! Non.
boolennes, mais pas aux chanes de
caractres ni aux tableaux. & Et (Variante : &&.)

!= Diffrent. Sapplique aux valeurs numriques | Ou (Variante :||.)


et boolennes, mais pas aux chanes de
caractres ni aux tableaux.

18 Groupe Eyrolles, 2012


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

1 Les ingrdients des programmes

ALLER PLUS LOIN Les oprations && et ||


Lopration && est une variante de &, telle que la valeur de lexpression t Ainsi lexcution de linstruction :
&& u soit false quand la valeur de t est false, mme si la valeur de System.out.println(x != 0 & 1/x > 2);
lexpression u nest pas dfinie. provoque une erreur, quand x est gal 0, mais celle de linstruction :
De mme, lopration ||est une variante de | telle que la valeur de
System.out.println(x != 0 && 1/x > 2);
lexpression t || u soit true quand la valeur de t est true, mme si
la valeur de lexpression u nest pas dfinie. affiche false.

Exercice 1.16
Le but de cet exercice est dcrire un programme qui demande lutilisateur
ALLER PLUS LOIN Les ordinateurs et le hasard
une date comprise entre le 1er janvier 1901 et le 31 dcembre 2099 et qui Parmi les oprations de base, nous avons cit la
indique le nombre de jours couls entre le premier janvier 1901 et cette date. fonction Math.random, qui renvoie un
Une bonne approximation de ce nombre est (a 1901) * 365 + (m 1) * nombre alatoire compris entre 0 et 1. Si lon sy
30 + j 1;. Mais il faut lui ajouter deux termes correctifs. Le premier est d arrte quelques secondes, lexistence dune telle
au fait que tous les mois ne font pas trente jours. On peut montrer que ce fonction est contradictoire avec la notion mme
terme correctif vaut m / 2 quand m est compris entre 1 et 2 et vaut (m + m / dalgorithme : un processus suffisamment bien
8) / 2 2 quand m est compris entre 3 et 12. Le second est d aux annes bis- dcrit et dtaill pour tre excut sans erreur ni
sextiles. On peut montrer que ce terme correctif vaut (a 1900)/4 1 si a initiative de la part dune machine ne peut pas
est un multiple de 4 et m est compris entre 1 et 2 et vaut (a 1900)/4 sinon. mener un rsultat imprvisible et diffrent
crire un programme qui demande lutilisateur trois nombres qui consti- chaque excution. Pourtant lintroduction de
tuent une date comprise entre le premier janvier 1901 et le 31 dcembre hasard dans les programmes est indispensable,
2099, par exemple 20 / 12 / 1996, et qui indique le nombre de jours couls par exemple pour crer des situations imprvues
entre le premier janvier 1901 et cette date. dans les logiciels de jeux, mais aussi pour
crire un programme qui demande lutilisateur deux dates et indique le rsoudre certains problmes qui ne peuvent pas
nombre de jours couls entre ces deux dates. tre rsolus sans une part de hasard, comme on
Sachant que le premier janvier 1901 tait un mardi, crire un programme le verra au chapitre 16. La fonction
qui demande lutilisateur une date et indique le jour de la semaine cor- Math.random ne gnre pas de nombres
respondant cette date. rellement alatoires, mais les rsultats obtenus
sont suffisamment proches de tirages alatoires
Exercice 1.17 pour la plupart des applications qui utilisent ce
En utilisant la fonction Math.random, crire un programme qui simule la loi genre de nombres. Lexercice 2.8 donne un
uniforme sur lintervalle [a ; b], o a et b sont deux rels donns. exemple dun tel gnrateur de nombres
pseudo-alatoires.
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

Groupe Eyrolles, 2012 19


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

Premire partie Langages

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 :
if (x == 0) {
y = 1;}
else {
y = 2;
z = 4;}

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 == 4) {
y = 1;}
else {
y = 2;
z = 3;}

{
if (x == 4) {
y = 1;}
else {
y = 2;}}
z = 3;

20 Groupe Eyrolles, 2012


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

1 Les ingrdients des programmes

et

if (x == 4) {
y = 1;}
else {
y = 2;}
z = 3;

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 e2 ltat obtenu en excutant linstruction p dans ltat e, e3 ltat
obtenu en excutant linstruction q dans ltat e2 et e4 ltat obtenu en excu-
tant linstruction r dans ltat e3.
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 e2 ?
Quel est ltat produit par lexcution de linstruction p {q r} dans ltat e ?

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.

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 1er octobre 2011) :

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

Groupe Eyrolles, 2012 21


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

Premire partie Langages

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.

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);}}}}}

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

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 ?

22 Groupe Eyrolles, 2012


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

Les boucles 2

Un ordinateur est fait pour effectuer des calculs longs


et rptitifs.
Gilles Kahn (1946-2006) et Gordon
Plotkin (1946-) ont propos des
outils pour dcrire la smantique des
langages de programmation, cest--
Dans ce chapitre, nous introduisons une nouvelle instruction, dire ce quil se passe quand on ex-
cute un programme. Gilles Kahn est
la boucle, qui permet dexcuter une instruction plusieurs fois. aussi lauteur, avec Grard Huet, du
Nous en prsentons deux variantes, la boucle for et la boucle systme Mentor, lun des premiers
while. Nous expliquons comment manipuler le compteur dune systmes qui permet de dfinir de
manire compltement formelle des
boucle for, dans quels cas plutt utiliser une boucle while,
langages de programmation. On doit
et pourquoi il peut arriver que lexcution dune boucle ne Gordon Plotkin des contributions
sarrte jamais. de nombreux domaines de linforma-
tique, en particulier la dmonstration
automatique et la thorie des sys-
tmes concurrents.

Groupe Eyrolles, 2012


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

Premire partie Langages

Au cours de lexcution dun programme construit avec les instructions


EXEMPLE Certaines instructions
prsentes au chapitre 1, chaque instruction du programme est excute
sont excutes plusieurs fois
au plus une fois. Par exemple, au cours de lexcution de linstruction :
Pour crire un programme qui affiche le
calendrier : x = 1;
1 janvier if (x == 2) {
2 janvier y = 3;}
3 janvier else {
4 janvier y = 7;}
5 janvier
6 janvier linstruction y = 7; est excute une fois et linstruction y = 3; nest pas
7 janvier excute, mais aucune instruction nest excute plusieurs fois. Or, bien
8 janvier
souvent, nous voulons effectuer des calculs dans lesquels certaines ins-
9 janvier
10 janvier tructions sont excutes plusieurs fois (voir lexemple ci-contre).
11 janvier Permettre une instruction dtre excute plusieurs fois au cours de lex-
12 janvier
13 janvier
cution dun programme est le but dune nouvelle instruction : la boucle.
14 janvier
15 janvier
16 janvier
17 janvier
18 janvier
19 janvier
20 janvier
La boucle for
21 janvier La premire forme de boucle, prsente dans ce chapitre, est la boucle
22 janvier
for. Cest une instruction de la forme for (i = e; i <= e'; i = i + 1)
23 janvier
24 janvier p o i est une variable, e et e' sont des expressions et p est une instruc-
25 janvier tion, appele corps de cette boucle. Comme dans le cas des tests, la cou-
26 janvier tume est de toujours mettre le corps dune boucle entre accolades.
27 janvier
28 janvier
Excuter la boucle for (i = e; i <= e'; i = i + 1) p a pour effet
29 janvier dexcuter linstruction p (n - m + 1) fois, o m est la valeur de lexpres-
30 janvier sion e et n celle de lexpression e', dans des tats dans lesquels la valeur
31 janvier de la variable i est successivement m, m + 1, , n.
nous ne voulons pas crire, dans le programme,
linstruction System.out.println trente Par exemple, excuter la boucle :
et une fois, mais crire cette instruction une
seule fois et faire en sorte quelle soit excute for (i = 1; i <= 10; i = i + 1) {
trente et une fois au cours de lexcution du System.out.print("all ");}
programme. System.out.println("t'es o ?");

a pour effet dafficher :


all all all all all all all all all all t'es o ?

Excuter la boucle :
for (i = 1; i <= 10; i = i + 1) {
System.out.println(i);}

a pour effet dafficher .

24 Groupe Eyrolles, 2012


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

2 Les boucles

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 1
2
part, la valeur de lexpression e' ne doit pas changer au cours de cette ex- 3
cution. Par exemple, excuter linstruction : 4
5
for (i = 1; i <= 10; i = i + 1) { 6
System.out.println(i);} 7
8
affiche , ce qui montre que le corps de la boucle est bien excut dix fois. 9
10
Mais excuter linstruction :
for (i = 1; i <= 10; i = i + 1) {
System.out.println(i);
i = i + 1;}

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 : 1 1 10
3 29
x = 10; 5 38
for (i = 1; i <= x; i = i + 1) { 7 47
System.out.print(i); 9 56
System.out.print(" ");
System.out.println(x);
x = x 1;}

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.
DANS DAUTRES LANGAGES
On retiendra de ces deux exemples, quil ne faut pas, dans le corps dune Texas Instruments et Casio
boucle, affecter la variable i ni aucune des variables qui apparaissent
Dans le langage des calculatrices Texas Instru-
dans lexpression e'. Quand on est tent de le faire, cela est souvent le ments et Casio les boucles scrivent ainsi :
signe quil aurait mieux valu utiliser une boucle while prsente ci-aprs. Texas Instruments
En utilisant une boucle for, on peut maintenant crire une instruction PROGRAM:COMPTE
:For (I,1,10)
qui affiche le calendrier ci-avant : :Disp I
:End
for (jour = 1; jour <= 31; jour = jour + 1) {
System.out.print(jour); Casio
System.out.println(" janvier");} ======COMPTE ======
For 1 I to 10
I
Next

Groupe Eyrolles, 2012 25


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

Premire partie Langages

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.

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 :

temperature = Isn.readDouble();
somme = somme + temperature;

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 :

somme = 0;
for (jour = 1; jour <= 7; jour = jour + 1) {
temperature = Isn.readDouble();
somme = somme + temperature;}
System.out.println(somme / 7.0);

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.

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.

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

26 Groupe Eyrolles, 2012


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

2 Les boucles

jours. Si tous les mois de lanne avaient trente jours, il suffirait dcrire le pro-
gramme suivant :

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);}}

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 :

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);}}

Exercice 2.5
Combien de points affiche le programme suivant ?

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

Et celui-ci ?

for (i = 1; i <= 100; i = i + 1) {


for (j = 1; j <= 100; j = j + 1) {
System.out.print(".");}}
System.out.println();

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.

Groupe Eyrolles, 2012 27


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

Premire partie Langages

Ajouter ce calendrier le jour de la semaine.

1 lundi 1 janvier 2001


2 mardi 2 janvier 2001

365241 mardi 30 dcembre 3000
365242 mercredi 31 dcembre 3000

Exercice 2.8 Fabriquer des nombres pseudo-alatoires


La suite de nombres dfinie par rcurrence de la manire suivante :
u0 = 13
un+1 = (16805 un + 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 ui 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 un est pair alors un+1 est
impair et que si un est impair alors un+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-
T Logarithme entier gramme est form dune boucle qui divise x par 2 plusieurs fois, jusqu
On appelle logarithme entier elog(x) dun obtenir un nombre infrieur ou gal 1, tout en ajoutant 1 un nombre
nombre rel x suprieur ou gal 1, le nombre de n chaque division, pour les compter. Quand la boucle est termine, la
fois quil faut le diviser par deux pour obtenir un variable n contient le nombre recherch. La nouveaut, avec cette
nombre infrieur ou gal 1. Par exemple, le loga- boucle, est que, tant que lexcution du calcul nest pas acheve, il ny a
rithme entier du nombre 60 000 est 16 car 60 000
/ 216 = 0.915, cest--dire 60 000 divis par 2
aucun moyen de savoir combien de fois le corps de cette boucle sera
seize fois. 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

28 Groupe Eyrolles, 2012


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

2 Les boucles

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 DANS DAUTRES LANGAGES
elle ne lest pas, lexcution de la boucle est acheve. Texas Instruments et Casio
Une boucle while est une instruction de la forme while (e) p o e est Dans le langage des calculatrices la boucle
une expression et p est une instruction, appele corps de cette boucle. while scrit de la manire suivante :
Excuter la boucle while (e) p a pour effet dexcuter linstruction p Texas Instruments
plusieurs fois tant que la valeur de lexpression e est gale true. PROGRAM:ELOG
:0 N
Ainsi, on peut programmer le calcul du logarithme entier dun nombre x :While X > 1
de la manire suivante : :X/2 X
:N+1 N
n = 0; :End
while (x > 1) { Casio
x = x / 2; ======ELOG ======
n = n + 1;} 0 N
While X > 1
Exercice 2.9 X/2 X
Montrer que si 2n1 < x 2n, alors elog(x) = n. Montrer que le logarithme N+1 N
entier dun nombre est son logarithme binaire, dfini par log2 (x) = ln(x) / WhileEnd
ln(2), arrondi par excs.

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.

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.

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);}

Groupe Eyrolles, 2012 29


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

Premire partie Langages

Exercice 2.11
On dfinit une suite u de la manire suivante :
u0 = 1000
si un = 1, alors la suite est finie et un est son dernier lment
si un est pair, alors un+1 = un / 2
si un est impair et distinct de 1, alors un+1 = 3 un + 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.

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.

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.

// 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;

30 Groupe Eyrolles, 2012


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

2 Les boucles

// 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));}}}

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 :
while (true) {
System.out.print("all ");}

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 :

Groupe Eyrolles, 2012 31


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

Premire partie Langages

i = e;
while (i <= e') {p i = i + 1;}

Par exemple, linstruction :


for (i = 1; i <= 10; i = i + 1) {
System.out.print("all ");}

peut tre vue comme une manire plus simple dcrire linstruction :
i = 1;
while (i <= 10) {
System.out.print("all ");
i = i + 1;}

et linstruction :
for (i = 1; i <= 10; i = i + 1) {
System.out.println(i);}
1
2
3 peut tre vue comme une manire plus simple dcrire linstruction :
4
5 i = 1;
6 while (i <= 10) {
7 System.out.println(i);
8 i = i + 1;}
9
10 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 :
for (i = 1; i <= 10; i = i + 1) {
System.out.println(i);
i = i + 1;}

peut tre vue comme une manire plus simple dcrire linstruction :
i = 1;

while (i <= 10) {
1 System.out.println(i);
3 i = i + 1;
5 i = i + 1;}
7
9 Et on comprend donc pourquoi cette instruction affiche .

32 Groupe Eyrolles, 2012


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

2 Les boucles

ALLER PLUS LOIN Savoir si un programme se termine ou non


Savoir si un programme se termine ou non nest pas une on numre tous les couples dont la somme des lments
chose facile. Par exemple, quand on excute linstruction : vaut 2, puis tous les couples dont la somme des lments
s = 4; vaut 3, et ainsi de suite, puis on teste si lun de ces couples
p = false; est une solution de lquation : i * i == 25 * j * j.
for (i = 1; i <= s 1; i = i + 1) { Quand on essaiera les couples dont la somme des l-
j = s i; ments vaut 6, on essaiera le couple (5 ; 1), qui est une
if (i * i == 25 * j * j) { solution de lquation, on excutera linstruction p =
p = true;}}
true; et lexcution de la boucle while se terminera.
on numre tous les couples dentiers strictement posi-
Autrement dit, ce programme numre tous les couples
tifs (i ; j) dont la somme vaut 4, cest--dire les cou-
dentiers strictement positifs (i ; j) et se termine quand
ples (1 ; 3), (2 ; 2), (3 ; 1), et on teste si lun de ces couples
il trouve une solution de lquation i * i == 25 * j * j.
est une solution de lquation : i * i == 25 * j * j.
Comme cette quation a une solution, le programme se
Comme ce nest le cas daucun de ces trois couples, lins-
termine.
truction p = true; nest jamais excute et la valeur de
En revanche, si on remplace le nombre 25 par le nombre
la variable p reste false.
2, le programme numre tous les couples dentiers
De mme, quand on excute linstruction : strictement positifs (i ; j) et se termine quand il
s = 2; trouve une solution de lquation i * i == 2 * j * j.
p = false;
Comme cette quation na pas de solution, le pro-
while (!p) {
gramme ne se termine pas.
for (i = 1; i <= s 1; i = i + 1) {
j = s i;
Ces deux programmes sont donc trs similaires, puisque
if (i * i == 25 * j * j) { lun cherche les solutions entires de lquation i * i
p = true;}} == 25 * j * j et lautre celles de lquation i * i ==
s = s + 1;} 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.

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.

Groupe Eyrolles, 2012 33


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

Premire partie Langages

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 ?

34 Groupe Eyrolles, 2012


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

Les types 3

Une bote ne sait pas comment elle sappelle.


Cest nous de lui donner un nom et une forme.

Robin Milner (1934-2010) est


lauteur de lun des premiers lan-
gages de programmation avec des
Dans ce chapitre, nous introduisons une nouvelle instruction, types polymorphes et implicites : le
la dclaration, qui permet dajouter une bote un tat, langage ML. Ce langage est lanctre
et nous voyons quil y a diffrents types de botes. de nombreux langages contempo-
rains en particulier des langages
Chaque bote, en fonction de son type, peut contenir un nombre Caml et Haskell. Par la suite il a dve-
entier, un nombre virgule, un boolen, une chane lopp lun des premiers langages per-
de caractres ou plusieurs, dans le cas dun tableau. mettant de dcrire des systmes
concurrents, cest--dire forms de
Une bote associe une variable peut nexister que pendant plusieurs processus qui sexcutent en
lexcution de certaines parties du programme on parle de parallle. Dans son discours de rcep-
porte de la variable. Une instruction qui manipule une variable tion du prix Turing, il a insist sur
lautonomie de linformatique, qui
doit donc se trouver dans la porte de celle-ci, et il est important
nest une partie daucune autre
de comprendre cette notion pour viter les erreurs. Munis de tous science.
ces ingrdients, nous pouvons enfin excuter nos programmes.

Groupe Eyrolles, 2012


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

Premire partie Langages

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
COMPLMENTS rpertoire que ses programmes.
B http://www.editions-eyrolles.com/ 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 :
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");}}}}

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
T Dclaration botes ne sont pas associes de manire permanente ces noms, mais
La dclaration T v; p, o T est un type, v une cette association est cre par les instructions int a; int b; int x; int
variable et p une instruction a pour effet dajouter y;, qui sappellent des dclarations. Pour abrger le programme et le
une bote de nom v et de type T ltat, excuter p
rendre plus lisible, on peut remplacer les quatre dclarations par une
dans ltat obtenu et supprimer la bote de nom v.
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) {

36 Groupe Eyrolles, 2012


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

3 Les types

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 :
int y;
x = 3;
y = 4;
System.out.println(x + y);

dans ltat ajoute ltat une bote de nom y, ce qui produit ltat
puis excute linstruction :

x = 3;
y = 4;
System.out.println(x + y);

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.

Groupe Eyrolles, 2012 37


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

Premire partie Langages

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 :
if (3 + 4) {
System.out.println(x);}
else {
System.out.println(y);}

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 g2 est non seule-
ment fausse, mais de plus mal forme, car le membre de gauche est
exprim en kg m s2 alors que celui de droite est exprim en kg m2 s4.
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.

38 Groupe Eyrolles, 2012


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

3 Les types

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 ?

Exercice 3.3 (avec corrig) T Type dune variable


Quel est le type appropri pour les variables suivantes : Le type dune variable indique la nature des don-
une variable qui contient le prnom de lutilisateur, nes que cette variable contient : nombre entier,
une variable qui sert de compteur dans une boucle for, nombre virgule, chane de caractres, etc.
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 1080
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 .

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.

Exercice 3.4 (avec corrig)


Quelle est la valeur de lexpression ((double) 5 / (double) 2) ? Et celle de
lexpression (double) (5 / 2) ?

Groupe Eyrolles, 2012 39


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

Premire partie Langages

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.

double alpha,principale;
alpha = Isn.readDouble();
principale = alpha % (2 * Math.PI);
if (principale > Math.PI) {
principale = principale - 2 * Math.PI;}
System.out.println(principale);

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,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);

40 Groupe Eyrolles, 2012


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

3 Les types

La porte et linitialisation
des variables
Si lon excute linstruction :
int z;
{
z = 7;
System.out.println(z);}


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 :
z = 7;
System.out.println(z);

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 :
{
int z;
z = 7;}
System.out.println(z);

Cette instruction est, en effet, une squence forme de linstruction :


{
int z;
z = 7;}

et de linstruction :
System.out.println(z);

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

Groupe Eyrolles, 2012 41


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

Premire partie Langages

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 :
int z;
z = 7;
System.out.println(z);

est, par convention, une autre notation pour :


int z;
{
z = 7;
System.out.println(z);}
T Porte dune variable
qui sexcute donc, comme ci-dessus. De manire plus gnrale, une ins-
La porte dune variable z est lensemble des ins-
tructions au cours de lexcution desquelles la
truction de la forme T x; p q est une autre notation pour T x; {p q} et
bote z est prsente dans ltat. non pour {T x; p} q.
Si maintenant, on cherche excuter linstruction :
int z;
System.out.println(z);


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.

42 Groupe Eyrolles, 2012


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

3 Les types

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.

Exercice 3.9 (avec corrig)


Complter le programme suivant afin que chaque variable soit correctement
dclare.

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

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 10n.
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 10n prs de la racine carre de 2.

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.

Groupe Eyrolles, 2012 43


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

Premire partie Langages

Exercice 3.10 (avec corrig)


Quel problme peut se poser avec le programme suivant ? Le corriger.

int n, i, f;
n = Isn.readInt();
for (i = 1; i <= n; i = i + 1) {
f = f * i;}
System.out.println(f);

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 .

T Tableau
Pour ajouter ltat une grande bote, on utilise une nouvelle
Une bote pouvant contenir plusieurs valeurs du
mme type sappelle un tableau.
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

44 Groupe Eyrolles, 2012


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

3 Les types

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.

Groupe Eyrolles, 2012 45


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

Premire partie Langages

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

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.

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.

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";

46 Groupe Eyrolles, 2012


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

3 Les types

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");}

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 ?

int [] t;
t = new int [10];
t[1] = 4;
System.out.println(t[1]);

Et le programme suivant ?

int [] t;
t[1] = 4;
System.out.println(t[1]);

Groupe Eyrolles, 2012 47


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

Premire partie Langages

Les tableaux
bidimensionnels
Pour reprsenter une table double entre, par exemple la table , une
120 145 87 possibilit est dutiliser un tableau de neuf cases () mais cette manire
de faire est malcommode.
12 67 89
90 112 83 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
i
le coefficient binomial formule pour tout i < n et pour tout j i. Les
j
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 ?

48 Groupe Eyrolles, 2012


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

3 Les types

ALLER PLUS LOIN Quest-ce que le calcul formel ?


Comment calculer avec la fonction polynme x 2 x3 + Mais reprsenter cette fonction ainsi permet de faire de
8 x2 + 7 x + 3 ? Une possibilit est den faire une expres- nombreuses nouvelles choses, par exemple lafficher
sion de son programme. Cela permet, par exemple, de for (i = 0; i <= 3; i = i + 1) {
calculer sa valeur en 5. System.out.print(t[i]);
int x, y; System.out.print(" ");
x = 5; if (i != 0) {
y = 2 * x * x * x + 8 * x * x + 7 * x + 3; System.out.print("x");
System.out.println(y); if (i != 1) {
System.out.print("^");
ce qui donne, bien entendu, le rsultat 488.
System.out.print(i);}}
Mais, il est aussi possible de reprsenter une fonction
if (i != 3) {
polynme du troisime degr par le quadruplet de ses System.out.print(" + ");}}
coefficients, cest--dire par un tableau System.out.println();
double [] t; ce qui donne le rsultat
On peut alors dfinir la fonction polynme x 2 x3 + 8 3.0 + 7.0 x + 8.0 x^2 + 2.0 x^3
x2 + 7 x + 3 ainsi
et mme calculer sa drive, en utilisant le fait que la
t = new double [4]; drive de xn + 1 est (n + 1) xn
t[3] = 2;
t[2] = 8; for (i = 0; i <= 2; i = i + 1) {
t[1] = 7; u[i] = t[i+1] * (i + 1);}
t[0] = 3; t[3] = 0;

Calculer la valeur de cette fonction en 5 demande un que l'on peut son tour afficher
programme un peu plus complexe 7.0 + 16.0 x + 6.0 x^2 + 0.0 x^3
int x, y, i, c; et on obtient que la fonction x 6 x2 + 16 x + 7 est la
3 2
x = 5; drive de la fonction x 2 x + 8 x + 7 x + 3. Cette proc-
y = 0; dure est bien sr valable quelle que soit la fonction poly-
c = 1; nme du troisime degr reprsente dans le tableau t.
for (i = 0; i <= 3; i = i + 1) { Les programmes peuvent donc calculer avec des objets
y = y + t[i] * c; trs divers : des nombres et des chanes de caractres
c = c * x;} bien entendu, mais aussi des expressions symboliques
System.out.println(y); comme x x3 + 8 x2 + 7 x + 3.
o la variable c contient les valeurs des puissances suc-
cessives de x.

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.

Groupe Eyrolles, 2012 49


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

Premire partie Langages

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.

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.

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.

String prenom, nom;


prenom = Isn.readString();
nom = Isn.readString();
System.out.print(Isn.stringNth(prenom,0));
System.out.println(Isn.stringNth(nom,0));

50 Groupe Eyrolles, 2012


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

3 Les types

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.

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

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.

Groupe Eyrolles, 2012 51


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

Premire partie Langages

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.

52 Groupe Eyrolles, 2012


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

3 Les types

Exercice 3.25 (avec corrig)


Le programme suivant est cens calculer la somme des carrs des n premiers
entiers.

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

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 ALLER PLUS LOIN
calculs. On affichera sa valeur la fin du corps de la boucle for. Pour cela on Pour de gros programmes
insre cet endroit les lignes :
Une telle mthode est utilisable sur des pro-
System.out.print("i vaut "); grammes de petite taille, mais peut rapidement
System.out.println(i); devenir lourde mettre en place pour de gros
programmes : il faut dcider des variables
On constate alors que i contient 1 la fin de la premire itration, mais 4 la observer et des points du programme o cela a
fin de la deuxime itration et 25 la fin de la troisime. Il y a donc une ins- un intrt, puis modifier le programme et le
truction dans le corps de la boucle qui modifie la valeur de i, ce quil ne faut recompiler, et enfin supprimer les affichages du
pas faire dans une boucle for. Une fois ceci constat, il nest pas difficile programme lorsque lon a identifi le problme.
dincriminer la ligne i = i * i;. Dans de nombreux environnements de dvelop-
Outre le test et linstrumentation, il existe de nombreuses autres pement logiciel, il existe des outils spcialiss, les
dbogueurs, pour obtenir des informations sur
mthodes de mise au point des programmes. Dans certains langages, les
ce quil se passe en mmoire durant lexcution
types permettent de dtecter des erreurs de faon beaucoup plus pousse dun programme, ou bien excuter un pro-
quen Java. On peut aussi dmontrer quun programme vrifie certaines gramme pas pas.
proprits (voir le chapitre 18), ce qui vite en particulier davoir cher-
cher les erreurs ttons.

Groupe Eyrolles, 2012 53


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

Premire partie Langages

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 ?

54 Groupe Eyrolles, 2012


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

Les fonctions 4
C HAPITRE AVANC

Pour avoir du style, il faut viter les redites.


John McCarthy (1927 - 2011) est
lauteur du langage Lisp (1958), dont
la principale construction est la dfi-
nition de fonctions. Il est aussi lun
Dans ce chapitre, nous introduisons une nouvelle des inventeurs de la notion de temps
partag, qui permet plusieurs per-
construction : la dfinition de fonction, qui permet disoler une
sonnes dutiliser un mme ordinateur
instruction qui revient plusieurs fois dans un programme. en mme temps. Il a crit lun des
premiers programmes jouant aux
Une fonction est dfinie par un nom, par ses arguments
checs et invent pour cela un algo-
qui porteront les valeurs communiques par le programme rithme, la mthode alpha-bta, qui
principal la fonction au moment de son appel et permet de jouer non seulement aux
ventuellement une valeur de retour communique checs, mais aussi de nombreux
autres jeux. Il a aussi t un dfen-
au programme par la fonction en fin dexcution. seur de lide de progrs et de
Nous revenons dans ce chapitre sur la question de la porte limportance des mathmatiques
des variables dans le cas des programmes qui comportent dans lducation.
des fonctions. Nous introduisons aussi des variables globales
dont la porte est le programme tout entier.

Groupe Eyrolles, 2012


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

Premire partie Langages

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 :
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();

dans lequel linstruction


System.out.println();
System.out.println("----------------------------------------");
System.out.println();

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.
T Fonction Pour dfinir la fonction tirerUnTrait, on procde de la faon suivante :
Dans les langages de programmation, une fonc-
static void tirerUnTrait () {
tion est une instruction isole du reste du pro-
System.out.println();
gramme, qui possde un nom, et qui peut tre
System.out.println("--------------------------------------");
appele par ce nom nimporte quel endroit du System.out.println();}
programme et autant de fois que lon veut.

et on utilise ensuite cette fonction dans le programme principal, comme


si ctait une instruction du langage :

56 Groupe Eyrolles, 2012


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

4 Les fonctions

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

Cette dfinition de fonction se place avant le programme principal, si


bien que lorganisation gnrale du programme est la suivante :
class Horaire { T Corps dune fonction

static void tirerUnTrait () { Linstruction


System.out.println(); System.out.println();
System.out.println("------------------------------------"); System.out.println("----...----");
System.out.println();} System.out.println();
que lon isole par la dfinition de la fonction
public static void main (String [] args) { tirerUnTrait sappelle le corps de cette fonc-
tion.
System.out.print("Le vol en direction de ");
System.out.print("Tokyo");
System.out.print(" dcollera ");
System.out.print("9h00");
tirerUnTrait(); T Appel dune fonction

Linstruction tirerUnTrait(); sappelle un


System.out.print("Le vol en direction de "); appel de la fonction tirerUnTrait. Excuter cette
System.out.print("Sydney"); instruction a pour effet dexcuter le corps de la
System.out.print(" dcollera "); fonction.
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();}}

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

Groupe Eyrolles, 2012 57


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

Premire partie Langages

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.
T Argument dune fonction Dans notre exemple, les arguments doivent reprsenter la destination,
On appelle argument dune fonction une variable que lon nomme destination, et lhoraire de vol, que lon nomme horaire.
particulire, utilise dans le corps de la fonction, et On dfinit alors cette fonction de la manire suivante :
dont la valeur est donne dans le programme prin-
cipal au moment o la fonction est appele. 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();}

Et le programme principal devient :


annoncerUnVol("Tokyo","9h00");
annoncerUnVol("Sydney","9h30");
annoncerUnVol("Toulouse","9h45");

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

58 Groupe Eyrolles, 2012


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

4 Les fonctions

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 :
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;}}

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 :
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;}

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 T Valeur de retour
nombreDea("abracadabra"), dans le programme principal, nest pas une ins- La valeur produite par une fonction partir de ses
truction, mais une expression, qui a la valeur 5. On peut lutiliser, par arguments, sil en existe une, est appele valeur
exemple, dans une affectation x = nombreDea("abracadabra");. de retour.

Groupe Eyrolles, 2012 59


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

Premire partie Langages

T En-tte dune fonction 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-
On appelle en-tte dune fonction la premire
ligne de sa dfinition, qui comporte dans lordre : cl void, sinon, on la fait prcder du type de sa valeur de retour.
le mot-cl static, Dans len-tte static void annoncerUnVol (String destination, String
le type de la valeur de retour de la fonction, ou
void le cas chant,
horaire) on trouve le nom annoncerUnVol et les deux arguments
le nom de la fonction, destination et horaire, lun et lautre de type String. Enfin, le mot-cl
la liste de ses arguments entre parenthses, void indique que cette fonction ne renvoie pas de valeur.
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.

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,
ALLER PLUS LOIN Lordre des arguments double distance).
Lordre des arguments na pas dimportance Exercice 4.2
pour la dfinition de la fonction : les en-ttes
static void annoncerUnVol (String crire len-tte des fonctions suivantes :
destination, String horaire) et Une fonction qui indique sil est possible de construire un triangle avec
static void annoncerUnVol (String trois segments de mesures donnes.
horaire, String destination) permet- Une fonction qui calcule le plus grand diviseur commun (PGCD) de deux
tent de dfinir la mme fonction. nombres entiers.
En revanche, lors dun appel cette fonction, Une fonction qui trace lcran un segment entre deux points.
lordre des arguments doit tre respect : Une fonction qui crit lcran les initiales dune personne dont on donne
annoncerUnVol("Tokyo","9h00"); est le nom complet.
correct vis--vis du premier en-tte, mais
annoncerUnVol("9h00","Tokyo"); nest
correct que vis--vis du second.

60 Groupe Eyrolles, 2012


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

4 Les fonctions

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.

Exercice 4.3 (avec corrig)


crire une fonction qui effectue la division dcimale de deux nombres entiers.
T Dfinition dune fonction
On appelle la fonction divisionDecimale. Il est spcifi ici que les argu- Au bout du compte, la dfinition dune fonction est
ments doivent tre de type int ; on va les appeler dividende et diviseur.
forme de son en-tte, puis du corps de la fonc-
La fonction renvoie une valeur qui ne peut tre que de type double car
tion, entre accolades.
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 :

double quotient;
quotient = ((double) dividende) / ((double) diviseur);

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 :

static double divisionDecimale (int dividende, int diviseur) {


double quotient;
if (denominateur == 0) {
quotient = Double.POSITIVE_INFINITY;}
else {
quotient = ((double) dividende) / ((double) diviseur);}
return quotient;}

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.

Groupe Eyrolles, 2012 61


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

Premire partie Langages

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;}

62 Groupe Eyrolles, 2012


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

4 Les fonctions

mnerait crire une fonction :


static void reinitialise () {
x = 0;}

et le programme principal :
public static void main (String [] args) {
int x;
x = 3;
x = 5;
reinitialise();
x = 7;
reinitialise();
x = 4;}

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 :
static void reinitialise () {
x = 0;}

public static void main (String [] args) {


int x;
x = 3;
x = 5;
reinitialise();
x = 7;
reinitialise();
x = 4;}
T Variable globale ou locale
Une manire de rsoudre ce problme est de dclarer la variable x de
Une variable globale est une variable dclare
manire ce que sa porte soit le programme entier. en dbut de programme, en dehors du programme
principal et de toute fonction. Sa porte est le pro-
static int x;
gramme entier. En Java, la dclaration dune
variable globale est prcde du mot-cl static.
static void reinitialise () {
Par opposition, une variable locale est dclare
x = 0;}
lintrieur dune fonction ou du programme prin-
public static void main (String [] args) { cipal, qui est une fonction particulire. Elle nest
x = 3; pas utilisable depuis les autres fonctions.
x = 5;

Groupe Eyrolles, 2012 63


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

Premire partie Langages

reinitialise();
x = 7;
reinitialise();
x = 4;}

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 :
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);}

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

64 Groupe Eyrolles, 2012


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

4 Les fonctions

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.

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 ?
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());}}}

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.

Groupe Eyrolles, 2012 65


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

Premire partie Langages

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 :

static void origine(int graine) {


int graineTronquee;
graineTronquee = graine % periode;
valeur = graineTronquee;}

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.

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;

66 Groupe Eyrolles, 2012


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

4 Les fonctions

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;}}}}

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 ?

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);}}

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.

Groupe Eyrolles, 2012 67


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

Premire partie Langages

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.

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));}}

Exercice 4.9
Dterminer la porte de chaque variable dans le programme suivant.

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);}}}

68 Groupe Eyrolles, 2012


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

4 Les fonctions

Exercice 4.10
Trouver les erreurs de porte 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.

Exercice 4.11 (avec corrig)


O faut-il placer les dclarations des diffrentes variables dans le programme
suivant ?

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";

Groupe Eyrolles, 2012 69


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

Premire partie Langages

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));}}

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.

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";

70 Groupe Eyrolles, 2012


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

4 Les fonctions

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));}}

Le passage par valeur


Dans le programme suivant :
static int a,b;

public static void main (String [] args) {


int c;
a = 4;
b = 7;
c = a;
a = b;

Groupe Eyrolles, 2012 71


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

Premire partie Langages

b = c;
System.out.print(a);
System.out.print(" ");
System.out.println(b);}

lexcution de linstruction :
c = a;
a = b;
b = c;

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 :
7 4

Cette opration dchange du contenu de deux botes tant souvent uti-


lise, on peut vouloir lisoler dans une fonction.
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);}

Toutefois, contrairement au prcdent, ce programme affiche :


4 7

et non :
7 4

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.

72 Groupe Eyrolles, 2012


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

4 Les fonctions

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.

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.

Exercice 4.12 (avec corrig)


Dans le programme suivant, quelles sont les expressions passes par valeur ?
Quaffiche ce programme lorsquon lexcute ?

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);}}

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.

Groupe Eyrolles, 2012 73


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

Premire partie Langages

Ce programme affiche donc :

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.

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

74 Groupe Eyrolles, 2012


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

4 Les fonctions

echange(a,b);
System.out.print(a[0]);
System.out.print(" ");
System.out.println(b[0]);}

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 :
a = new int [2];
b = new int [2];

cre deux nouvelles botes (). Laffectation qui suit :
a[0] = 4;
b[0] = 7;

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.

Groupe Eyrolles, 2012 75


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

Premire partie Langages

ALLER PLUS LOIN Les licences logicielles : logiciel libre versus logiciel propritaire
Quand on crit un programme qui est utilis par dautres son programme, mais aussi den tudier le fonctionne-
personnes que soi, on doit prciser ses conditions dutili- ment et de le modifier. Il diffuse donc la fois le code
sation par un contrat qui sappelle une licence logicielle. compil et le code source.
Les programmes ont certains points communs avec Parmi les licences libres, il y a encore deux types de
dautres biens non rivaux (voir le chapitre 11), comme les licences. Les licences contaminantes, comme la General
inventions et les uvres de lesprit . Cela explique que Public Licence (GPL), imposent, dans le cas de la diffusion
le droit des licences ait certains points communs avec le du programme modifi, de le diffuser avec la mme
droit des brevets et le droit dauteur. Le droit des brevets licence, afin de faire bnficier les autres des mmes
et le droit dauteur donnent aux inventeurs et aux liberts que celles dont on a soi-mme bnfici.
auteurs le monopole de lexploitation de leur cration et Dautres licences, comme la licence Berkeley Software Dis-
les autorisent vendre ce droit dexploitation. Ils favori- tribution (BSD), donnent la libert de modifier le pro-
sent donc la cration, en permettant aux crateurs de gramme et de diffuser la version modifie sous une
gagner de largent. Cependant, ils la freinent galement, licence propritaire.
car ils interdisent dautres dutiliser ces crations et de Les licences libres ont permis un nouveau mode de dve-
poursuivre le travail de leurs auteurs. Cest pour cela que loppement des logiciels, par une dmarche qui a un cer-
ce monopole dexploitation est toujours limit dans le tain nombre de points communs avec la recherche
temps et que, dans le droit des brevets, linventeur est scientifique : coopration internationale, publication,
souvent tenu de rendre terme son invention publique. validation par les pairs, libert de critiquer et de modi-
Il y a principalement deux formes de licences logicielles : fier, etc., alors que, dans les temps anciens, Pythagore,
les licences propritaires (ou privatrices) et les licences par exemple, interdisait ses disciples de divulguer leurs
libres. Avec une licence propritaire, lauteur donne sim- thormes et leurs dmonstrations. Au-del des pro-
plement un droit dutilisation de son programme. La plu- grammes, cette nouvelle manire de produire et de dif-
part du temps, il diffuse le code compil de son fuser des objets industriels prfigure peut-tre une
programme, mais en garde le code source (voir le volution plus globale de lindustrie, dans un monde
chapitre 15) secret. Avec une licence libre, en revanche, il dans lequel de plus en plus de biens industriels sont com-
donne le droit ses utilisateurs non seulement dutiliser 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 ?

76 Groupe Eyrolles, 2012


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

La rcursivit 5
C HAPITRE AVANC

Une dfinition rcursive est une dfinition rcursive.


Christopher Strachey (1916-1975)
et Dana Scott (1932-) ont donn
une smantique aux dfinitions
Dans ce chapitre, nous voyons quune fonction peut sappeler rcursives : la dfinition f = G(f) nest
elle-mme. Cette construction, alternative celle de boucle, pas circulaire, mais une dfinition
permet dcrire des programmes courts et lgants. 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.

Groupe Eyrolles, 2012


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

Premire partie Langages

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 :
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();}

il est possible dcrire le programme :


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");}

78 Groupe Eyrolles, 2012


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

5 La rcursivit

Il est aussi possible disoler linstruction :


System.out.println();
System.out.println("--------------------------------------------");
System.out.println();

de la fonction annoncerUnVol et dcrire ce programme ainsi :


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");}

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 :
static int puissance (int exposant) {
if (exposant == 0) {
return 1;}
else {
return (2 * puissance(exposant 1));}} T Fonction rcursive

Le cas le plus simple est celui de lappel puissance(0) qui retourne la Une fonction rcursive est une fonction qui
sappelle elle-mme.
valeur 1 sans avoir besoin de refaire un appel la fonction puissance.

Groupe Eyrolles, 2012 79


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

Premire partie Langages

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.
ATTENTION Prvoir un cas de base Plus gnralement, la valeur retourne par lappel puissance(k + 1) est le
Dans la dfinition dune fonction rcursive, il
double de celle retourne par lappel puissance(k). La valeur retourne
faut toujours prvoir au moins un cas de base, par lappel puissance(k) est donc 2k.
comme le cas exposant == 0 dans la dfini-
Cette fonction calcule donc la mme chose que la fonction :
tion ci-avant, dans lequel la fonction ne
sappelle pas elle-mme ; sinon elle sappellera
static int puissance (int exposant) {
elle-mme indfiniment.
int i,resultat;
resultat = 1;
for (i = 1; i <= exposant; i = i + 1) {
resultat = 2 * resultat;}
return resultat;}

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.

80 Groupe Eyrolles, 2012


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

5 La rcursivit

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

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 :

static int quotient (int dividende, int diviseur)

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 :

if (dividende < diviseur) {


return 0;}

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 :

static int quotient (int dividende, int diviseur) {


if (dividende < diviseur) {
return 0;}
else {
return 1 + quotient (dividende diviseur, diviseur);}}

Exercice 5.2
Modifier le programme ci-avant pour quil calcule, non le quotient, mais le
reste dune division euclidienne.

Groupe Eyrolles, 2012 81


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

Premire partie Langages

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 :
u0 = u1 = 1
un+2 = un + un+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- termes de la suite dans lordre en se souvenant des deux
nacci, si les dfinitions rcursives rendent parfois trs dernires valeurs calcules. Avec les fonctions rcursives,
pratiques lcriture dun programme, elles peuvent aussi on appelle accumulateurs les arguments qui propagent
avoir des consquences trs nfastes sur leur efficacit. ces deux valeurs dun appel de la fonction au suivant.
Ainsi, dans notre exemple, pour calculer u10, il faut cal- static int fib (int n, int u1, int u0) {
culer u9 et u8, mais comme u9 est calcul rcursivement, if (n > 1) {
pour lobtenir il faut calculer u8 et u7. Le calcul de u8 est return fib(n - 1,u1 + u0,u1);}
donc fait deux fois. On peut montrer de mme que u7 est else {
calcul trois fois, u6 cinq fois, etc. if (n == 1) {
Cela nest pas un problme inhrent aux fonctions rcur- return u1;}
sives, cest juste un pige dans lequel on peut facilement else {
tomber quand on en crit une. Il faut dans un tel cas se return u0;}}}
demander si certains calculs ne sont pas faits plusieurs Cette fonction permet en ralit de calculer le n-me
fois, et si cest le cas comment lviter. Les solutions habi- terme de toute suite vrifiant la mme relation de rcur-
tuelles sont de mmoriser, dune faon ou dune autre, rence que la suite de Fibonacci, en spcifiant les valeurs
les calculs dj effectus et qui serviront nouveau. Dans de u0 et u1. Pour le n-me terme de la suite de Fibonacci
le cas de la suite de Fibonacci, il suffit de calculer les elle-mme, il suffit dappeler fib(n,1,1).

82 Groupe Eyrolles, 2012


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

5 La rcursivit

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

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.

Groupe Eyrolles, 2012 83


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

Premire partie Langages

// 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);}}}

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 ?

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 ?

84 Groupe Eyrolles, 2012


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

La notion
de langage 6
formel
C HAPITRE AVANC

Les langages informatiques sont presque comme


les langues naturelles. Mais pas tout fait.
Lidographie de Gottlob Frege
(1848 - 1925) est le premier langage
formel propos pour exprimer
Dans ce chapitre, hors programme lexception de la section lensemble des mathmatiques. Ce
Redfinir la smantique , nous introduisons la notion langage a t aujourdhui aban-
de langage formel, au-del des langages de programmation, donn, mais il est lorigine de la
thorie des ensembles, de la logique
et nous comparons ces langages aux langues naturelles. des prdicats et, en grande partie,
Nous prenons lexemple du langage HTML, prsent des langages formels utiliss en infor-
au chapitre 8. Ceci nous permet de prsenter les notions matique, en particulier des langages
de programmation. Lorigine com-
de grammaire et de smantique.
mune des mots langage ,
La grammaire dfinit quelles sont les chanes de caractres, logique et logiciel nous rap-
pelle les liens entre la logique
par exemple les programmes, qui sont correctement forms.
ltude du langage mathmatique
La smantique dfinit ce qui se passe quand on utilise un texte, et linformatique.
par exemple quand on excute un programme.

Groupe Eyrolles, 2012


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

Premire partie Langages

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.
ALLER PLUS LOIN La grammaire des langages informatiques est plus simple, mais plus pr-
La grammaire des langues naturelles cise, que celle des langues naturelles : un point-virgule oubli dans un pro-
La grammaire des langues naturelles est beau- gramme et celui-ci nest plus correct, alors quil est difficile de trouver une
coup plus complexe que celle des langages for- phrase en franais qui serait incomprhensible cause dun signe de ponc-
mels, en particulier parce quelle tient compte tuation oubli. De plus, la frontire entre les phrases correctes et les
de nombreuses exceptions : homonymie, syno- phrases incorrectes dans une langue naturelle nest pas si bien dfinie.
nymie, etc. Ainsi, en franais, la phrase les
poules du couvent couvent est correcte.
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-

86 Groupe Eyrolles, 2012


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

6 La notion de langage formel

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-

Groupe Eyrolles, 2012 87


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

Premire partie Langages

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 x2 < 4, mais pas x2 < <.
ALLER PLUS LOIN Mlanger langages formels Ces langages formels sont relativement rcents : la notation musicale date
et langues naturelles du XIIIe sicle, la notation algbrique du XVIe sicle et la nomenclature
Souvent, dans un texte scientifique, on mlange des composs chimiques du XIXe sicle. Avant linvention de la notation
des passages crits dans des langages formels, algbrique, on crivait les quations en langue naturelle, par exemple
comme le langage algbrique, et des passages lquation x3 + 3 x2 = 20 scrivait : un cube et trois carrs font vingt.
crits en langue naturelle : Supposons quil Nanmoins, ces langages sont tous les trois antrieurs linformatique.
existe deux nombres entiers non nuls et pre-
miers entre eux tels que x2 = 2 y2. Le nombre x2 La ranon de luniversalit des langues naturelles semble donc tre leur
est pair et, daprs le lemme 1, le nombre x incapacit exprimer prcisment les choses, ds que lon sintresse
galement : il existe donc un nombre x tel que
un domaine prcis comme les sciences, le droit ou la musique. Raison
x = 2 x. On en dduit (2 x)2 = 2 y2, cest--
dire 4 x2 = 2 y2, do on tire y2 = 2 x2. Le pour laquelle les scientifiques, les juristes ou les musiciens se sont loi-
nombre y2 est donc pair et, en utilisant le gns des langues naturelles, parfois par de petits carts, parfois en crant
lemme 1 nouveau, le nombre y galement. de vritables langages formels. Lapparition et la gnralisation, avec
Les nombres x et y sont tous les deux pairs, ce linformatique, des langages formels taient donc prpares par le dve-
qui est en contradiction avec lhypothse .
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

88 Groupe Eyrolles, 2012


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

6 La notion de langage formel

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

Groupe Eyrolles, 2012 89


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

Premire partie Langages

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 :

L = aab | abab

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 :

L= | aL

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.

A= |aA
B= |bB
L=AB

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 :

I = TV = E; I | V = E; | II | if (E) I else I | while (E) I | {I}

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

90 Groupe Eyrolles, 2012


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

6 La notion de langage formel

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.

C=a|b|c|d|

en excluant les symboles < et >.


Le langage form des suites de tels symboles se dfinit ainsi :

L= | CL

Cependant, un texte en HTML nest pas une simple suite de tels sym- ALLER PLUS LOIN Langages et formats
boles, puisquil peut aussi contenir des expressions comme <b>un La notion de langage nest pas trs loigne de
passage important</b>. la notion de format introduite au chapitre 9.
Dans un cas comme dans lautre, on dfinit un
On dfinit alors le langage des textes en HTML ainsi : ensemble de rgles qui permettent dexprimer
un texte, une image, etc. Dailleurs, on dit par-
L = | CL | EL fois le langage HTML et parfois le format
E = <b>L</b> | <i>L</i> | <p>L</p> | <h1>L</h1> | <h2>L</h2> HTML .
On a cependant tendance rserver le mot lan-
| <a href = A>L</a>
gage aux suites de symboles exprimes dans
un alphabet riche et avec une grammaire relati-
o le langage A, qui reste dfinir, est celui des adresses web. vement complexe. Ainsi le langage HTML utilise
tous les symboles de lalphabet, qui peuvent
Ainsi, dans le langage E, on introduit les symboles < et > et les diff- eux-mmes tre exprims dans un format :
rentes balises existantes, mais on assure galement au passage que les ASCII ou latin-1, alors que le format latin-1 uti-
balises sont utilises correctement : toute balise ouverte est referme par lise un alphabet qui se limite aux symboles 0
la suite et les balises sont correctement imbriques, cest--dire refer- et 1. De mme, toutes les suites de huit bits sont
bien formes en latin-1, si bien que la gram-
mes dans lordre correspondant leur ouverture. Par exemple, cette
maire du format latin-1 est trs simple et na
grammaire exclut une suite de caractres comme <b><i>erreur</b></i>. que peu dintrt.

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.

Groupe Eyrolles, 2012 91


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

Premire partie Langages

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 :
h1 {Font-Size: 24pt; Color: Red; Text-Align: Center;}
a {Color: Green; Text-Decoration: Overline;}

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 :
<link rel="stylesheet" href="example.css" type="text/css">
</link>

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


oeuvre {Font-Style: Italic}

92 Groupe Eyrolles, 2012


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

6 La notion de langage formel

Le texte :
<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>.

saffiche alors dans un navigateur :

L'le mystrieuse est la fois la suite de Vingt mille lieues sous les mers et
des Enfants du capitaine Grant.

exactement comme laurait fait le texte :


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

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> :
oeuvre {Text-Decoration: Underline;}

pour que le texte saffiche :

Lle mystrieuse est la fois la suite de Vingt mille lieues sous les mers
et des Enfants du capitaine Grant.

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.

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 ?

Groupe Eyrolles, 2012 93


ManuelDowek.book Page 94 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 95 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 96 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 97 Monday, July 9, 2012 4:58 PM

Reprsenter des
nombres entiers 7
et virgule

Au commencement taient le 0 et le 1, puis nous


crmes les nombres, les textes, les images et les sons.
Le livre de laddition et de la sous-
traction daprs le calcul indien de
Muhammad al-Khwarizmi (783 ? -
Dans ce chapitre, nous voyons comment les nombres 850 ?), qui prsente la numration
sont reprsents dans les ordinateurs avec des 0 et des 1. dcimale position et des algo-
rithmes permettant deffectuer les
oprations sur les nombres exprims
Nous introduisons la notion de base, en partant de la notation dans ce systme, a t le vecteur de la
dcimale que nous utilisons ordinairement pour crire diffusion de ce systme de numra-
les nombres entiers. Nous passons par la base cinq puis tion dans le bassin mditerranen. Le
mot algorithme est driv du nom
dcrivons la base deux, aussi appele reprsentation binaire.
dal-Khwarizmi et le mot algbre (al-
Nous gnralisons ensuite aux nombres relatifs en utilisant jabr) du titre dun autre de ses livres.
la notation en complment deux, puis aux nombres virgule,
reprsents par leur signe, leur mantisse et leur exposant.

Groupe Eyrolles, 2012


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

Deuxime partie Informations

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.

98 Groupe Eyrolles, 2012


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

7 Reprsenter des nombres entiers et virgule

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 T Indiquer la base
deux, de cinq, de douze, de vingt, de soixante, etc. On crirait alors les Dans ce livre, quand une suite de chiffres exprime
nombres entiers naturels en notation position en base deux, cinq, un nombre dans une base diffrente de dix, on
douze, vingt ou soixante. La notation dcimale position sappelle donc indique la base entre parenthses, par exemple :
1101 (en base deux). On souligne aussi parfois un
aussi la notation position en base dix. mot pour indiquer quil exprime un nombre en
En notation binaire, cest--dire en notation position en base deux, le base deux : 1101. Enfin, on rassemble parfois les
nombre treize scrit 1101 : de droite gauche, 1 unit, 0 deuzaine, bits par groupe de quatre ou de huit dans les mots
trs longs pour quils soient plus faciles lire :
1 quatraine et 1 huitaine. Lcriture dun entier naturel en binaire est en 1111111101 est crit 11 1111 1101. Comme en
moyenne 3,2 fois plus longue que son criture en base dix, mais elle ne base dix, ces groupes sont forms de droite
demande dutiliser que deux chiffres : 0 et 1. gauche.

Groupe Eyrolles, 2012 99


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

Deuxime partie Informations

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.

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.

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 52) + (4 51) + (2 50)
Donc 47 = 142 (en base cinq).

100 Groupe Eyrolles, 2012


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

7 Reprsenter des nombres entiers et virgule

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.

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 = 52 = 25, le prcdent de
5 5 5 = 53 = 125, et ainsi de suite.

Exercice 7.9 (avec corrig)


Trouver la reprsentation en base dix du nombre 401302 (en base cinq).

401302 (en base cinq) = (2 50) + (0 51) + (3 52) + (1 53) + (0 54) + (4 55)
= 12702.

Exercice 7.10
Trouver la reprsentation en base dix des nombres 2341 (en base cinq) et 444
(en base cinq).

Groupe Eyrolles, 2012 101


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

Deuxime partie Informations

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.

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.

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 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 = 22 = 4, le prcdent de 2 2 2 = 23 = 8, etc.

102 Groupe Eyrolles, 2012


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

7 Reprsenter des nombres entiers et virgule

Exercice 7.15 (avec corrig)


Trouver la reprsentation en base dix du nombre 11111111.

11111111 = (1 20) + (1 21) + (1 22) + (1 23) + (1 24) + (1 25) + (1 26)


+ (1 27) = 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.

T Les octets
Exercice 7.18
Montrer quavec un mot de n bits on peut reprsenter les nombres de 0 2n1. Dans la mmoire des ordinateurs les circuits
mmoire un bit sont souvent groups par huit : les
Exercice 7.19 octets. On utilise souvent des nombres exprims
en notation binaire, cest--dire en base deux, sur
Pour multiplier par dix un entier naturel exprim en base dix, il suffit dajouter un, deux, quatre ou huit octets, soit 8, 16, 32 ou
un 0 sa droite, par exemple, 12 10 = 120. Quelle est lopration quiva- 64 bits. Ceci permet de reprsenter les nombres de
lente pour les entiers naturels exprims en base deux ? Exprimer en base deux 0 1111 1111 = 255 sur un octet, de 0
les nombres 3, 6 et 12 pour illustrer cette remarque.
1111 1111 1111 1111 = 65 535 sur deux octets, de
Exercice 7.20 0 1111 1111 1111 1111 1111 1111 1111 1111
= 4 294 967 295 sur trois octets et de 0
Quelle est la reprsentation binaire du nombre 57 ? Et celle du nombre 198 ? 1111 1111 1111 1111 1111 1111 1111 1111 1111
Soit m un mot de 8 bits, n lentier naturel reprsent en binaire par le mot m, 1111 1111 1111 1111 1111 1111 1111 =
m le mot obtenu en remplaant dans m chaque 0 par un 1 et chaque 1 par 18 446 744 073 709 551 615 sur quatre octets.
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.

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.

Groupe Eyrolles, 2012 103


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

Deuxime partie Informations

Exercice 7.21 (avec corrig)


T Base 16 Trouver la reprsentation en base seize du nombre 965.
Rponse : 965 = 3c5 (en base seize)
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).

Exercice 7.22
Trouver la reprsentation en base seize des nombres 6725 et 18 379.

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 = k2, le prcdent les paquets de
k k k = k3, etc.

Exercice 7.23 (avec corrig)


Trouver la reprsentation en base dix du nombre 4e2c (en base seize).

4e2c (en base seize) = (12 160) + (2 161) + (14 162) + (4 163) = 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 ?

104 Groupe Eyrolles, 2012


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

7 Reprsenter des nombres entiers et virgule

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 = -(215 - 1) = -32 767
111 1111 1111 1111 = 215 - 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 + 216 = 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
-215 = -32 768 et 215 - 1 = 32 767. Plus gnralement, avec des mots de
n bits, on crit les entiers relatifs compris entre -2n-1 et 2n-1 - 1 :
un entier relatif x positif ou nul compris entre 0 et 2n-1 - 1 est repr-
sent par lentier naturel x compris entre 0 et 2n-1 - 1 ;
un entier relatif x strictement ngatif compris entre 2n-1 et 1 est
reprsent par lentier naturel x + 2n compris entre 2n-1 et 2n - 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.

Groupe Eyrolles, 2012 105


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

Deuxime partie Informations

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 + 2n.

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 + 28 = -128
+ 256 = 128 : 1000 0000.

Exercice 7.28
Trouver la reprsentation binaire sur huit bits des entiers relatif 127 et -127.

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 2n-1, cest lentier relatif reprsent,
sil est suprieur ou gal 2n-1, lentier relatif reprsent est p - 2n.

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 = 27 et donc lentier relatif 128 -
28 = 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 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 + 28 = -x + 256 =
256 - p. Si lentier relatif x est compris entre -127 et -1, alors il est reprsent par lentier
naturel p = x + 28 = x + 256 et son oppos -x est reprsent par lentier naturel p = -x = 256 - p.
106 Groupe Eyrolles, 2012
ManuelDowek.book Page 107 Monday, July 9, 2012 4:58 PM

7 Reprsenter des nombres entiers et virgule

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.

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.

Groupe Eyrolles, 2012 107


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

Deuxime partie Informations

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 m 2n o s est le signe du nombre, n son exposant et m sa man-
ALLER PLUS LOIN Valeurs exceptionnelles tisse. Le signe est + ou -, lexposant est un entier relatif et la mantisse est un
Ce codage prend en compte des valeurs nombre virgule, compris entre 1 inclus et 2 exclu.
exceptionnelles : +, - et NaN (not a Par exemple, quand on utilise 64 bits pour reprsenter un nombre vir-
number) qui est une valeur indfinie. Ces
valeurs non numriques sont reprsentes res-
gule, on utilise 1 bit pour le signe, 11 bits pour lexposant et 52 bits pour la
pectivement par les mots de 64 bits suivants : mantisse. Le signe + est reprsent par 0 et le signe - par 1. Lexposant n
0 11111111111 00000000000000000000000 est un entier relatif compris entre -1 022 et 1 023 ; on le reprsente
00000000000000000000000000000 comme lentier naturel n + 1 023, qui est compris entre 1 et 2 046. Les
1 11111111111 00000000000000000000000
00000000000000000000000000000
deux entiers naturels 0 et 2 047 sont rservs pour des situations excep-
1 11111111111 11111111111111111111111 tionnelles (+, -, NaN, etc.). La mantisse m est un nombre binaire vir-
11111111111111111111111111111 gule compris entre 1 inclus et 2 exclu, comprenant 52 chiffres aprs la
Ce codage permet galement de reprsenter des virgule. Comme cette mantisse est comprise entre 1 et 2, elle a toujours un
valeurs infinitsimales qui, sans tre nulles, sont
seul chiffre avant la virgule et ce chiffre est toujours un 1 ; il est donc inu-
trop petites pour que lon puisse calculer avec
elles. tile de le reprsenter et on utilise les 52 bits pour reprsenter les 52 chiffres
aprs la virgule.

SAVOIR-FAIRE Trouver la reprsentation en base dix dun nombre


virgule donn en binaire
On identifie le signe, la mantisse et lexposant.

Exercice 7.37 (avec corrig)


Trouver le nombre virgule reprsent par le mot
1100010001101001001111000011100000000000000000000000000000000000

108 Groupe Eyrolles, 2012


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

7 Reprsenter des nombres entiers et virgule

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 :

m = 1.1001 0011 1100 0011 1000 0000 0000 0000 0000 0000 0000 0000 0000
= 1 + 1/2 + 1/24 + 1/27 + 1/28 + 1/29 + 1/210 + 1/215 + 1/216 + 1/217
= (217 + 216 + 213 + 210 + 29 + 28 + 27 + 22 + 2 + 1) / 217
= 206727/131072.

Le nombre reprsent est donc -206 727 / 131 072 271 = -3.724 1021.

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 ?

Groupe Eyrolles, 2012 109


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

Deuxime partie Informations

Exercice 7.45
On considre le programme suivant :

double x, y;
x = 1.0;
y = x + 1.0;
while (y - x == 1.0) {
x = x * 2.0;
y = x + 1.0;}

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 :

double a;
int n;
a = 0.0;
for (n = 1; n <= 10; n = n + 1) {
a = a + 0.1;
System.out.println(a);}

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.

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 ?

110 Groupe Eyrolles, 2012


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

Reprsenter
des caractres 8
et des textes

Les lettres ? Toutes des nombres !

Samuel Morse (1791 - 1872) est


Dans ce chapitre, nous voyons comment sont reprsents linventeur dun code, dans lequel
chaque lettre est exprime par une
les caractres et les textes de toutes les langues du monde. alternance de sons brefs symboliss
par . et longs , utilis pour
Nous expliquons pourquoi il existe plusieurs codes tels ASCII, tlgraphier des textes. La lettre a
y est exprime par les sons . , la
latin-1, latin-2, UTF-32, UTF-8. Nous prsentons ensuite
lettre b par les sons , etc.
les formats enrichis qui permettent de dcrire la forme Artiste peintre, Samuel Morse sest
des caractres et des textes, comme le font les logiciels intress aux tlcommunications
de traitement de texte. aprs quen 1825, un message lui
annonant que sa femme tait
Un exemple de format enrichi est le langage HTML. 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.

Groupe Eyrolles, 2012


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

Deuxime partie Informations

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

112 Groupe Eyrolles, 2012


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

8 Reprsenter des caractres et des textes

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.

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.

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.
Groupe Eyrolles, 2012 113
ManuelDowek.book Page 114 Monday, July 9, 2012 4:58 PM

Deuxime partie Informations

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.

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 :

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

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.

114 Groupe Eyrolles, 2012


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

8 Reprsenter des caractres et des textes

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 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 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

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.

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 , . ; ? !
! ?

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.

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

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 ?

Groupe Eyrolles, 2012 115


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

Deuxime partie Informations

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 :
Ma <i>premire</i> page <b>web</b>

saffiche dans un navigateur :

116 Groupe Eyrolles, 2012


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

8 Reprsenter des caractres et des textes

Ma premire page web


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

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

qui affiche dans un navigateur :

Pour les dtails sur le langage HTML, on pourra consulter la page


Hypertext MarkupLanguage de Wikipdia.

Groupe Eyrolles, 2012 117


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

Deuxime partie Informations

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

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 :
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</meta>

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.

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

Exercice 8.10 (avec corrig)


crire une page HTML qui prsente les diffrents projets informatiques des
lves dune classe.

118 Groupe Eyrolles, 2012


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

8 Reprsenter des caractres et des textes

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

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 ?

Il faut <i>comprendre/i> le codage des objets numriques pour les


matriser.

Exercice 8.14
Dans ce texte, vers quel site web pointe le lien ?

Votre compte bancaire prsente une anomalie. Cliquer <a href="http://grosse-arnaque.com">ici</a> pour avoir de l'aide.

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 :

On pourra consulter la page suivante.

Groupe Eyrolles, 2012 119


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

Deuxime partie Informations

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 ?

120 Groupe Eyrolles, 2012


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

Reprsenter
des images 9
et des sons

Pour dcrire une image, commence par comprendre


comment ton il la voit.
Claude Shannon (1916 - 2001), a
montr en 1949, en sappuyant sur
des travaux antrieurs de Harry
Cest encore avec des 0 et des 1 que lon reprsente les images Nyquist, que la frquence dchan-
et les sons, mais en grand nombre. tillonnage dun son, et plus gnrale-
ment dun signal, doit tre au moins
Pour dcrire une image, on peut utiliser une reprsentation le double de la frquence maximale
vectorielle en dcrivant des formes gomtriques : un cercle, contenue dans ce son, pour que le
son puisse tre restitu partir de
une droite, etc., ou une reprsentation bitmap en quadrillant lchantillon. Il a galement montr
limage et en dcrivant chaque case (pixel). Noir et blanc, comment dcrire les circuits lectro-
niveaux de gris ou couleurs sont dcrits par diffrents codages. niques par des fonctions boolennes
(voir le chapitre 13) et comment
Les sons aussi sont chantillonns en dcoupant le temps exprimer toutes les fonctions boo-
durant lequel le son est mis. lennes et arithmtiques laide des
fonctions boolennes lmentaires
Les images et les sons sont de trs longues suites de 0 et de 1, (voir le chapitre 10).
nous introduisons dans ce chapitre les units pour mesurer
la taille des fichiers.

Groupe Eyrolles, 2012


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

Deuxime partie Informations

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 :
0000000000001111110001100001100100000010010000001001000000100100000010
011000011000111111000000000000

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.

122 Groupe Eyrolles, 2012


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

9 Reprsenter des images et des sons

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, P1
# Mon premier fichier PBM : cercle
la hauteur de limage, en base 10, suivie dun retour la ligne ou dun 10 10
espace, 0000000000
0011111100
la liste des pixels, ligne par ligne, de haut en bas et de gauche droite
0110000110
les retours la ligne et les espaces sont ignors dans cette partie. 0100000010
0100000010
En outre, aucune ligne ne doit dpasser 70 caractres et toutes les lignes
0100000010
commenant par le caractre # sont des commentaires ignors (voir le 0100000010
chapitre 3). Ainsi, le code ci-contre est un fichier au format PBM. Bien 0110000110
entendu, le format PBM nest que lun des multiples formats de fichiers 0011111100
0000000000
dimages. Dautres exemples sont PGM, PPM, PNG, JPEG, GIF, PS,
PICT, TIFF, etc.

Groupe Eyrolles, 2012 123


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

Deuxime partie Informations

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.

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,

124 Groupe Eyrolles, 2012


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

9 Reprsenter des images et des sons

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,

Groupe Eyrolles, 2012 125


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

Deuxime partie Informations

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.
P3
# Mon premier fichier PPM : orange Par exemple, en mlangeant du rouge et du vert en quantits gales, on
100 100 obtient du jaune. En augmentant la quantit de rouge, par exemple
255
237 127 16
rouge = 237, vert = 127, bleu = 16, on obtient du orange. On peut alors
237 127 16 crire un fichier PPM qui reprsente un carr orange de 100 pixels sur
237 127 16 100 pixels, le triplet 237 127 16 devant tre rpt dix mille fois, puisque
237 127 16 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).

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 Exercice 9.3 (avec corrig)
10 10 Lequel des formats PBM, PGM et PPM est adapt pour reprsenter un carr
1111111111 noir de 10 pixels sur 10 pixels ?
1111111111 Mme question pour un carr rouge de mme taille.
1111111111 Comparer les tailles des fichiers obtenus.
1111111111
1111111111
1111111111 Pour un carr noir, le format PBM suffit, puisquil ny a ni niveaux de gris ni
1111111111 couleurs, et le fichier est le suivant (voir ci-contre ).
1111111111 Pour un carr rouge, il faut obligatoirement recourir au format PPM, seul
1111111111 capable de reprsenter de la couleur. Le rouge se reprsente par les trois
1111111111 nombres 255 0 0 : intensit maximale pour le rouge et nulle pour le vert
et le bleu. On obtient le fichier .

126 Groupe Eyrolles, 2012


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

9 Reprsenter des images et des sons

Le fichier reprsentant la seconde image est significativement plus gros


que celui reprsentant la premire, puisquil faut indiquer trois octets par
P3
pixel, au lieu dun bit dans le cas du fichier PBM.
# Un carr rouge
10 10
Exercice 9.4
255
crire les fichiers de lexercice 9.3 dans un diteur de texte et les ouvrir avec un 255 0 0
logiciel de traitement dimages, par exemple Gimp. Attention, certains dessins 255 0 0
sont petits, il peut tre ncessaire de zoomer pour bien les voir. 255 0 0

(100 lignes identiques)
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 ?

Depuis Georges Seurat et Paul Signac, la fin du XIXe sicle, Logo de DansTonChat.com en pixel art
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.

ALLER PLUS LOIN La synthse soustractive rouge, le vert et le bleu et qui ne reflte rien : une encre
noire, et non jaune. Cest pour cela quen synthse sous-
Les imprimantes galement simulent toutes les couleurs
tractive, on doit utiliser trois encres telles que :
en mlangeant trois types dencre. Pourtant ces trois
encres ne sont pas rouge, vert et bleu, mais cyan, La premire absorbe le rouge et reflte le vert et le
magenta et jaune. Cela est d au fait que, contraire- bleu : lencre cyan.
ment un cran qui met de la lumire, une feuille de La deuxime absorbe le vert et reflte le rouge et le
papier ne fait que recevoir de la lumire blanche (cest- bleu : lencre magenta.
-dire un mlange de lumires de toutes les couleurs), La troisime absorbe le bleu et reflte le rouge et le
absorber certaines couleurs et reflter les autres. Lencre vert : lencre jaune.
rouge, par exemple, absorbe le vert et le bleu et reflte Ce mme principe de synthse soustractive est celui
le rouge. De mme, lencre verte absorbe le rouge et le quemploient les peintres pour obtenir toutes les cou-
bleu et reflte le vert. Si on mlange de lencre rouge et leurs en mlangeant, sur leur palette, trois couleurs pri-
de lencre verte, on obtient une encre qui absorbe le maires.

Groupe Eyrolles, 2012 127


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

Deuxime partie Informations

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 :

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 XIIIe 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 On comprend quil est possible de reconstituer la sinusode dans le pre-
musicale existent aussi, comme le format MIDI mier cas, mais pas dans le second. De manire plus gnrale, on montre
(Musical Instrument Digital Interface) uti- que quand on chantillonne un son, il faut, pour que la reconstitution
lis pour reprsenter les sons produits par les ins-
soit possible, une frquence dchantillonnage au moins double de la fr-
truments de musique lectroniques.
quence la plus leve contenue dans ce son.

128 Groupe Eyrolles, 2012


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

9 Reprsenter des images et des sons

En gnral, on chantillonne les sons 44 000 Hz, car le son sinusodal le ALLER PLUS LOIN La notation musicale
plus aigu que notre oreille peut entendre est de 22 000 Hz environ, ce qui et la musique contemporaine
implique que notre oreille ne peut pas distinguer deux sons qui donnent le
La comparaison des diffrentes mthodes de
mme chantillon 44 000 Hz. Cette frquence est relativement leve ; reprsentation des sons permet de prendre cons-
cest pourquoi il faut plusieurs millions de bits pour reprsenter une minute cience de leurs spcificits. La notation musicale
de son et les fichiers audio sont souvent compresss (voir le chapitre 12). prsente lavantage, sur les formats RAW ou
MP3, de pouvoir tre lue par un musicien. En
Cette mthode de reprsentation dun son par chantillonnage est uti- revanche, elle ne permet pas de reprsenter tous
lise dans de nombreux formats. Les plus simples sont RAW, WAV et les sons. Il est par exemple impossible de repr-
BWF, mais il existe de nombreux autres formats plus sophistiqus : senter le bruit dune locomotive ou dune porte
qui grince en duo avec un flexaton. Si les musi-
MP3, WMA, AAC, etc. Comme pour les images, ces formats se distin-
ciens baroques ne pouvaient utiliser le bruit dune
guent les uns des autres par la manire dont le son est reprsent, par le locomotive, ou mme le barrissement dun l-
fait quil soit compress ou non, que le format soit public ou secret et phant, dans lune de leurs compositions, les
propritaire ou libre. 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.

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 (103), un
mga (M) un million (106), un giga (G) un milliard (109) et un tra (T)
mille milliards (1012). Ainsi, une image dun mgaoctet est forme de
huit millions de bits. On utilise cependant souvent des prfixes similaires ALLER PLUS LOIN Prfixes
qui expriment des nombres ronds, non en dcimal, mais en binaire : Pour distinguer ces prfixes des prfixes dci-
maux, certains ont propos dutiliser plutt les
un kilo (binaire) est 1 024 (210), prfixes kibi (Ki), mbi (Mi), gibi (Gi) et tbi (Ti).
un mga (binaire) 1 048 576 (220), Ainsi un mgaoctet (Mo) serait 1 000 000 octets
et un mbioctet (Mio) 1 048 576 octets. Ces pr-
un giga (binaire) 1 073 741 824 (230),
fixes sont malheureusement peu souvent utiliss.
un tra (binaire) 1 099 511 627 776 (240).

Groupe Eyrolles, 2012 129


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

Deuxime partie Informations

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.

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.

130 Groupe Eyrolles, 2012


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

9 Reprsenter des images et des sons

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 ?

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.

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 ?

Groupe Eyrolles, 2012 131


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

Les fonctions
boolennes
10

Pour un oui ou pour un non ? Oui ou non ?

Dans le Manoir de Bletchey Park,


Les fonctions boolennes sont utilises partout : dans les quartier gnral des services de ren-
seignement britanniques, Thomas
langages de programmation, en architecture des ordinateurs, Flowers (1905 - 1998) a construit
dans certains algorithmes cryptographiques pendant la seconde guerre mondiale
la machine Colossus, premier calcula-
Elles peuvent tre dcrites par des tables ou de manire teur lectronique utiliser le systme
symbolique et nous montrons comment passer dune binaire. Si cette machine ntait pas
reprsentation une autre. encore un ordinateur, elle a cass les
codes secrets (voir le chapitre 12) uti-
Nous nous concentrons dans ce chapitre sur les fonctions non, liss par larme allemande et a t
ou et et qui permettent dexprimer toutes les autres. un lment essentiel dans la victoire
allie. Plusieurs milliers de personnes
ont travaill Bletchey Park, en parti-
culier Alan Turing.

Groupe Eyrolles, 2012


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

Deuxime partie Informations

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.

x
non(x)
non(x) Les fonctions non, et, ou
0 1
Les fonctions non, et et ou sont dfinies par les tables ci-contre.
1 0
Le nom de ces fonctions vient de la convention de lire 0 comme faux
et 1 comme vrai .
et(x,y) ou(x,y)
Ainsi, la fonction non transforme faux en vrai et vrai en faux : le boo-
x y et(x,y) x y ou(x,y)
len non(x) est donc gal 1 si et seulement si x nest pas gal 1.
0 0 0 0 0 0
De mme, le boolen x et y est gal 1 si et seulement si x est gal 1
0 1 0 0 1 1 et y est gal 1.
1 0 0 1 0 1 Le boolen x ou y est gal 1 si et seulement si au moins x ou y est
1 1 1 1 1 1 gal 1.
On remarquera que, quand x et y sont tous les deux gaux 1, x ou y est
T Notation
gal 1. Ce ou est donc inclusif ; cest le ou qui apparat dans la phrase
De mme que lon crit x + y le nombre que lon Je viendrai sil y a un bus ou un mtro. et non le ou exclusif qui appa-
devrait, en toute rigueur, crire +(x,y), on crit rat dans la phrase Tu dois choisir : aller la mer ou aller la
souvent x et y le boolen que lon devrait crire
et(x,y).
montagne. Pour le distinguer du prcdent, ce ou exclusif sera not oux.

134 Groupe Eyrolles, 2012


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

10 Les fonctions boolennes

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 mux(x,y,z)
dans {0,1} est telle que si x vaut 0, alors mux(x,y,z) vaut y et si x vaut 1, x y z mux(x,y,z)
alors mux(x,y,z) vaut z. Elle est dfinie par la table ci-contre. Elle
0 0 0 0
sexprime avec les fonctions non, et et ou, par lexpression symbolique
0 0 1 0
mux(x,y,z) = (non(x) et y) ou (x et z).
0 1 0 1
Pour le montrer, on calcule ligne ligne la table de la fonction qui x, y
0 1 1 1
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 1 0 0 0
est celle de la fonction mux : 1 0 1 1
1 1 0 0
x y z non(x) non(x) et y x et z (non(x) et y) ou (x et z)
1 1 1 1
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

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), x h (x ) x k(x) x i (x )
la fonction constante gale 1 () exprime par k(x) = x ou non(x), 0 0 0 1 0 0
l identit () exprime par i(x) = x, sans utiliser aucune fonction, 1 0 1 1 1 1
et la fonction non,
qui peuvent donc toutes les quatre tre exprimes avec des fonctions non,
et et ou.
Groupe Eyrolles, 2012 135
ManuelDowek.book Page 136 Monday, July 9, 2012 4:58 PM

Deuxime partie Informations

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 :
g(x1, , xn) = f(x1,, xn,0)
g(x1,, xn) = f(x1,, xn,1)

et on remarque que la fonction f peut sexprimer de manire symbolique


avec les fonctions g, g et mux :
f(x1,, xn, xn+1) = mux(xn+1, g(x1,, xn), g(x1,, xn))

car, quand xn+1 vaut 0, le membre de gauche et le membre de droite sont


tous les deux gaux g(x1,, xn) et, quand xn+1 vaut 1, les deux mem-
bres sont gaux g(x1,, xn).
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.

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(x1, , xn) = f(x1,, xn,0)
g(x1,, xn) = f(x1,, xn,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.

136 Groupe Eyrolles, 2012


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

10 Les fonctions boolennes

Exercice 10.1 (avec corrig)


x y x oux y
Trouver une expression symbolique exprimant une fonction ou exclusif (oux)
dfinie par la table ci-contre. 0 0 0
0 1 1
Le boolen x oux y est gal 1 si et seulement si x est gal 1 ou y est gal 1 0 1
1, mais pas les deux.
1 1 0
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)) x g(x) x g'(x)
0 0 0 1
Exercice 10.2
1 1 1 0
Trouver lexpression symbolique de la fonction de si et seulement si dfinie
par la table ci-contre.
x y x ssi y
0 0 1
0 1 0

Lexpression des fonctions 1


1
0
1
0
1

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))
x 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 0 0 0
fonction et. 0 1 0
1 0 0
Exercice 10.3
1 1 1
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.

Groupe Eyrolles, 2012 137


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

Deuxime partie Informations

Exercice 10.4
La fonction de Sheffer exprime lincompatibilit de deux valeurs boolennes.
x y S (x,y) Elle est dfinie par la table ci-contre.
0 0 1 Montrer que S(x, y) = non(x et y).
0 1 1 Montrer, rciproquement, que non(x) = S(x,x) et x ou y = S(S(x,x),S(y,y)). En
1 0 1 dduire que toutes les fonctions boolennes peuvent sexprimer avec la fonc-
tion de Sheffer uniquement.
1 1 0
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.

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 ?

138 Groupe Eyrolles, 2012


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

Structurer
linformation
11
C HAPITRE AVANC

Comment trouver son chemin dans une jungle


dinformations ?
En 1989, Tim Berners-Lee (1955 ) a
propos un outil aux nombreux cher-
cheurs de lOrganisation euro-
Dans ce chapitre, nous voyons comment les informations penne pour la recherche nuclaire
seffacent, se conservent, sorganisent, selon les usages que (CERN) pour partager de grandes
quantits dinformations : insrer
nous voulons en faire, de la notion de fichier en arborescence dans des textes des liens vers dautres
et de liens celle de base de donnes. textes, situs sur dautres ordinateurs,
auxquels on accde travers le
Nous insistons ici sur la notion de persistance des donnes rseau Internet. Cette toile darai-
avec le danger de lhypermnsie et discutons les enjeux autour gne de liens a vite trouv un nom :
de la gratuit de la copie ou diffusion de linformation. le Web. Tim Berners Lee est lauteur
du langage HTML et du premier
navigateur : Nexus.

Groupe Eyrolles, 2012


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

Deuxime partie Informations

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 :

a Alice 060606060606 3 On ajoute un numro.


Contact ajout
a Bob 0606060607 3 On ajoute un autre numro.
Contact ajout
i Alice 3 On interroge le rpertoire.
60606060606
q 3 On quitte le programme.

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.

140 Groupe Eyrolles, 2012


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

11 Structurer linformation

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 240 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 :
010010100110010100100000011100000110010101101110011100110110010
100101100001000000110010001101111011011100110001100100000011010
1001100101001000000111001101110101011010010111001100101110

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 :
Alice
0606060606
Bob
0606060607

Groupe Eyrolles, 2012 141


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

Deuxime partie Informations

Charles
0606060608
Djamel
0606060609
tienne
0606060610
Frdrique
0606060611
Guillaume
0606060612
Hector
0606060613
Isabelle
0606060614
Jrme
0606060615

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

142 Groupe Eyrolles, 2012


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

11 Structurer linformation

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.
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");}

On peut alors utiliser ce programme comme celui du chapitre 3 :


Hector
0606060613

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.

Groupe Eyrolles, 2012 143


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

Deuxime partie Informations

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.

ls
Isn.java joconde.ppm Repertoire.java repertoire.txt Vinci.java

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

144 Groupe Eyrolles, 2012


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

11 Structurer linformation

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.

Groupe Eyrolles, 2012 145


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

Deuxime partie Informations

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.

146 Groupe Eyrolles, 2012


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

11 Structurer linformation

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

visualise dans un navigateur, apparat de la manire suivante :

Le programme Repertoire.java permet de rechercher un nom dans un


rpertoire, exprim sous forme dun fichier texte, comme le fichier
repertoire.txt.

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 EN SAVOIR PLUS Structure darbre
donc possible daccder un fichier sans savoir prcisment o il se et structure de graphe
trouve dans larborescence, simplement en cliquant sur un lien. Cette mthode permet aussi de dpasser facile-
ment les limites dun disque unique et de rf-
Cette remarque mne une autre manire dorganiser les fichiers sur un
rencer des fichiers qui se trouvent ailleurs sur le
disque, o la place du fichier dans larborescence est moins importante que rseau. En outre, dans une structure arbores-
la manire dy accder en cliquant sur un lien qui apparat dans une page. cente, si le dossier B est un lment du
Par exemple, au lieu de classer ses photos dans plusieurs dossiers, Anniver- dossier A, le dossier A ne peut pas son tour
tre un lment du dossier B. En revanche, avec
saire, Londres, etc. on laisse ses photos en vrac dans un dossier et on cre
des liens hypertextes, rien nempche une
une page web pour accder ses photos danniversaire, une autre pour page A de contenir un lien vers une page B, qui
accder aux photos de son voyage Londres, etc. et une page web qui contient elle-mme un lien vers la page A.
permet daccder chacune de ces pages. Cette ide est la base du Web, une structure darbre se substitue donc une
des logiciels de gestion de photos ou de fichiers son et des rseaux sociaux. structure de graphe (voir le chapitre 22).

Groupe Eyrolles, 2012 147


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

Deuxime partie Informations

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
240 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-
SUJET DEXPOS Loi du 6 janvier 1978
tre personnel ne peuvent tre conserves sous une forme permettant
Rechercher le texte de la loi du 6 janvier 1978 lidentification des personnes concernes au-del de la dure ncessaire
afin den prsenter les ides principales.
aux finalits pour lesquelles elles ont t collectes.

148 Groupe Eyrolles, 2012


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

11 Structurer linformation

Alors que, dans les derniers millnaires, lhumanit a beaucoup cherch SUJET DEXPOS La CNIL
laisser des traces de ses actions, elle commence juste prendre conscience
Prsenter la Commission nationale de linforma-
de limportance quil y a aussi parfois effacer certaines de ces traces. tique et des liberts.
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 XXe 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,

Groupe Eyrolles, 2012 149


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

Deuxime partie Informations

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.

150 Groupe Eyrolles, 2012


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

11 Structurer linformation

ALLER PLUS LOIN Les bases de donnes


Pour grer de grandes quantits de donnes, par et une autre qui indique la famille de chaque instrument
exemple lensemble des rservations de billets de train F = {(instrument = violon ; famille = cordes),
ou davion que doit grer une compagnie ferroviaire ou (instrument = hautbois ; famille = bois),
arienne, il nest pas possible dutiliser une simple struc- (instrument = clarinette ; famille = bois),
ture arborescente ou base de liens hypertextes. On (instrument = xylophone ; famille = percussions), }
doit utiliser des outils plus sophistiqus : un systme de Lensemble de ces trois relations constitue une base de
gestion de bases de donnes et un langage de manipula- donnes.
tion de donnes, comme le langage SQL. Un systme de gestion de bases de donnes est un systme
Le rpertoire que nous avons construit ci-avant peut qui permet de crer de telles relations, dajouter ou de
tre dfini comme un ensemble fini de couples forms retirer des n-uplets dans une relation et de rechercher
dun nom et dun numro de tlphone des n-uplets. Pour cela, on formule des requtes dans un
R = {(nom = Alice ; tel = 0606060606), langage de gestion de donnes.
(nom = Bob ; tel = 0606060607), Par exemple, on peut formuler la requte de chercher
(nom = Charles ; tel = 0606060608), les instruments dont joue Hector, en cherchant les cou-
(nom = Djamel ; tel = 0606060609), ples de la relation I dont la composante nom est Hector :
(nom = tienne ; tel = 0606060610), (nom = Hector ; instrument = basson)
(nom = Frdrique ; tel = 0606060611), (nom = Hector ; instrument = contrebasson)
(nom = Guillaume ; tel = 0606060612),
On peut de mme chercher les joueurs de basson, en cher-
(nom = Hector ; tel = 0606060613),
chant les couples de la relation I dont la composante ins-
(nom = Isabelle ; tel = 0606060614),
(nom = Jrme ; tel = 0606060615)}
trument est basson. On trouvera alors deux couples
(nom = Guillaume ; instrument = basson)
Un tel ensemble de couples, de triplets ou, plus gnra-
(nom = Hector ; instrument = basson)
lement, de n-uplets, sappelle une relation et un
ensemble de relations sappelle une base de donnes. On peut aussi fabriquer, partir des relations R et I, une
Par exemple, si Alice, Bob, Charles, Djamel, tienne, Frd- nouvelle relation qui est un ensemble de triplets forms
rique, Guillaume, Hector, Isabelle et Jrme sont des musi- dun nom, dun numro de tlphone et dun instru-
ciens, outre la relation ci-avant qui indique le numro de ment. On appelle cela la jointure des relations R et I et il
tlphone de chacun, on peut dfinir une autre relation est possible de chercher dedans comme dans les rela-
qui indique les instruments dont chacun joue. tions simples ; par exemple, on peut chercher ceux des
triplets de cette jointure dont la composante instrument
I = {(nom = Alice ; instrument = alto),
(nom = Bob ; instrument = contrebasse), est basson. On obtiendra ainsi deux triplets
(nom = Charles ; instrument = cor), (nom = Guillaume ; tel = 0606060612 ; instrument = basson)
(nom = Charles ; instrument = trompette), (nom = Hector ; tel = 0606060613 ; instrument = basson)
(nom = Djamel ; instrument = piano), ce qui est linformation dont on a besoin quand on
(nom = tienne ; instrument = xylophone), cherche remplacer un bassoniste.
(nom = Frdrique ; instrument = harpe), Quand on utilise un systme de gestion de bases de don-
(nom = Guillaume ; instrument = basson), nes, on exprime donc, dans un langage de haut niveau,
(nom = Hector ; instrument = basson), des requtes dont lexcution consulte et modifie des
(nom = Hector ; instrument = contrebasson),
fichiers. Toutefois, il nest plus ncessaire de connatre la
(nom = Isabelle ; instrument = hautbois),
forme exacte de ces fichiers, car on ny accde plus que par
(nom = Isabelle ; instrument = clarinette),
(nom = Jrme ; instrument = violon)} lintermdiaire du systme de gestion de bases de donnes.

Groupe Eyrolles, 2012 151


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

Deuxime partie Informations

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 ?

152 Groupe Eyrolles, 2012


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

Compresser,
corriger, 12
chiffrer
C HAPITRE AVANC

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. Ronald Rivest (1947-), Adi Shamir
(1952-) et Len Adleman (1945-) ont
Pour dtecter et corriger les erreurs, nous expliquons comment conu, en 1978, une mthode de chif-
utiliser la redondance dinformations et exploiter des bits de frement, la mthode RSA, fonde sur
contrle de cohrence. Pour le chiffrement, nous expliquons lutilisation de deux cls : une cl
les mthodes cl et introduisons la notion de cl publique cl prive et une cl publique. La
mthode la plus rapide connue ce
prive. 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.

Groupe Eyrolles, 2012


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

Deuxime partie Informations

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
T Compresser des informations La phrase je pense, donc je suis. peut se reprsenter en ASCII par la
On appelle compresser des informations le fait suite 106, 101, 32, 112, 101, 110, 115, 101, 44, 32, 100, 111, 110, 99,
de les exprimer sous la forme dune suite de bits, 32, 106, 101, 32, 115, 117, 105, 115, 46 (voir le chapitre 8). Chacun de
avec un code choisi pour rendre cette suite aussi ces nombres est exprim sur 8 bits. Il faut donc 23 8 = 184 bits pour
courte que possible. 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.
ALLER PLUS LOIN Cette ide est la base des mthodes de compression par dictionnaire. Un
Joindre le dictionnaire au message dictionnaire est une fonction qui associe des suites de bits non pas des
Un dictionnaire tant construit sur mesure pour symboles isols, mais des suites de symboles. La suite de bits associe
chaque message, il faut ladjoindre au message par un dictionnaire une suite de symboles est appele sa rfrence. Rem-
pour rendre la lecture de ce dernier possible. Ce placer, dans un texte, chaque suite de symboles par sa rfrence exprime
cot est cependant vite amorti quand le mes-
sage est long.
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

154 Groupe Eyrolles, 2012


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

12 Compresser, corriger, chiffrer

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

Groupe Eyrolles, 2012 155


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

Deuxime partie Informations

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.

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.

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.

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

156 Groupe Eyrolles, 2012


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

12 Compresser, corriger, chiffrer

gzip a.txt
gzip alea.txt

ls -l a.txt.gz
36
ls -l alea.txt.gz
652

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

Groupe Eyrolles, 2012 157


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

Deuxime partie Informations

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.

158 Groupe Eyrolles, 2012


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

12 Compresser, corriger, chiffrer

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 T Code correcteur derreurs

code permet donc de dtecter et corriger toutes les erreurs, condition On appelle code correcteur derreurs un code
quil y ait au plus une erreur par triplet. En revanche, si plusieurs erreurs qui permet de retrouver les informations codes
mme en cas derreurs de transmission, de lecture
sont commises sur le mme triplet, elles peuvent passer inaperues ou tre
ou dcriture.
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 ALLER PLUS LOIN Longueur des suites
tous les 100 bits transmis, indiquant si le nombre de 1 dans ce paquet de
Plutt que des suites de 100 bits, on peut
100 bits est pair (0) ou impair (1). La longueur des messages est ainsi prendre des suites de 10 bits ou de 1 000 bits.
augmente de 1 % seulement. Si une erreur se produit lors de la trans- Plus la suite est longue, plus la mthode est co-
mission des 101 bits, cest--dire si un 0 est remplac par un 1, ou un 1 nome, mais plus la probabilit de voir deux
par un 0, la parit du nombre de 1 est change et lerreur est dtecte. erreurs se produire dans la mme suite, et donc
passer inaperues, est leve.
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.

Groupe Eyrolles, 2012 159


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

Deuxime partie Informations

Exercice 12.7
On utilise la mthode dcrite prcdemment pour transmettre 16 bits. Par
exemple, pour transmettre le message 0011010111010111 on construit le
tableau :

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

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 ?

T Sret et scurit Chiffrer


Dans la section prcdente, nous avons prsent
des mthodes qui permettent de protger les infor- Une mthode pour protger les informations contre les actions dune
mations contre des erreurs accidentelles. Cela personne malveillante qui veut y accder alors quelles ne lui sont pas
sappelle augmenter la sret des informa- destines consiste les chiffrer.
tions, cest--dire la protger des erreurs involon-
taires, telles les erreurs de transmission. Cette ide de chiffrement est ancienne puisquon sait que Jules Csar
linverse, on cherche dans cette section aug- avait dj mis au point un algorithme pour transmettre des ordres ses
menter la scurit des informations, cest--
armes de manire secrte. Pour cela, il utilisait le code de Csar, qui con-
dire la protger contre laction de personnes
malveillantes. 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.
T Chiffrer
Cette mthode nest en fait pas trs bonne. Dune part, une fois quon la
On appelle chiffrer des informations le fait de les connat, on peut dchiffrer tous les messages trs simplement. Dautre
exprimer sous la forme dune suite de bits, avec un
part, mme si on ne connat pas la correspondance entre les lettres, celle-
code choisi pour rendre cette suite aussi inintelli-
gible que possible, sauf pour son destinataire. 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-

160 Groupe Eyrolles, 2012


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

12 Compresser, corriger, chiffrer

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

Groupe Eyrolles, 2012 161


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

Deuxime partie Informations

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 :

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

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, (we % 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 = we % n, puis envoie ce message chiffr w
au destinataire, qui le dchiffre en calculant w d % n, qui est donc gal
(we % 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 we % 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.

162 Groupe Eyrolles, 2012


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

12 Compresser, corriger, chiffrer

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 ALLER PLUS LOIN Authentifier
Pour construire une cl RSA, il suffit de choisir deux Les mthodes cl publique cl prive permettent
nombres premiers et distincts p et q, par exemple aussi une autorit dauthentifier un utilisateur, cest--
p = 3017642249 et q = 6644055791. On choisit ensuite un dire de vrifier son identit. Pour cela, il lui suffit de
nombre d premier avec (p - 1) (q - 1), par exemple dtenir la cl publique de la personne authentifier et
d = 2596516757 et un nombre e tel que (e d) % ((p - de vrifier quelle dtient bien sa cl prive en lui fai-
1) (q - 1)) = 1, par exemple e = 35661169403325998333. sant dcoder un message.
On pose ensuite n = pq, dans cet exemple
n = 20049383459634713959. La cl prive est forme des Lutilisateur : Lautorit :
nombres, d, e et n et la cl publique des nombres e et n dtient la cl prive ; dtient la cl publique ;
uniquement. demande tre
On dmontre alors que pour tout entier w infrieur n, authentifi ;
(we % n)d % n = w. Pour cela, on montre que wed w est
un multiple de p, en utilisant le petit thorme de fabrique un message ;
Fermat : si p est un nombre premier et w un nombre qui chiffre ce message
nest pas un multiple de p alors wp-1 % p = 1. La avec la cl publique ;
dmonstration ne demande que quelques lignes. On
envoie le message ;
montre de mme que wed w est un multiple de q.
Comme p et q sont deux nombres premiers et diffrents, dchiffre le message
wed w est un multiple de n = pq. Donc wed % n = w, avec la cl prive ;
cest--dire (we % n)d % n = w. envoie le message vrifie si le message de test
La mthode connue la plus rapide pour dchiffrer un de test dcod ; a t dchiffr.
message, quand on ne connat pas la cl prive, consiste
la dduire de la cl publique en factorisant le On voit donc ici que seul un utilisateur qui dtient la cl
nombre n en un produit de deux nombres premiers, on prive peut dchiffrer le message de test, ce qui garantit
obtient ainsi p et q, donc (p - 1) (q - 1), puis en connais- lauthentification, si on fait lhypothse que la cl
sant (p - 1) (q - 1) et e, on peut retrouver d. Toutefois, publique utilise est bien celle de lutilisateur, et non
factoriser un nombre de quelques milliers de chiffres celle dun imposteur.
binaires demande plusieurs annes de calcul.

Groupe Eyrolles, 2012 163


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

Deuxime partie Informations

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 x2 + 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 ?

164 Groupe Eyrolles, 2012


ManuelDowek.book Page 165 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 166 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 167 Monday, July 9, 2012 4:58 PM

Les portes
boolennes
13

Au commencement tait le transistor,


puis nous crmes les portes boolennes
et, la fin de la journe, les ordinateurs. 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-
Dans ce chapitre, nous voyons de quoi sont faits les ordinateurs nateur squentiel contenant un
lchelle microscopique. Nous partons du transistor et unique processeur en des pro-
construisons successivement des circuits non et ou qui vont grammes destins tre utiliss sur
un ordinateur parallle contenant
nous permettre ensuite de construire les circuits de toutes les plusieurs processeurs. Elle est aussi
fonctions boolennes, comme nous lavons vu au chapitre 10. 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.

Groupe Eyrolles, 2012


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

Troisime partie Machines

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 XXe 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
ALLER PLUS LOIN Comme beaucoup de systmes complexes, un ordinateur peut se dcrire
Les circuits CMOS de nombreuses chelles. lchelle la plus petite, un ordinateur est un
Dans ce livre nous utilisons un seul type de tran-
assemblage de transistors. Un transistor est un circuit lectronique trois
sistors appels N-Mos. On construit aujourd'hui fils appels le drain, la source et la grille. La rsistance entre le drain et la
plus souvent des circuits qui utilisent deux types source est ou bien trs petite ou bien trs grande en fonction de la ten-
de transistors N-Mos et P-Mos, afin de mini- sion applique entre la grille et la source. Quand cette tension est inf-
miser la consommation d'lectricit et la pro-
duction de chaleur.
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.

168 Groupe Eyrolles, 2012


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

13 Les portes boolennes

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. A B D
0 0 0
La table de ce circuit est donc la suivante (voir ci-contre) o lon recon-
nat la table de la fonction ou. 0 1 1
1 0 1
On peut schmatiser ces circuits de manire plus succincte en rempla-
ant le morceau de dessin reprsentant le transistor et la rsistance enca- 1 1 1
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 ().

Groupe Eyrolles, 2012 169


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

Troisime partie Machines

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 .

170 Groupe Eyrolles, 2012


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

13 Les portes boolennes

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 A B C
point C est dans ltat 0. Sinon le point C est dans ltat 1. 0 0 1
La table de ce circuit est donc la suivante (voir ci-contre). 0 1 0
Il sagit de la table de la fonction boolenne qui A et B associe non (A ou B). 1 0 0
1 1 0
Exercice 13.2 (avec corrig)
Quelle est la table du circuit suivant ? Est-ce la table dune fonction boolenne
connue ?

Groupe Eyrolles, 2012 171


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

Troisime partie Machines

La table de ce circuit est :

A B C
0 0 0
0 1 0
1 0 0
1 1 1

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 :

172 Groupe Eyrolles, 2012


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

13 Les portes boolennes

Exercice 13.5 (avec corrig)


Construire le circuit ralisant le calcul de la fonction Cout dfinie par la table :

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

Quelle est cette fonction ?


g (A, B) g (A, B)
On utilise la mthode de dcomposition par multiplexage (voir le chapitre 10).
A B g A B g'
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 : 0 0 0 0 0 0
On reconnat les tables des fonctions et et ou, respectivement. Si bien que 0 1 0 0 1 1
Cout (A, B , Cin) = mux (Cin, A et B, A ou B).
1 0 0 1 0 1
Un circuit calculant cette fonction est donc :
1 1 1 1 1 1

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.

Groupe Eyrolles, 2012 173


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

Troisime partie Machines

Exercice 13.7
Construire un circuit 9 entres A0 A7 et D et 8 sorties B0 B7 telles que :
lorsque D = 0, Bi = Ai pour i compris entre 0 et 7,
lorsque D = 1, Bi = Ai-1 pour i compris entre 1 et 7 et B0 = 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, A7, est oubli afin de
faire tenir le rsultat sur huit bits.

Exercice 13.8
Construire un circuit 11 entres A0 A7 et D0 D2 et 8 sorties B0 B7
telles que Bi = Ai-d pour i entre d et 7 et Bi = 0 pour i entre 0 et (d - 1), o d est
le nombre entre 0 et 7 reprsent en binaire par D0 D2. Ce circuit ralise un
dcalage gauche de d bits dun nombre binaire de huit bits, ce qui corres-
pond la multiplication par 2d. 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 2d.

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 qui, in fine, utilise quatre transistors, trois pour la porte
dassemblages de portes boolennes. Comme chaque ou et un pour la porte non. Si, en revanche, on sait aussi
porte est constitue de plusieurs composants lectroni- comment ces portes sont construites avec des transis-
ques, cette description sous la forme dun assemblage tors, on peut remarquer que le circuit
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 qui ne comporte que deux transistors, convient. Rai-
on veut construire un circuit qui ralise lopration boo- sonner une petite chelle permet donc dconomiser
lenne qui A et B associe non (A ou B) et si lon sait uni- deux transistors. Il est souvent utile, quand on raisonne
quement associer des portes boolennes, on construira une chelle donne, de faire une incursion lchelle
le circuit suivant infrieure ou lchelle suprieure.

174 Groupe Eyrolles, 2012


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

13 Les portes boolennes

Cela dit, il y a aussi des avantages construire des cir- De plus, il est illusoire desprer penser simultanment
cuits avec des portes boolennes en ignorant, ou en fei- un systme aussi complexe quun ordinateur toutes les
gnant dignorer, les chelles infrieures. Par exemple, les chelles. Sil est donc, bien entendu, utile davoir une
portes boolennes sont aujourdhui fabriques avec des culture gnrale qui donne une ide de la manire dont
transistors, mais par le pass, elles ont t fabriques un ordinateur se dcrit toutes les chelles, il est aussi
avec dautres composants : des relais, des tubes vide, souvent ncessaire de savoir penser une chelle
etc. et il est possible que, dans le futur, elles soient rali- unique, en ignorant, ou en feignant dignorer, la
ses avec dautres composants, aujourdhui non encore manire dont les composants que lon assemble sont
invents. Raisonner lchelle des portes boolennes, fabriqus. Ainsi, aux chapitres 14 et 15, on construira
sans prendre en compte la manire dont elles sont fabri- des circuits de plus en plus labors en rutilisant les cir-
ques, permet de conserver la mme organisation des cuits prcdents comme de nouveaux composants.
circuits lchelle des portes, mme quand la manire
dont ces portes sont fabriques change.

ALLER PLUS LOIN Qui a invent lordinateur ?


Contrairement la pnicilline, il est trs difficile de dire machine lectronique utiliser le binaire semble avoir
qui a invent lordinateur. t la machine Colossus, construite par Thomas Flowers
Sans remonter aux machines calculer du XVIIe sicle de au cours de la seconde guerre mondiale, mais cette
Wilhelm Schickard, Blaise Pascal, Gottfried Wilhelm machine ntait pas universelle. La premire machine
Leibniz, etc., ou la machine analytique imagine au conue pour tre universelle fut sans doute lENIAC,
XIXe sicle par Charles Babbage, lapparition de lordi- construite en 1946 par John Mauchly, Presper Eckert et
nateur a t prpare par une grande crativit dans le John Von Neumann. Pour certains nanmoins, ce ntait
domaine de la construction de machines la fin du pas encore un ordinateur, son programme ntant pas
XIXe sicle et au dbut du XXe sicle, avec, par exemple, enregistr dans la mmoire. La premire machine pro-
la machine recensement de Herman Hollerith cons- gramme enregistr a sans doute t la machine Baby,
truite en 1889 ou lanalyseur diffrentiel de Harold construite Manchester en 1948 par Frederic Williams,
Locke Hazen et Vannevar Bush construit entre 1928 et Tom Kilburn et Geoff Tootill.
1931, qui taient dj des machines polyvalentes. Il semble donc difficile dattribuer linvention de lordi-
La notion duniversalit a t dfinie mathmatique- nateur un inventeur unique. Il y a plutt eu un foison-
ment en 1936 par Alonzo Church et Alan Turing et il nement dinnovations de la fin des annes trente au
semble que la premire machine universelle ait t le dbut des annes cinquante qui, chacune sa manire,
Z3, construite en 1941 par Konrad Zuse, mme si on ne ont contribu linvention de lordinateur.
sen est rendu compte qua posteriori. La premire

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 ?

Groupe Eyrolles, 2012 175


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

Le temps
et la mmoire
14

Le temps est ce qui permet dviter de tout faire


en mme temps.
Otto Schmitt (1913-1998) est un
pionnier du gnie biomdical. En
1934, en tudiant la propagation de
Dans ce chapitre, nous voyons comment les circuits linflux nerveux dans les nerfs des cal-
lectroniques prennent le temps en compte. Nous voyons mars, il a compris quun circuit en
boucle ferme positive cest--dire
dabord comment fabriquer un circuit mmoire. Puis, dans lequel la sortie est connecte
comment un circuit particulier, lhorloge, permet lentre, sans inversion de valeur
de synchroniser tous les autres. 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.

Groupe Eyrolles, 2012


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

Troisime partie Machines

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.

178 Groupe Eyrolles, 2012


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

14 Le temps et la mmoire

ALLER PLUS LOIN La rupture de symtrie


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

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

Groupe Eyrolles, 2012 179


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

Troisime partie Machines

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 :

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

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,

180 Groupe Eyrolles, 2012


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

14 Le temps et la mmoire

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 :

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

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.

Verrou D

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 V1 lentre V du premier, A2 la sortie
du deuxime, etc.
On dfinit un circuit squentiel appel bascule D en reliant la sortie A1 dun
premier verrou D avec lentre V2 dun second verrou D, et en reliant
lentre S1 du premier une porte non dont la sortie est raccorde
lentre S2 du second.
Si lon considre ce circuit dans son intgralit, ses entres sont donc lentre V1
du premier verrou D et une entre S unique qui alimente la fois S1 directe-
ment et S2 via la porte non. Sa sortie est la sortie A2 du second verrou D. Bascule 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.

Groupe Eyrolles, 2012 181


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

Troisime partie Machines

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 V1
dune premire bascule D, la sortie A1 de cette bascule tant elle-mme relie
lentre A de ladditionneur. On relie galement la sortie C de ladditionneur
lentre V2 dune deuxime bascule D. Enfin, on relie ensemble les entres S1
et S2 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

182 Groupe Eyrolles, 2012


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

14 Le temps et la mmoire

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 T Frquence dhorloge
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 La frquence dhorloge, qui est souvent indi-
entres S de ces 25 verrous sont relies une horloge unique. que dans les caractristiques techniques des ordi-
nateurs, est le nombre de cycles par seconde. Par
tablir un lien entre la frquence de lhorloge et le temps de propagation des
exemple, quand la frquence dhorloge est 1 GHz,
signaux lectriques portant les retenues des 8 additionneurs un bit composant
la priode de lhorloge, cest--dire la longueur
ladditionneur 8 bits.
dun cycle, est de 1 nanoseconde, un milliardime
Estimer le temps de propagation maximal par porte boolenne, suppos cons- de seconde.
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.

Groupe Eyrolles, 2012 183


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

Troisime partie Machines

ALLER PLUS LOIN La rversibilit


Le fonctionnement dun circuit squentiel est ratures diffrentes est donc un phnomne dit irrver-
dynamique : il se dcrit dans le temps. Comme chaque sible. Non seulement il est impossible de rejouer le film
fois que lon observe un phnomne dynamique, on en arrire et dobtenir les deux litres de gaz aux temp-
peut sinterroger sur sa rversibilit. ratures T1 et T2, mais il est de plus impossible de dfinir
Par exemple, si on connat la position x et la vitesse v, un ce que ces tempratures T1 et T2 doivent tre, puisquil y
instant t, dun point en mouvement rectiligne uniforme, a plusieurs solutions lquation 2 T1 T2 / (T1 + T2) = T.
on peut prdire sa position et sa vitesse un instant t du Les volutions des tats des circuits vues dans ce chapitre
futur : sa position sera x = x + v (t - t) et sa vitesse sera sont des volutions irrversibles, comme le mlange de
v = v. Rciproquement, si on connat sa position x et la deux volumes de gaz de tempratures diffrentes. Si
vitesse v linstant t, on peut aussi rtro-prdire sa lentre V dun circuit mmoire est 0, au moment o lon
position et sa vitesse un instant t du pass : sa position met son entre S 1, ce circuit enregistre la valeur 0. La
tait x = x - v (t - t) et sa vitesse tait v = v. La variation valeur prcdemment mmorise est irrmdiablement
de position et de vitesse dun point en mouvement recti- dtruite. Il est donc impossible de rejouer le film lenvers
ligne uniforme est un phnomne dit rversible. pour retrouver ltat initial du circuit, car les deux tats
En revanche, quand on mlange un litre de gaz la initiaux possibles mnent au mme tat final.
temprature T1 avec un litre de gaz la temprature T2, La physique statistique et la thorie de linformation per-
on obtient deux litres de gaz la temprature mettent de mesurer le degr dirrversibilit de ces deux
T = 2 T1 T2 / (T1 + T2). Si on connat les tempratures T1 phnomnes : la croissance de lentropie, ou la perte
et T2, on peut donc prdire la temprature T. En dinformation, lors de la destruction dun bit dinforma-
revanche, si on connat la temprature T, il est impos- tion est de 9,5 1024 J/K et celle lors du mlange dun litre
sible de rtro-prdire les tempratures T1 et T2 : deux dun gaz parfait monoatomique 105 Pa et 290 K avec un
litres de gaz 300 K peuvent avoir t obtenus en litre de ce mme gaz cette mme pression et 310.7 K est
mlangeant un litre 290 K et un litre 310.7 K, mais il de 9,9 104 J/K, soit en comptant cette perte dinforma-
peuvent aussi avoir t obtenus en mlangeant un litre tion, non en J/K, mais en bits, 1020 bits.
280 K et un litre 323 K. Mlanger des gaz de temp-

ALLER PLUS LOIN Transformation dnergie et production de chaleur


Un processeur consomme de llectricit et la trans- beaucoup augment pour arriver, en 2007, environ 1 %
forme essentiellement en chaleur. Llectricit con- de la production mondiale dlectricit. Cette estimation
somme et la chaleur produite sont des facteurs ne tient compte que de lnergie transforme pour effec-
physiques limitant les performances des processeurs. tuer les calculs et non de celle transforme pour fabri-
Le cot nergtique dun calcul a beaucoup diminu avec quer, transporter et recycler les machines utilises.
le temps puisquon est pass dune production de calculs Les gros centres de serveurs de calcul ou de donnes ont
denviron 400 calculs par kWh pour lENIAC, en 1946, des besoins normes en lectricit et cherchent souvent
environ 1 million de milliards de calculs par kWh pour un se rapprocher gographiquement des centrales lectri-
processeur actuel. Dans cette estimation, un calcul est ques. Ils requirent de mme des systmes de climatisa-
par exemple laddition de deux nombres entiers. Cepen- tion de plus en plus sophistiqus, par exemple des
dant, comme on fait beaucoup plus de calculs quen systmes de refroidissement qui utilisent de leau de mer.
1946, la quantit dlectricit consomme pour ce faire a

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 ?

184 Groupe Eyrolles, 2012


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

Lorganisation
dun ordinateur
15

Pour fabriquer un ordinateur,


il suffit dun fer souder (ou presque).
Dans les annes 1940, lUniversit
de Pennsylvanie, John von Neu-
mann (1903-1957) a conu, avec
Dans ce chapitre, nous voyons de quoi sont faits les ordinateurs Presper Eckert et John Mauchly, deux
une chelle plus proche de la ntre et comment architecture des premiers ordinateurs : lENIAC,
puis lEDVAC. Ces ordinateurs taient
et langages sont lis. Nous dcrivons la manire dont sont organiss selon larchitecture de von
assembls le processeur de calcul, lorganisation de la mmoire Neumann, utilise dans la quasi-tota-
et les bus permettant la circulation des donnes. Nous voyons lit des ordinateurs conus depuis :
sparation du processeur et de la
comment programmer le processeur au moyen dun langage
mmoire, relis par un bus de com-
machine simple et expliquons comment drouler une squence munication. LENIAC pesait vingt-sept
dinstructions. Nous adjoignons enfin les priphriques tonnes.
pour obtenir un ordinateur.

Groupe Eyrolles, 2012


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

Troisime partie Machines

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.

ALLER PLUS LOIN


Taille de la mmoire La mmoire est compose de plusieurs milliards de circuits mmoires un
En gnral, on indique la taille de la mmoire en bit. Ces circuits sont organiss en agrgats de huit, seize, trente-deux,
prcisant le nombre doctets, cest--dire de soixante-quatre bits, et parfois davantage, que lon appelle des cases
mots de huit bits, qui peuvent tre mmoriss.
Ainsi, une mmoire de 4 gigaoctets (binaires),
mmoires et qui peuvent donc mmoriser des mots de huit, seize, trente-
contient 4 230 8 = 34 359 738 368 circuits deux, soixante-quatre bits, etc. Le nombre de ces cases dfinit la taille de
mmoires un bit. Si la mmoire est organise en la mmoire de lordinateur. Comme il faut distinguer ces cases les unes
mots de soixante-quatre bits, ces circuits sont des autres, on donne chacune un numro : son adresse. La mmoire
rpartis en 536 870 912 cases permettant de
mmoriser un mot chacune.
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
ALLER PLUS LOIN mmoires, que lon appelle des registres. On peut imaginer, par exemple,
Les processeurs 32 et 64 bits
quil ne contient que deux registres, appels A et B. Les registres peuvent
Lorsque lon parle de processeurs 32 bits ou contenir des donnes, mais aussi des adresses de cases mmoires.
64 bits, on fait rfrence la taille de ces regis-
tres.

186 Groupe Eyrolles, 2012


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

15 Lorganisation dun ordinateur

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 LDA 7
et si, dans ltat initial, la case 7 de la mmoire contient le nombre 42, la LDB 8
case 8 le nombre 68, la case 9 le nombre 47 et la case 10 le nombre 33, ADD A
lexcution des huit oprations a comme effet de : LDB 9
ADD A
LDA 7 charger le contenu de la case 7, soit 42, dans le registre A, LDB 10
LDB 8 charger le contenu de la case 8, soit 68, dans le registre B, ADD A
STA 11
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,

Groupe Eyrolles, 2012 187


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

Troisime partie Machines

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 :

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

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

188 Groupe Eyrolles, 2012


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

15 Lorganisation dun ordinateur

excute linstruction en question,


et ajoute 2 au registre PC. ALLER PLUS LOIN
Enregistrer les programmes en mmoire permet de faire trs simplement Pourquoi sparer A et B pour ADD
et DEC mais pas pour LD et ST ?
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 Dans le langage machine que nous venons
plutt le nombre n - 2 qui sera augment de 2 immdiatement aprs lex- dinventer, pour que le compteur de programme
fonctionne correctement, chaque instruction uti-
cution du JMP, dans le registre PC pour dtourner le programme de sa lise exactement deux cases mmoire : une pour
route et le forcer continuer son excution ladresse n. De mme, lins- son nom et une pour son argument. Largument
truction JMPZ (jump if zero), qui effectue un saut si le contenu du registre A des instructions ADD et DEC est le nom dun
est 0, permet de faire des tests. On ajoute enfin linstruction END, qui ter- registre. En revanche, comme les instructions de
chargement ont dj un argument (ladresse
mine le programme. En langage machine, on suppose que JMP, JMPZ et END mmoire o aller chercher la donne charger),
scrivent respectivement 6, 7 et 8 et que END prend 0 comme argument elle ne peuvent pas en avoir un second pour
puisquil en faut un. Mais cet argument nest pas utilis. indiquer le registre utilis. Cest pour cela que
lon a deux instructions LDA et LDB et de mme
Pour construire une boucle ou un test avec ces nouvelles instructions, il deux instructions STA et STB.
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- ALLER PLUS LOIN
traire, peut scrire : Calcul sur des structures de donnes
plus complexes
100 0 LDA 11 110 3 STB 30 Les instructions que nous venons de prsenter
101 11 111 30 ne permettent daccder qu un nombre limit
de cases mmoire, dont les adresses sont les
102 5 DEC A 112 6 JMP 118 constantes entires qui servent darguments aux
103 0 113 118 instructions LDA, STA, LDB et STB. Le calcul sur
des structures de donnes plus complexes,
104 5 DEC A 114 1 LDB 12
comme des tableaux, ncessite dautres instruc-
105 0 115 12 tions pour accder une case mmoire dont
ladresse est elle-mme une donne, en particu-
106 7 JMPZ 114 116 3 STB 20
lier le rsultat dun calcul. Les processeurs ont
107 114 117 20 bien dautres instructions encore : des opra-
108 1 LDB 13 118 8 END tions boolennes, des oprations sur les nom-
bres entiers, des oprations sur les nombres
109 13 119 0 flottants, etc.

Groupe Eyrolles, 2012 189


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

Troisime partie Machines

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.

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.

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

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 :

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

tat de la mmoire aprs lexcution du programme :

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

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.

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

190 Groupe Eyrolles, 2012


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

15 Lorganisation dun ordinateur

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 :
e = a + b + c + d;

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 :
e = a + b + c + d;

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

Groupe Eyrolles, 2012 191


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

Troisime partie Machines

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-

192 Groupe Eyrolles, 2012


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

15 Lorganisation dun ordinateur

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- ALLER PLUS LOIN
tion dun nom chaque fichier et leur organisation arborescente (voir Plusieurs systmes dexploitation
le chapitre 11). Il existe plusieurs systmes dexploitation : Unix,
Il gre aussi lcran, cest--dire son dcoupage en fentres, louver- Linux ou GNU/Linux, Windows, Mac OS, etc.
ture et la fermeture des fentres. Toutefois, le dveloppement dun systme
dexploitation est une tche si coteuse en
Dans certains systmes utiliss par plusieurs personnes, il gre temps, quil nexiste gure plus dune dizaine de
lauthentification de chaque utilisateur et les droits, en particulier de systmes dexploitation rellement utiliss.
lecture et dcriture des fichiers, associs chacun deux.

ALLER PLUS LOIN Les ordinateurs parallles


Une manire de fabriquer des ordinateurs plus rapides Les processeurs peuvent se partager une mmoire ou
est de mettre dans un ordinateur plusieurs processeurs plusieurs. Si deux processeurs partagent la mme
qui calculent en parallle, cest--dire en mme temps. mmoire et doivent se communiquer des donnes, il
Les ordinateurs qui ont plusieurs processeurs parallles faut sassurer que le premier ait bien fini de les calculer
sont appels ordinateurs parallles ou multicurs. Cer- et de les stocker en mmoire avant que le second ne les
tains algorithmes sont trs faciles parallliser : par lise. On dit que les deux processeurs doivent se synchro-
exemple pour augmenter la luminosit dune image en niser. Ils peuvent aussi avoir des mmoires diffrentes et
niveaux de gris, il faut ajouter une constante chaque communiquer par un bus. Les processeurs peuvent fonc-
pixel. Chaque pixel peut tre trait indpendamment tionner sur la mme horloge ; on dit alors quils sont
des autres et utiliser deux processeurs au lieu dun divise synchrones. Ou bien chaque processeur peut avoir sa
le temps de calcul par deux. Toutefois, dautres algo- propre horloge ; on dit quils sont asynchrones. Le paral-
rithmes sont plus difficiles parallliser. llisme existe aussi lintrieur des processeurs, entre les
La programmation des processeurs parallles est plus instructions du langage machine. Cette forme de paral-
difficile car, en plus dcrire des instructions, il faut pr- llisme sappelle le paralllisme dinstructions.
voir sur quel processeur elles vont sexcuter.

Groupe Eyrolles, 2012 193


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

Troisime partie Machines

ALLER PLUS LOIN La hirarchie mmoire


Il y a une vidente ressemblance entre les notions de pour un calcul ou bien elle mme calcule si elle est le
case de la mmoire dun ordinateur et de bote associe rsultat dun autre calcul.
une variable dans un tat de lexcution dun pro- La ralit est encore un peu plus complexe car les pro-
gramme. Toutefois, ces deux notions ne sont pas absolu- cesseurs disposent de mmoires caches ou antmmoires.
ment identiques. Un programmeur peut faire comme si Ce sont les mmoires L1 et L2 indiques dans les caract-
une valeur stocke dans une bote de nom x tait ristiques techniques des processeurs. Ces mmoires sont
stocke au mme endroit de la mmoire dun bout daccs plus rapides que la mmoire ordinaire, mais
lautre de lexcution du programme. Cependant, cette beaucoup moins grandes. Gnralement, laccs une
valeur peut en ralit changer de place. Elle peut tre mmoire cache ne prend que quelques cycles dhorloge,
en mmoire, mais comme le systme dexploitation gre mais sa capacit est limite quelques kilooctets ou
plusieurs programmes en temps partag, il peut trs mgaoctets. Pendant le calcul, la valeur de la bote x
bien attribuer la bote de nom x dabord une case de peut aussi se trouver dans une de ces mmoires caches.
la mmoire, puis une autre plus tard. Ce que le systme Un mcanisme matriel gre automatiquement ces deux
dexploitation garantit est que, quoi quil se passe en mmoires et les instructions du langage machine ne per-
ralit, tout se passera de manire transparente pour le mettent mme pas de choisir dutiliser lune ou lautre.
programmeur, qui peut donc faire comme si le contenu Toutefois, le principe retenir est que toute donne
de cette bote tait toujours stock dans la mme case. rcemment utilise a de fortes chances dtre encore
Si on utilise des processeurs parallles pour faire un dans un des caches. Donc viter de trop loigner les uti-
calcul, la valeur de la bote x peut tre dans la mmoire lisations dune mme variable dans un programme peut
dun processeur ou dun autre, voire dans plusieurs faire gagner beaucoup de temps de calcul.
mmoires en mme temps. On a vu aussi que la valeur On a ici un nouvel exemple de la description dune
peut tre dans un registre au moment o elle est utilise mme ralit diffrents niveaux dabstraction.

ALLER PLUS LOIN La distribution du code source dun logiciel


Certains auteurs et diteurs de programmes ne donnent signalant des erreurs, en les corrigeant ou en ajoutant
leurs utilisateurs que le code compil de leurs pro- des composants aux programmes.
grammes. Ils peuvent ainsi garder leurs secrets de fabrica- Les partisans de la distribution du code source des logi-
tion. Les usagers peuvent utiliser ces programmes, mais ciels articulent leurs arguments sur deux plans : un plan
ne peuvent pas comprendre comment ils fonctionnent. thique et philosophique et un plan scientifique et tech-
Dautres, linverse, donnent leurs utilisateurs la fois nique. Certains insistent sur limpratif moral de distri-
le code compil et le code source. Cela permet aux utili- buer le code source de ses programmes, avec lobjectif
sateurs qui le souhaitent de comprendre comment le de diffuser tous des connaissances et de leur per-
programme est conu, de ladapter leurs propres mettre de se les approprier. Dautres insistent sur le fait
besoins si le programme ny rpond quimparfaitement, que permettre aux utilisateurs de contribuer aux logi-
ou de vrifier que le programme ne fait rien dindsi- ciels dvelopps en amliore la qualit. De fait, certains
rable, par exemple quil ne contient pas despion qui logiciels tels les systmes dexploitation GNU/Linux sont
communique son insu des informations sur lutilisateur aujourdhui dvelopps par des milliers de contributeurs
lauteur du programme. Cela permet aussi aux utilisa- de par le monde, ce qui serait impossible si le code
teurs de contribuer lamlioration du programme, en source ntait pas publi.

194 Groupe Eyrolles, 2012


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

15 Lorganisation dun ordinateur

ALLER PLUS LOIN Des programmes auto-modifiants aux virus


Stocker le programme excuter dans la mmoire, avec est un programme qui est conu pour se dupliquer et se
le reste des donnes, a permis de prendre conscience de propager dordinateur en ordinateur linsu de leurs
la possibilit pour un programme de se modifier lui- utilisateurs, par le rseau, ou tout autre support permet-
mme, par une simple instruction STA, dans la partie de tant de transmettre de linformation : cl de mmoire
la mmoire consacre au stockage du programme. Si flash, CD-ROM, etc. Une fois install sur un ordinateur,
cette possibilit disparat dans les langages de program- un virus peut espionner ses utilisateurs et communiquer
mation volus, elle est bien prsente dans les pro- les informations collectes par le rseau. Il peut aussi
grammes directement crits en langage machine. simplement utiliser la capacit de calcul de lordinateur
Cette possibilit de se dupliquer et de se transformer est hte, par exemple pour envoyer des courriers en trs
en particulier utilise par les virus informatiques. Un virus 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 ?

Groupe Eyrolles, 2012 195


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

Les rseaux 16
C HAPITRE AVANC

Les ordinateurs parlent aux ordinateurs.

Vinton Cerf (1943-) et Robert Kahn


Dans ce chapitre, nous voyons comment les ordinateurs (1938-) ont invent, au dbut des
annes 1970, le protocole de trans-
communiquent entre eux, et comment ces communications mission de paquets de donnes IP
se composent pour faire fonctionner le rseau Internet. (Internet Protocol) et le protocole de
Ces mcanismes de communication de machine machine contrle de flux de donnes TCP
(Transmission Control Protocol). Il
sappellent des protocoles.
sagit des deux principaux protocoles
Les protocoles de la couche physique connectent les bus du rseau Internet. Ils donnent ce
rseau sa fiabilit, sa robustesse en
des ordinateurs. Les protocoles de la couche lien organisent
cas de pannes ou de modifications et
un rseau local autour dun serveur et reprent les ordinateurs sa capacit voluer. Cela a valu
par ladresse MAC de leur carte rseau. Les protocoles leurs auteurs le surnom de pres
de la couche rseau organisent les rseaux locaux de proche dInternet.
en proche et reprent les ordinateurs par leur adresse IP.
Nous expliquons comment les informations sont achemines
au travers du rseau laide de routeurs.

Groupe Eyrolles, 2012


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

Troisime partie Machines

Nous avons vu quun ordinateur pouvait se dcrire diffrentes chelles :


T Rseau
les transistors sassemblent en portes boolennes, qui sassemblent leur
tour en composants processeurs, mmoires, etc. qui sassemblent
Un rseau est un ensemble dordinateurs et de leur tour en ordinateurs. Et nous pouvons continuer, car les ordinateurs
connexions qui permettent chaque ordinateur de
communiquer avec tous les autres, ventuellement sassemblent leur tour en rseaux de diffrentes tailles : des rseaux les
en passant par des intermdiaires. 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 PA, par exemple un logiciel de courrier lectronique, ex-
cut sur un ordinateur A, veut communiquer des informations un autre
programme PB, excut sur un ordinateur B, il sous-traite cette tche un
programme spcialis QA, excut sur lordinateur A, qui met en uvre un
protocole. Ce programme QA dialogue, suivant les spcifications de ce pro-
tocole, avec un programme homologue QB excut sur lordinateur B, ce
qui permet ainsi la communication entre les programmes PA et PB.
T Protocole
En fait, le programme QA sous-traite, son tour, certaines tches moins
Un protocole est un ensemble de rgles qui
rgissent la transmission dinformations sur un sophistiques dautres programmes mettant en uvre dautres protocoles,
rseau. Il existe de nombreux protocoles, chacun qui sous-traitent, de mme, certaines tches encore plus lmentaires
spcialis dans une tche bien prcise. dautres protocoles, etc. On peut ainsi classer les protocoles en couches hi-
rarchiques, par le niveau de sophistication des tches quils excutent.
T Couche Ainsi, les informations envoyes par le programme de courrier lectro-
nique sont dabord confies un protocole de la couche application, qui
Une couche est un ensemble de protocoles qui
effectuent des tches de mme niveau. On dis- les confie un protocole de la couche transport, qui les confie un pro-
tingue cinq couches appeles couche applica- tocole de la couche rseau, qui les confie un protocole de la couche
tion, couche transport, couche rseau, lien, qui les confie un protocole de la couche physique, qui les transmet
couche lien et couche physique. 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 Hk 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

198 Groupe Eyrolles, 2012


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

16 Les rseaux

Systme en couches,
piles de protocoles. Encapsulation
et dcapsulation de linformation.

couche application la couche transport arrivent un protocole de la


couche physique, plusieurs en-ttes H4, H3, H2, H1 leur ont t ajouts.
Ces en-ttes sont supprims la rception : la couche k analyse puis
supprime Hk avant de passer linformation la couche k+1. On appelle
cela la dcapsulation des informations.

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.

Groupe Eyrolles, 2012 199


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

Troisime partie Machines

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.

Transmission point point

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
Flashcode exprimant le nombre
par un carr noir ou blanc.
5412082001000261

200 Groupe Eyrolles, 2012


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

16 Les rseaux

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, SUJET DEXPOS Protocoles et codages
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 Chercher sur le Web quels sont les protocoles
lordinateur rcepteur comme un 1. utiliss dans les liaisons RS-232 dune part, et
partir de combien de bits errons la suite de cinq bits envoye nest-elle dans les liaisons USB dautre part. Quels sont les
plus discernable de lautre suite ? avantages dUSB par rapport RS-232 ? Cher-
cher de mme ce que sont les codages Man-
En dduire la probabilit quune suite de cinq bits envoye ne soit pas
reconnaissable larrive. chester dune part et NRZI dautre part. Quels
sont les avantages du codage Manchester par
Quels sont les avantages et inconvnients de cette mthode ? rapport au codage NRZI ?

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.

Groupe Eyrolles, 2012 201


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

Troisime partie Machines

Rseau local

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.
T Paquet Le rle des protocoles de la couche lien est galement de dfinir le
Un paquet est une suite de bits structurs selon format des messages changs : de mme quun fichier PGM (voir le
un certain format, destine tre change sur le chapitre 9) nest pas simplement une suite de pixels, mais contient aussi
rseau. dautres informations la largeur et la hauteur de limage, le nombre de
niveaux de gris, etc. et est structur selon un certain format standard,

202 Groupe Eyrolles, 2012


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

16 Les rseaux

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 ?

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.

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 ?

Groupe Eyrolles, 2012 203


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

Troisime partie Machines

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
POUR ALLER PLUS LOIN DIPv4 IPv6 assurer les communications locales. Le plus utilis des protocoles rseau
est le protocole IP (Internet protocol).
Il ny a donc que 232 adresses IPv4 possibles,
soit un peu plus de quatre milliards : cest peu Avec le protocole IP, chaque machine a une adresse, appele son adresse
quand on sait que le rseau Internet contient IP. Contrairement ladresse MAC, celle-ci nest pas associe de
dj trois milliards dordinateurs. Cette pnurie manire durable un ordinateur : quand un ordinateur est remplac par
en adresses IP, due limprvoyance des pion-
niers dInternet, qui cherchaient seulement un autre, le nouveau peut hriter de ladresse IP de lancien. linverse,
connecter quelques dizaines dordinateurs sans si un ordinateur est dplac dun lieu un autre, il change dadresse IP.
anticiper le succs de leur rseau, explique que Les adresses IP classiques (IPv4) sont des mots de 32 bits crits sous
lon cherche aujourdhui les remplacer par des forme dun quadruplet de nombres compris entre 0 et 255, par exemple
adresses de 128 bits (IPv6).
216.239.59.104.

SAVOIR-FAIRE Trouver ladresse IP attribue un ordinateur


Ouvrir une fentre terminal. Utiliser la commande ifconfig sous Linux ou ipconfig /
all sous Windows.

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 ?

204 Groupe Eyrolles, 2012


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

16 Les rseaux

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 T Routeur
routeur. Pour envoyer des informations une machine dont ladresse IP Un routeur est un ordinateur dont la seule fonc-
est X, un ordinateur commence par les envoyer au routeur auquel il est tion est dacheminer des informations sur le
connect. En fonction de ladresse X, celui-ci lenvoie un autre routeur, rseau. Pour les distinguer des routeurs, on appelle
puis un autre, etc. jusqu ce que les informations arrivent destina- les autres ordinateurs du rseau des htes.

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.

Rseau global. Routage de A B en passant


par les routeurs R1, R2, R3, R4, R5, R6, R7 et
R8.

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.

Groupe Eyrolles, 2012 205


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

Troisime partie Machines

Les protocoles luvre lors du routage.


Chemin suivi par linformation travers les
couches sur chaque machine.

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

206 Groupe Eyrolles, 2012


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

16 Les rseaux

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.

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.

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.

Groupe Eyrolles, 2012 207


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

Troisime partie Machines

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.

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 :

sujet : Hello
corps du message :
Alice (par -)

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 :

Alice (par -)
Djamel (par anonyme2@adalovelace.fr)
Frdrique (par anonyme2@adalovelace.fr)
Hector (par anonyme7@adalovelace.fr)

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 :

sujet : Hello
corps du message :
Alice (par -)

208 Groupe Eyrolles, 2012


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

16 Les rseaux

Djamel (par anonyme2@adalovelace.fr)


Frdrique (par anonyme2@adalovelace.fr)
Hector (par anonyme7@adalovelace.fr)

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 :

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.

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.
Groupe Eyrolles, 2012 209
ManuelDowek.book Page 210 Monday, July 9, 2012 4:58 PM

Troisime partie Machines

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
ALLER PLUS LOIN Le port
r-acclre la cadence quand les accuss de rception arrivent.
Comme plusieurs programmes peuvent utiliser
TCP en mme temps et sur la mme machine, Une autre fonction de TCP est de dcouper les informations transmettre
TCP attribue chacun deux un numro : un en paquets de 1 500 octets. Par exemple, pour envoyer une page web de
port. Un numro de port permet TCP de distin- 10 000 octets, TCP dcoupe ces 10 000 octets en paquets plus petits,
guer les paquets correspondant aux diffrents chacun de taille standard, et les envoie lun aprs lautre. lautre bout du
programmes qui communiquent en mme temps.
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 ?

210 Groupe Eyrolles, 2012


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

16 Les rseaux

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) SUJET DEXPOS DNS
etc. Un autre protocole dapplication important est DNS (Domain Name Prsenter les principes de base de DNS.
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-

Groupe Eyrolles, 2012 211


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

Troisime partie Machines

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 XXe 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.
SUJET DEXPOS
Laffaire LICRA contre Yahoo! Parce que cest un rseau mondial, Internet permet de publier, dans un
Quest-ce que larticle R.645-1 du Code Pnal pays, des textes qui peuvent tre lus dans le monde entier et, de mme,
franais ? Quest-ce que le premier amende- de vendre des objets qui peuvent tre achets dans le monde entier. Ds
ment de la Constitution des tats-Unis ? En quoi lors, quelle loi appliquer ? cette question, qui est nouvelle, plusieurs
sont-ils contradictoires ? Chercher des docu- rponses ont t imagines, sans que personne ne sache encore laquelle
ments sur laffaire de la LICRA contre
Yahoo!, relative la vente aux enchres
simposera sur le long terme :
dobjets nazis sur Internet (de lordonnance du lapplication des lois du pays dans lequel le texte est publi ou lobjet
Tribunal de Grande Instance de Paris du mis en vente,
20 novembre 2000, jusqu la dcision de la
Cour Suprme des tats-Unis du 30 mai 2006). lapplication des lois du pays dans lequel le texte peut tre lu ou
Montrer en quoi cette affaire illustre le pro- lobjet achet ce qui obligerait, par exemple, un hbergeur de site
blme de lapplication de lgislations diffrentes web bloquer laccs certains sites depuis certains pays,
selon les pays pour la vente sur Internet.
ou lmergence dun minimum de rgles universelles.

212 Groupe Eyrolles, 2012


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

16 Les rseaux

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
SUJET DEXPOS Que sont
dcentralis : un petit nombre de dcisions doivent tre prises en commun.
lInternet Engineering Task Force (IETF),
Ici, plusieurs modes dorganisation sont en concurrence, nouveau sans lInternet Corporation for Assigned
que personne ne sache lequel simposera sur le long terme : Names and Numbers (ICANN),
lmergence dorganisations internationales rgies par des traits entre tats, lInternet Society (ISOC),
le World Wide Web Consortium (W3C),
lmergence dorganisations internationales informelles, dont la lgiti- le WhatWG,
mit vient uniquement de la confiance qui leur est accorde, et lUnion Internationale des Tlcoms
lmergence dorganisations propres aux pays o Internet est le plus (UIT) ?
dvelopp (cette dernire solution ayant linconvnient daugmenter les Quel est le rle et quel est le statut de chacune
de ces organisations ?
diffrences de dveloppement dInternet entre les pays).

ALLER PLUS LOIN Calculer dans les nuages (cloud computing)


Au cours de lhistoire de linformatique, des modes cen- qui se chargera de lenvoyer ; cest lide du Webmail. De
tralisatrices et dcentralisatrices se sont succdes. Ainsi, mme, au lieu dacheter un logiciel de comptabilit et
jusquaux annes 1970, les entreprises navaient quun de lutiliser, une entreprise peut se connecter, chaque
seul ordinateur, auquel taient connects de nombreux fois quelle souhaite effectuer une opration comp-
terminaux, par exemple forms dun clavier et dun table, une machine distante qui effectue cette opra-
cran, qui permettaient diffrentes personnes deffec- tion pour lentreprise. Lordinateur local ne sert plus
tuer des calculs sur cet ordinateur. partir des annes qu communiquer des informations cette machine
1980, ces terminaux ont t remplacs par des micro- distante, comme jadis les terminaux.
ordinateurs, connects par un rseau un serveur. Les Utiliser des programmes sur une machine distante sim-
calculs ntaient alors plus effectus par un ordinateur plifie beaucoup de choses. Il nest plus ncessaire dins-
central, mais par chacun de ces micro-ordinateurs. taller des logiciels sur son ordinateur, de les mettre jour
Depuis le milieu des annes 2000, on voit apparatre un de temps en temps, etc. De plus, il devient possible
retour de la centralisation. Des entreprises, qui ven- denvoyer un courrier depuis nimporte quel ordinateur :
daient nagure des programmes des clients qui les uti- dun web caf de Bogota ou de Caracas, comme de son
lisaient pour effectuer des calculs sur leurs ordinateurs, bureau. Pour une entreprise, cela permet de diminuer la
proposent dsormais ces mmes clients deffectuer taille du service informatique, puisquil lui suffit dsor-
elles-mmes ces calculs leur place. Les clients ont juste mais davoir quelques ordinateurs relis au rseau.
besoin de communiquer leurs donnes ces entreprises, Cependant, cette volution prsente aussi un risque de
qui font les calculs sur leurs propres ordinateurs et dpossession des utilisateurs de leur pouvoir : au lieu
envoient le rsultat de ces calculs leurs clients. Cest ce davoir ses programmes, ses courriers, ses photos, sa
quon appelle le calcul dans les nuages (cloud computing). comptabilit, etc. sur son ordinateur, on prfre les con-
Par exemple, au lieu dinstaller un logiciel de courrier fier des entreprises et des ordinateurs distants. En
lectronique sur son ordinateur et de lutiliser pour outre, on a parfois une garantie assez faible de leur con-
envoyer des courriers, on peut, chaque fois que lon servation sur le long terme, de son pouvoir de les
souhaite envoyer un courrier, se connecter un ordina- effacer ou de son contrle sur les usages que ces entre-
teur distant, en gnral au moyen dune page web, et prises peuvent faire de ces donnes.
communiquer le texte de son courrier cet ordinateur,

Groupe Eyrolles, 2012 213


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

Troisime partie Machines

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 ?

214 Groupe Eyrolles, 2012


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

Les robots 17
C HAPITRE AVANC

Un robot ? Cest un ordinateur deux roues.

Norbert Wiener (1894-1964) est le


Dans ce chapitre, nous introduisons de nouveaux objets : fondateur, la fin des annes 1940, de
la science du pilotage ou cybern-
les robots, qui sont essentiellement des ordinateurs munis tique. Entour dun groupe interdisci-
de capteurs et dactionneurs. Nous voyons comment plinaire de mathmaticiens, logiciens,
les grandeurs captes sont numrises et comment le principe anthropologues, psychologues, co-
nomistes, il a cherch comprendre
de la boucle ferme permet de contrler une action.
les processus de commande et de
Enfin, nous voyons comment programmer un robot communication chez les tres vivants,
laide dune boucle infinie dans laquelle les capteurs dans les machines et dans les socits.
sont interrogs et les actionneurs activs. Le concept central de la cyberntique
est celui de causalit circulaire ou con-
trle en boucle ferme (feedback).

Groupe Eyrolles, 2012


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

Troisime partie Machines

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.

216 Groupe Eyrolles, 2012


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

17 Les robots

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

Groupe Eyrolles, 2012 217


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

Troisime partie Machines

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 ?

218 Groupe Eyrolles, 2012


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

17 Les robots

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.

Groupe Eyrolles, 2012 219


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

Troisime partie Machines

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.
ALLER PLUS LOIN Un programme sans fin On commence donc par crire un programme et le compiler. On utilise
Contrairement beaucoup de programmes qui pour cela lenvironnement de dveloppement MPLAB. On le transmet
calculent un rsultat et se terminent, un pro- ensuite au robot laide dun cble USB et du programme mOwayGUI
gramme commandant un robot, un tlphone, (mOway Graphic User Interface).
un rseau et, plus gnralement, un objet qui
interagit avec son environnement, doit ne Pour crire un programme, on utilise des fonctions qui interrogent les
jamais se terminer, car le robot ou le tlphone capteurs et commandent les actionneurs. Ces fonctions ne font pas
ne cessent jamais dinteragir avec leur environ- partie du langage C lui-mme, mais dune extension de C fournie par le
nement. Quand un tel programme se termine,
on dit que le robot ou le tlphone est en
fabricant du robot. On indique que lon utilise cette extension en ajou-
panne, car il ne rpond plus aux sollicitations tant au dbut de son programme les commandes :
de son environnement et, bien souvent, on
relance ce programme. #include "lib_mot_moway.h"
#include "lib_sen_moway.h"

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

220 Groupe Eyrolles, 2012


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

17 Les robots

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 :
MOT_STR(50,FWD,TIME,100);
MOT_ROT(25,FWD,CENTER,LEFT,ANGLE,50);

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 e