Académique Documents
Professionnel Documents
Culture Documents
1
2
3
4
5
6
7
8
9
10
1
3
5
7
9
1 10
2 9
3 8
4 7
5 6
DANS DAUTRES LANGAGES
Texas Instruments et Casio
Dans le langage des calculatrices Texas Instru-
ments et Casio les boucles scrivent ainsi :
Texas Instruments
PROGRAM:COMPTE
:For (I,1,10)
:Disp I
:End
Casio
======COMPTE ======
For 1 I to 10
I
Next
ManuelDowek.book Page 25 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
26
Exercice 2.1 (avec corrig)
crire un programme qui recueille au clavier les tempratures de 7 jours suc-
cessifs et calcule la temprature moyenne de la semaine.
Ici, le compteur de boucle jour ne reprsente que le numro du jour dans la
semaine et nintervient pas dans les calculs. Dans le corps de la boucle, on se
contente donc de lire les tempratures au clavier dans une variable
temperature et de faire la somme des nombres entrs au fur et mesure dans
une variable somme. Linstruction correspondante sera donc :
Pour que la somme calcule soit correcte, il faut penser initialiser la variable
somme zro avant la boucle. Enfin, une fois les 7 tempratures entres, il faut
convertir cette somme en moyenne et lafficher :
Exercice 2.2
Modifier le programme prcdent pour que lutilisateur puisse prciser le
nombre de jours avant de donner les tempratures.
Exercice 2.3
crire un programme qui calcule et affiche la liste des diviseurs dun nombre
entier naturel entr au clavier.
Exercice 2.4 (avec corrig)
crire un programme qui affiche un calendrier pour une anne entire.
Ce programme doit avoir une structure en boucles imbriques : une anne est
constitue de douze mois et chaque mois est son tour constitu de plusieurs
SAVOIR-FAIRE crire un programme utilisant une boucle for
Identifier si le compteur doit jouer un rle dans le corps de la boucle. crire le corps de la
boucle. Prvoir une initialisation des variables en amont de la boucle et un post-traite-
ment en aval.
temperature = Isn.readDouble();
somme = somme + temperature;
somme = 0;
for (jour = 1; jour <= 7; jour = jour + 1) {
temperature = Isn.readDouble();
somme = somme + temperature;}
System.out.println(somme / 7.0);
SAVOIR-FAIRE Imbriquer deux boucles
Quand linstruction excuter lintrieur dune boucle est elle aussi rptitive, le corps de
cette boucle contient une seconde boucle et on dit que ces deux boucles sont imbriques.
Les bornes de la boucle interne dpendent souvent du compteur de la boucle externe.
ManuelDowek.book Page 26 Monday, July 9, 2012 4:58 PM
2 Les boucles
Groupe Eyrolles, 2012
27
jours. Si tous les mois de lanne avaient trente jours, il suffirait dcrire le pro-
gramme suivant :
Mais comme les mois ont un nombre de jours variable, il faut, pour chaque
mois, dabord calculer le nombre de jours nbj du mois en fonction de mois,
puis utiliser une boucle dont lindice jour varie de 1 nbj :
Exercice 2.5
Combien de points affiche le programme suivant ?
Et celui-ci ?
Exercice 2.6
crire un programme qui affiche un calendrier pour une anne mais en cri-
vant les mois janvier , fvrier , etc. et non 1, 2, etc.
Exercice 2.7
crire un programme qui affiche un calendrier qui va du 1er janvier 2001 au 31
dcembre 3000. Attention les annes multiples de quatre sont bissextiles, sauf
les annes multiples de cent qui ne le sont pas, sauf les annes multiples de
quatre cents qui le sont. Ainsi, 2100, 2200, 2300, 2500, 2600, 2700, 2900 et
3000 ne sont pas bissextiles mais 2400 et 2800 le sont.
Ajouter ce calendrier le nombre de jours couls depuis le dbut du calendrier.
for (mois = 1; mois <= 12; mois = mois + 1) {
for (jour = 1; jour <= 30; jour = jour + 1) {
System.out.print(jour);
System.out.print(" / ");
System.out.println(mois);}}
for (mois = 1; mois <= 12; mois = mois + 1) {
if (mois == 2) {
nbj = 28;}
else {
nbj = 30 + (mois + mois / 8) % 2;}
for (jour = 1; jour <= nbj; jour = jour + 1) {
System.out.print(jour);
System.out.print(" / ");
System.out.println(mois);}}
for (i = 1; i <= 100; i = i + 1) {
System.out.print(".");}
for (j = 1; j <= 100; j = j + 1) {
System.out.print(".");}
System.out.println();
for (i = 1; i <= 100; i = i + 1) {
for (j = 1; j <= 100; j = j + 1) {
System.out.print(".");}}
System.out.println();
ManuelDowek.book Page 27 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
28
Ajouter ce calendrier le jour de la semaine.
Exercice 2.8 Fabriquer des nombres pseudo-alatoires
La suite de nombres dfinie par rcurrence de la manire suivante :
u
0
= 13
u
n+1
= (16805 u
n
+ 1) % 32768
semble alatoire.
crire un programme qui affiche les 10 000 premiers termes de cette suite.
Pour simuler une suite de tirages pile ou face, on observe le neuvime bit
(voir le chapitre 7) de chaque lment de cette suite et on dcrte, lors du
i-me tirage, que la pice est tombe du ct pile si le neuvime bit du
nombre u
i
est un 0, et quelle est tombe du ct face si cest un 1. crire
un programme qui affiche les 10 000 premiers tirages.
On teste la qualit de ce gnrateur dala en comptant le nombre de fois
que la pice tombe dun ct et de lautre. crire un programme qui simule
10 000 tirages et compte le nombre de fois que la pice tombe du ct pile.
Quobtient-on si on observe le bit des units au lieu dobserver le neu-
vime bit ? Expliquer pourquoi : montrer que si u
n
est pair alors u
n+1
est
impair et que si u
n
est impair alors u
n+1
est pair.
Montrer que, loin dtre rellement alatoire, la suite u est en fait prio-
dique partir dun certain rang.
La boucle while
On veut crire un programme qui prend en argument un nombre vir-
gule x suprieur ou gal 1 et qui calcule son logarithme entier. Ce pro-
gramme est form dune boucle qui divise x par 2 plusieurs fois, jusqu
obtenir un nombre infrieur ou gal 1, tout en ajoutant 1 un nombre
n chaque division, pour les compter. Quand la boucle est termine, la
variable n contient le nombre recherch. La nouveaut, avec cette
boucle, est que, tant que lexcution du calcul nest pas acheve, il ny a
aucun moyen de savoir combien de fois le corps de cette boucle sera
rpt, puisque ce nombre est prcisment le nombre que lon cherche
calculer : le logarithme entier de x. Il nest donc pas possible dcrire ce
programme avec une boucle for.
Cest pour cela que lon a introduit, dans les langages de programmation,
une autre forme de boucle : la boucle while. Dans une telle boucle, le choix
1 lundi 1 janvier 2001
2 mardi 2 janvier 2001
1
2
3
4
5
6
7
8
9
10
1
3
5
7
9
ManuelDowek.book Page 32 Monday, July 9, 2012 4:58 PM
2 Les boucles
Groupe Eyrolles, 2012
33
Exercice 2.15 (avec corrig)
Quelle boucle est adapte lcriture de programmes traitant les problmes
suivants :
le calcul du total payer une caisse enregistreuse,
la recherche du jour le plus pluvieux dune anne,
le calcul du primtre dun polygone,
le calcul de la dure dune mission de radio, connaissant ses horaires de
dbut et de fin ?
Une boucle while : on ne sait pas combien il y aura darticles, on ne
sarrte que lorsque le tapis est vide.
Une boucle for : le corps de la boucle doit tre rpt 365 fois exactement.
ALLER PLUS LOIN Savoir si un programme se termine ou non
Savoir si un programme se termine ou non nest pas une
chose facile. Par exemple, quand on excute linstruction :
s = 4;
p = false;
for (i = 1; i <= s 1; i = i + 1) {
j = s i;
if (i * i == 25 * j * j) {
p = true;}}
on numre tous les couples dentiers strictement posi-
tifs (i ; j) dont la somme vaut 4, cest--dire les cou-
ples (1 ; 3), (2 ; 2), (3 ; 1), et on teste si lun de ces couples
est une solution de lquation : i * i == 25 * j * j.
Comme ce nest le cas daucun de ces trois couples, lins-
truction p = true; nest jamais excute et la valeur de
la variable p reste false.
De mme, quand on excute linstruction :
s = 2;
p = false;
while (!p) {
for (i = 1; i <= s 1; i = i + 1) {
j = s i;
if (i * i == 25 * j * j) {
p = true;}}
s = s + 1;}
on numre tous les couples dont la somme des lments
vaut 2, puis tous les couples dont la somme des lments
vaut 3, et ainsi de suite, puis on teste si lun de ces couples
est une solution de lquation : i * i == 25 * j * j.
Quand on essaiera les couples dont la somme des l-
ments vaut 6, on essaiera le couple (5 ; 1), qui est une
solution de lquation, on excutera linstruction p =
true; et lexcution de la boucle while se terminera.
Autrement dit, ce programme numre tous les couples
dentiers strictement positifs (i ; j) et se termine quand
il trouve une solution de lquation i * i == 25 * j * j.
Comme cette quation a une solution, le programme se
termine.
En revanche, si on remplace le nombre 25 par le nombre
2, le programme numre tous les couples dentiers
strictement positifs (i ; j) et se termine quand il
trouve une solution de lquation i * i == 2 * j * j.
Comme cette quation na pas de solution, le pro-
gramme ne se termine pas.
Ces deux programmes sont donc trs similaires, puisque
lun cherche les solutions entires de lquation i * i
== 25 * j * j et lautre celles de lquation i * i ==
2 * j * j mais lun se termine et lautre non.
SAVOIR-FAIRE Choisir entre une boucle for et la boucle while
pour crire un programme
Si on connat lavance le nombre de rptitions effectuer, la boucle for est toute indi-
que. linverse, si la dcision darrter la boucle ne peut sexprimer que par un test, cest
la boucle while quil faut choisir.
ManuelDowek.book Page 33 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
34
Cela dpend : si le nombre de cts est connu, une boucle for, sinon, une
boucle while qui sarrte lorsquon est revenu au sommet de dpart.
Il ny a pas besoin de boucle.
Exercice 2.16
crire les programmes proposs dans lexercice prcdent.
Exercice 2.17
crire un programme qui affiche un tableau de valeurs pour la fonction f : x
x 2 x 2. Lutilisateur choisit les bornes de lintervalle sur lequel on
calcule ces valeurs, ainsi que le pas entre deux valeurs.
Exercice 2.18
Dans cet exercice on crit plusieurs versions dun programme qui joue la
bataille navale, autrement dit qui cherche couler un bateau. Comme dans le
premier exemple, on suppose quil ny a quun seul bateau dune seule case,
dont la position est connue par lutilisateur.
Programmer lalgorithme naf qui consiste essayer toutes les cases syst-
matiquement.
Amliorer cet algorithme pour quil sarrte quand il a coul le bateau.
Amliorer cet algorithme pour quil cherche le bateau intelligemment si
celui-ci est en vue, cest--dire dans une case adjacente au dernier essai
effectu.
Peut-on encore amliorer cet algorithme pour minimiser le nombre
dessais ncessaires ?
Ai-je bien compris ?
quoi sert une boucle ?
Quelle est la diffrence entre une boucle for et une boucle while ?
Que signifie quun programme se termine ?
ManuelDowek.book Page 34 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
3 Les types
Robin Milner (1934-2010) est
lauteur de lun des premiers lan-
gages de programmation avec des
types polymorphes et implicites : le
langage ML. Ce langage est lanctre
de nombreux langages contempo-
rains en particulier des langages
Caml et Haskell. Par la suite il a dve-
lopp lun des premiers langages per-
mettant de dcrire des systmes
concurrents, cest--dire forms de
plusieurs processus qui sexcutent en
parallle. Dans son discours de rcep-
tion du prix Turing, il a insist sur
lautonomie de linformatique, qui
nest une partie daucune autre
science.
Une bote ne sait pas comment elle sappelle.
Cest nous de lui donner un nom et une forme.
Dans ce chapitre, nous introduisons une nouvelle instruction,
la dclaration, qui permet dajouter une bote un tat,
et nous voyons quil y a diffrents types de botes.
Chaque bote, en fonction de son type, peut contenir un nombre
entier, un nombre virgule, un boolen, une chane
de caractres ou plusieurs, dans le cas dun tableau.
Une bote associe une variable peut nexister que pendant
lexcution de certaines parties du programme on parle de
porte de la variable. Une instruction qui manipule une variable
doit donc se trouver dans la porte de celle-ci, et il est important
de comprendre cette notion pour viter les erreurs. Munis de tous
ces ingrdients, nous pouvons enfin excuter nos programmes.
ManuelDowek.book Page 35 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
36
Pour excuter le programme donn en dbut de chapitre 1, il faut dabord
le taper dans un fichier, appel par exemple BatailleNavale.java.
Certains programmes prsents dans ce livre utilisent une extension de
Java appele Isn. Il est donc galement ncessaire de rcuprer le fichier
Isn.java sur le site de lditeur de ce livre et de le mettre dans le mme
rpertoire que ses programmes.
Il faut ensuite compiler ce programme, cest--dire le traduire dans le
langage propre de lordinateur (voir le chapitre 15), avec la commande
javac BatailleNavale.java. Le programme traduit, qui se trouve alors
dans le fichier BatailleNavale.class, peut tre excut par la com-
mande java BatailleNavale.
Toutefois, pour que ce programme produise le rsultat attendu, il faut
laccompagner de quelques instructions supplmentaires :
On a ajout six lignes en dbut de programme et ferm la fin du pro-
gramme les accolades ouvertes plus haut.
On a vu que ce programme utilise quatre botes de noms a, b, x et y. Ces
botes ne sont pas associes de manire permanente ces noms, mais
cette association est cre par les instructions int a; int b; int x; int
y;, qui sappellent des dclarations. Pour abrger le programme et le
rendre plus lisible, on peut remplacer les quatre dclarations par une
seule int a,b,x,y;.
Les deux premires lignes, quant elles, constituent un en-tte qui
indique que lon va crire un programme.
class BatailleNavale {
public static void main (String [] args) {
int a;
int b;
int x;
int y;
a = 4;
b = 7;
System.out.println(" vous de jouer");
x = Isn.readInt();
y = Isn.readInt();
if (x == a && y == b) {
System.out.println("Coul");}
else {
if (x == a || y == b) {
System.out.println("En vue");}
else {
System.out.println(" l'eau");}}}}
class BatailleNavale {
public static void main (String [] args) {
COMPLMENTS
Bhttp://www.editions-eyrolles.com/
T Dclaration
La dclaration T v; p, o T est un type, v une
variable et p une instruction a pour effet dajouter
une bote de nom v et de type T ltat, excuter p
dans ltat obtenu et supprimer la bote de nom v.
ManuelDowek.book Page 36 Monday, July 9, 2012 4:58 PM
3 Les types
Groupe Eyrolles, 2012
37
Exercice 3.1
crire le programme ci-dessus dans un diteur. Compiler et excuter ce pro-
gramme.
Exercice 3.2
Ouvrir le fichier BatailleNavale.class dans un diteur.
Excuter linstruction :
dans ltat ajoute ltat une bote de nom y, ce qui produit ltat
puis excute linstruction :
ce qui produit ltat et affiche 7, et enfin supprime la bote de nom y,
ce qui produit ltat .
Les types de base
En Java, comme dans la plupart des langages de programmation, les
expressions sont classes en fonction de leur type :
les expressions, comme 1 + 2, dont la valeur est un nombre entier,
comme 3, sont de type int (integer : nombre entier),
celles comme 1.5 + 1.64, dont la valeur est un nombre virgule,
comme 3,14, sont de type double, ce nom fait rfrence au fait que les
nombres virgules exprims sur 32 bits sont appels nombres vir-
gule en simple prcision et ceux exprims sur 64 bit sont appels nom-
bres virgule en double prcision (voir le chapitre 7),
celles comme 0 < 2, dont la valeur est un boolen, false (faux) ou
true (vrai), sont de type boolean, dans les langages de programma-
tion, on crit en gnral les boolens false et true et non 0 et 1 pour
viter les confusions avec les nombres,
celles, comme "Cou" + "l", dont la valeur est une chane de carac-
tres, comme "Coul", sont de type String.
int y;
x = 3;
y = 4;
System.out.println(x + y);
x = 3;
y = 4;
System.out.println(x + y);
120 145 87
12 67 89
90 112 83
i
j
ManuelDowek.book Page 48 Monday, July 9, 2012 4:58 PM
3 Les types
Groupe Eyrolles, 2012
49
Exercice 3.18
On souhaite crire un programme qui dtermine les bornes de lintervalle de
fluctuation au seuil de 95 % dune loi binomiale de paramtres n et p quon
lira au clavier.
crire une version de ce programme qui calcule la loi de probabilit bino-
miale dans son intgralit puis dtermine et affiche lintervalle de con-
fiance.
crire une version de ce programme qui dtermine et affiche lintervalle de
confiance en ne calculant la loi de probabilit que jusqu atteindre la
borne suprieure de lintervalle de confiance. Quels calculs conomise-t-on
de cette faon ?
Si p est proche de 1, que peut-on dire du programme crit la question 2 ?
Proposer une troisime version pour rendre le programme plus efficace
dans ce cas particulier.
ALLER PLUS LOIN Quest-ce que le calcul formel ?
Comment calculer avec la fonction polynme x 2 x
3
+
8 x
2
+ 7 x + 3 ? Une possibilit est den faire une expres-
sion de son programme. Cela permet, par exemple, de
calculer sa valeur en 5.
int x, y;
x = 5;
y = 2 * x * x * x + 8 * x * x + 7 * x + 3;
System.out.println(y);
ce qui donne, bien entendu, le rsultat 488.
Mais, il est aussi possible de reprsenter une fonction
polynme du troisime degr par le quadruplet de ses
coefficients, cest--dire par un tableau
double [] t;
On peut alors dfinir la fonction polynme x 2 x
3
+ 8
x
2
+ 7 x + 3 ainsi
t = new double [4];
t[3] = 2;
t[2] = 8;
t[1] = 7;
t[0] = 3;
Calculer la valeur de cette fonction en 5 demande un
programme un peu plus complexe
int x, y, i, c;
x = 5;
y = 0;
c = 1;
for (i = 0; i <= 3; i = i + 1) {
y = y + t[i] * c;
c = c * x;}
System.out.println(y);
o la variable c contient les valeurs des puissances suc-
cessives de x.
Mais reprsenter cette fonction ainsi permet de faire de
nombreuses nouvelles choses, par exemple lafficher
for (i = 0; i <= 3; i = i + 1) {
System.out.print(t[i]);
System.out.print(" ");
if (i != 0) {
System.out.print("x");
if (i != 1) {
System.out.print("^");
System.out.print(i);}}
if (i != 3) {
System.out.print(" + ");}}
System.out.println();
ce qui donne le rsultat
3.0 + 7.0 x + 8.0 x^2 + 2.0 x^3
et mme calculer sa drive, en utilisant le fait que la
drive de x
n + 1
est (n + 1) x
n
for (i = 0; i <= 2; i = i + 1) {
u[i] = t[i+1] * (i + 1);}
t[3] = 0;
que l'on peut son tour afficher
7.0 + 16.0 x + 6.0 x^2 + 0.0 x^3
et on obtient que la fonction x 6 x
2
+ 16 x + 7 est la
drive de la fonction x 2 x
3
+ 8 x
2
+ 7 x + 3. Cette proc-
dure est bien sr valable quelle que soit la fonction poly-
nme du troisime degr reprsente dans le tableau t.
Les programmes peuvent donc calculer avec des objets
trs divers : des nombres et des chanes de caractres
bien entendu, mais aussi des expressions symboliques
comme x x
3
+ 8 x
2
+ 7 x + 3.
ManuelDowek.book Page 49 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
50
Comment dcider sil vaut mieux utiliser le programme crit la question 2
ou celui crit la question 3 ? crire un programme qui fait ce choix auto-
matiquement.
En utilisant la mthode dtaille au chapitre 21, dterminer si la partie du
programme qui prend le plus de temps est celle o lon calcule les coeffi-
cients binomiaux ou bien celle o lon dtermine lintervalle de fluctuation.
En dduire si les diffrentes versions crites dans les questions 1 4 modi-
fient significativement le temps dexcution de lalgorithme. En admettant
que lon nait jamais utiliser cet algorithme pour des valeurs de n sup-
rieures 1000, comment peut-on le rendre plus efficace ?
Les chanes de caractres
Jusqu prsent, on a dfini et manipul le type String comme si ctait un
type de base, alors quil est en fait composite : une chane de caractres est
forme de plusieurs valeurs simples que sont ses diffrents caractres.
Exercice 3.19 (avec corrig)
crire un programme qui demande lutilisateur de taper son prnom et son
nom, puis affiche les initiales correspondantes.
Si le prnom et le nom sont entrs dans deux chanes diffrentes, il suffit
dafficher le premier caractre de chacune de ces chanes.
SAVOIR-FAIRE Calculer avec des chanes de caractres
Pour comparer des chanes de caractres, on utilise imprativement les fonctions
Isn.stringEqual et Isn.stringAlph. Attention en particulier lopration == qui ne
produira pas derreur la compilation mais ne donnera pas les rsultats attendus.
Lorsque lon doit parcourir une chane de caractres lment par lment, on peut
utiliser une boucle for, le nombre dexcutions du corps de la boucle tant donn par
la fonction Isn.stringLength.
Pour modifier une chane existante, on en extrait les parties appropries laide de la
fonction Isn.stringNth, on reconstitue une nouvelle chane laide de lopration de
concatnation +, et on laffiche ou on la stocke dans une variable.
String prenom, nom;
prenom = Isn.readString();
nom = Isn.readString();
System.out.print(Isn.stringNth(prenom,0));
System.out.println(Isn.stringNth(nom,0));
ManuelDowek.book Page 50 Monday, July 9, 2012 4:58 PM
3 Les types
Groupe Eyrolles, 2012
51
Mais ce programme ne permet pas de traiter des prnoms composs ou des
noms multiples. Si le prnom et le nom sont entrs dans une seule chane, les
initiales sont les premires lettres des mots, cest--dire le premier caractre de
la chane et ceux qui suivent immdiatement un espace. Il faut donc parcourir
cette chane caractre par caractre en recherchant les espaces, et afficher le
caractre suivant ds que lon en trouve un. On ne va en ralit que jusqu
lavant-dernier caractre de la chane, car mme si le dernier caractre est un
espace, il ne peut pas tre suivi dune lettre.
Cette version est plus gnrale mais aussi plus sensible aux entres mal
formes : un espace mal plac ou un tiret utilis pour sparer des prnoms
fausse le rsultat.
Exercice 3.20
crire un programme qui lit une chane de caractres et :
compte le nombre despaces,
compte le nombre de voyelles,
calcule le score marqu au Scrabble avec cette chane, en comptant 0 point
pour les espaces et les signes de ponctuation,
dtermine la lettre la plus frquente.
Exercice 3.21
crire un programme qui lit une chane de caractres et la rcrit en revenant
la ligne entre chaque caractre.
Exercice 3.22
Chercher sur le Web ce quest la mthode de chiffrement ROT13 et crire un
programme qui lit une chane de caractres et la chiffre ou la dchiffre selon
cette mthode.
Exercice 3.23
crire un programme qui lit une chane de caractres et :
la rcrit tout en majuscules,
la rcrit tout en minuscules,
la rcrit en inversant majuscules et minuscules.
Exercice 3.24
Chercher sur le Web ce quest lcriture leet speak et crire un programme
qui lit une chane de caractres et la rcrit en leet speak.
String nom;
int i;
nom = Isn.readString();
System.out.print(Isn.stringNth(nom,0));
for (i = 0; i <= Isn.stringLength(nom) - 2; i = i + 1) {
if (Isn.stringEqual(" ",Isn.stringNth(nom, i))) {
System.out.print(Isn.stringNth(nom,i + 1));}}
System.out.println();
ManuelDowek.book Page 51 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
52
La mise au point
des programmes
Les programmes sont souvent des objets complexes forms de plusieurs
milliers, voire plusieurs millions de lignes et il est peu probable, quand
on crit un programme qui dpasse quelques dizaines de lignes, de ne
pas faire derreur. Une erreur dans un programme peut avoir des cons-
quences dramatiques si ce programme est par exemple utilis dans le
rgulateur de vitesse dune voiture, une centrale nuclaire ou un robot
chirurgical. Cest pourquoi il existe de nombreuses mthodes pour viter
les erreurs dans les programmes. La premire, dj voque au chapitre
1, est de tester les programmes que lon crit.
Quand on teste un programme et quil ne fait pas ce que lon espre, il
faut dterminer lendroit o une erreur sest produite. Pour cela on doit
instrumenter son programme, cest--dire ajouter des instructions de
sortie dans le programme, qui permettent de visualiser ce quil se passe
au cours de son excution. On repre ainsi le moment de lexcution du
programme, o une variable prend, pour la premire fois, une valeur ina-
dquate.
SAVOIR-FAIRE Mettre au point un programme en linstrumentant
1 Identifier les variables critiques, dont la valeur peut radicalement influencer le com-
portement du programme. En particulier, la variable i dans une instruction de la
forme for (i = e; i <= e'; i = i + 1) p et les variables intervenant dans lexpres-
sion e dune instruction de la forme while (e) p sont particulirement importantes
puisquelles conditionnent le nombre de fois que le corps de cette boucle est excut.
2 Identifier pour chacune de ces variables les endroits cls du programme qui la
concernent : par exemple lorsque lon lui affecte une valeur, en dbut ou en fin de
boucle.
3 Insrer un affichage lcran de chaque variable critique aux endroits appropris, en
noubliant pas de prciser de quelle variable on affiche la valeur.
ManuelDowek.book Page 52 Monday, July 9, 2012 4:58 PM
3 Les types
Groupe Eyrolles, 2012
53
Exercice 3.25 (avec corrig)
Le programme suivant est cens calculer la somme des carrs des n premiers
entiers.
Montrer que ce programme est erron laide dun test bien choisi.
Instrumenter ce programme pour dtecter lerreur et la corriger.
En testant le programme pour n = 0, 1 ou 2, on observe que le rsultat affich
est correct. En revanche, pour n = 3, on devrait trouver 1 1 + 2 2 + 3 3 =
14, or le programme affiche 5.
La variable critique est ici le compteur de boucle i, qui sert galement dans les
calculs. On affichera sa valeur la fin du corps de la boucle for. Pour cela on
insre cet endroit les lignes :
On constate alors que i contient 1 la fin de la premire itration, mais 4 la
fin de la deuxime itration et 25 la fin de la troisime. Il y a donc une ins-
truction dans le corps de la boucle qui modifie la valeur de i, ce quil ne faut
pas faire dans une boucle for. Une fois ceci constat, il nest pas difficile
dincriminer la ligne i = i * i;.
Outre le test et linstrumentation, il existe de nombreuses autres
mthodes de mise au point des programmes. Dans certains langages, les
types permettent de dtecter des erreurs de faon beaucoup plus pousse
quen Java. On peut aussi dmontrer quun programme vrifie certaines
proprits (voir le chapitre 18), ce qui vite en particulier davoir cher-
cher les erreurs ttons.
int i, n, somme;
n = Isn.readInt();
somme = 0;
for (i = 1; i <= n; i = i + 1) {
i = i * i;
somme = somme + i; }
System.out.println(somme);
System.out.print("i vaut ");
System.out.println(i);
ALLER PLUS LOIN
Pour de gros programmes
Une telle mthode est utilisable sur des pro-
grammes de petite taille, mais peut rapidement
devenir lourde mettre en place pour de gros
programmes : il faut dcider des variables
observer et des points du programme o cela a
un intrt, puis modifier le programme et le
recompiler, et enfin supprimer les affichages du
programme lorsque lon a identifi le problme.
Dans de nombreux environnements de dvelop-
pement logiciel, il existe des outils spcialiss, les
dbogueurs, pour obtenir des informations sur
ce quil se passe en mmoire durant lexcution
dun programme, ou bien excuter un pro-
gramme pas pas.
ManuelDowek.book Page 53 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
54
ALLER PLUS LOIN Un langage de programmation petit, mais complet
Maintenant que nous avons introduit la notion de dclaration, nous
pouvons construire un petit de langage de programmation qui contient
la dclaration de variables,
laffectation,
la squence,
le test
et la boucle while.
Ce langage de programmation, bien quil soit trs petit, est complet, ce
qui signifie que tous les programmes que lon peut imaginer peuvent
tre exprims dans ce langage.
Nous avons vu que linstruction :
for (i = e; i <= e'; i = i + 1) p
pouvait tre traduite en linstruction :
i = e;
while (i <= e') {p i = i + 1;}
qui ne contient que des affectations, des squences et une boucle
while. La boucle for nest donc quune manire plus confortable
dcrire des programmes qui pourraient sexprimer dans ce petit lan-
gage. De mme, les instructions qui utilisent les fonctions et la rcursi-
vit que nous introduirons aux chapitres 4 et 5, pourraient, en thorie,
tre traduites dans ce petit langage, mme si ces traductions sont beau-
coup plus complexes que celle de la boucle for.
De mme que tous les objets qui nous entourent sont forms de trois
types de particules : les protons, les neutrons et les lectrons, que tous
les textes que nous lisons sont forms de vingt-six lettres, et de quelques
signes de ponctuation, que toutes les pices de musiques que nous
entendons sont formes de douze notes, tous les programmes que nous
utilisons peuvent ultimement tre exprims avec ces cinq instructions :
la dclaration, laffectation, la squence, le test et la boucle.
Ai-je bien compris ?
Comment la dclaration dune variable transforme-t-elle ltat de lexcution dun
programme ?
Quels sont les diffrents types possibles pour une variable ?
Quest-ce que la porte dune variable ?
ManuelDowek.book Page 54 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
4 Les fonctions
CHAPITRE AVANC
John McCarthy (1927 - 2011) est
lauteur du langage Lisp (1958), dont
la principale construction est la dfi-
nition de fonctions. Il est aussi lun
des inventeurs de la notion de temps
partag, qui permet plusieurs per-
sonnes dutiliser un mme ordinateur
en mme temps. Il a crit lun des
premiers programmes jouant aux
checs et invent pour cela un algo-
rithme, la mthode alpha-bta, qui
permet de jouer non seulement aux
checs, mais aussi de nombreux
autres jeux. Il a aussi t un dfen-
seur de lide de progrs et de
limportance des mathmatiques
dans lducation.
Pour avoir du style, il faut viter les redites.
Dans ce chapitre, nous introduisons une nouvelle
construction : la dfinition de fonction, qui permet disoler une
instruction qui revient plusieurs fois dans un programme.
Une fonction est dfinie par un nom, par ses arguments
qui porteront les valeurs communiques par le programme
principal la fonction au moment de son appel et
ventuellement une valeur de retour communique
au programme par la fonction en fin dexcution.
Nous revenons dans ce chapitre sur la question de la porte
des variables dans le cas des programmes qui comportent
des fonctions. Nous introduisons aussi des variables globales
dont la porte est le programme tout entier.
ManuelDowek.book Page 55 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
56
Isoler une instruction
Au cours des chapitres prcdents, il nous est arriv dcrire des pro-
grammes dans lesquels certaines instructions revenaient plusieurs fois,
parce que nous voulions faire plusieurs fois la mme chose. Un exemple
de programme prsentant des rptitions est le suivant :
dans lequel linstruction
est rpte trois fois. Au lieu de rpter la totalit de cette instruction, on
peut lui donner un nom, par exemple tirerUnTrait, puis la remplacer par
ce nom dans le programme principal chaque fois quelle est utilise.
Pour dfinir la fonction tirerUnTrait, on procde de la faon suivante :
et on utilise ensuite cette fonction dans le programme principal, comme
si ctait une instruction du langage :
System.out.print("Le vol en direction de ");
System.out.print("Tokyo");
System.out.print(" dcollera ");
System.out.print("9h00");
System.out.println();
System.out.println("----------------------------------------");
System.out.println();
System.out.print("Le vol en direction de ");
System.out.print("Sydney");
System.out.print(" dcollera ");
System.out.print("9h30");
System.out.println();
System.out.println("----------------------------------------");
System.out.println();
System.out.print("Le vol en direction de ");
System.out.print("Toulouse");
System.out.print(" dcollera ");
System.out.print("9h45");
System.out.println();
System.out.println("----------------------------------------");
System.out.println();
System.out.println();
System.out.println("----------------------------------------");
System.out.println();
static void tirerUnTrait () {
System.out.println();
System.out.println("--------------------------------------");
System.out.println();}
T Fonction
Dans les langages de programmation, une fonc-
tion est une instruction isole du reste du pro-
gramme, qui possde un nom, et qui peut tre
appele par ce nom nimporte quel endroit du
programme et autant de fois que lon veut.
ManuelDowek.book Page 56 Monday, July 9, 2012 4:58 PM
4 Les fonctions
Groupe Eyrolles, 2012
57
Cette dfinition de fonction se place avant le programme principal, si
bien que lorganisation gnrale du programme est la suivante :
Utiliser des fonctions vite les rptitions dans les programmes et rend
donc ces derniers plus courts et, surtout, plus faciles lire et
comprendre : pour comprendre le programme ci-dessus, il nest pas
ncessaire de savoir comment la fonction tirerUnTrait est dfinie, il suffit
de savoir ce quelle fait. Utiliser des fonctions permet aussi dorganiser le
System.out.print("Le vol en direction de ");
System.out.print("Tokyo");
System.out.print(" dcollera ");
System.out.print("9h00");
tirerUnTrait();
System.out.print("Le vol en direction de ");
System.out.print("Sydney");
System.out.print(" dcollera ");
System.out.print("9h30");
tirerUnTrait();
System.out.print("Le vol en direction de ");
System.out.print("Toulouse");
System.out.print(" dcollera ");
System.out.print("9h45");
tirerUnTrait();
class Horaire {
static void tirerUnTrait () {
System.out.println();
System.out.println("------------------------------------");
System.out.println();}
public static void main (String [] args) {
System.out.print("Le vol en direction de ");
System.out.print("Tokyo");
System.out.print(" dcollera ");
System.out.print("9h00");
tirerUnTrait();
System.out.print("Le vol en direction de ");
System.out.print("Sydney");
System.out.print(" dcollera ");
System.out.print("9h30");
tirerUnTrait();
System.out.print("Le vol en direction de ");
System.out.print("Toulouse");
System.out.print(" dcollera ");
System.out.print("9h45");
tirerUnTrait();}}
T Corps dune fonction
Linstruction
System.out.println();
System.out.println("----...----");
System.out.println();
que lon isole par la dfinition de la fonction
tirerUnTrait sappelle le corps de cette fonc-
tion.
T Appel dune fonction
Linstruction tirerUnTrait(); sappelle un
appel de la fonction tirerUnTrait. Excuter cette
instruction a pour effet dexcuter le corps de la
fonction.
ManuelDowek.book Page 57 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
58
travail de dveloppement : on peut dcider dcrire le programme prin-
cipal un jour et dcrire la fonction tirerUnTrait le lendemain. On peut
aussi dcider de confier lcriture du programme principal un program-
meur et lcriture de la fonction tirerUnTrait un autre. Enfin, si lon
veut modifier la longueur du trait tirer ou le nombre de lignes sautes
au-dessus et en-dessous de ce trait, il suffit de modifier le corps de la
fonction et non le programme principal chacun des endroits concerns.
Passer des arguments
Le programme ci-prcdent est form de trois blocs qui annoncent
chacun lhoraire dun vol. On peut vouloir aller plus loin dans lorganisa-
tion de ce programme et crire une fonction annoncerUnVol, quil suffirait
dappeler trois fois dans le programme principal. Cependant, contraire-
ment lexemple de la fonction tirerUnTrait, ces trois blocs ne sont pas
absolument identiques : la destination et lhoraire du vol diffrent dun
cas lautre. Il faut donc paramtrer linstruction que lon isole pour pou-
voir choisir la destination et lhoraire du vol.
Dans notre exemple, les arguments doivent reprsenter la destination,
que lon nomme destination, et lhoraire de vol, que lon nomme horaire.
On dfinit alors cette fonction de la manire suivante :
Et le programme principal devient :
Excuter une instruction de la forme annoncerUnVol(e,e'); a pour effet
dvaluer les deux expressions e et e' et de fabriquer un nouvel tat dans
lequel deux botes de noms destination et horaire contiennent respecti-
vement la valeur de lexpression e et celle de lexpression e', dexcuter le
corps de la fonction dans cet tat, puis de revenir ltat initial. Dans
static void annoncerUnVol (String destination, String horaire) {
System.out.print("Le vol en direction de ");
System.out.print(destination);
System.out.print(" dcollera ");
System.out.print(horaire);
System.out.println();
System.out.println("--------------------------------------------");
System.out.println();}
annoncerUnVol("Tokyo","9h00");
annoncerUnVol("Sydney","9h30");
annoncerUnVol("Toulouse","9h45");
T Argument dune fonction
On appelle argument dune fonction une variable
particulire, utilise dans le corps de la fonction, et
dont la valeur est donne dans le programme prin-
cipal au moment o la fonction est appele.
ManuelDowek.book Page 58 Monday, July 9, 2012 4:58 PM
4 Les fonctions
Groupe Eyrolles, 2012
59
lexemple ci-avant, au moment o lon excute pour la premire fois
linstruction System.out.print(destination); du corps de la fonction, la
valeur de lexpression destination est "Tokyo". Lors du deuxime appel, la
valeur de lexpression destination est "Sydney". Et lors du troisime, elle
est "Toulouse".
Rcuprer une valeur
Le passage darguments permet donc de communiquer des informations
depuis le programme principal vers une fonction. On veut aussi souvent
communiquer des informations dans lautre sens : depuis une fonction,
vers le programme principal. Par exemple, si lon veut isoler, dans une
fonction, linstruction suivante qui calcule le nombre n de fois que le
caractre a apparat dans une chane s :
On veut non seulement que le programme principal puisse communi-
quer la chane de caractres s la fonction, mais aussi que la fonction
puisse communiquer le nombre n au programme principal. Cela mne
crire la fonction suivante :
Lexcution de linstruction return n; a pour effet dinterrompre lexcu-
tion du corps de la fonction et de renvoyer la valeur de lexpression n au
programme principal.
Comme la fonction nombreDea renvoie une valeur, lappel
nombreDea("abracadabra"), dans le programme principal, nest pas une ins-
truction, mais une expression, qui a la valeur 5. On peut lutiliser, par
exemple, dans une affectation x = nombreDea("abracadabra");.
int i, n;
n = 0;
for (i = 0; i <= Isn.stringLength(s) - 1; i = i + 1) {
if (Isn.stringEqual(Isn.stringNth(s,i), "a")) {
n = n + 1;}}
static int nombreDea (String s) {
int i, n;
n = 0;
for (i = 0; i <= Isn.stringLength(s) - 1; i = i + 1) {
if (Isn.stringEqual(Isn.stringNth(s,i), "a")) {
n = n + 1;}}
return n;}
T Valeur de retour
La valeur produite par une fonction partir de ses
arguments, sil en existe une, est appele valeur
de retour.
ManuelDowek.book Page 59 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
60
Si une fonction ne renvoie pas de valeur, par exemple si elle ne fait
quafficher des messages lcran, on fait prcder sa dfinition du mot-
cl void, sinon, on la fait prcder du type de sa valeur de retour.
Dans len-tte static void annoncerUnVol (String destination, String
horaire) on trouve le nom annoncerUnVol et les deux arguments
destination et horaire, lun et lautre de type String. Enfin, le mot-cl
void indique que cette fonction ne renvoie pas de valeur.
Exercice 4.1 (avec corrig)
crire len-tte dune fonction qui calcule la vitesse moyenne dun mobile con-
naissant son temps de parcours et la distance parcourue.
La fonction peut, par exemple, sappeler vitesse.
Les arguments sont tout indiqus : on les appelle, par exemple, temps et
distance.
Selon les units choisies, les arguments pourraient tre de type int ou
double. Cependant, on sait quil faut effectuer une division dcimale pour
calculer la vitesse et que cette opration requiert des nombres de type
double.
Enfin, la fonction doit renvoyer une valeur, la vitesse, qui est elle aussi de
type double cause de la division.
Len-tte de la fonction est donc static double vitesse (double temps,
double distance).
Exercice 4.2
crire len-tte des fonctions suivantes :
Une fonction qui indique sil est possible de construire un triangle avec
trois segments de mesures donnes.
Une fonction qui calcule le plus grand diviseur commun (PGCD) de deux
nombres entiers.
Une fonction qui trace lcran un segment entre deux points.
Une fonction qui crit lcran les initiales dune personne dont on donne
le nom complet.
T En-tte dune fonction
On appelle en-tte dune fonction la premire
ligne de sa dfinition, qui comporte dans lordre :
le mot-cl static,
le type de la valeur de retour de la fonction, ou
void le cas chant,
le nom de la fonction,
la liste de ses arguments entre parenthses,
chaque argument tant prcd de son type.
SAVOIR-FAIRE crire len-tte dune fonction
1 Choisir un nom qui indique clairement ce que fait la fonction.
2 Identifier les arguments qui varient lors des diffrents appels de la fonction dans le
programme principal. Donner un nom chacun de ces arguments.
3 Identifier un type appropri pour chacun de ces arguments.
4 Identifier si la fonction renvoie une valeur et, si oui, le type de cette valeur.
ALLER PLUS LOIN Lordre des arguments
Lordre des arguments na pas dimportance
pour la dfinition de la fonction : les en-ttes
static void annoncerUnVol (String
destination, String horaire) et
static void annoncerUnVol (String
horaire, String destination) permet-
tent de dfinir la mme fonction.
En revanche, lors dun appel cette fonction,
lordre des arguments doit tre respect :
annoncerUnVol("Tokyo","9h00"); est
correct vis--vis du premier en-tte, mais
annoncerUnVol("9h00","Tokyo"); nest
correct que vis--vis du second.
ManuelDowek.book Page 60 Monday, July 9, 2012 4:58 PM
4 Les fonctions
Groupe Eyrolles, 2012
61
Exercice 4.3 (avec corrig)
crire une fonction qui effectue la division dcimale de deux nombres entiers.
On appelle la fonction divisionDecimale. Il est spcifi ici que les argu-
ments doivent tre de type int ; on va les appeler dividende et diviseur.
La fonction renvoie une valeur qui ne peut tre que de type double car
cest le rsultat dune division dcimale. Son en-tte est donc :
static double divisionDecimale (int dividende, int diviseur).
Il faut prvoir une variable de type double pour noter le quotient de la divi-
sion et le renvoyer. En outre, lintrt de dfinir une telle fonction est
quelle prend systmatiquement en charge la conversion de type de ses
arguments, de faon transparente pour lutilisateur. Le corps de la fonction
doit donc comporter notamment les lignes suivantes :
On termine cette fonction par linstruction return quotient;.
Si lon veut une fonction qui prvoit tous les cas, notamment lorsque le
diviseur fourni est nul, il faut galement renvoyer une valeur, choisie arbi-
trairement mais de type conforme celui prvu dans len-tte. La fonction
peut donc se prsenter ainsi :
Le choix est fait ici de renvoyer le double spcial + (voir le chapitre 7) si le
diviseur est nul, par analogie avec la limite de la fonction inverse lorsque
x tend vers 0 par valeurs positives. Ce choix est discutable, dune part car une
division par zro ne se produit pas forcment lorsque lon recherche une
limite, dautre part car est une autre limite possible pour un quotient dont
le dnominateur tend vers 0, par exemple la fonction inverse lorsque x tend
vers 0 par valeurs ngatives.
SAVOIR-FAIRE crire une fonction
1 crire len-tte de la fonction.
2 crire le corps de la fonction comme si les arguments taient dj remplis par des
valeurs.
3 Ne pas oublier linstruction return, le cas chant.
4 Prvoir une excution correcte de la fonction quelle que soit la valeur donne chacun
des arguments, y compris dans des cas que lon na pas forcment anticips dans le cours
normal du programme principal.
double quotient;
quotient = ((double) dividende) / ((double) diviseur);
static double divisionDecimale (int dividende, int diviseur) {
double quotient;
if (denominateur == 0) {
quotient = Double.POSITIVE_INFINITY;}
else {
quotient = ((double) dividende) / ((double) diviseur);}
return quotient;}
T Dfinition dune fonction
Au bout du compte, la dfinition dune fonction est
forme de son en-tte, puis du corps de la fonc-
tion, entre accolades.
ManuelDowek.book Page 61 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
62
Cette fonction doit donc tre accompagne dune documentation qui prcise
ce qui se passe dans ce genre de cas. On aurait pu galement faire le choix
dafficher un message, par exemple System.out.println("Erreur : division
par 0 interdite."); mais ce dernier risquerait dinterfrer avec les autres sor-
ties du programme, et si la fonction est appele plusieurs fois au cours du pro-
gramme, il ne serait pas directement possible de savoir quel appel lerreur
sest produite.
Exercice 4.4
crire les fonctions suivantes.
Une fonction qui renvoie la plus grande de deux valeurs de type int.
Une fonction qui rpte un mme mot un certain nombre de fois au choix.
Une fonction, construite partir de la fonction Math.random, qui tire au
sort un nombre entier entre deux bornes donnes en arguments.
Une fonction qui dcide sil est possible de construire un triangle avec trois
segments de mesures donnes.
Exercice 4.5
crire une fonction qui prend en argument une chane de caractres s et deux
entiers i et j, et renvoie la sous-chane de s comprise entre le caractre
numro i inclus et le caractre numro j exclu.
Le programme principal
En Java, il a t choisi de faire du programme principal une fonction
particulire qui porte un nom spcial : main.
La porte des variables
et les variables globales
Isoler linstruction x = 0; dans le programme suivant :
public static void main (String [] args) {
int x;
x = 3;
x = 5;
x = 0;
x = 7;
x = 0;
x = 4;}
ManuelDowek.book Page 62 Monday, July 9, 2012 4:58 PM
4 Les fonctions
Groupe Eyrolles, 2012
63
mnerait crire une fonction :
et le programme principal :
Cependant, ce programme nest pas correct. En effet, si ltat dans lequel
on excute linstruction reinitialise(); dans le programme principal est
form dune bote de nom x qui contient, par exemple, la valeur 5, ltat
dans lequel le corps de cette fonction est excut ne contient en revanche
aucune bote, si bien que quand on excute linstruction x = 0; il ny a
pas de bote de nom x.
Une autre manire de voir le problme est quen dplaant linstruction
x = 0; du programme principal vers le corps de la fonction, on a sorti
laffectation de la variable x de la porte de cette variable. Or, la
variable x ne peut tre utilise que dans la partie en gras du programme :
Une manire de rsoudre ce problme est de dclarer la variable x de
manire ce que sa porte soit le programme entier.
static void reinitialise () {
x = 0;}
public static void main (String [] args) {
int x;
x = 3;
x = 5;
reinitialise();
x = 7;
reinitialise();
x = 4;}
static void reinitialise () {
x = 0;}
public static void main (String [] args) {
int x;
x = 3;
x = 5;
reinitialise();
x = 7;
reinitialise();
x = 4;}
static int x;
static void reinitialise () {
x = 0;}
public static void main (String [] args) {
x = 3;
x = 5;
T Variable globale ou locale
Une variable globale est une variable dclare
en dbut de programme, en dehors du programme
principal et de toute fonction. Sa porte est le pro-
gramme entier. En Java, la dclaration dune
variable globale est prcde du mot-cl static.
Par opposition, une variable locale est dclare
lintrieur dune fonction ou du programme prin-
cipal, qui est une fonction particulire. Elle nest
pas utilisable depuis les autres fonctions.
ManuelDowek.book Page 63 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
64
Ainsi, dans cet exemple, le corps de chaque fonction est excut dans un
environnement qui contient une bote x.
Dans un programme qui, comme celui-ci, contient des variables glo-
bales, lappel dune fonction a comme effet lexcution du corps de la
fonction, dans un tat qui contient dune part des botes qui ont comme
noms les arguments de la fonction, dautre part des botes qui ont
comme noms les variables globales. Quand lexcution du corps de la
fonction est acheve, on supprime les botes qui correspondent aux argu-
ments de la fonction, on garde celles qui correspondent aux variables
globales et on remet celles qui correspondent aux variables du pro-
gramme principal.
Par exemple, dans le programme suivant :
1 On excute le programme principal dans ltat qui contient la
variable globale a.
2 Au cours de lexcution du programme principal, on dclare une
autre variable n. On affecte la valeur 3 la variable a et la valeur 4 la
variable n ().
3 Au moment de lappel f(a + n); de la fonction f, on supprime la
bote de nom n de ltat, car n est une variable locale au programme
principal, mais on garde la bote de nom a car a est une variable glo-
bale, et on ajoute une bote de nom x, qui contient la valeur 7 de
lexpression a + n ().
4 On excute alors le corps de la fonction, ce qui a pour effet
dafficher 14 et daffecter cette valeur la variable a ().
5 En quittant la fonction pour revenir au programme principal, on sup-
prime la bote de nom x et on remet la bote de nom n avec le contenu
quelle possdait avant lappel de la fonction ().
reinitialise();
x = 7;
reinitialise();
x = 4;}
static int a;
static void f (int x) {
System.out.println(2 * x);
a = 2 * x;}
public static void main (String [] args) {
int n;
a = 3;
n = 4;
f(a + n);}
ManuelDowek.book Page 75 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
76
ALLER PLUS LOIN Les licences logicielles : logiciel libre versus logiciel propritaire
Quand on crit un programme qui est utilis par dautres
personnes que soi, on doit prciser ses conditions dutili-
sation par un contrat qui sappelle une licence logicielle.
Les programmes ont certains points communs avec
dautres biens non rivaux (voir le chapitre 11), comme les
inventions et les uvres de lesprit . Cela explique que
le droit des licences ait certains points communs avec le
droit des brevets et le droit dauteur. Le droit des brevets
et le droit dauteur donnent aux inventeurs et aux
auteurs le monopole de lexploitation de leur cration et
les autorisent vendre ce droit dexploitation. Ils favori-
sent donc la cration, en permettant aux crateurs de
gagner de largent. Cependant, ils la freinent galement,
car ils interdisent dautres dutiliser ces crations et de
poursuivre le travail de leurs auteurs. Cest pour cela que
ce monopole dexploitation est toujours limit dans le
temps et que, dans le droit des brevets, linventeur est
souvent tenu de rendre terme son invention publique.
Il y a principalement deux formes de licences logicielles :
les licences propritaires (ou privatrices) et les licences
libres. Avec une licence propritaire, lauteur donne sim-
plement un droit dutilisation de son programme. La plu-
part du temps, il diffuse le code compil de son
programme, mais en garde le code source (voir le
chapitre 15) secret. Avec une licence libre, en revanche, il
donne le droit ses utilisateurs non seulement dutiliser
son programme, mais aussi den tudier le fonctionne-
ment et de le modifier. Il diffuse donc la fois le code
compil et le code source.
Parmi les licences libres, il y a encore deux types de
licences. Les licences contaminantes, comme la General
Public Licence (GPL), imposent, dans le cas de la diffusion
du programme modifi, de le diffuser avec la mme
licence, afin de faire bnficier les autres des mmes
liberts que celles dont on a soi-mme bnfici.
Dautres licences, comme la licence Berkeley Software Dis-
tribution (BSD), donnent la libert de modifier le pro-
gramme et de diffuser la version modifie sous une
licence propritaire.
Les licences libres ont permis un nouveau mode de dve-
loppement des logiciels, par une dmarche qui a un cer-
tain nombre de points communs avec la recherche
scientifique : coopration internationale, publication,
validation par les pairs, libert de critiquer et de modi-
fier, etc., alors que, dans les temps anciens, Pythagore,
par exemple, interdisait ses disciples de divulguer leurs
thormes et leurs dmonstrations. Au-del des pro-
grammes, cette nouvelle manire de produire et de dif-
fuser des objets industriels prfigure peut-tre une
volution plus globale de lindustrie, dans un monde
dans lequel de plus en plus de biens industriels sont com-
plexes et immatriels.
Ai-je bien compris ?
quoi sert une fonction ?
De quels lments la dfinition dune fonction est-elle compose ?
Comment utilise-t-on une fonction dans un programme ?
ManuelDowek.book Page 76 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
5 La rcursivit
CHAPITRE AVANC
Christopher Strachey (1916-1975)
et Dana Scott (1932-) ont donn
une smantique aux dfinitions
rcursives : la dfinition f = G(f) nest
pas circulaire, mais une dfinition
de f comme point fixe de G. Christo-
pher Strachey est aussi lauteur dun
des premiers programmes jouant aux
dames et de lun des premiers pro-
grammes dinformatique musicale.
Avec Michael Rabin, Dana Scott a
tudi les systmes tats et transi-
tions (voir le chapitre 22) non dter-
ministes, cest--dire dans lesquels
plusieurs transitions sont possibles
partir dun mme tat.
Une dfinition rcursive est une dfinition rcursive.
Dans ce chapitre, nous voyons quune fonction peut sappeler
elle-mme. Cette construction, alternative celle de boucle,
permet dcrire des programmes courts et lgants.
ManuelDowek.book Page 77 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
78
Des fonctions qui
appellent des fonctions
Au chapitre 4, nous avons vu que les fonctions permettaient disoler une
instruction du programme principal. Par exemple, au lieu dcrire le
programme :
il est possible dcrire le programme :
static public void main (String [] args) {
System.out.print("Le vol en direction de ");
System.out.print("Tokyo");
System.out.print(" dcollera ");
System.out.print("9h00");
System.out.println();
System.out.println("--------------------------------------------");
System.out.println();
System.out.print("Le vol en direction de ");
System.out.print("Sydney");
System.out.print(" dcollera ");
System.out.print("9h30");
System.out.println();
System.out.println("--------------------------------------------");
System.out.println();
System.out.print("Le vol en direction de ");
System.out.print("Toulouse");
System.out.print(" dcollera ");
System.out.print("9h45");
System.out.println();
System.out.println("--------------------------------------------");
System.out.println();}
static void annoncerUnVol (String destination, String horaire) {
System.out.print("Le vol en direction de ");
System.out.print(destination);
System.out.print(" dcollera ");
System.out.print(horaire);
System.out.println();
System.out.println("--------------------------------------------");
System.out.println();}
static public void main (String [] args) {
annoncerUnVol("Tokyo","9h00");
annoncerUnVol("Sydney","9h30");
annoncerUnVol("Toulouse","9h45");}
ManuelDowek.book Page 78 Monday, July 9, 2012 4:58 PM
5 La rcursivit
Groupe Eyrolles, 2012
79
Il est aussi possible disoler linstruction :
de la fonction annoncerUnVol et dcrire ce programme ainsi :
o la fonction tirerUnTrait est appele, non depuis le programme prin-
cipal, mais depuis le corps de la fonction annoncerUnVol.
Des fonctions qui
sappellent elles-mmes
Il est mme possible daller plus loin et dappeler une fonction f, non
depuis le corps dune fonction g, mais depuis le corps de la fonction f
elle-mme. Cest, par exemple, le cas de la fonction suivante :
Le cas le plus simple est celui de lappel puissance(0) qui retourne la
valeur 1 sans avoir besoin de refaire un appel la fonction puissance.
System.out.println();
System.out.println("--------------------------------------------");
System.out.println();
static void tirerUnTrait () {
System.out.println();
System.out.println("-------------------------------------------");
System.out.println();}
static void annoncerUnVol (String destination, String horaire) {
System.out.print("Le vol en direction de ");
System.out.print(destination);
System.out.print(" dcollera ");
System.out.print(horaire);
tirerUnTrait ();}
static public void main (String [] args) {
annoncerUnVol("Tokyo","9h00");
annoncerUnVol("Sydney","9h30");
annoncerUnVol("Toulouse","9h45");}
static int puissance (int exposant) {
if (exposant == 0) {
return 1;}
else {
return (2 * puissance(exposant 1));}}
T Fonction rcursive
Une fonction rcursive est une fonction qui
sappelle elle-mme.
ManuelDowek.book Page 79 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
80
On peut alors comprendre la valeur retourne par lappel puissance(1) :
quand on excute le corps de la fonction dans un tat dans lequel la bote
de nom exposant contient la valeur 1, on value lexpression
2 * puissance(exposant 1). Comme la valeur de lexpression exposant
est 1, celle de lexpression exposant 1 est 0 et celle de lexpression
puissance(exposant 1) est, comme on la vu, 1. Celle de lexpression
2 * puissance(exposant 1) est donc 2. Lappel puissance(1) retourne
donc la valeur 2.
De mme, lappel puissance(2) retourne la valeur 4, lappel puissance(3)
retourne la valeur 8, et ainsi de suite.
Plus gnralement, la valeur retourne par lappel puissance(k + 1) est le
double de celle retourne par lappel puissance(k). La valeur retourne
par lappel puissance(k) est donc 2
k
.
Cette fonction calcule donc la mme chose que la fonction :
Toutefois, elle utilise cette possibilit pour une fonction de sappeler elle-
mme, au lieu dutiliser une boucle.
On note que dans la dfinition rcursive de la fonction puissance, la
valeur de largument exposant diminue chaque appel de la fonction et le
test effectu au dbut du corps de la fonction assure que la fonction
puissance ne sappelle pas elle-mme au cours de son excution dans un
tat dans lequel la bote de nom exposant contient la valeur 0. Cette
observation fournit la garantie que tout appel la fonction puissance avec
un argument qui est un nombre entier positif exposant se termine aprs
exposant appels. Les fonctions rcursives et celles utilisant les boucles
partagent ainsi la mme proccupation de terminaison.
static int puissance (int exposant) {
int i,resultat;
resultat = 1;
for (i = 1; i <= exposant; i = i + 1) {
resultat = 2 * resultat;}
return resultat;}
ATTENTION Prvoir un cas de base
Dans la dfinition dune fonction rcursive, il
faut toujours prvoir au moins un cas de base,
comme le cas exposant == 0 dans la dfini-
tion ci-avant, dans lequel la fonction ne
sappelle pas elle-mme ; sinon elle sappellera
elle-mme indfiniment.
ManuelDowek.book Page 80 Monday, July 9, 2012 4:58 PM
5 La rcursivit
Groupe Eyrolles, 2012
81
Exercice 5.1 (avec corrig)
crire une fonction rcursive qui calcule le quotient de la division euclidienne
dun nombre entier naturel par un autre, bien entendu sans utiliser
lopration / du langage.
Le dividende et le diviseur sont les deux arguments et la valeur de retour
est le quotient. On a donc len-tte :
Une dfinition rcursive est possible : on diminue le dividende chaque
appel rcursif jusqu avoir compt combien de fois il contient le diviseur.
Le cas de base est celui o le dividende est infrieur au diviseur : le quo-
tient est alors nul. La fonction commence donc par le test :
Dans les autres cas, le dividende est suprieur au diviseur, on retranche le
diviseur au dividende et largument ainsi modifi reste positif. Le diviseur
nest pas modifi. La fonction se termine toujours car le dividende, qui est
un entier positif, ne peut pas diminuer indfiniment.
chaque appel rcursif, on compte une fois le diviseur dans le dividende,
le quotient doit donc augmenter de 1. La fonction scrit donc :
Exercice 5.2
Modifier le programme ci-avant pour quil calcule, non le quotient, mais le
reste dune division euclidienne.
SAVOIR-FAIRE Dfinir une fonction rcursive
1 crire len-tte de la fonction (voir le savoir-faire, page 60, crire len-tte dune
fonction ).
2 Vrifier tout dabord que la fonction est adapte une dfinition rcursive, autrement
dit que lon sait calculer une valeur partir dun appel plus simple la mme fonction.
3 Prvoir le ou les cas de base, qui ne ncessitent pas dappel rcursif de la fonction.
4 Dans tous les appels rcursifs, sassurer que les arguments sont plus simples que ceux avec les-
quels la fonction a t appele : nombres plus petits, chanes de caractres plus courtes, etc.
5 Reconstituer correctement la valeur de retour de la fonction partir du rsultat du ou
des appel(s) rcursif(s).
static int quotient (int dividende, int diviseur)
if (dividende < diviseur) {
return 0;}
static int quotient (int dividende, int diviseur) {
if (dividende < diviseur) {
return 0;}
else {
return 1 + quotient (dividende diviseur, diviseur);}}
ManuelDowek.book Page 81 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
82
Exercice 5.3
crire une fonction rcursive qui calcule le logarithme entier dun nombre
(voir le chapitre 2).
Exercice 5.4
crire une fonction rcursive qui calcule la factorielle dun nombre
n! = 1 2 (n 1) n.
Exercice 5.5
crire une fonction rcursive qui calcule le plus grand diviseur commun (PGCD)
de deux nombres entiers, en utilisant lalgorithme dEuclide. Dans ce pro-
gramme, en quoi les arguments de lappel rcursif sont-ils plus simples que
ceux avec lesquels la fonction est appele ?
Exercice 5.6
Programmer rcursivement le calcul du terme de rang n de la suite de Fibo-
nacci dfinie par :
u
0
= u
1
= 1
u
n+2
= u
n
+ u
n+1
Quy a-t-il de particulier dans cette fonction rcursive ? Que se passe-t-il si on
excute ce programme pour de grandes valeurs de n, partir de 35 ou 45
selon la machine utilise ? Par ailleurs, indpendamment de la machine uti-
lise, partir de n = 46, les valeurs donnes par ce programme deviennent
incorrectes. Expliquer ces deux phnomnes.
ALLER PLUS LOIN Lefficacit des fonctions rcursives
Comme on a pu le voir sur lexemple de la suite de Fibo-
nacci, si les dfinitions rcursives rendent parfois trs
pratiques lcriture dun programme, elles peuvent aussi
avoir des consquences trs nfastes sur leur efficacit.
Ainsi, dans notre exemple, pour calculer u
10
, il faut cal-
culer u
9
et u
8
, mais comme u
9
est calcul rcursivement,
pour lobtenir il faut calculer u
8
et u
7
. Le calcul de u
8
est
donc fait deux fois. On peut montrer de mme que u
7
est
calcul trois fois, u
6
cinq fois, etc.
Cela nest pas un problme inhrent aux fonctions rcur-
sives, cest juste un pige dans lequel on peut facilement
tomber quand on en crit une. Il faut dans un tel cas se
demander si certains calculs ne sont pas faits plusieurs
fois, et si cest le cas comment lviter. Les solutions habi-
tuelles sont de mmoriser, dune faon ou dune autre,
les calculs dj effectus et qui serviront nouveau. Dans
le cas de la suite de Fibonacci, il suffit de calculer les
termes de la suite dans lordre en se souvenant des deux
dernires valeurs calcules. Avec les fonctions rcursives,
on appelle accumulateurs les arguments qui propagent
ces deux valeurs dun appel de la fonction au suivant.
static int fib (int n, int u1, int u0) {
if (n > 1) {
return fib(n - 1,u1 + u0,u1);}
else {
if (n == 1) {
return u1;}
else {
return u0;}}}
Cette fonction permet en ralit de calculer le n-me
terme de toute suite vrifiant la mme relation de rcur-
rence que la suite de Fibonacci, en spcifiant les valeurs
de u
0
et u
1
. Pour le n-me terme de la suite de Fibonacci
elle-mme, il suffit dappeler fib(n,1,1).
ManuelDowek.book Page 82 Monday, July 9, 2012 4:58 PM
5 La rcursivit
Groupe Eyrolles, 2012
83
Des images rcursives
La rcursivit est un outil utile en gomtrie algorithmique et en syn-
thse dimages. Observons, par exemple, le dessin ci-contre.
Une manire de le dcrire est de dire quil est form :
dun cercle, en rouge sur la figure ci-contre,
en haut et droite de ce cercle, de deux cercles tangents de rayon
moiti moindre, en vert sur la figure,
en haut et droite de chacun de ces cercles, de deux cercles tangents
de rayon moiti moindre, en bleu sur la figure,
en haut et droite de chacun de ces cercles, de deux cercles tangents
de rayon moiti moindre,
etc.
Toutefois, une autre manire de le dcrire est de dire quil est form dun
cercle, en rouge sur la figure ci-contre et de deux copies moiti plus
petites du dessin lui-mme, en vert et en bleu sur la figure.
Cela nous montre comment crire une fonction rcursive qui dessine
cette figure : pour dessiner une figure dont le plus grand cercle a le
centre (x ; y) et le rayon rayon, on trace dabord ce cercle, puis on
appelle rcursivement deux fois la fonction dessiner en centrant le
grand cercle en (x + 3 * rayon / 2 ; y) et en (x ; y - 3 * rayon / 2) et
en lui donnant le rayon rayon / 2.
Il ne reste plus qu appeler dans le programme principal la fonction
dessiner(200,200,64);.
Exercice 5.7
Quel est largument qui assure que cette fonction ne sappelle elle-mme
quun nombre fini de fois ? Avec lappel initial propos, combien dappels
rcursifs auront lieu ?
Un dessin plus joli est obtenu en entourant chaque cercle, non pas de
deux, mais de trois dessins plus petits dans des directions qui dpendent de
sa position : sil est lui mme droite dun cercle plus grand, par exemple,
alors il est form dun cercle et de trois dessins situs en haut, en bas et
droite, mais pas gauche, de ce cercle. Pour cela, on fait correspondre un
nombre chaque direction et on ajoute un argument la fonction.
static void dessiner (int x, int y, int rayon) {
Isn.drawCircle(x,y,rayon,0,0,0);
if (rayon > 1) {
dessiner(x + 3 * rayon / 2,y,rayon / 2);
dessiner(x,y 3 * rayon / 2,rayon / 2);}}
ManuelDowek.book Page 83 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
84
Exercice 5.8
Que reprsente le nouvel argument v dans cette fonction ? Quel nom serait
plus explicite pour cet argument ?
Exercice 5.9
Comment utiliser, sans la modifier, cette dernire fonction pour obtenir le
dessin complet o le cercle central est entour de quatre motifs identiques en
haut, en bas, droite et gauche ?
// Dfinition des directions
static int gauche = 0;
static int droite = 1;
static int haut = 2;
static int bas = 3;
static int aucun = 4;
// Dessin
static void dessiner (int x, int y, int rayon, int v) {
Isn.drawCircle(x,y,rayon,0,0,0);
if (rayon > 1) {
if (v != droite) {
dessiner(x + 3 * rayon / 2,y,rayon / 2,gauche);}
if (v != gauche) {
dessiner(x - 3 * rayon / 2,y,rayon / 2,droite);}
if (v != haut) {
dessiner(x,y - 3 * rayon / 2,rayon / 2,bas);}
if (v != bas) {
dessiner(x,y + 3 * rayon / 2,rayon / 2,haut);}}}
Ai-je bien compris ?
Quest-ce quune fonction rcursive ?
Quelle autre construction la rcursivit permet-elle souvent de remplacer ?
Que faut-il toujours prvoir dans la dfinition dune fonction rcursive, si on veut que
cette fonction se termine ?
ManuelDowek.book Page 84 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
6
La notion
de langage
formel
CHAPITRE AVANC
Lidographie de Gottlob Frege
(1848 - 1925) est le premier langage
formel propos pour exprimer
lensemble des mathmatiques. Ce
langage a t aujourdhui aban-
donn, mais il est lorigine de la
thorie des ensembles, de la logique
des prdicats et, en grande partie,
des langages formels utiliss en infor-
matique, en particulier des langages
de programmation. Lorigine com-
mune des mots langage ,
logique et logiciel nous rap-
pelle les liens entre la logique
ltude du langage mathmatique
et linformatique.
Les langages informatiques sont presque comme
les langues naturelles. Mais pas tout fait.
Dans ce chapitre, hors programme lexception de la section
Redfinir la smantique , nous introduisons la notion
de langage formel, au-del des langages de programmation,
et nous comparons ces langages aux langues naturelles.
Nous prenons lexemple du langage HTML, prsent
au chapitre 8. Ceci nous permet de prsenter les notions
de grammaire et de smantique.
La grammaire dfinit quelles sont les chanes de caractres,
par exemple les programmes, qui sont correctement forms.
La smantique dfinit ce qui se passe quand on utilise un texte,
par exemple quand on excute un programme.
ManuelDowek.book Page 85 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
86
Aux chapitres 1 5, 15, 8 et 11, nous avons vu plusieurs langages : des
langages de programmation tout dabord, mais aussi, plus brivement,
des langages de description de pages web et des langages dinterrogation
de bases de donnes. Ces langages informatiques ont un certain nombre
de points communs avec les langues naturelles comme le franais ou le
japonais : ils servent exprimer et communiquer des ides. Cependant,
ils ont aussi un certain nombre de diffrences.
Les langages informatiques
et les langues naturelles
Nous avons vu quun langage de programmation, comme Java, permet
dexprimer tous les algorithmes. Toutefois, il ne permet dexprimer que
des algorithmes. On ne peut pas lutiliser pour crire un roman, un con-
trat ou une carte postale. Cest donc un langage spcialis. Une langue
naturelle, en revanche, peut tre utilise non seulement pour exprimer
des algorithmes, mme si cest souvent de manire imprcise, mais aussi
pour crire des cartes postales, des contrats et des romans : les langues
naturelles sont universelles.
Le vocabulaire dune langue naturelle contient plusieurs milliers de mots.
Celui dun langage informatique, par exemple un langage de programma-
tion, nen contient que quelques dizaines : par exemple if, while, for et
int. En revanche, le vocabulaire dun langage informatique est souvent
extensible : en dfinissant une fonction tirerUnTrait, ou en dclarant une
variable x, on ajoute un nouveau mot au langage, souvent avec une porte
limite, ce que lon ne peut pas faire dans une langue naturelle.
La grammaire des langages informatiques est plus simple, mais plus pr-
cise, que celle des langues naturelles : un point-virgule oubli dans un pro-
gramme et celui-ci nest plus correct, alors quil est difficile de trouver une
phrase en franais qui serait incomprhensible cause dun signe de ponc-
tuation oubli. De plus, la frontire entre les phrases correctes et les
phrases incorrectes dans une langue naturelle nest pas si bien dfinie.
Ainsi, la phrase Nous, on y est pas all, mon frre et moi, au cinma.
manifeste une moins grande matrise de la langue que la phrase Ni mon
frre ni moi ne sommes alls au cinma. , mais elle reste comprhensible.
En revanche, il ny a aucune discussion possible sur le fait quun pro-
ALLER PLUS LOIN
La grammaire des langues naturelles
La grammaire des langues naturelles est beau-
coup plus complexe que celle des langages for-
mels, en particulier parce quelle tient compte
de nombreuses exceptions : homonymie, syno-
nymie, etc. Ainsi, en franais, la phrase les
poules du couvent couvent est correcte.
ManuelDowek.book Page 86 Monday, July 9, 2012 4:58 PM
6 La notion de langage formel
Groupe Eyrolles, 2012
87
gramme soit grammaticalement correct ou non, car la correction gramma-
ticale, dans un langage de programmation, est dfinie par un algorithme.
Enfin, ces langages informatiques appartiennent exclusivement au
domaine de lcrit : une pice de thtre est crite pour tre dite haute
voix, pas un programme.
Les anctres des langages
formels
Pour les distinguer des langues naturelles, on appelle langages formels ces
langages artificiels la grammaire simple, mais prcise. Lapparition,
avec linformatique, de ces langages est une tape importante de lhis-
toire du langage. Certains la comparent mme linvention de lcriture
ou de lalphabet. Cependant, une fois que lon a pris conscience de la
spcificit de ces langages, on peut se demander si certains de leurs traits
ntaient pas dj prsents dans des langages spcialiss plus anciens, en
particulier dans ceux utiliss en sciences, en droit et en musique.
Tout dabord, sans cesser dtre une langue naturelle, la langue scienti-
fique prsente quelques aspects qui rappellent les langages informati-
ques. Par exemple, elle donne la possibilit dintroduire de nouveaux
mots par des dfinitions. Sil nest pas possible dans la langue courante
de dire On appellera pagneul breton un steak saignant. , puis Je vou-
drais manger un pagneul breton. , on peut, dans la langue scientifique,
donner une dfinition : On appellera travail dune force, son produit
scalaire avec le dplacement de son point dapplication. , puis utiliser le
mot dfini : Le travail dune force orthogonale au dplacement de son
point dapplication est nul. Une fois dfini, le mot travail a une
porte illimite, mais ce nest pas le cas du mot x si on lintroduit dans
une dmonstration mathmatique par la dfinition x = y + 4. Une fois
cette dmonstration acheve, il nest plus possible dutiliser le mot x pour
dsigner la valeur y + 4. De mme, dans le langage juridique, on dbute
le texte dun contrat en donnant lidentit des contractants et en indi-
quant un mot par lequel ils seront dsigns dans la suite du contrat. Par
exemple, Contrat de location entre les sous-signs, Monsieur Dupond,
demeurant 1, rue Durand, Grenoble, ci-aprs dsign le loueur et
Monsieur Durand, demeurant 1, rue Dupond, Grenoble, ci-aprs
dsign le locataire . Bien entendu, cette manire de dsigner Mon-
ManuelDowek.book Page 87 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
88
sieur Dupond et Monsieur Durand comme le loueur et le
locataire a une porte limite au texte de ce contrat.
Cependant, il y a aussi des situations o lon sloigne davantage des lan-
gues naturelles et cre de vritables langages formels, au vocabulaire limit
et la grammaire simple mais prcise. Par exemple, la nomenclature des
composs chimiques, la notation musicale et le langage algbrique. Ainsi,
dans la nomenclature des composs chimiques, il y a un chlorure
daminomthylpyrimidinylhydroxythylmthythiazolium, mais pas de
chlorure dpagneul breton : seul un nombre restreint de mots peut tre
employ dans ce langage. Comme la nomenclature des composs chimi-
ques, la notation musicale utilise un vocabulaire restreint et une grammaire
simple, mais prcise : elle autorise mettre six croches dans une mesure
binaire trois temps, mais pas quatre noires. De mme, le langage alg-
brique permet dappliquer la relation < deux expressions, mais pas la
relation < elle-mme : on peut crire x
2
< 4, mais pas x
2
< <.
Ces langages formels sont relativement rcents : la notation musicale date
du XIII
e
sicle, la notation algbrique du XVI
e
sicle et la nomenclature
des composs chimiques du XIX
e
sicle. Avant linvention de la notation
algbrique, on crivait les quations en langue naturelle, par exemple
lquation x
3
+ 3 x
2
= 20 scrivait : un cube et trois carrs font vingt.
Nanmoins, ces langages sont tous les trois antrieurs linformatique.
La ranon de luniversalit des langues naturelles semble donc tre leur
incapacit exprimer prcisment les choses, ds que lon sintresse
un domaine prcis comme les sciences, le droit ou la musique. Raison
pour laquelle les scientifiques, les juristes ou les musiciens se sont loi-
gns des langues naturelles, parfois par de petits carts, parfois en crant
de vritables langages formels. Lapparition et la gnralisation, avec
linformatique, des langages formels taient donc prpares par le dve-
loppement de ces langages spcialiss, plus ou moins formels.
Les langages formels
et les machines
Les langages de programmation, et plus gnralement les langages
informatiques, sont soumis une double contrainte. Ils doivent tre uti-
lisables par les tres humains qui crivent les programmes, mais aussi par
les machines qui les excutent. Cette seconde contrainte explique en
ALLER PLUS LOIN Mlanger langages formels
et langues naturelles
Souvent, dans un texte scientifique, on mlange
des passages crits dans des langages formels,
comme le langage algbrique, et des passages
crits en langue naturelle : Supposons quil
existe deux nombres entiers non nuls et pre-
miers entre eux tels que x
2
= 2 y
2
. Le nombre x
2
est pair et, daprs le lemme 1, le nombre x
galement : il existe donc un nombre x tel que
x = 2 x. On en dduit (2 x)
2
= 2 y
2
, cest--
dire 4 x
2
= 2 y
2
, do on tire y
2
= 2 x
2
. Le
nombre y
2
est donc pair et, en utilisant le
lemme 1 nouveau, le nombre y galement.
Les nombres x et y sont tous les deux pairs, ce
qui est en contradiction avec lhypothse .
ManuelDowek.book Page 88 Monday, July 9, 2012 4:58 PM
6 La notion de langage formel
Groupe Eyrolles, 2012
89
partie que ce soient des langages formels. Au dbut de linformatique,
cette seconde contrainte tait prpondrante et seuls existaient les lan-
gages machine, comme celui dcrit au chapitre 15, ce qui rendait lcri-
ture de ces programmes difficile pour les tres humains, mais dune
excution relativement facile pour les machines. Lhistoire des langages
de programmation est celle des efforts entrepris pour rendre ces langages
plus faciles utiliser par les tres humains, tout en gardant la possibilit
de les traduire en langage machine, et donc de les faire excuter par des
machines.
Une tendance dans lvolution des langages de programmation est de se rap-
procher des langues naturelles. Par exemple, les langages machine nutilisent
que des chiffres, mais les langages volus galement des lettres. Toutefois,
les langues naturelles ne sont pas ncessairement les bons outils pour
exprimer les algorithmes. Ainsi, la manire dcrire les quations en algbre,
sest loigne des langues naturelles, bien avant que lon ait des machines,
simplement parce que le langage algbrique est plus facile utiliser que les
langues naturelles pour exprimer des quations et les rsoudre. De mme,
certains langages formels sont peut-tre plus faciles utiliser que les langues
naturelles pour exprimer des algorithmes. La ncessit de rendre les pro-
grammes excutables par des machines nest donc pas lunique raison pour
laquelle les langages de programmation sont des langages formels.
La grammaire
La premire chose dfinir quand on conoit un langage formel, que ce
soit un langage de programmation, un langage de description de pages
web ou un langage dinterrogation de bases de donnes, est sa gram-
maire. La grammaire dun langage est un algorithme qui indique si une
chane de caractres appartient ce langage ou non. Par exemple, la
grammaire des instructions du langage Java indique que la chane de
caractres x = 1; est une instruction, mais pas la chane de caractres
1 = x;. On ne cherche pas ici dfinir ce qui se passe quand on excute
cette instruction, mais uniquement si elle est grammaticalement correcte
ou non.
Pour dfinir une grammaire, on utilise un langage qui contient :
des symboles pour les lettres du langage, a, b, etc.
des symboles pour des langages, cest--dire des ensembles de
chanes de caractres, A, B, L, etc.
les symboles = (gal), | (ou) et (chane vide).
ManuelDowek.book Page 89 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
90
On commence par un exemple simple : le langage L ne contient que
deux chanes de caractres aab et abab. La grammaire de ce langage se
dfinit ainsi :
Un autre exemple de langage est celui qui contient toutes les chanes de
caractres qui ne sont formes que de a : la chane vide , a, aa, aaa, etc.
Sa grammaire se dfinit ainsi :
Cette dfinition signifie quun lment de L est, ou bien la chane vide ,
ou bien la lettre a, suivie dun autre lment de L. En effet, les chanes
de caractres, non vides, formes uniquement de a commencent toutes
par un a, suivi dune autre chane forme uniquement de a.
On peut, de mme, dfinir le langage des chanes de caractres formes
dun certain nombre de a, suivis dun certain nombre de b. Par exemple
la chane aaabbbbb fait partie de ce langage mais pas la chane aaabbbab.
Pour cela, on dfinit dabord un langage A qui contient toutes les chanes
qui ne sont formes que de a, puis un langage B qui contient toutes les
chanes qui ne sont formes que de b, et enfin le langage dont les l-
ments sont forms dune chane de A suivie dune chane de B.
On peut de mme dfinir ainsi la grammaire des instructions simples en
Java. On suppose que lon a dj dfini le langage T des types de Java, le
langage V des noms de variables et le langage E des expressions. Le
langage I des instructions se dfinit alors ainsi :
Une instruction est en effet :
une dclaration : T V = E; I,
une affectation : V = E;,
une squence : I I,
un test : if (E) I else I,
une boucle : while (E) I,
une instruction entre accolades : {I}.
L = aab | abab
L = | a L
A = | a A
B = | b B
L = A B
I = TV = E; I | V = E; | II | if (E) I else I | while (E) I | {I}
ManuelDowek.book Page 90 Monday, July 9, 2012 4:58 PM
6 La notion de langage formel
Groupe Eyrolles, 2012
91
On peut galement dfinir la grammaire du langage HTML, ou plus
exactement de la partie de ce langage introduite au chapitre 8. On
dfinit dabord un langage qui contient les diverses lettres de lalphabet.
en excluant les symboles < et >.
Le langage form des suites de tels symboles se dfinit ainsi :
Cependant, un texte en HTML nest pas une simple suite de tels sym-
boles, puisquil peut aussi contenir des expressions comme <b>un
passage important</b>.
On dfinit alors le langage des textes en HTML ainsi :
o le langage A, qui reste dfinir, est celui des adresses web.
Ainsi, dans le langage E, on introduit les symboles < et > et les diff-
rentes balises existantes, mais on assure galement au passage que les
balises sont utilises correctement : toute balise ouverte est referme par
la suite et les balises sont correctement imbriques, cest--dire refer-
mes dans lordre correspondant leur ouverture. Par exemple, cette
grammaire exclut une suite de caractres comme <b><i>erreur</b></i>.
La smantique
La grammaire dun langage de programmation dfinit quand une suite
de symboles est un programme bien form dans ce langage ou non, mais
pas ce qui se passe quand on excute ce programme. Ce second volet de
la dfinition dun langage de programmation est appele sa smantique.
Par exemple, le fait que quand on excute linstruction x = 1; on trans-
forme ltat en mettant la valeur 1 dans la bote de nom x fait partie de la
smantique, et non de la grammaire, du langage Java.
De mme, la smantique du langage HTML dfinit la manire dont un
texte crit en HTML saffiche dans un navigateur.
C = a | b | c | d |
L = | CL
L = | CL | EL
E = <b>L</b> | <i>L</i> | <p>L</p> | <h1>L</h1> | <h2>L</h2>
| <a href = A>L</a>
ALLER PLUS LOIN Langages et formats
La notion de langage nest pas trs loigne de
la notion de format introduite au chapitre 9.
Dans un cas comme dans lautre, on dfinit un
ensemble de rgles qui permettent dexprimer
un texte, une image, etc. Dailleurs, on dit par-
fois le langage HTML et parfois le format
HTML .
On a cependant tendance rserver le mot lan-
gage aux suites de symboles exprimes dans
un alphabet riche et avec une grammaire relati-
vement complexe. Ainsi le langage HTML utilise
tous les symboles de lalphabet, qui peuvent
eux-mmes tre exprims dans un format :
ASCII ou latin-1, alors que le format latin-1 uti-
lise un alphabet qui se limite aux symboles 0
et 1. De mme, toutes les suites de huit bits sont
bien formes en latin-1, si bien que la gram-
maire du format latin-1 est trs simple et na
que peu dintrt.
ManuelDowek.book Page 91 Monday, July 9, 2012 4:58 PM
Premire partie Langages
Groupe Eyrolles, 2012
92
Redfinir la smantique
En HTML (voir le chapitre 8), les balises <h1> et </h1> dlimitent un
titre et les balises <a> et </a> dlimitent un lien. Concrtement, cela
signifie que, dans un navigateur, un passage dlimit par les balises <h1>
et </h1> est crit en gros caractres et un passage dlimit par les balises
<a> et </a> est crit en bleu et soulign.
Cela dit, il est possible de modifier cette smantique et de dcider, par
exemple, que les titres doivent tre non seulement en grosses lettres,
mais aussi en rouge et centrs et que les liens doivent tre en vert et sur-
ligns. Cela est possible car la smantique de HTML est elle-mme
dfinie dans un langage formel : le langage CSS. Par exemple, la dfini-
tion CSS suivante :
indique que les titres doivent tre en 24 points, en rouge et centrs, et les
liens en vert et surligns.
Si on crit cette dfinition dans un fichier exemple.css et si lon ajoute
len-tte du fichier HTML, prsent au chapitre 8, la commande :
alors ce texte sera affich dans un navigateur, non sous la forme mais
sous la forme .
On peut aussi dfinir en CSS de nouvelles balises <oeuvre> et </oeuvre> :
h1 {Font-Size: 24pt; Color: Red; Text-Align: Center;}
a {Color: Green; Text-Decoration: Overline;}
<link rel="stylesheet" href="example.css" type="text/css">
</link>
oeuvre {Font-Style: Italic}
ManuelDowek.book Page 92 Monday, July 9, 2012 4:58 PM
6 La notion de langage formel
Groupe Eyrolles, 2012
93
Le texte :
saffiche alors dans un navigateur :
exactement comme laurait fait le texte :
La diffrence est que, si lon dcide aprs coup de souligner les noms des
uvres au lieu de les mettre en italique, il suffit de changer la sman-
tique des balises <oeuvre> et </oeuvre> :
pour que le texte saffiche :
les autres italiques du texte restant des italiques.
Cela permet de dissocier le fond (le texte, dans lequel on indique simple-
ment que Lle mystrieuse est le titre dune uvre) de la forme (la
smantique du langage HTML, dans laquelle on indique que les titres
des uvres doivent tre en italique ou souligns). La mise en page des
textes peut tre ainsi change ad libitum.
Exercice 6.1
Reprendre lune des pages HTML crites au chapitre 8 et lui adjoindre un
fichier CSS pour modifier son aspect.
<oeuvre>L'le mystrieuse</oeuvre> est la fois la suite de
<oeuvre>Vingt mille lieues sous les mers</oeuvre> et des
<oeuvre>Enfants du capitaine Grant</oeuvre>.
L'le mystrieuse est la fois la suite de Vingt mille lieues sous les mers et
des Enfants du capitaine Grant.
<i>L'le mystrieuse</i> est la fois la suite de <i>Vingt
mille lieues sous les mers</i> et des <i>Enfants du capitaine
Grant</i>.
oeuvre {Text-Decoration: Underline;}
Lle mystrieuse est la fois la suite de Vingt mille lieues sous les mers
et des Enfants du capitaine Grant.
Ai-je bien compris ?
Quelles sont les principales diffrences entre un langage formel et une langue
naturelle ?
Quelle est la diffrence entre la grammaire et la smantique dun langage ?
quoi sert le langage CSS ?
ManuelDowek.book Page 93 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 94 Monday, July 9, 2012 4:58 PM
DEUXIME PARTIE
Informations
Dans cette deuxime partie, nous abordons lune des problmatiques
centrales de linformatique : reprsenter les informations que lon veut
communiquer, stocker et transformer. Nous apprenons reprsenter
les nombres entiers et les nombres virgule (chapitre 7), les caractres
et les textes (chapitre 8), et les images et les sons (chapitre 9). La
notion de valeur boolenne, ou de bit, qui apparat dans ces trois
chapitres, nous mne naturellement la notion de fonction boolenne
(chapitre 10).
Nous apprenons ensuite structurer de grandes quantits
dinformations (chapitre 11*), optimiser la place occupe grce la
compression, corriger les erreurs qui peuvent se produire au moment
de la transmission et du stockage de ces informations et les
protger par le chiffrement (chapitre 12*).
ManuelDowek.book Page 95 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 96 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
7
Reprsenter des
nombres entiers
et virgule
Le livre de laddition et de la sous-
traction daprs le calcul indien de
Muhammad al-Khwarizmi (783 ? -
850 ?), qui prsente la numration
dcimale position et des algo-
rithmes permettant deffectuer les
oprations sur les nombres exprims
dans ce systme, a t le vecteur de la
diffusion de ce systme de numra-
tion dans le bassin mditerranen. Le
mot algorithme est driv du nom
dal-Khwarizmi et le mot algbre (al-
jabr) du titre dun autre de ses livres.
Au commencement taient le 0 et le 1, puis nous
crmes les nombres, les textes, les images et les sons.
Dans ce chapitre, nous voyons comment les nombres
sont reprsents dans les ordinateurs avec des 0 et des 1.
Nous introduisons la notion de base, en partant de la notation
dcimale que nous utilisons ordinairement pour crire
les nombres entiers. Nous passons par la base cinq puis
dcrivons la base deux, aussi appele reprsentation binaire.
Nous gnralisons ensuite aux nombres relatifs en utilisant
la notation en complment deux, puis aux nombres virgule,
reprsents par leur signe, leur mantisse et leur exposant.
ManuelDowek.book Page 97 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
98
Vus de lextrieur, les ordinateurs et les programmes que nous utilisons
tous les jours permettent de mmoriser, de transmettre et de transformer
des nombres, des textes, des images, des sons, etc.
Pourtant, quand on les observe une plus petite chelle, ces ordinateurs
ne manipulent que des objets beaucoup plus simples : des 0 et des 1.
Mmoriser, transmettre et transformer des nombres, des textes, des
images ou des sons demande donc dabord de les reprsenter comme des
suites de 0 et de 1.
La mmoire des ordinateurs est constitue dune multitude de petits cir-
cuits lectroniques qui ne peuvent tre, chacun, que dans deux tats (voir
le chapitre 14). Comme il fallait donner un nom ces tats, on a dcid
de les appeler 0 et 1, mais on aurait pu tout aussi bien les appeler A et B,
froid et chaud ou faux et vrai. Une telle valeur, 0 ou 1, sappelle un boo-
len, un chiffre binaire ou encore un bit (binary digit). Un tel circuit
deux tats sappelle un circuit mmoire un bit et se dcrit donc par le
symbole 0 ou par le symbole 1.
Ltat dun circuit, compos de plusieurs de ces circuits mmoire un bit,
se dcrit par une suite finie de 0 et de 1, que lon appelle un mot. Par
exemple, le mot 100 dcrit ltat dun circuit compos de trois circuits
mmoire un bit, respectivement dans ltat 1, 0 et 0.
Exercice 7.1
On imagine un ordinateur dont la mmoire est constitue de quatre circuits
mmoire un bit. Quel est le nombre dtats possibles de la mmoire de cet
ordinateur ? Mme question pour un ordinateur dont la mmoire est consti-
tue de dix circuits mmoire un bit. Et pour un ordinateur dont la mmoire est
constitue de 34 milliards de tels circuits.
Exercice 7.2
On veut reprsenter chacune des sept couleurs de larc-en-ciel par un mot, les
sept mots devant tre distincts et de mme longueur. Quelle est la longueur
minimale de ces mots ?
Exercice 7.3
Trouvez trois informations de la vie courante qui peuvent tre exprimes par
un boolen.
Exercice 7.4
On considre une box internet avec une diode lectroluminescente,
teinte ou allume selon un motif de 0 et de 1 qui change chaque demi-
seconde. Lorsque la box est teinte, la diode aussi, le motif est 0000000000
Lorsque la box est allume et fonctionne, la diode est allume en continu, le
motif vaut donc 1111111111 Lorsque la box est en panne, le fournisseur
daccs souhaite que la diode clignote selon diffrents motifs en fonction du
type de panne : pas de rseau, rseau satur, facture non paye, etc. On parle
ainsi de clignotement rapide pour le motif 0101010101.
ManuelDowek.book Page 98 Monday, July 9, 2012 4:58 PM
7 Reprsenter des nombres entiers et virgule
Groupe Eyrolles, 2012
99
Proposer deux motifs qui pourraient correspondre aux descriptions
clignotement lent et clignotement trs lent .
Comment peut-on dcrire les motifs suivants, rpts indfiniment :
0000100000 et 0101010000 ?
Comment faut-il procder pour quun motif donn ne saffiche que toutes
les dix secondes ?
Dans une situation o il y aurait deux types de panne en mme temps,
comment pourrait-on procder pour afficher les motifs correspondant aux
deux messages derreurs diffrents ?
La reprsentation
des entiers naturels
Depuis le Moyen ge, on crit les nombres entiers naturels en notation
dcimale position. Cela signifie que, pour crire le nombre entier
naturel n, on commence par imaginer n objets, que lon groupe par
paquets de dix, puis on groupe ces paquets de dix objets en paquets de
dix paquets, etc. la fin, il reste entre zro et neuf objets isols, entre
zro et neuf paquets isols de dix objets, entre zro et neuf paquets isols
de cent, etc. Et on crit cet entier naturel en notant, de droite gauche,
le nombre dobjets isols, le nombre de paquets de dix, le nombre de
paquets de cent, le nombre de paquets de mille, etc. Chacun de ces nom-
bres tant compris entre zro et neuf, seuls dix chiffres sont ncessaires :
0, 1, 2, 3, 4, 5, 6, 7, 8 et 9. Par exemple, lcriture 2359 exprime un
entier naturel form de 9 units, 5 dizaines, 3 centaines et 2 milliers.
Le choix de faire des paquets de dix est peut-tre d au fait que lon a dix
doigts, mais on aurait pu tout aussi bien dcider de faire des paquets de
deux, de cinq, de douze, de vingt, de soixante, etc. On crirait alors les
nombres entiers naturels en notation position en base deux, cinq,
douze, vingt ou soixante. La notation dcimale position sappelle donc
aussi la notation position en base dix.
En notation binaire, cest--dire en notation position en base deux, le
nombre treize scrit 1101 : de droite gauche, 1 unit, 0 deuzaine,
1 quatraine et 1 huitaine. Lcriture dun entier naturel en binaire est en
moyenne 3,2 fois plus longue que son criture en base dix, mais elle ne
demande dutiliser que deux chiffres : 0 et 1.
T Indiquer la base
Dans ce livre, quand une suite de chiffres exprime
un nombre dans une base diffrente de dix, on
indique la base entre parenthses, par exemple :
1101 (en base deux). On souligne aussi parfois un
mot pour indiquer quil exprime un nombre en
base deux : 1101. Enfin, on rassemble parfois les
bits par groupe de quatre ou de huit dans les mots
trs longs pour quils soient plus faciles lire :
1111111101 est crit 11 1111 1101. Comme en
base dix, ces groupes sont forms de droite
gauche.
ManuelDowek.book Page 99 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
100
Exercice 7.5
Un horloger excentrique a eu lide de fabriquer une montre sur laquelle
lheure est indique par 10 diodes lectroluminescentes appeles 1 h, 2 h, 4 h,
8 h, 1 min, 2 min, 4 min, 8 min, 16 min et 32 min. Pour connatre lheure, il
suffit dajouter la valeur de toutes les diodes allumes.
Quelle heure est-il quand sont allumes les diodes 1 h, 2 h, 4 h, 1 min, 2 min,
8 min, 16 min et 32 min ? Quelles sont les diodes allumes 5 h 55 ? Est-il pos-
sible de reprsenter toutes les heures ? Toutes les configurations sont-elles la
reprsentation dune heure ?
Comme la mmoire des ordinateurs est constitue de circuits qui ne
peuvent tre chacun que dans deux tats, on peut utiliser chaque circuit
de la mmoire pour reprsenter un chiffre binaire, en identifiant lun de
ces tats avec le chiffre binaire 0 et lautre avec le chiffre binaire 1 on
comprend a posteriori pourquoi on a choisi dappeler ces tats eux-
mmes 0 et 1. Le nombre 13 = 1101 est donc reprsent dans la
mmoire dun ordinateur par le mot 1101, cest--dire par quatre circuits
respectivement dans les tats 1, 0, 1 et 1.
La base cinq
Pour comprendre comment transformer un entier naturel, crit en base
dix, dans une autre base, on commence par la base cinq, moins particu-
lire que la base deux, sur laquelle on reviendra plus tard.
Exercice 7.6 (avec corrig)
Trouver la reprsentation en base cinq de 47.
47 objets se regroupent en 9 paquets et 2 units, puis les 9 paquets se regrou-
pent en 1 paquet de paquets et 4 paquets.
47 = 9 5 + 2 = (1 5 + 4) 5 + 2 = (1 5
2
) + (4 5
1
) + (2 5
0
)
Donc 47 = 142 (en base cinq).
SAVOIR-FAIRE Trouver la reprsentation en base cinq dun entier naturel
donn en base dix
Pour crire les entiers naturels en base cinq, on a besoin de cinq chiffres : 0, 1, 2, 3, 4.
Quand on a n objets, on les groupe par paquets de cinq, quon groupe ensuite en paquets
de cinq paquets, etc. Autrement dit, on fait une succession de divisions par 5, jusqu
obtenir un quotient gal 0.
ManuelDowek.book Page 100 Monday, July 9, 2012 4:58 PM
7 Reprsenter des nombres entiers et virgule
Groupe Eyrolles, 2012
101
Exercice 7.7 (avec corrig)
Trouver la reprsentation en base cinq du nombre 944.
On obtient 944 = 12234 (en base cinq).
Exercice 7.8
Trouver la reprsentation en base cinq du nombre 289.
Exercice 7.9 (avec corrig)
Trouver la reprsentation en base dix du nombre 401302 (en base cinq).
401302 (en base cinq) = (2 5
0
) + (0 5
1
) + (3 5
2
) + (1 5
3
) + (0 5
4
) + (4 5
5
)
= 12702.
Exercice 7.10
Trouver la reprsentation en base dix des nombres 2341 (en base cinq) et 444
(en base cinq).
SAVOIR-FAIRE Trouver la reprsentation en base dix dun entier naturel
donn en base cinq
Pour trouver la reprsentation en base dix dun entier naturel donn en base cinq, on uti-
lise le fait quen base cinq, le chiffre le plus droite reprsente les units, le prcdent les
paquets de 5, le prcdent les paquets de 5 5 = 5
2
= 25, le prcdent de
5 5 5 = 5
3
= 125, et ainsi de suite.
ManuelDowek.book Page 101 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
102
La base deux
Les nombres exprims en base deux sont plus difficiles lire, car il ny a
que deux chiffres, 0 et 1, mais le principe de la numration en base deux
est en tout point similaire celui de la numration en base cinq.
Exercice 7.11 (avec corrig)
Trouver la reprsentation en base deux du nombre 11.
On obtient 11 = 1011.
Exercice 7.12
Trouver la reprsentation en base deux du nombre 1000.
Exercice 7.13
Chercher sur le Web la date de la mort de Charlemagne. Trouver la reprsenta-
tion en base deux de ce nombre.
Exercice 7.14
Donner les reprsentations en base deux des nombres 1, 3, 7, 15, 31 et 63.
Expliquer le rsultat.
SAVOIR-FAIRE Trouver la reprsentation en base deux
dun entier naturel donn en base dix
Pour crire les nombres en base deux, on a besoin de deux chiffres : 0 et 1. Quand on a n objets,
on les groupe par paquets de deux, quon regroupe eux-mmes en paquets de deux paquets, etc.
Autrement dit, on fait une succession de divisions par 2, jusqu obtenir un quotient gal 0.
SAVOIR-FAIRE Trouver la reprsentation en base dix dun entier naturel
donn en base deux
Pour trouver la reprsentation en base dix dun entier naturel donn en base deux, on utilise
le fait quen base deux, le chiffre le plus droite reprsente les units, le prcdent les paquets
de 2, le prcdent les paquets de 2 2 = 2
2
= 4, le prcdent de 2 2 2 = 2
3
= 8, etc.
ManuelDowek.book Page 102 Monday, July 9, 2012 4:58 PM
7 Reprsenter des nombres entiers et virgule
Groupe Eyrolles, 2012
103
Exercice 7.15 (avec corrig)
Trouver la reprsentation en base dix du nombre 11111111.
11111111 = (1 2
0
) + (1 2
1
) + (1 2
2
) + (1 2
3
) + (1 2
4
) + (1 2
5
) + (1 2
6
)
+ (1 2
7
) = 255.
Exercice 7.16
Trouver la reprsentation en base dix du nombre 10010110.
Exercice 7.17
Cest en 11110010000 qua t dmontr le thorme fondamental de linfor-
matique. Exprimer ce nombre en base dix.
Exercice 7.18
Montrer quavec un mot de n bits on peut reprsenter les nombres de 0 2
n
1.
Exercice 7.19
Pour multiplier par dix un entier naturel exprim en base dix, il suffit dajouter
un 0 sa droite, par exemple, 12 10 = 120. Quelle est lopration quiva-
lente pour les entiers naturels exprims en base deux ? Exprimer en base deux
les nombres 3, 6 et 12 pour illustrer cette remarque.
Exercice 7.20
Quelle est la reprsentation binaire du nombre 57 ? Et celle du nombre 198 ?
Soit m un mot de 8 bits, n lentier naturel reprsent en binaire par le mot m,
m le mot obtenu en remplaant dans m chaque 0 par un 1 et chaque 1 par
un 0 et n lentier naturel reprsent en binaire par le mot m. Exprimer n et n
comme une somme de puissances de 2, montrer que n + n = 255. Montrer que
la reprsentation binaire du nombre 255 n est obtenue en remplaant dans
celle de n chaque 0 par un 1 et chaque 1 par un 0.
Une base quelconque
On peut gnraliser une base quelconque les mthodes vues pour la
base cinq et la base deux.
T Les octets
Dans la mmoire des ordinateurs les circuits
mmoire un bit sont souvent groups par huit : les
octets. On utilise souvent des nombres exprims
en notation binaire, cest--dire en base deux, sur
un, deux, quatre ou huit octets, soit 8, 16, 32 ou
64 bits. Ceci permet de reprsenter les nombres de
0 1111 1111 = 255 sur un octet, de 0
1111 1111 1111 1111 = 65 535 sur deux octets, de
0 1111 1111 1111 1111 1111 1111 1111 1111
= 4 294 967 295 sur trois octets et de 0
1111 1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 1111 =
18 446 744 073 709 551 615 sur quatre octets.
SAVOIR-FAIRE Trouver la reprsentation en base k dun entier naturel
donn en base dix
Pour crire les entiers naturels en base k, on a besoin de k chiffres. Quand on a n objets, on
les groupe par paquets de k, quon regroupe leur tour en paquets de k paquets, etc. Autre-
ment dit, on fait une succession de divisions par k, jusqu obtenir un quotient gal 0.
ManuelDowek.book Page 103 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
104
Exercice 7.21 (avec corrig)
Trouver la reprsentation en base seize du nombre 965.
Rponse : 965 = 3c5 (en base seize)
Exercice 7.22
Trouver la reprsentation en base seize des nombres 6725 et 18 379.
Exercice 7.23 (avec corrig)
Trouver la reprsentation en base dix du nombre 4e2c (en base seize).
4e2c (en base seize) = (12 16
0
) + (2 16
1
) + (14 16
2
) + (4 16
3
) = 20 012.
Exercice 7.24
Trouver la reprsentation en base dix des nombres abcd (en base seize) et
281ef (en base seize).
Exercice 7.25
Chercher sur le Web ce quest le systme de numration Shadok. Est-ce un sys-
tme de numration position ? Si oui, en quelle base et avec quels chiffres ?
T Base 16
En base seize, on a besoin de 16 chiffres : 0, 1, 2,
3, 4, 5 , 6, 7, 8, 9, puis a (dix), b (onze), c (douze),
d (treize), e (quatorze) et f (quinze).
SAVOIR-FAIRE Trouver la reprsentation en base dix dun entier naturel
donn en base k
Pour trouver la reprsentation en base dix dun entier naturel donn en base k, on utilise
le fait quen base k, le chiffre le plus droite reprsente les units, le prcdent les
paquets de k, le prcdent les paquets de k k = k
2
, le prcdent les paquets de
k k k = k
3
, etc.
ManuelDowek.book Page 104 Monday, July 9, 2012 4:58 PM
7 Reprsenter des nombres entiers et virgule
Groupe Eyrolles, 2012
105
La reprsentation
des entiers relatifs
Pour reprsenter les entiers relatifs en notation binaire, on doit tendre
la reprsentation aux nombres ngatifs. Une solution est de rserver un
bit pour le signe de lentier reprsenter et dutiliser les autres pour
reprsenter sa valeur absolue. Ainsi, avec des mots de 16 bits, en utilisant
1 bit pour le signe et 15 bits pour la valeur absolue, on pourrait repr-
senter les entiers relatifs de -111 1111 1111 1111 = -(2
15
- 1) = -32 767
111 1111 1111 1111 = 2
15
- 1 = 32 767. Cependant, cette mthode a
plusieurs inconvnients, lun deux tant quil y a deux zros, lun positif
et lautre ngatif.
On a donc prfr une autre mthode, qui consiste reprsenter un entier
relatif par un entier naturel. Si on utilise des mots de 16 bits, on peut repr-
senter les entiers relatifs compris entre -32 768 et 32 767 : on reprsente un
entier relatif x positif ou nul comme lentier naturel x, et un entier relatif x
strictement ngatif comme lentier naturel x + 2
16
= x + 65 536, qui est
compris entre 32 768 et 65 535. Ainsi, les entiers naturels de 0 32 767
servent reprsenter les entiers relatifs positifs ou nuls, en vert sur la figure,
et les entiers naturels de 32 768 65 535 dcrivent les entiers relatifs stric-
tement ngatifs, en rouge sur la figure.
Lentier relatif -1 est reprsent comme lentier naturel 65 535, cest--
dire par le mot 1111 1111 1111 1111.
Cette manire de reprsenter les entiers relatifs sappelle la notation en
complment deux.
Avec des mots de seize bits, on crit les entiers relatifs compris entre
-2
15
= -32 768 et 2
15
- 1 = 32 767. Plus gnralement, avec des mots de
n bits, on crit les entiers relatifs compris entre -2
n-1
et 2
n-1
- 1 :
un entier relatif x positif ou nul compris entre 0 et 2
n-1
- 1 est repr-
sent par lentier naturel x compris entre 0 et 2
n-1
- 1 ;
un entier relatif x strictement ngatif compris entre 2
n-1
et 1 est
reprsent par lentier naturel x + 2
n
compris entre 2
n-1
et 2
n
- 1.
Exercice 7.26
Quels entiers relatifs peut-on reprsenter avec des mots de 8 bits ? Combien
sont-ils ? Mme question avec des mots de 32 bits et 64 bits.
ManuelDowek.book Page 105 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
106
Exercice 7.27 (avec corrig)
Trouver la reprsentation binaire sur huit bits des entiers relatifs 0 et -128.
Lentier relatif 0 est reprsent comme lentier naturel 0 : 0000 0000.
Lentier relatif -128 est reprsent comme lentier naturel -128 + 2
8
= -128
+ 256 = 128 : 1000 0000.
Exercice 7.28
Trouver la reprsentation binaire sur huit bits des entiers relatif 127 et -127.
Exercice 7.29 (avec corrig)
Trouver la reprsentation dcimale des entiers relatifs dont la reprsentation
binaire sur huit bits est 0000 0000 et 1000 0000.
Le mot 0000 0000 reprsente lentier naturel 0 et donc lentier relatif 0. Le mot
1000 0000 reprsente lentier naturel 128 = 2
7
et donc lentier relatif 128 -
2
8
= 128 - 256 = -128.
Exercice 7.30
Trouver la reprsentation dcimale des entiers relatifs dont la reprsentation
binaire sur huit bits est 0111 1111 et 1000 0001.
SAVOIR-FAIRE Trouver la reprsentation binaire sur n bits dun entier
relatif donn en dcimal
On a vu que :
Si lentier relatif x est positif ou nul, on le reprsente comme lentier naturel x.
Sil est strictement ngatif, on le reprsente comme lentier naturel x + 2
n
.
SAVOIR-FAIRE Trouver la reprsentation dcimale dun entier relatif
donn en binaire sur n bits
Si cet entier relatif est donn par le mot m, on commence par calculer lentier naturel p
reprsent par ce mot. Si p est strictement infrieur 2
n-1
, cest lentier relatif reprsent,
sil est suprieur ou gal 2
n-1
, lentier relatif reprsent est p - 2
n
.
SAVOIR-FAIRE Calculer la reprsentation p de loppos dun entier
relatif x partir de sa reprsentation p, pour une reprsentation des
entiers relatifs sur huit bits
Si lentier relatif x est compris entre 0 et 127, alors il est reprsent sur huit bits par lentier
naturel p = x et son oppos -x est reprsent par lentier naturel p = -x + 2
8
= -x + 256 =
256 - p. Si lentier relatif x est compris entre -127 et -1, alors il est reprsent par lentier
naturel p = x + 2
8
= x + 256 et son oppos -x est reprsent par lentier naturel p = -x = 256 - p.
ManuelDowek.book Page 106 Monday, July 9, 2012 4:58 PM
7 Reprsenter des nombres entiers et virgule
Groupe Eyrolles, 2012
107
Exercice 7.31 (avec corrig)
Calculer la reprsentation binaire sur huit bits de lentier relatif 4, puis celle de
son oppos.
Lentier relatif 4 est reprsent comme lentier naturel 4 = 0000 0100.
Pour calculer la reprsentation de son oppos, on remplace les 0 par des 1 et
les 1 par des 0, ce qui donne 1111 1011. Puis on ajoute 1, ce qui donne
1111 1100. On peut vrifier que ce nombre est bien la reprsentation de
lentier relatif -4, cest--dire de lentier naturel -4 + 256 = 252.
Exercice 7.32
Calculer la reprsentation binaire sur huit bits de lentier relatif -16, puis de
son oppos.
Exercice 7.33
Montrer que le bit le plus gauche vaut 1 pour les entiers relatifs strictement
ngatifs et 0 pour les entiers relatifs positifs ou nuls.
Exercice 7.34
On considre des entiers relatifs sur 3 bits. Dessiner le cercle rouge-vert ci-
avant en plaant les 8 nombres : 0, 1, 2, 3, -1, -2, -3, -4 leur place. Relier les
nombres opposs : 1 et -1, 2 et -2, etc. Quelle est linterprtation gomtrique
de la fonction qui chaque nombre associe son oppos ?
Exercice 7.35
Reprsenter les entiers relatifs 96 et 48 en binaire sur huit bits. Ajouter les
deux nombres binaires obtenus en utilisant lalgorithme de laddition binaire
du chapitre 18. Quel est lentier relatif obtenu ? Pourquoi est-il ngatif ?
Exercice 7.36
Expliquer comment faire une soustraction de deux nombres binaires sur huit
bits partir du calcul de loppos et de lalgorithme de laddition du
chapitre 18. Calculer ainsi 15 - 7.
Donc, sauf quand x = -128, dont loppos nest pas reprsentable sur 8 bits, si un entier
relatif x est reprsent par lentier naturel p, son oppos -x est reprsent par lentier
naturel p = 256 - p = (255 - p) + 1.
Calculer 255 - p = 1111 1111 - p est facile, puisquil suffit, dans la reprsentation binaire
de p, de remplacer chaque 0 par un 1 et chaque 1 par un 0 (voir lexercice 7.20). Il suffit
ensuite dajouter 1 au nombre obtenu.
ManuelDowek.book Page 107 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
108
La reprsentation
des nombres virgule
Comme la notation dcimale, la notation binaire permet aussi de repr-
senter des nombres virgule. En notation dcimale, les chiffres gauche de
la virgule reprsentent des units, des dizaines, des centaines, etc. et ceux
droite de la virgule, des diximes, des centimes, des millimes, etc. De
mme, en binaire, les chiffres droite de la virgule reprsentent des demis,
des quarts, des huitimes, des seizimes, etc. On peut ainsi reprsenter, par
exemple, le nombre un et un quart : 1.01. Toutefois, cette manire de faire
ne permet pas de reprsenter des nombres trs grands ou trs petits comme
le nombre dAvogadro ou la constante de Planck. On utilise donc une autre
reprsentation similaire la notation scientifique des calculatrices, sauf
quelle est en base deux et non en base dix. Un nombre est reprsent sous
la forme s m2
n
o s est le signe du nombre, n son exposant et m sa man-
tisse. Le signe est + ou -, lexposant est un entier relatif et la mantisse est un
nombre virgule, compris entre 1 inclus et 2 exclu.
Par exemple, quand on utilise 64 bits pour reprsenter un nombre vir-
gule, on utilise 1 bit pour le signe, 11 bits pour lexposant et 52 bits pour la
mantisse. Le signe + est reprsent par 0 et le signe - par 1. Lexposant n
est un entier relatif compris entre -1 022 et 1 023 ; on le reprsente
comme lentier naturel n + 1 023, qui est compris entre 1 et 2 046. Les
deux entiers naturels 0 et 2 047 sont rservs pour des situations excep-
tionnelles (+, -, NaN, etc.). La mantisse m est un nombre binaire vir-
gule compris entre 1 inclus et 2 exclu, comprenant 52 chiffres aprs la
virgule. Comme cette mantisse est comprise entre 1 et 2, elle a toujours un
seul chiffre avant la virgule et ce chiffre est toujours un 1 ; il est donc inu-
tile de le reprsenter et on utilise les 52 bits pour reprsenter les 52 chiffres
aprs la virgule.
Exercice 7.37 (avec corrig)
Trouver le nombre virgule reprsent par le mot
1100010001101001001111000011100000000000000000000000000000000000
ALLER PLUS LOIN Valeurs exceptionnelles
Ce codage prend en compte des valeurs
exceptionnelles : +, - et NaN (not a
number) qui est une valeur indfinie. Ces
valeurs non numriques sont reprsentes res-
pectivement par les mots de 64 bits suivants :
0 11111111111 00000000000000000000000
00000000000000000000000000000
1 11111111111 00000000000000000000000
00000000000000000000000000000
1 11111111111 11111111111111111111111
11111111111111111111111111111
Ce codage permet galement de reprsenter des
valeurs infinitsimales qui, sans tre nulles, sont
trop petites pour que lon puisse calculer avec
elles.
SAVOIR-FAIRE Trouver la reprsentation en base dix dun nombre
virgule donn en binaire
On identifie le signe, la mantisse et lexposant.
ManuelDowek.book Page 108 Monday, July 9, 2012 4:58 PM
7 Reprsenter des nombres entiers et virgule
Groupe Eyrolles, 2012
109
Le signe est reprsent par 1.
Lexposant est reprsent par 10001000110. La mantisse est reprsente par
1001001111000011100000000000 000000000000000000000000.
Le signe du nombre est donc -. Le nombre 100 0100 0110 est gal 1 094 et
lexposant du nombre est n = 1094 - 1023 = 71. Sa mantisse est :
Le nombre reprsent est donc -206 727 / 131 072 2
71
= -3.724 10
21
.
Exercice 7.38
Trouver le nombre virgule reprsent par le mot :
0001000000111101001110010101100000000000000000000000000000000000.
Exercice 7.39
Comment est reprsent le nombre virgule 2
-1 022
(qui est gal
2,225 10
-308
) ?
Exercice 7.40
Comment est reprsent le nombre entier 7 ? Et le nombre virgule 7,0 ?
Exercice 7.41
combien de dcimales environ correspondent 52 chiffres binaires aprs la
virgule ?
Exercice 7.42
Quel est le plus grand nombre virgule que lon peut reprsenter en binaire ?
Quel est le plus petit nombre virgule, donc ngatif, que lon peut repr-
senter en binaire ? Quel est le plus petit nombre virgule strictement positif
que lon peut reprsenter en binaire ?
Exercice 7.43
Quelle prcision perd-on si on divise par deux un nombre virgule avant de le
remultiplier par deux ?
Exercice 7.44
chaque multiplication de deux nombres virgule, on arrondit le calcul en ne
gardant que 52 chiffres binaires aprs la virgule, ce qui introduit une erreur
relative de lordre de 2
-52
. Quelle est la valeur de cette erreur en base dix ? Si
on fait plusieurs multiplications, ces erreurs saccumulent. Quelle est lerreur
relative dun calcul qui est form dun million de multiplications, qui dure
quelques millisecondes sur un ordinateur usuel ?
m = 1.1001 0011 1100 0011 1000 0000 0000 0000 0000 0000 0000 0000 0000
= 1 + 1/2 + 1/2
4
+ 1/2
7
+ 1/2
8
+ 1/2
9
+ 1/2
10
+ 1/2
15
+ 1/2
16
+ 1/2
17
= (2
17
+ 2
16
+ 2
13
+ 2
10
+ 2
9
+ 2
8
+ 2
7
+ 2
2
+ 2 + 1) / 2
17
= 206727/131072.
ManuelDowek.book Page 109 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
110
Exercice 7.45
On considre le programme suivant :
Si lon calculait sur des nombres rationnels exacts, que se passerait-il lors de
lexcution de ce programme ?
crire ce programme et lexcuter. Que constate-t-on ?
Modifier le programme de faon dterminer au bout de combien dex-
cutions du corps de la boucle il sarrte, ainsi que la valeur de x la fin de
cette excution.
Comment est reprsente cette dernire valeur de x ? Et celle de y ?
Proposer une explication de ce comportement.
Exercice 7.46
On considre le programme suivant :
Si lon calculait sur des nombres rationnels exacts, que se passerait-il lors de
lexcution de ce programme ?
crire ce programme et lexcuter. Que constate-t-on ?
Vrifier que la reprsentation binaire de 0,1 est
0011111110111001100110011001100110011001100110011001100110011010.
Quel nombre dcimal cette reprsentation dsigne-t-elle en ralit ?
En dduire les reprsentations binaires de 0,2, 0,3 et les nombres dcimaux
que cette reprsentation dsigne en ralit.
Expliquer laffichage obtenu.
double x, y;
x = 1.0;
y = x + 1.0;
while (y - x == 1.0) {
x = x * 2.0;
y = x + 1.0;}
double a;
int n;
a = 0.0;
for (n = 1; n <= 10; n = n + 1) {
a = a + 0.1;
System.out.println(a);}
Ai-je bien compris ?
En quelle base reprsente-t-on le plus souvent les nombres en informatique ?
Pourquoi ?
Comment reprsente-t-on les nombres ngatifs ?
Comment reprsente-t-on les nombres virgule ?
ManuelDowek.book Page 110 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
8
Reprsenter
des caractres
et des textes
Samuel Morse (1791 - 1872) est
linventeur dun code, dans lequel
chaque lettre est exprime par une
alternance de sons brefs symboliss
par . et longs , utilis pour
tlgraphier des textes. La lettre a
y est exprime par les sons . , la
lettre b par les sons , etc.
Artiste peintre, Samuel Morse sest
intress aux tlcommunications
aprs quen 1 25, un message lui
annonant que sa femme tait
malade ne lui est pas parvenu
temps. Comme nous le verrons au
chapitre 12, le code morse est rf-
rences de longueurs variables, mais
ce nest pas un code prfixe.
Les lettres ? Toutes des nombres !
Dans ce chapitre, nous voyons comment sont reprsents
les caractres et les textes de toutes les langues du monde.
Nous expliquons pourquoi il existe plusieurs codes tels ASCII,
latin-1, latin-2, UTF-32, UTF-8. Nous prsentons ensuite
les formats enrichis qui permettent de dcrire la forme
des caractres et des textes, comme le font les logiciels
de traitement de texte.
Un exemple de format enrichi est le langage HTML.
ManuelDowek.book Page 111 Monday, July 9, 2012 4:58 PM
8
Deuxime partie Informations
Groupe Eyrolles, 2012
112
Nous nous intressons, dans ce chapitre, la reprsentation des textes,
cest--dire des suites de caractres, ventuellement enrichies dinforma-
tions typographiques.
La reprsentation
des caractres
Puisquun texte est une suite de caractres, nous commenons par nous
intresser la reprsentation des caractres, cest--dire entre autres choses
aux lettres minuscules et majuscules, aux chiffres, aux signes de ponctua-
tion et aux symboles mathmatiques. Pour reprsenter ces caractres, on
attribue un nombre chacun.
Le code ASCII, par exemple, attribue le nombre 65 la lettre A, le nombre
66 la lettre B , le nombre 97 la lettre a et le nombre 98 la lettre
b . Il reprsente 95 caractres : les 26 lettres minuscules, les 26 lettres
majuscules, les 10 chiffres, les 32 symboles ! " # $ % & ( ) * + , . / : ; < = > ?
@ [ \ ] ^ _ ` { | } ~ et 1 signe despace. Il reprsente aussi 33 autres symboles de
mise en page, par exemple le retour chariot qui signale la fin de la ligne et le
saut de page qui signale le passage la page suivante. Le code ASCII repr-
sente donc 95 + 33 = 128 = 2
7
caractres, par des nombres qui peuvent eux-
mmes tre reprsents en binaire par des mots de sept bits. Ils sont en fait
reprsents par des mots de huit bits, le premier tant toujours un zro.
Le code ASCII tait lorigine conu pour des textes crits en anglais,
comme lindique son nom, American Standard Code for Information Inter-
change. Il nest pas adapt pour reprsenter des textes crits dans dautres
langues, mme celles qui, comme le franais, utilisent lalphabet latin, car
ces langues utilisent des accents, des cdilles et autres signes diacritiques.
Cest pourquoi on a tout dabord conu une extension du code ASCII, le
code latin-1, qui contient 191 caractres. Aux 128 caractres du code
ASCII, qui sont reprsents comme en ASCII, sajoutent les lettres ,
, , , , , , etc. qui permettent de reprsenter les
textes crits dans la plupart des langues dEurope de lOuest, mme si, pour
le franais, le a t oubli. Il manque toutefois des lettres utilises par
les langues dEurope de lEst, si bien quun autre format, le code latin-2, a
t propos pour ces langues. Ensuite, pour reprsenter les textes crits en
grec, russe, chinois, japonais, coren, etc., il a fallu proposer un format
universel : Unicode. Unicode recense prs de 110 000 caractres et associe
un nom et un numro chacun. A priori, ce numro se code sur 32 bits.
ManuelDowek.book Page 112 Monday, July 9, 2012 4:58 PM
8 Reprsenter des caractres et des textes
Groupe Eyrolles, 2012
113
Cependant, Unicode existe en plusieurs dclinaisons, parmi lesquelles
UTF-32, dans laquelle chaque caractre est ainsi exprim sur 32 bits, et
UTF-8, dans laquelle les caractres les plus courants sont exprims sur
8 bits et les moins courants sur 16, 32 ou 64 bits, utilisant une ide discute
en dtail au chapitre 12 propos de la notion de compression.
Le format UTF-8 a vocation devenir le standard, mais il ne lest pas
encore : malgr les efforts des comits de normalisation, lhumanit na
pas encore russi se doter dun format universellement accept, si bien
quil est parfois ncessaire de traduire un texte dUTF-8 en latin-1 ou de
latin-2 en UTF-8. Quand cette traduction nest pas bien faite, les carac-
tres accentus sont remplacs par des caractres bizarres.
Cependant, tous ces formats reposent sur une mme ide : associer un
nombre, cest--dire un mot binaire, chaque caractre. Tous ces for-
mats sont accessibles sur le Web.
La reprsentation
des textes simples
Un texte tant une suite de caractres, on peut le reprsenter en crivant
les caractres les uns aprs les autres.
Exercice 8.1 (avec corrig)
Trouver la reprsentation binaire en ASCII du texte Je pense, donc je suis.
On cherche la table des codes ASCII sur le Web de manire traduire le texte,
caractre par caractre : 74, 101, 32, 112, 101, 110, 115, 101, 44, 32, 100, 111,
110, 99, 32, 106, 101, 32, 115, 117, 105, 115, 46. On exprime ensuite chacun de
ces nombres en binaire sur huit bits :
01001010 01100101 00100000 01110000 01100101 01101110 01110011
01100101 00101100 00100000 01100100 01101111 01101110 01100011
00100000 01101010 01100101 00100000 01110011 01110101 01101001
01110011 00101110.
Exercice 8.2
Trouver la reprsentation binaire en ASCII du texte Cet exercice est un peu
fastidieux.
SAVOIR-FAIRE Trouver la reprsentation en ASCII binaire dun texte
En utilisant une table, on cherche le code ASCII de chaque caractre. Puis on traduit
chacun de ces nombres en reprsentation binaire.
ManuelDowek.book Page 113 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
114
Exercice 8.3 (avec corrig)
Trouver le texte reprsent en ASCII binaire par la suite de bits
01000011001001110110010101110011011101000010000001100110011000010
1100011011010010110110001100101.
On commence par dcouper la suite de bits en octets : 01000011 00100111
01100101 01110011 01110100 00100000 01100110 01100001 01100011
01101001 01101100 01100101. Chaque octet reprsente un nombre entier : 67,
39, 101, 115, 116, 32, 102, 97, 99, 105, 108, 101. On cherche ensuite la table des
codes ASCII en ligne de manire traduire chacun de ces nombres en une
lettre : Cest facile .
Exercice 8.4
Trouver le texte reprsent en ASCII binaire par la suite de bits
001100000111010001100101011101000111010000110001.
Exercice 8.5
Traduire en ASCII binaire votre phrase prfre, par exemple : Le commence-
ment de toutes les sciences, cest ltonnement. en oubliant les accents. Tra-
duire ensuite cette phrase en UTF-8 avec les accents.
Exercice 8.6
Traduire une phrase en ASCII binaire, puis la passer son voisin qui la dcode.
Exercice 8.7
On suppose que les seize lettres qui suivent sont codes ainsi :
Dcoder le message suivant : 1011 1100 1001 1111 0000 1010 1111 0111 1101
0110 0101 1111 0110 1100 1011 1110 1000, puis en se faisant ventuellement
aider dune personne qui lit larabe ou en utilisant le mcanisme de traduction
de Google, dterminer sil correspond la phrase tout en code binaire ou
les lettres deviennent des nombres .
Exercice 8.8
On considre lalphabet de 32 signes constitu des 26 lettres de lalphabet, de
lespace et de cinq symboles de ponctuation : la virgule, le point, le point-virgule,
le point dinterrogation et le point dexclamation. On reprsente les caractres de
cet alphabet par un code binaire de cinq bits prsent dans le tableau suivant. Sur
la dernire ligne, on a fait figurer la traduction dcimale de chaque code binaire.
SAVOIR-FAIRE Dcoder un texte reprsent en ASCII binaire
On dcoupe la suite de bits en octets, on traduit chaque octet en dcimal, puis on
cherche en utilisant une table, le caractre exprim par chacun de ces nombres.
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ManuelDowek.book Page 114 Monday, July 9, 2012 4:58 PM
8 Reprsenter des caractres et des textes
Groupe Eyrolles, 2012
115
Quel est le troisime bit du code de la lettre P ?
Dcoder le message suivant : 00001011100110101001011101010010001.
crire son prnom avec ce code.
Quels sont les caractres qui commencent par deux 1 ?
Pourquoi ny a t-il pas de caractres en minuscule dans cet alphabet ?
On considre lopration qui consiste transformer les 0 en 1 et vice-versa
dans chaque caractre. Recopier et remplir le tableau ci-aprs qui,
chaque caractre, associe le caractre obtenu par cette transformation.
On considre lopration qui consiste changer le premier bit avec le dernier,
et le deuxime bit avec lavant-dernier ; recopier et remplir le tableau ci-aprs
qui, chaque caractre, associe le caractre obtenu par cette transformation.
Exercice 8.9
Selon Pierre Lecomte du Noy, 01001100 01100101 00100000 01100010
01110101 01110100 00100000 01100100 01100101 00100000 01101100
01100001 00100000 01110011 01100011 01101001 01100101 01101110
01100011 01100101 00100000 01100101 01110011 01110100 00100000
01100100 01100101 00100000 01110000 01110010 01100101 01110110
01101111 01101001 01110010 00101100 00100000 00100000 01101110
01101111 01101110 00100000 01100100 01100101 00100000 01100011
01101111 01101101 01110000 01110010 01100101 01101110 01100100
01110010 01100101. tes-vous daccord avec lui ?
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z , . ; ? !
0
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
1
1
0
0
1
0
0
0
0
1
0
1
0
0
1
1
0
0
0
1
1
1
0
1
0
0
0
0
1
0
0
1
0
1
0
1
0
0
1
0
1
1
0
1
1
0
0
0
1
1
0
1
0
1
1
1
0
0
1
1
1
1
1
0
0
0
0
1
0
0
0
1
1
0
0
1
0
1
0
0
1
1
1
0
1
0
0
1
0
1
0
1
1
0
1
1
0
1
0
1
1
1
1
1
0
0
0
1
1
0
0
1
1
1
0
1
0
1
1
0
1
1
1
1
1
0
0
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z , . ; ? !
! ?
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z , . ; ? !
A Q
ATTENTION Utiliser un code standard
Pour les exercices 8.7 et 8.8, nous avons invent un code valable exclusi-
vement pour la dure de lexercice. Pour partager des informations, il ne
faut jamais faire cela, mais utiliser un code standard, connu de tous.
Sauf, bien sr, si on veut garder le texte secret (voir le chapitre 12).
ManuelDowek.book Page 115 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
116
La reprsentation
des textes enrichis
Les textes en ASCII ou en Unicode sont simplement des suites de
caractres. Les diteurs de texte sont les logiciels qui manipulent ces suites
de caractres. Toutefois, quand on crit un texte, on peut souhaiter lui
donner une forme spciale, plus jolie, plus lisible, comme le fait un
imprimeur. On peut jouer sur la police de caractres Times, Courier,
etc. , sur la taille des caractres 11 points, 12 points, etc. , sur leur
forme romain, italique, etc. , leur graisse maigre, gras, etc. On peut
aussi souhaiter dcouper un texte en chapitres et mettre en valeur les
titres des chapitres, etc. Or, les seules caractristiques que lon puisse
exprimer avec un code comme lASCII, par exemple, sont la casse dune
lettre minuscule ou majuscule et le dcoupage en paragraphes, grce
au symbole retour chariot. Les traitements de texte sont les logiciels qui
permettent ces mises en pages plus labores.
Ceci a amen enrichir ces formats, de manire :
1 qualifier certaines parties du texte, par exemple en mettant certaines
parties en gras ou en italique,
2 structurer le texte en divisions : un texte nest pas uniquement une
suite de paragraphes, mais est hirarchis en parties, chapitres, sec-
tions, sous-sections,
3 prsenter certaines informations sous forme de listes et de tables,
4 permettre de faire rfrence dautres textes,
5 donner des informations sur le texte : son titre, son ou ses auteur(s),
sa date de cration, sa langue, des mots-cls utiliss pour le recher-
cher parmi plusieurs textes, etc. Ces informations sur le texte, et non
du texte, sont appeles des mta-donnes.
Toutes ces considrations sont, bien entendu, valables aussi bien pour les
textes manuscrits ou imprims que pour les textes traits par les ordinateurs.
Lun de ces formats enrichis, qui est utilis en particulier pour crire des
pages web est appel le format HTML. En HTML, pour mettre un
passage en gras, on le dlimite par les balises <b> et </b> et pour le mettre
en italique, on le dlimite par les balises <i> et </i>. Ainsi le texte :
saffiche dans un navigateur :
Ma <i>premire</i> page <b>web</b>
ManuelDowek.book Page 116 Monday, July 9, 2012 4:58 PM
8 Reprsenter des caractres et des textes
Groupe Eyrolles, 2012
117
Comme les parenthses, les balises vont par deux : on ouvre le passage
mettre en gras avec la balise <b> et on le ferme avec la balise </b>.
Une division du texte est dlimite par les balises <div> et </div>, ainsi le
texte :
saffichera dans le navigateur en rendant ces divisions explicites.
Comme les parenthses, les balises peuvent semboter les unes dans les
autres, mais pas se chevaucher.
On indique quun passage est un titre en le dlimitant par les balises <h1>
et </h1> et que cest un sous-titre en le dlimitant par les balises <h2> et
</h2>.
De mme, les autres structurations du texte comme les numrations ou
les tableaux sont exprimes par dautres balises.
Quand on crit un texte, il est frquent de mentionner dautres textes :
par exemple, de parler dans une lettre dun livre que lon a lu. Dans le cas
dun texte manuscrit ou imprim, on donne en gnral une rfrence du
texte cit, par exemple le titre du livre et son auteur, afin que le lecteur
puisse sy rfrer sil le souhaite. Quand on veut exprimer, dans une page
web, une rfrence une autre page, on peut faire mieux que simplement
indiquer ladresse de la page web en question (par exemple ladresse
http://fr.wikipedia.org/wiki/Hypertext_Markup_Language) ; on peut changer lappa-
rence du passage o lon fait la rfrence, pour indiquer au lecteur que sil
clique sur ce passage, le navigateur affichera la page demande. On uti-
lise pour cela les balises <a> et </a> : on encadre la partie du texte quali-
fier par ces deux balises et on indique lintrieur de la balise <a>
ladresse de la page rfrence. Par exemple le texte :
qui affiche dans un navigateur :
Ma premire page web
<div>Ma premire page web
<div> comporte une premire sous-division pour dire Bonjour tout le
monde ! </div>
<div> et une seconde qui finit par bientt ! </div>
</div>
Pour les dtails sur le langage HTML, on pourra consulter <a href =
"http://fr.wikipedia.org/wiki/Hypertext_Markup_Language">la page
<i>Hypertext Markup Language de Wikipdia</i></a>.
Pour les dtails sur le langage HTML, on pourra consulter la page
Hypertext MarkupLanguage de Wikipdia.
ManuelDowek.book Page 117 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
118
Si lon clique sur le passage en bleu et soulign, le navigateur affiche la page
dont ladresse est http://fr.wikipedia.org/wiki/Hypertext_Markup_Language. Un tel
passage sur lequel on peut cliquer pour accder une autre page sappelle
un lien, et un texte qui contient au moins un lien est un hypertexte.
Les balises <body> et </body> dlimitent le texte afficher dans le naviga-
teur. On indique avant ces informations les mta-donnes relatives la
page : son titre, le format utilis pour les lettres accentues, etc.
Voici, au bout du compte, un exemple de texte au format HTML :
Len-tte situ entre les deux balises <head> et </head> indique dune part
que le texte est exprim en UTF-8, cest lobjet de la ligne :
et dautre part que le titre de la page est Un exemple.
Le contenu est situ entre les balises <body> et </body>. On y retrouve les
balises <b>, </b>, <i>, </i>, <h1>, </h1>, <h2>, </h2>, <div>, </div>, <a> et
</a> que lon a dcrites. Dans un navigateur, le texte saffiche de la
manire ci-contre.
Exercice 8.10 (avec corrig)
crire une page HTML qui prsente les diffrents projets informatiques des
lves dune classe.
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</meta>
<title>Un exemple</title>
</head>
<body>
<h1>Un titre</h1>
<h2>Un sous-titre</h2>
<div><a href="http://www.wikipedia.org/">Un lien</a></div>
<div><b>Un passage important</b></div>
</body>
</html>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</meta>
SAVOIR-FAIRE crire une page en HTML
crire le texte contenu dans cette page. Structurer ce texte en divisions. Identifier les
titres de parties, les passages mettre en gras, en italique, etc. et les rfrences vers
dautres pages. Ajouter les balises <body> et </body> autour du corps du texte, len-tte qui
contient les mta-donnes et terminer avec les balises <html> et </html>.
ManuelDowek.book Page 118 Monday, July 9, 2012 4:58 PM
8 Reprsenter des caractres et des textes
Groupe Eyrolles, 2012
119
Exercice 8.11
crire une page HTML qui prsente la liste des concerts et des spectacles pr-
sents dans un thtre.
Exercice 8.12
Changer le texte HTML Ma <i>premire</i> page web pour que le mot
premire apparaisse non en italique, mais en gras.
Exercice 8.13
Ce texte HTML est incorrect. Comment le corriger ?
Exercice 8.14
Dans ce texte, vers quel site web pointe le lien ?
Comment ce texte saffiche-t-il dans un navigateur ? Quel est lintrt de
regarder le source HTML de cette page avant de cliquer ?
Exercice 8.15
Donner le source HTML du texte suivant sachant que le texte en bleu et sou-
lign est un lien vers la page http://www.monlivre.fr/page2 :
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
<title>Projets Ada Lovelace</title>
</head>
<body>
<h1>Les projets de la classe de TS1 du Lyce <a href = "http://www.adalovelace.fr">Ada Lovelace</a></h1>
<div>
<a href="http://www.adalovelace.fr/informatique/ts1/projets/backgammon/index.html">Un programme qui <b>joue
aux Backgammon</b></a>
</div>
<div>
<a href="http://www.adalovelace.fr/informatique/ts1/projets/compression/index.html">Un programme qui
<b>compresse des images</b></a>
</div>
<div><a href="http://www.adalovelace.fr/informatique/ts1/projets/montecarlo/index.html">Un programme qui
<b>calcule des intgrales</b> sans peine</a>
</div>
</body>
</html>
Il faut <i>comprendre/i> le codage des objets numriques pour les
matriser.
Votre compte bancaire prsente une anomalie. Cliquer <a href="http://grosse-arnaque.com">ici</a> pour avoir de l'aide.
On pourra consulter la page suivante.
ManuelDowek.book Page 119 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
120
Ai-je bien compris ?
Comment reprsente-t-on un caractre ?
Quelle est la diffrence entre le code ASCII et le format Unicode ?
Quelle est la diffrence entre le format Unicode et le format HTML ?
ManuelDowek.book Page 120 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
9
Reprsenter
des images
et des sons
Claude Shannon (1916 - 2001), a
montr en 1949, en sappuyant sur
des travaux antrieurs de Harry
Nyquist, que la frquence dchan-
tillonnage dun son, et plus gnrale-
ment dun signal, doit tre au moins
le double de la frquence maximale
contenue dans ce son, pour que le
son puisse tre restitu partir de
lchantillon. Il a galement montr
comment dcrire les circuits lectro-
niques par des fonctions boolennes
(voir le chapitre 13) et comment
exprimer toutes les fonctions boo-
lennes et arithmtiques laide des
fonctions boolennes lmentaires
(voir le chapitre 10).
Pour dcrire une image, commence par comprendre
comment ton il la voit.
Cest encore avec des 0 et des 1 que lon reprsente les images
et les sons, mais en grand nombre.
Pour dcrire une image, on peut utiliser une reprsentation
vectorielle en dcrivant des formes gomtriques : un cercle,
une droite, etc., ou une reprsentation bitmap en quadrillant
limage et en dcrivant chaque case (pixel). Noir et blanc,
niveaux de gris ou couleurs sont dcrits par diffrents codages.
Les sons aussi sont chantillonns en dcoupant le temps
durant lequel le son est mis.
Les images et les sons sont de trs longues suites de 0 et de 1,
nous introduisons dans ce chapitre les units pour mesurer
la taille des fichiers.
ManuelDowek.book Page 121 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
122
La reprsentation
des images
Pour dcrire limage , une possibilit est de dire : cette image est
forme dun cercle . On peut mme tre plus prcis et indiquer les coor-
donnes du centre du cercle et son rayon. Et, partir de cette descrip-
tion, nimporte qui pourrait reconstituer le dessin.
On peut donc reprsenter cette image par trois nombres : deux pour les
coordonnes du centre et un pour le rayon. Une image forme de plu-
sieurs cercles serait de mme dcrite par trois nombres pour chacun
deux. On peut reprsenter dune manire similaire un dessin form de
cercles et de rectangles, en reprsentant chaque figure par une lettre,
c pour un cercle, r pour un rectangle, suivi dune suite de nombres
qui dfinissent les paramtres de la figure. On parle alors de reprsenta-
tion symbolique, ou parfois de reprsentation vectorielle, dune image.
Nanmoins, cette mthode est peu pratique pour reprsenter limage .
Une autre mthode, qui a lavantage de pouvoir tre utilise sur nimporte
quelle image, consiste superposer un quadrillage limage .
Chacune des cases de ce quadrillage sappelle un pixel (picture element).
On noircit ensuite les pixels qui contiennent une portion de trait ().
Puis, il suffit dindiquer la couleur de chacun des pixels, en les lisant de
gauche droite et de haut en bas, comme un texte. Ce dessin se dcrit donc
par une suite de mots blanc ou noir . Comme seuls les mots noir
ou blanc sont utiliss, on peut tre plus conome et remplacer chacun de
ces mots par un bit, par exemple 1 pour noir et 0 pour blanc .
Le dessin ci-avant, avec une grille de 10 10, se dcrit alors par la suite
de 100 bits suivante :
Cette description est assez approximative, mais on peut la rendre plus pr-
cise en utilisant un quadrillage, non plus de 10 10 pixels, mais de
100 100 pixels. partir de quelques millions de pixels, notre il nest
plus capable de faire la diffrence entre les deux images. Cette manire de
reprsenter une image sous la forme dune suite de pixels, chacun exprims
sur un bit, sappelle une bitmap. Cest une mthode approximative, mais
universelle : nimporte quelle image en noir et blanc peut se dcrire ainsi.
0000000000001111110001100001100100000010010000001001000000100100000010
011000011000111111000000000000
P1
# Un carr noir
10 10
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
ManuelDowek.book Page 126 Monday, July 9, 2012 4:58 PM
9 Reprsenter des images et des sons
Groupe Eyrolles, 2012
127
Le fichier reprsentant la seconde image est significativement plus gros
que celui reprsentant la premire, puisquil faut indiquer trois octets par
pixel, au lieu dun bit dans le cas du fichier PBM.
Exercice 9.4
crire les fichiers de lexercice 9.3 dans un diteur de texte et les ouvrir avec un
logiciel de traitement dimages, par exemple Gimp. Attention, certains dessins
sont petits, il peut tre ncessaire de zoomer pour bien les voir.
Exercice 9.5
Rechercher des informations sur la structure des fichiers GIF.
Combien de bits occupe la reprsentation dun pixel dans ce format ?
Quelle information particulirement importante pour laffichage de
limage le fichier doit-il contenir et qui ntait pas prsente dans les for-
mats PBM, PGM et PPM?
P3
# Un carr rouge
10 10
255
255 0 0
255 0 0
255 0 0
(100 lignes identiques)
Depuis Georges Seurat et Paul Signac, la fin du XIX
e
sicle,
les artistes exploitent cette possibilit surprenante
de suggrer des images, avec des taches monochromes. Ici un Mario
en carrelage, photographi rue au Pltre, Paris, en juillet 2011.
Logo de DansTonChat.com en pixel art
ALLER PLUS LOIN La synthse soustractive
Les imprimantes galement simulent toutes les couleurs
en mlangeant trois types dencre. Pourtant ces trois
encres ne sont pas rouge, vert et bleu, mais cyan,
magenta et jaune. Cela est d au fait que, contraire-
ment un cran qui met de la lumire, une feuille de
papier ne fait que recevoir de la lumire blanche (cest-
-dire un mlange de lumires de toutes les couleurs),
absorber certaines couleurs et reflter les autres. Lencre
rouge, par exemple, absorbe le vert et le bleu et reflte
le rouge. De mme, lencre verte absorbe le rouge et le
bleu et reflte le vert. Si on mlange de lencre rouge et
de lencre verte, on obtient une encre qui absorbe le
rouge, le vert et le bleu et qui ne reflte rien : une encre
noire, et non jaune. Cest pour cela quen synthse sous-
tractive, on doit utiliser trois encres telles que :
La premire absorbe le rouge et reflte le vert et le
bleu : lencre cyan.
La deuxime absorbe le vert et reflte le rouge et le
bleu : lencre magenta.
La troisime absorbe le bleu et reflte le rouge et le
vert : lencre jaune.
Ce mme principe de synthse soustractive est celui
quemploient les peintres pour obtenir toutes les cou-
leurs en mlangeant, sur leur palette, trois couleurs pri-
maires.
ManuelDowek.book Page 127 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
128
La reprsentation des sons
Un son est une variation de la pression de lair au cours du temps. Une
manire simple de reprsenter un son consiste lchantillonner, cest--
dire mesurer la pression intervalles rguliers et le reprsenter comme la
suite des mesures obtenues. Lchantillonnage dun son est une mthode
assez similaire au dcoupage dune image en pixels, sauf que le dcou-
page seffectue, non dans lespace, mais dans le temps. Par exemple, si on
chantillonne 44 000 Hz, cest--dire en faisant 44 000 mesures par
seconde, une sinusode de frquence 440 Hz, on fait cent mesures par
priode et on obtient lchantillon suivant :
En revanche, si lon chantillonne 300 Hz cette mme sinusode, on
fait une mesure toutes les priodes et demie environ, et on obtient
lchantillon suivant :
On comprend quil est possible de reconstituer la sinusode dans le pre-
mier cas, mais pas dans le second. De manire plus gnrale, on montre
que quand on chantillonne un son, il faut, pour que la reconstitution
soit possible, une frquence dchantillonnage au moins double de la fr-
quence la plus leve contenue dans ce son.
ALLER PLUS LOIN La reprsentation
des sons et la notation musicale
Cette manire de reprsenter les sons par chan-
tillonnage se distingue de la notation musicale
utilise depuis le XIII
e
sicle, qui permet de repr-
senter la dure, la frquence et lintensit des
notes de musique, chacune reprsente par un
symbole sur une porte. Des systmes interm-
diaires entre lchantillonnage et la notation
musicale existent aussi, comme le format MIDI
(Musical Instrument Digital Interface) uti-
lis pour reprsenter les sons produits par les ins-
truments de musique lectroniques.
ManuelDowek.book Page 128 Monday, July 9, 2012 4:58 PM
9 Reprsenter des images et des sons
Groupe Eyrolles, 2012
129
En gnral, on chantillonne les sons 44 000 Hz, car le son sinusodal le
plus aigu que notre oreille peut entendre est de 22 000 Hz environ, ce qui
implique que notre oreille ne peut pas distinguer deux sons qui donnent le
mme chantillon 44 000 Hz. Cette frquence est relativement leve ;
cest pourquoi il faut plusieurs millions de bits pour reprsenter une minute
de son et les fichiers audio sont souvent compresss (voir le chapitre 12).
Cette mthode de reprsentation dun son par chantillonnage est uti-
lise dans de nombreux formats. Les plus simples sont RAW, WAV et
BWF, mais il existe de nombreux autres formats plus sophistiqus :
MP3, WMA, AAC, etc. Comme pour les images, ces formats se distin-
guent les uns des autres par la manire dont le son est reprsent, par le
fait quil soit compress ou non, que le format soit public ou secret et
propritaire ou libre.
La taille dun texte,
dune image ou dun son
La taille dune suite de 0 et de 1, que cette suite reprsente un texte, une
image ou un son, sexprime soit en bits, soit en octets, un octet tant gal
8 bits. Par exemple, la suite 0111 0001 0010 0111 a une taille de
16 bits, ou encore de 2 octets.
Comme les textes, les images et les sons sont souvent de longues suites ;
on peut exprimer leurs tailles en kilooctets, mgaoctets, gigaoctets ou
traoctets. Comme en physique, un kilo (k) est un millier (10
3
), un
mga (M) un million (10
6
), un giga (G) un milliard (10
9
) et un tra (T)
mille milliards (10
12
). Ainsi, une image dun mgaoctet est forme de
huit millions de bits. On utilise cependant souvent des prfixes similaires
qui expriment des nombres ronds, non en dcimal, mais en binaire :
un kilo (binaire) est 1 024 (2
10
),
un mga (binaire) 1 048 576 (2
20
),
un giga (binaire) 1 073 741 824 (2
30
),
un tra (binaire) 1 099 511 627 776 (2
40
).
ALLER PLUS LOIN La notation musicale
et la musique contemporaine
La comparaison des diffrentes mthodes de
reprsentation des sons permet de prendre cons-
cience de leurs spcificits. La notation musicale
prsente lavantage, sur les formats RAW ou
MP3, de pouvoir tre lue par un musicien. En
revanche, elle ne permet pas de reprsenter tous
les sons. Il est par exemple impossible de repr-
senter le bruit dune locomotive ou dune porte
qui grince en duo avec un flexaton. Si les musi-
ciens baroques ne pouvaient utiliser le bruit dune
locomotive, ou mme le barrissement dun l-
phant, dans lune de leurs compositions, les
magntophones, puis les instruments lectroni-
ques, ont permis aux compositeurs contempo-
rains de composer des Nocturne aux chemins
de fer et des Variations pour une porte et
un soupir, qui mettent en vidence certaines
limites de la notation musicale.
ALLER PLUS LOIN Prfixes
Pour distinguer ces prfixes des prfixes dci-
maux, certains ont propos dutiliser plutt les
prfixes kibi (Ki), mbi (Mi), gibi (Gi) et tbi (Ti).
Ainsi un mgaoctet (Mo) serait 1 000 000 octets
et un mbioctet (Mio) 1 048 576 octets. Ces pr-
fixes sont malheureusement peu souvent utiliss.
ManuelDowek.book Page 129 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
130
Exercice 9.6 (avec corrig)
On enregistre un son pendant 10 min avec 10 000 chantillons par seconde et
16 bits pour chaque chantillon, sans compresser les donnes. Quelle est la
taille du fichier ?
La taille du fichier est 10 60 10 000 16 bits = 96 000 000 bits, soit
91,55 mgabits (binaire) environ.
Exercice 9.7
On enregistre une image 10 cm 10 cm, avec 100 pixels par centimtre,
chaque pixel tant reprsent par trois nombres entiers, chacun cod sur un
octet. Quelle est la taille du fichier ?
Exercice 9.8
Exprimer les capacits des exercices prcdents en mgabits dcimaux. Que
constate-t-on ? Ces presque 5 % de marge entre les capacits exprimes en
dcimal et en binaire permettent quelques constructeurs de gonfler un peu
les capacits des disques ou des mmoires quils vendent. Voil une raison de
plus dtre vigilant quand on lit les donnes techniques des produits que lon
achte.
Exercice 9.9
Prendre une photo avec un petit appareil numrique, comme celui intgr
un tlphone. Observer la taille du fichier obtenu. Calculer la taille de limage
aprs stre renseign sur le nombre de pixels de lappareil et en supposant
quun pixel est exprim sur trois octets. Comparer la taille du fichier. En
dduire le taux de compression.
Recommencer avec dix photos en prenant soin de prendre la fois des vues
trs riches, avec beaucoup de petits dtails, et des vues sans rien : une feuille
blanche ou une photo sans flash dans le noir. Comparer les taux de compres-
sion obtenus.
SAVOIR-FAIRE Comprendre les tailles des donnes et les ordres
de grandeurs
Trois quantits peuvent entrer en jeu dans la taille dun fichier de donnes :
1 le nombre de bits utilis pour reprsenter une unit de donne : pixel, caractre
alphanumrique, chantillon sonore, etc. ;
2 ventuellement, selon le format, la frquence dchantillonnage : nombre dchan-
tillons par seconde, de pixels par centimtre, etc. ;
3 la taille de lobjet dans une unit concrte : dure du son en secondes, surface de
limage en centimtres carrs, etc.
ManuelDowek.book Page 130 Monday, July 9, 2012 4:58 PM
9 Reprsenter des images et des sons
Groupe Eyrolles, 2012
131
Exercice 9.10 (avec corrig)
Pour une photographie de vacances, peut-on accepter un format avec perte ? Si
on doit envoyer cette photo dans un courrier lectronique, quelle est la taille
maximale du fichier ? Quels logiciels utiliseront les rcepteurs de cette image ?
Pour une photographie de vacances, on peut accepter une lgre perte. Si le
fichier doit transiter par courrier, sa taille est limite quelques mgaoctets
chez la plupart des fournisseurs dadresses et il faut en gnral rechercher une
taille moindre pour que le rcepteur du fichier puisse y accder en un temps
raisonnable. A priori, on ne sait pas quels logiciels seront utiliss, il faut donc
employer un format lisible par le plus grand nombre de logiciels diffrents,
par exemple un format libre.
Exercice 9.11
Pour une courbe reprsentant les rsultats dun TP de physique que lon sou-
haite prsenter dans un expos, peut-on accepter un format avec perte ?
Quelle est la taille maximale du fichier ? Quels logiciels utilise-t-on pour lire
cette image ?
Exercice 9.12
Ouvrir un logiciel de traitement dimages tel que Gimp et y charger une photo.
Observer dans le logiciel sa taille en mmoire en choisissant la fonction Pro-
prit de limage dans le menu Image. Cette taille en mmoire est le produit du
nombre de pixels et de la taille des pixels. En dduire la taille, en octets, de
chaque pixel. Pour une photo en couleurs, le rsultat devrait tre 3 octets. Tou-
tefois, si le format de limage nest pas PPM, le rsultat peut tre diffrent.
Enregistrer cette image sous diffrents formats et diffrents niveaux de com-
pression (voir le chapitre 12). Comparer visuellement les rsultats obtenus.
Observer si le taux de compression propos correspond bien au rapport des
tailles des fichiers.
SAVOIR-FAIRE Choisir un format appropri par rapport un usage
ou un besoin, une qualit, des limites
Identifier les points suivants.
1 Les donnes doivent-elles tre stockes avec prcision ou un certain taux de perte
est-il acceptable ?
2 Quelle taille est acceptable pour le fichier ainsi cr ?
3 Quels logiciels devront pouvoir accder au fichier ?
Ai-je bien compris ?
Quelles sont les deux principales manires de reprsenter une image ?
Comment reprsente-t-on un son ?
En quelle unit se mesure typiquement la taille dun son ou dune image ?
ManuelDowek.book Page 131 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 132 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
10
Les fonctions
boolennes
Dans le Manoir de Bletchey Park,
quartier gnral des services de ren-
seignement britanniques, Thomas
Flowers (1905 - 1998) a construit
pendant la seconde guerre mondiale
la machine Colossus, premier calcula-
teur lectronique utiliser le systme
binaire. Si cette machine ntait pas
encore un ordinateur, elle a cass les
codes secrets (voir le chapitre 12) uti-
liss par larme allemande et a t
un lment essentiel dans la victoire
allie. Plusieurs milliers de personnes
ont travaill Bletchey Park, en parti-
culier Alan Turing.
Pour un oui ou pour un non ? Oui ou non ?
Les fonctions boolennes sont utilises partout : dans les
langages de programmation, en architecture des ordinateurs,
dans certains algorithmes cryptographiques
Elles peuvent tre dcrites par des tables ou de manire
symbolique et nous montrons comment passer dune
reprsentation une autre.
Nous nous concentrons dans ce chapitre sur les fonctions non,
ou et et qui permettent dexprimer toutes les autres.
ManuelDowek.book Page 133 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
134
Nous nous intressons, dans ce chapitre, aux fonctions boolennes, qui
associent un boolen, 0 ou 1, un ou plusieurs boolen(s).
Lexpression
des fonctions boolennes
Comme les fonctions dune variable relle, les fonctions boolennes peu-
vent sexprimer de manire symbolique : lexpression
(non(x) et y) ou (x et z) est btie sur le mme modle que lexpression
(sin(x) y) + (x z), sauf que les variables x, y et z y reprsentent des
boolens et non des nombres rels.
En revanche, contrairement aux fonctions dune variable relle, ces fonc-
tions ne peuvent pas sexprimer par des courbes. Nanmoins, elles peu-
vent sexprimer dune nouvelle manire : par des tables car, la
diffrence des nombres rels, les boolens sont en nombre fini.
Les fonctions non, et, ou
Les fonctions non, et et ou sont dfinies par les tables ci-contre.
Le nom de ces fonctions vient de la convention de lire 0 comme faux
et 1 comme vrai .
Ainsi, la fonction non transforme faux en vrai et vrai en faux : le boo-
len non(x) est donc gal 1 si et seulement si x nest pas gal 1.
De mme, le boolen x et y est gal 1 si et seulement si x est gal 1
et y est gal 1.
Le boolen x ou y est gal 1 si et seulement si au moins x ou y est
gal 1.
On remarquera que, quand x et y sont tous les deux gaux 1, x ou y est
gal 1. Ce ou est donc inclusif ; cest le ou qui apparat dans la phrase
Je viendrai sil y a un bus ou un mtro. et non le ou exclusif qui appa-
rat dans la phrase Tu dois choisir : aller la mer ou aller la
montagne. Pour le distinguer du prcdent, ce ou exclusif sera not oux.
non(x)
x non(x)
0 1
1 0
et(x,y) ou(x,y)
x y et(x,y) x y ou(x,y)
0 0 0 0 0 0
0 1 0 0 1 1
1 0 0 1 0 1
1 1 1 1 1 1
T Notation
De mme que lon crit x + y le nombre que lon
devrait, en toute rigueur, crire +(x,y), on crit
souvent x et y le boolen que lon devrait crire
et(x,y).
ManuelDowek.book Page 134 Monday, July 9, 2012 4:58 PM
10 Les fonctions boolennes
Groupe Eyrolles, 2012
135
Lexpression des fonctions
boolennes avec
les fonctions non, et, ou
On peut exprimer de manire symbolique toutes les fonctions boo-
lennes avec les seules fonctions non, et et ou.
Avant de voir comment le faire dans le cas gnral, on commence par
exprimer cinq fonctions particulires, qui seront utilises dans la suite.
La premire est la fonction multiplexeur, mux. Cette fonction de {0,1}
3
dans {0,1} est telle que si x vaut 0, alors mux(x,y,z) vaut y et si x vaut 1,
alors mux(x,y,z) vaut z. Elle est dfinie par la table ci-contre. Elle
sexprime avec les fonctions non, et et ou, par lexpression symbolique
mux(x,y,z) = (non(x) et y) ou (x et z).
Pour le montrer, on calcule ligne ligne la table de la fonction qui x, y
et z associe (non(x) et y) ou (x et z) en ajoutant des colonnes correspon-
dant aux calculs intermdiaires et on vrifie, ligne ligne, que cette table
est celle de la fonction mux :
Les quatre autres cas particuliers sont les quatre fonctions de {0,1} dans
{0,1} :
la fonction constante gale 0 () exprime, de manire symbolique,
par h(x) = x et non(x),
la fonction constante gale 1 () exprime par k(x) = x ou non(x),
l identit () exprime par i(x) = x, sans utiliser aucune fonction,
et la fonction non,
qui peuvent donc toutes les quatre tre exprimes avec des fonctions non,
et et ou.
x y z non(x) non(x) et y x et z (non(x) et y) ou (x et z)
0 0 0 1 0 0 0
0 0 1 1 0 0 0
0 1 0 1 1 0 1
0 1 1 1 1 0 1
1 0 0 0 0 0 0
1 0 1 0 0 1 1
1 1 0 0 0 0 0
1 1 1 0 0 1 1
mux(x,y,z)
x y z mux(x,y,z)
0 0 0 0
0 0 1 0
0 1 0 1
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 0
1 1 1 1
x h(x) x k(x) x i(x)
0 0 0 1 0 0
1 0 1 1 1 1
ManuelDowek.book Page 135 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
136
On peut maintenant voir comment exprimer toutes les fonctions de
{0,1}
n
dans {0,1} avec les fonctions non, et et ou. On procde par rcur-
rence sur n.
Dans le cas n = 1, la fonction exprimer est lune des fonctions h, k, i et
non, qui peuvent toutes sexprimer avec les fonctions non, et et ou.
On suppose maintenant que lon sait exprimer toutes les fonctions de
{0,1}
n
dans {0,1} avec les fonctions non, et et ou et on se donne une
fonction f de {0,1}
n+1
dans {0,1}. On dfinit les fonctions g et g de
{0,1}
n
dans {0,1} par :
et on remarque que la fonction f peut sexprimer de manire symbolique
avec les fonctions g, g et mux :
car, quand x
n+1
vaut 0, le membre de gauche et le membre de droite sont
tous les deux gaux g(x
1
,, x
n
) et, quand x
n+1
vaut 1, les deux mem-
bres sont gaux g(x
1
,, x
n
).
Par hypothse de rcurrence, on sait exprimer les deux fonctions g et g de
manire symbolique avec les fonctions non, et et ou, et comme on sait aussi
exprimer la fonction mux, on peut exprimer la fonction f en remplaant les
fonctions mux, g et g par leur expression en termes de non, et et ou.
g(x
1
, , x
n
) = f(x
1
,, x
n
,0)
g(x
1
,, x
n
) = f(x
1
,, x
n
,1)
f(x
1
,, x
n
, x
n+1
) = mux(x
n+1
, g(x
1
,, x
n
), g(x
1
,, x
n
))
SAVOIR-FAIRE Trouver une expression symbolique exprimant
une fonction partir de sa table
On identifie le nombre darguments de la fonction f. On extrait de la table de la
fonction f les tables des fonctions g et g dfinies par :
g(x
1
, , x
n
) = f(x
1
,, x
n
,0)
g(x
1
,, x
n
) = f(x
1
,, x
n
,1)
On trouve les expressions symboliques de ces deux fonctions et on construit celle de la
fonction f partir de ces deux expressions symboliques et de celle de la fonction multi-
plexeur.
ManuelDowek.book Page 136 Monday, July 9, 2012 4:58 PM
10 Les fonctions boolennes
Groupe Eyrolles, 2012
137
Exercice 10.1 (avec corrig)
Trouver une expression symbolique exprimant une fonction ou exclusif (oux)
dfinie par la table ci-contre.
Le boolen x oux y est gal 1 si et seulement si x est gal 1 ou y est gal
1, mais pas les deux.
Soit g la fonction dfinie par g(x) = x oux 0 et g la fonction dfinie par
g(x) = x oux 1. La table de la fonction g est et celle de la fonction g est .
On reconnat les tables de la fonction identit et de la fonction non. Donc
g(x) = x et g(x) = non(x), do on tire lexpression de la fonction oux :
x oux y = mux(y,x,non(x)) = (non(y) et x) ou (y et non(x))
Exercice 10.2
Trouver lexpression symbolique de la fonction de si et seulement si dfinie
par la table ci-contre.
Lexpression des fonctions
boolennes avec
les fonctions non et ou
On veut maintenant montrer quil est possible de se passer de la fonction et
et que toutes les fonctions boolennes peuvent sexprimer avec les fonc-
tions non et ou. Pour cela, il suffit de montrer que la fonction et elle-mme
peut sexprimer ainsi. Cette fonction sexprime de la manire suivante :
x et y = non (non(x) ou non(y))
En effet, la table de la fonction qui x et y associe non (non(x) ou non(y))
se calcule ligne ligne (voir ci-contre) et on reconnat la table de la
fonction et.
Exercice 10.3
Montrer que :
x ou y = non (non(x) et non(y))
En dduire que toutes les fonctions boolennes peuvent sexprimer avec les
fonctions non et et.
x y x oux y
0 0 0
0 1 1
1 0 1
1 1 0
x g(x) x g'(x)
0 0 0 1
1 1 1 0
x y x ssi y
0 0 1
0 1 0
1 0 0
1 1 1
x y non (non(x) ou non(y))
0 0 0
0 1 0
1 0 0
1 1 1
ManuelDowek.book Page 137 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
138
Exercice 10.4
La fonction de Sheffer exprime lincompatibilit de deux valeurs boolennes.
Elle est dfinie par la table ci-contre.
Montrer que S(x, y) = non(x et y).
Montrer, rciproquement, que non(x) = S(x,x) et x ou y = S(S(x,x),S(y,y)). En
dduire que toutes les fonctions boolennes peuvent sexprimer avec la fonc-
tion de Sheffer uniquement.
Le choix dexprimer les fonctions avec les fonctions non et ou nest donc quun
choix parmi dautres.
Exercice 10.5
Quand deux interrupteurs sont en parallle, la lumire sallume quand lun
deux est ferm. Quand ils sont en srie, la lumire sallume quand les deux
sont ferms. Quand ils sont en va-et-vient la lumire sallume quand les deux
sont ferms ou les deux sont ouverts. Donner la table de la fonction boo-
lenne dans ces trois cas et exprimer ces trois fonctions boolennes avec les
fonctions non et ou.
Exercice 10.6
Montrer que x et y = y et x. Est-ce la mme chose pour ou ? Calculer x et 1 et
x et 0. On appelle lment neutre dune fonction binaire f, un lment n tel
que pour tout x, f(x,n) = f(n,x) = x et lment absorbant un lment a tel que
pour tout x, f(x,a) = f(a,x) = a. La fonction et a-t-elle un lment neutre ? Et un
lment absorbant ? La fonction ou a-t-elle un lment neutre ? Et un l-
ment absorbant ?
Exercice 10.7
Med est content si Bob et Jon sont tous les deux l, mais sans Rut, ou si Rut est
l soit avec Bob, soit avec Jon. Construire une table avec en entre la prsence
de Rut, Bob et Jon et en sortie le boolen qui vaut 1 si Med est content.
Exprimer le choix de Med par une phrase plus simple.
Exercice 10.8
Soit f une fonction qui sexprime de manire symbolique avec la fonction ou
uniquement. Montrer que f(0,0,,0) = 0. Montrer que la fonction non ne peut
pas sexprimer avec la fonction ou uniquement.
x y S (x,y)
0 0 1
0 1 1
1 0 1
1 1 0
Ai-je bien compris ?
Quelles sont les deux principales manires de reprsenter une fonction boolenne ?
Quelle est la table de la fonction non ? Celle de la fonction et ? Celle de la fonction ou ?
Quelles sont les fonctions de base partir desquelles il est possible de construire
toutes les autres fonctions ?
ManuelDowek.book Page 138 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
11
Structurer
linformation
CHAPITRE AVANC
En 1989, Tim Berners-Lee (1955 ) a
propos un outil aux nombreux cher-
cheurs de lOrganisation euro-
penne pour la recherche nuclaire
(CERN) pour partager de grandes
quantits dinformations : insrer
dans des textes des liens vers dautres
textes, situs sur dautres ordinateurs,
auxquels on accde travers le
rseau Internet. Cette toile darai-
gne de liens a vite trouv un nom:
le Web. Tim Berners Lee est lauteur
du langage HTML et du premier
navigateur : Nexus.
Comment trouver son chemin dans une jungle
dinformations ?
Dans ce chapitre, nous voyons comment les informations
seffacent, se conservent, sorganisent, selon les usages que
nous voulons en faire, de la notion de fichier en arborescence
et de liens celle de base de donnes.
Nous insistons ici sur la notion de persistance des donnes
avec le danger de lhypermnsie et discutons les enjeux autour
de la gratuit de la copie ou diffusion de linformation.
ManuelDowek.book Page 139 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
140
La persistance des donnes
Reprenons lide de crer, comme au chapitre 3, un programme de ges-
tion dun rpertoire. Cependant, au lieu dtre dcids une fois pour
toutes au moment de lcriture du programme, les noms et les numros
de tlphone de ce rpertoire sont entrs par lutilisateur du programme.
Par exemple :
Le point qui nous intresse ici est que, quand on tape la commande q, le
programme se termine et les donnes entres sont perdues. Si on excute
nouveau ce programme, on doit nouveau entrer tous les contacts, ce
qui nest pas en gnral ce que lon souhaite faire quand on utilise un
rpertoire : on souhaite que les donnes soient persistantes, cest--dire
quelles demeurent un endroit accessible quand le programme se ter-
mine et mme quand on teint lordinateur sur lequel ce programme est
excut, voire quand on remplace cet ordinateur par un autre.
Cette question de la persistance des donnes se pose deux niveaux.
Cest dabord une question de matriel : les valeurs stockes dans les
variables dun programme sont physiquement stockes dans la mmoire
de lordinateur (voir le chapitre 14) et ces donnes sont perdues quand
lordinateur est teint et que la mmoire cesse dtre alimente en cou-
rant lectrique. Cela a men concevoir des priphriques, comme les
disques, ou les cls de mmoire flash aussi appeles cls USB, qui peuvent
stocker des donnes de manire persistante. La persistance des donnes
est ensuite une question de programmation, puisquil faut tre capable,
dans un programme, de stocker des donnes sur un tel priphrique et
dutiliser de telles donnes.
a Alice 060606060606
Contact ajout
3 On ajoute un numro.
a Bob 0606060607
Contact ajout
3 On ajoute un autre numro.
i Alice
60606060606
3 On interroge le rpertoire.
q 3 On quitte le programme.
ManuelDowek.book Page 140 Monday, July 9, 2012 4:58 PM
11 Structurer linformation
Groupe Eyrolles, 2012
141
La notion de fichier
Un texte en ASCII ou en HTML, une image au format PBM, PGM ou
PPM, un son au format RAW ou MP3, un programme en Java ou en C,
sont des exemples de donnes que lon souhaite faire persister, par
exemple en les stockant sur un disque.
Un disque stocke simplement une suite de bits, une suite de 0 et de 1. Le
nombre de bits quun disque peut stocker est appel sa capacit : par
exemple un disque dun traoctet (binaire) peut stocker 2
40
mots de 8 bits,
soit un peu plus de huit mille milliards de bits. On peut donc facilement
stocker un texte, une image, un son ou un programme sur un tel disque.
Cependant, comme on souhaite souvent stocker sur un disque plusieurs
images, textes, etc., il faut diviser les huit mille milliards de bits dont le
disque est constitu en plusieurs espaces plus petits, que lon appelle des
fichiers. Un fichier est simplement une suite de 0 et de 1, laquelle on
associe un nom. Par exemple, nous avons vu que le texte Je pense, donc je
suis. se reprsente en ASCII comme la suite de 184 bits suivante :
Il est possible de stocker cette suite de bits sur un disque en lui donnant
le nom cogito.txt, lextension txt indiquant que cette suite de bits
exprime un texte en ASCII.
Utiliser un fichier
dans un programme
Pour revenir lexemple du rpertoire, on commence par stocker les
contacts dans un fichier repertoire.txt qui peut avoir t crit la
main, en utilisant un diteur de texte ou un logiciel de traitement de
texte, ou t produit par un autre programme. Il a la forme suivante :
010010100110010100100000011100000110010101101110011100110110010
100101100001000000110010001101111011011100110001100100000011010
1001100101001000000111001101110101011010010111001100101110
Alice
0606060606
Bob
0606060607
ManuelDowek.book Page 141 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
142
Le programme dinterrogation du rpertoire est semblable celui du
chapitre 3, la diffrence prs que, au lieu de remplir les cases des
tableaux nom et tel avec des constantes, on transfre ces informations
depuis le fichier repertoire.txt dans les tableaux nom et tel. Pour cela,
on utilise une nouvelle fonction Isn.readStringFromFile (lire une
chane de caractres dans un fichier) en tout point semblable la fonc-
tion Isn.readString que lon a dj employe, sauf quau lieu dattendre
quune chane de caractres soit tape au clavier, elle la lit dans un fichier.
Avant de pouvoir lire dans un fichier, il faut tablir un canal de commu-
nication avec lui ; cest ce que lon appelle ouvrir le fichier. Cela se fait
avec la fonction Isn.openIn qui prend en argument une chane de carac-
tres, le nom du fichier, et qui retourne le canal de communication lui-
mme. Ensuite, la fonction Isn.readStringFromFile prend en argument
ce canal de communication et retourne la chane de caractres lue.
Quand la lecture est acheve, il faut fermer le canal de communication
avec linstruction Isn.closeIn. Le canal de communication lui-mme a
le type java.util.Scanner.
En rsum, le programme commence par allouer deux tableaux nom et
tel, ouvre un canal de communication f avec le fichier repertoire.txt,
lit les dix noms et les dix numros de tlphone sur ce canal de commu-
nication, puis ferme ce canal.
Charles
0606060608
Djamel
0606060609
tienne
0606060610
Frdrique
0606060611
Guillaume
0606060612
Hector
0606060613
Isabelle
0606060614
Jrme
0606060615
nom = new String [10];
tel = new String [10];
f = Isn.openIn("repertoire.txt");
for (i = 0; i <= 9; i = i + 1) {
nom[i] = Isn.readStringFromFile(f);
tel[i] = Isn.readStringFromFile(f);}
Isn.closeIn(f);
ManuelDowek.book Page 142 Monday, July 9, 2012 4:58 PM
11 Structurer linformation
Groupe Eyrolles, 2012
143
La suite du programme est similaire celui du chapitre 3. On demande
un nom lutilisateur, au clavier cette fois-ci, on recherche ce nom dans
le tableau nom laide dune boucle while et quand on la trouv, on
affiche le numro de tlphone correspondant.
On peut alors utiliser ce programme comme celui du chapitre 3 :
Exercice 11.1
Que se passe-t-il si lon ouvre et ferme le fichier chaque lecture ?
Exercice 11.2
crire un programme de rpertoire invers, qui demande lutilisateur un
numro de tlphone et recherche le nom associ.
crire dans un fichier se fait de manire similaire : on ouvre le fichier
avec linstruction Isn.openOut qui prend en argument une chane de
caractres et qui retourne un canal de communication. On crit dans le
fichier avec les instructions Isn.printToFile et Isn.printlnToFile qui
prennent en argument un canal de communication et un objet crire,
chane de caractres, nombre entier ou nombre virgule, et on ferme le
canal de communication avec linstruction Isn.closeOut. Un canal de
communication qui permet, non de lire, mais dcrire dans un fichier a le
type java.io.OutputStreamWriter.
Exercice 11.3
Adapter le programme, ci-avant, pour quil puisse enregistrer de nouveaux
numros. Le fichier sera entirement lu et rcrit chaque modification.
s = Isn.readString();
i = 0;
while (i < 10 && !Isn.stringEqual(s,nom[i])) {
i = i + 1;}
if (i < 10) {
System.out.println(tel[i]);}
else {
System.out.println("Inconnu");}
Hector
0606060613
ManuelDowek.book Page 143 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
144
Organiser des fichiers
en une arborescence
Quand un disque, ou une cl de mmoire flash, contient plusieurs
fichiers, il est possible den afficher la liste. La manire la plus courante
de le faire est de reprsenter chaque fichier par une icne dans une
fentre, la forme de licne variant en fonction du format du fichier.
On peut aussi simplement afficher la liste des fichiers par ordre alphab-
tique avec, dans une fentre terminal, une commande qui sappelle ls ou
dir selon le systme dexploitation.
Dcouper un disque en fichiers nest toutefois pas suffisant, car il est
probable que ce disque contiendra rapidement plusieurs milliers de
fichiers : des fichiers professionnels, comme les programmes que lon est
en train ou que lon a termin de dvelopper, des fichiers personnels,
comme des photos de vacances, etc. Il est donc ncessaire dorganiser ces
fichiers. Une manire de le faire est de regrouper ces derniers dans des
dossiers ; par exemple, tous les fichiers professionnels dans un dossier Pro
et tous les fichiers personnels dans un dossier Perso. lintrieur du dos-
sier Pro, on peut encore regrouper tous les fichiers qui concernent ce
cours dans un dossier Informatique, tous les fichiers qui concernent le
cours de physique dans un dossier Physique, etc. lintrieur du dossier
ls
Isn.java joconde.ppm Repertoire.java repertoire.txt Vinci.java
ManuelDowek.book Page 144 Monday, July 9, 2012 4:58 PM
11 Structurer linformation
Groupe Eyrolles, 2012
145
Informatique, on peut regrouper tous les fichiers qui concernent le projet
dcrire un programme de gestion de rpertoire dans un dossier Rper-
toire, etc. Si bien que le disque contient un dossier Pro, qui contient un
dossier Informatique, qui contient un dossier Rpertoire, qui contient
enfin le fichier Repertoire.java, et dautres. On appelle une telle orga-
nisation des fichiers une organisation arborescente, car on peut la visua-
liser sous la forme dun arbre.
Dans cet arbre, le chemin dun fichier est la liste des noms des nuds de
la branche qui va de la racine de larbre au fichier en question. Par
exemple, le chemin du fichier Repertoire.java est /DISQUE/Pro/
Informatique/Rpertoire/Repertoire.java.
SAVOIR-FAIRE Classer des fichiers sous la forme dune arborescence
Faire la liste des fichiers classer, les regrouper en catgories homognes, donner un
nom significatif chacune de ces catgories. ventuellement les regrouper elles-mmes
en catgories homognes. Crer les dossiers correspondant chacune de ces catgories.
Mettre chaque fichier dans le dossier appropri.
ManuelDowek.book Page 145 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
146
Exercice 11.4 (avec corrig)
Classer, sous la forme dune arborescence, les fichiers suivants :
des photos de vacances,
des photos de sa classe,
une page de tableur prsentant ses notes du trimestre,
des pages de Wikipdia prsentant des informations utiles pour son TPE,
des copies de mails personnels,
un fichier texte contenant les notes prises dans une runion prparatoire
au conseil de classe,
des fichiers de musique pour son baladeur,
des fichiers de musique tlchargs en prparation de son TPE.
On commence par donner un nom chacune de ces catgories : photos de
vacances, photos de classe, etc. On peut regrouper les dossiers contenant les
photos de vacances, les mails personnels et les fichiers pour son baladeur, dans
un dossier Perso, les photos de la classe et les notes prises en runion dans un
dossier Dlgu, puisque ces diffrentes informations sont lies cette fonc-
tion, les pages de Wikipdia et la musique tlcharge pour le TPE peuvent
tre rassembles dans un dossier TPE, enfin on peut regrouper le dossier
Dlgu, le dossier TPE et les notes du trimestre dans un dossier Pro. On
obtient alors larborescence suivante.
Exercice 11.5
Classer, sous la forme dune arborescence, les fichiers qui tranent dans son
rpertoire personnel sur les ordinateurs du lyce.
ManuelDowek.book Page 146 Monday, July 9, 2012 4:58 PM
11 Structurer linformation
Groupe Eyrolles, 2012
147
Liens et hypertextes
Lorganisation arborescente des fichiers nest pas le seul moyen de struc-
turer linformation : elle est en concurrence avec dautres mthodes,
parmi lesquelles lutilisation de liens hypertextes, notion qui na pas t
invente pour structurer linformation, mais pour simplifier la notion de
rfrence dans une page web (voir le chapitre 8).
Ainsi, une page web, crite au format HTML,
visualise dans un navigateur, apparat de la manire suivante :
Et en cliquant sur lun des mots en bleu et souligns, on accde directe-
ment au fichier Repertoire.java ou au fichier repertoire.txt. Il est
donc possible daccder un fichier sans savoir prcisment o il se
trouve dans larborescence, simplement en cliquant sur un lien.
Cette remarque mne une autre manire dorganiser les fichiers sur un
disque, o la place du fichier dans larborescence est moins importante que
la manire dy accder en cliquant sur un lien qui apparat dans une page.
Par exemple, au lieu de classer ses photos dans plusieurs dossiers, Anniver-
saire, Londres, etc. on laisse ses photos en vrac dans un dossier et on cre
une page web pour accder ses photos danniversaire, une autre pour
accder aux photos de son voyage Londres, etc. et une page web qui
permet daccder chacune de ces pages. Cette ide est la base du Web,
des logiciels de gestion de photos ou de fichiers son et des rseaux sociaux.
Le programme <a href =
"file:///DISQUE/Pro/Informatique/Rpertoire/
Repertoire.java">Repertoire.java</a> permet de rechercher un
nom dans un rpertoire, exprim sous forme d'un fichier texte,
comme le fichier
<a href =
"file:///DISQUE/Pro/Informatique/Rpertoire/
repertoire.txt">repertoire.txt</a>.
Le programme Repertoire.java permet de rechercher un nom dans un
rpertoire, exprim sous forme dun fichier texte, comme le fichier
repertoire.txt.
EN SAVOIR PLUS Structure darbre
et structure de graphe
Cette mthode permet aussi de dpasser facile-
ment les limites dun disque unique et de rf-
rencer des fichiers qui se trouvent ailleurs sur le
rseau. En outre, dans une structure arbores-
cente, si le dossier B est un lment du
dossier A, le dossier A ne peut pas son tour
tre un lment du dossier B. En revanche, avec
des liens hypertextes, rien nempche une
page A de contenir un lien vers une page B, qui
contient elle-mme un lien vers la page A.
une structure darbre se substitue donc une
structure de graphe (voir le chapitre 22).
ManuelDowek.book Page 147 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
148
Lhypermnsie
La persistance des donnes, qui est souvent souhaite, a aussi quelques
effets indsirables. Par exemple, quand un ordinateur hors dusage est
mis au grenier, son disque continue contenir des milliers de textes,
courriers, photos, etc. et il est possible que cent ans plus tard, ces infor-
mations soient encore accessibles. Les ordinateurs sont hypermnsiques :
ils noublient rien. Souhaite-t-on rellement que ses petits enfants puis-
sent accder toutes ses photos, la liste des sites web que lon a visits,
aux conversations que lon a eues sur le chat, aux mails que lon a
changs, etc. ?
Bien entendu, ce phnomne dhypermnsie existait avant les
ordinateurs : dans le mme grenier, un album de photos ou une liasse de
lettres manuscrites pouvaient aussi voyager dans le temps. La diffrence
est quun album de photos ou une liasse de lettres se voit et contient peu
dinformations. Un disque de un traoctet (binaire) peut stocker
2
40
caractres, soit un million de livres de cinq cents pages, sans que lon
voie, au premier abord, ce quil contient.
Si lon ny prend garde, on ira peut-tre vers un monde dans lequel rien
ne soubliera : chaque geste laissera une trace dans tout tat postrieur du
monde.
Cette hypermnsie des ordinateurs serait un problme facile rsoudre
si les ordinateurs ntaient pas connects en rseau : chacun devrait sim-
plement trier les informations quil souhaite garder et celles quil sou-
haite dtruire sur le disque de son ordinateur. Nanmoins, comme les
ordinateurs sont connects en rseaux, les courriers changs peuvent
aussi tre conservs par les fournisseurs de services de courrier. Il en va
de mme avec la liste des produits que lon achte et les magasins en
ligne, ou ceux dans lesquels on a une carte de fidlit, les images filmes
par les camras de surveillance et les entreprises qui installent et grent
ces camras, etc.
Ces problmes, qui sont nouveaux, ont dj reu des solutions partielles,
mais bien des solutions sont encore inventer. Parmi elles, certaines sont
individuelles : quand on met une photo en ligne, on peut la protger par
un mot de passe ou en restreindre laccs un petit nombre de
personnes ; ainsi elle ne sera pas archive par les moteurs de recherche.
Dautres sont collectives : par exemple, larticle 6 de la loi du
6 janvier 1978 (modifie plusieurs fois) indique que des donnes carac-
tre personnel ne peuvent tre conserves sous une forme permettant
lidentification des personnes concernes au-del de la dure ncessaire
aux finalits pour lesquelles elles ont t collectes.
SUJET DEXPOS Loi du 6 janvier 1978
Rechercher le texte de la loi du 6 janvier 1978
afin den prsenter les ides principales.
ManuelDowek.book Page 148 Monday, July 9, 2012 4:58 PM
11 Structurer linformation
Groupe Eyrolles, 2012
149
Alors que, dans les derniers millnaires, lhumanit a beaucoup cherch
laisser des traces de ses actions, elle commence juste prendre conscience
de limportance quil y a aussi parfois effacer certaines de ces traces.
Exercice 11.6
Chercher sur le Web la dfinition du droit loubli que certains cherchent
promouvoir comme un droit fondamental.
Pourquoi linformation
est-elle souvent gratuite ?
Si lon achte une pomme et si on la mange, cette pomme ne peut pas
aussi tre mange par quelquun dautre. De mme, si on achte un sac
de charbon pour chauffer sa maison, ce sac de charbon ne peut pas aussi
chauffer la maison de quelquun dautre. Et si lon achte les services
dun jardinier pour tondre sa pelouse, ce jardinier ne peut pas en mme
temps tondre la pelouse de quelquun dautre. Une pomme, un sac de
charbon ou les services dun jardinier sont des biens dont la consomma-
tion par une personne exclut la consommation par une autre. On dit que
de tels biens sont rivaux. Jusquau XX
e
sicle, presque tous les biens pro-
duits par lagriculture et lindustrie taient rivaux et notre conomie, en
particulier notre notion de proprit, est construite pour la production,
lchange et la consommation de tels biens.
Un fichier qui contient un texte, un morceau de musique, une image,
une vido ou un programme est, en revanche, un bien non rival. Reco-
pier un tel fichier ou le diffuser sur un rseau ne cote pratiquement
rien, si bien que le fait quune personne coute un morceau de musique
nempche nullement une autre personne dcouter le mme morceau.
Linformation est, par nature, un bien non rival. Un livre, un CD, une
photo, un DVD, un CD-ROM sont des biens rivaux, mais non un texte,
une pice de musique, une image, une vido ou un programme.
Si une mine produit un sac de charbon et le vend une personne qui luti-
lise pour chauffer sa maison et quune seconde personne souhaite aussi
acheter un sac de charbon pour chauffer la sienne, la mine doit produire
un second sac de charbon, ce qui lui cote de largent. De ce fait, la mine
na pas dautre choix que celui de vendre ce sac de charbon la seconde
personne. En revanche, si une entreprise produit une vido pour une per-
sonne et quune seconde personne souhaite aussi regarder cette vido,
SUJET DEXPOS La CNIL
Prsenter la Commission nationale de linforma-
tique et des liberts.
ManuelDowek.book Page 149 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
150
lentreprise peut, en thorie, donner cette vido gratuitement la seconde
personne, car, une vido tant un bien non rival, cela ne cote rien de plus
lentreprise de laisser une seconde personne en profiter galement.
Ce raisonnement mne cependant un paradoxe : pourquoi le premier
client paierait-il la vido, sil sait quil lui suffit dattendre que quelquun
dautre la paie pour tre le second ? Au cours de lhistoire, les producteurs
de biens non rivaux ont imagin diffrentes manires de rpondre cette
question.
Imiter le march des biens rivaux, cest--dire empcher les per-
sonnes qui ne le paient pas de consommer un bien, mme si cela ne
coterait rien de plus de les laisser le consommer. Ainsi laccs cer-
taines chanes de tlvision est interdit aux personnes qui ne paient
pas un abonnement, mme si laisser ces personnes regarder ces
chanes ne coterait rien de plus.
Faire payer chacun ce quil est prt payer pour ce bien. Cest par
exemple le cas de logiciels qui sont payants pour les entreprises, mais
beaucoup moins chers pour les particuliers, voire gratuits pour les
tudiants.
Faire payer chacun ce quil souhaite payer. Cest le cas de certaines
radios dans le monde, qui sont gratuites mais rappellent frquem-
ment lantenne que, si on ne leur envoie pas un chque de temps en
temps, elles finiront par fermer.
changer ce bien, non contre de largent, mais contre un bien dont
tout le monde dispose : du temps et de lattention. Cest la rponse
des chanes de tlvision ou des sites web qui sont gratuits, mais qui
demandent leurs consommateurs daccorder un peu de temps et
dattention des publicits.
Distribuer un bien gratuitement, car cela cre de la demande pour un
autre bien, rival cette fois-ci. Ainsi, certaines entreprises distribuent
un logiciel gratuitement, mais font payer les cours pour apprendre
sen servir.
Faire payer tout le monde, consommateur ou non, cest par exemple
le cas des chanes de tlvision publiques, qui sont payes par un
impt spcial. Cest galement le cas du service des pompiers qui est
pay par les impts.
Une dernire rponse est celles dentreprises qui dveloppent un logiciel
pour leur besoins propres et qui ensuite laissent tout le monde en pro-
fiter et aussi amliorer ce logiciel, ce dont elles bnficient en retour.
Plusieurs de ces rponses mnent donc distribuer gratuitement des
biens non rivaux, en particulier de linformation, ce quil est impossible
de faire avec des pommes, des sacs de charbons ou les services dun jardi-
nier qui, avant davoir un prix, ont un cot.
ManuelDowek.book Page 150 Monday, July 9, 2012 4:58 PM
11 Structurer linformation
Groupe Eyrolles, 2012
151
ALLER PLUS LOIN Les bases de donnes
Pour grer de grandes quantits de donnes, par
exemple lensemble des rservations de billets de train
ou davion que doit grer une compagnie ferroviaire ou
arienne, il nest pas possible dutiliser une simple struc-
ture arborescente ou base de liens hypertextes. On
doit utiliser des outils plus sophistiqus : un systme de
gestion de bases de donnes et un langage de manipula-
tion de donnes, comme le langage SQL.
Le rpertoire que nous avons construit ci-avant peut
tre dfini comme un ensemble fini de couples forms
dun nom et dun numro de tlphone
R = {(nom = Alice ; tel = 0606060606),
(nom = Bob ; tel = 0606060607),
(nom = Charles ; tel = 0606060608),
(nom = Djamel ; tel = 0606060609),
(nom = tienne ; tel = 0606060610),
(nom = Frdrique ; tel = 0606060611),
(nom = Guillaume ; tel = 0606060612),
(nom = Hector ; tel = 0606060613),
(nom = Isabelle ; tel = 0606060614),
(nom = Jrme ; tel = 0606060615)}
Un tel ensemble de couples, de triplets ou, plus gnra-
lement, de n-uplets, sappelle une relation et un
ensemble de relations sappelle une base de donnes.
Par exemple, si Alice, Bob, Charles, Djamel, tienne, Frd-
rique, Guillaume, Hector, Isabelle et Jrme sont des musi-
ciens, outre la relation ci-avant qui indique le numro de
tlphone de chacun, on peut dfinir une autre relation
qui indique les instruments dont chacun joue.
I = {(nom = Alice ; instrument = alto),
(nom = Bob ; instrument = contrebasse),
(nom = Charles ; instrument = cor),
(nom = Charles ; instrument = trompette),
(nom = Djamel ; instrument = piano),
(nom = tienne ; instrument = xylophone),
(nom = Frdrique ; instrument = harpe),
(nom = Guillaume ; instrument = basson),
(nom = Hector ; instrument = basson),
(nom = Hector ; instrument = contrebasson),
(nom = Isabelle ; instrument = hautbois),
(nom = Isabelle ; instrument = clarinette),
(nom = Jrme ; instrument = violon)}
et une autre qui indique la famille de chaque instrument
F = {(instrument = violon ; famille = cordes),
(instrument = hautbois ; famille = bois),
(instrument = clarinette ; famille = bois),
(instrument = xylophone ; famille = percussions), }
Lensemble de ces trois relations constitue une base de
donnes.
Un systme de gestion de bases de donnes est un systme
qui permet de crer de telles relations, dajouter ou de
retirer des n-uplets dans une relation et de rechercher
des n-uplets. Pour cela, on formule des requtes dans un
langage de gestion de donnes.
Par exemple, on peut formuler la requte de chercher
les instruments dont joue Hector, en cherchant les cou-
ples de la relation I dont la composante nom est Hector :
(nom = Hector ; instrument = basson)
(nom = Hector ; instrument = contrebasson)
On peut de mme chercher les joueurs de basson, en cher-
chant les couples de la relation I dont la composante ins-
trument est basson. On trouvera alors deux couples
(nom = Guillaume ; instrument = basson)
(nom = Hector ; instrument = basson)
On peut aussi fabriquer, partir des relations R et I, une
nouvelle relation qui est un ensemble de triplets forms
dun nom, dun numro de tlphone et dun instru-
ment. On appelle cela la jointure des relations R et I et il
est possible de chercher dedans comme dans les rela-
tions simples ; par exemple, on peut chercher ceux des
triplets de cette jointure dont la composante instrument
est basson. On obtiendra ainsi deux triplets
(nom = Guillaume ; tel = 0606060612 ; instrument = basson)
(nom = Hector ; tel = 0606060613 ; instrument = basson)
ce qui est linformation dont on a besoin quand on
cherche remplacer un bassoniste.
Quand on utilise un systme de gestion de bases de don-
nes, on exprime donc, dans un langage de haut niveau,
des requtes dont lexcution consulte et modifie des
fichiers. Toutefois, il nest plus ncessaire de connatre la
forme exacte de ces fichiers, car on ny accde plus que par
lintermdiaire du systme de gestion de bases de donnes.
ManuelDowek.book Page 151 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
152
ALLER PLUS LOIN Transformer, stocker et transmettre des informations
Lalgorithme de laddition en base deux (voir le chapitre 18) illustre une
manire dutiliser les ordinateurs pour transformer des informations :
les informations 10 et 11 sont transformes en 101. Ce chapitre illustre
quant lui une autre manire dutiliser des ordinateurs, non pour trans-
former des informations, mais pour les stocker et les retrouver plus tard.
Une troisime utilisation des ordinateurs consiste transmettre des
informations dun endroit un autre.
Les ordinateurs ont essentiellement t invents pour transformer des
informations. Le stockage et la transmission sont venus plus tard et ont
apport avec eux de nouveaux problmes et de nouveaux algorithmes,
par exemple pour interroger les bases de donnes ou pour mettre jour
des tables de routage (voir le chapitre 16).
Ai-je bien compris ?
Quelle est la diffrence entre une donne persistante et une donne non persistante ?
Quels sont les diffrents moyens dorganiser les informations ?
Que signifie le mot hypermnsie ?
ManuelDowek.book Page 152 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
12
Compresser,
corriger,
chiffrer
CHAPITRE AVANC
Ronald Rivest (1947-), Adi Shamir
(1952-) et Len Adleman (1945-) ont
conu, en 1978, une mthode de chif-
frement, la mthode RSA, fonde sur
lutilisation de deux cls : une cl
prive et une cl publique. La
mthode la plus rapide connue ce
jour pour retrouver la cl prive
partir de la cl publique est la dcom-
position dun nombre entier en un
produit de facteurs premiers, calcul
qui demande un temps trs long,
quand le nombre factoriser dpasse
quelques milliers de chiffres binaires.
Zhqm, zmgm, zmfm. ( Jules Csar, 47 av. J.-C.)
Nous voyons maintenant comment modifier lexpression
des donnes dans le but dconomiser de lespace, de corriger
des erreurs ou de les protger. Pour cela, nous utilisons
des formats beaucoup plus sophistiqus que ceux vus
aux chapitres 8 et 9.
Pour la compression, nous expliquons comment dfinir un
dictionnaire des mots utiliss et les coder selon leur frquence.
Pour dtecter et corriger les erreurs, nous expliquons comment
utiliser la redondance dinformations et exploiter des bits de
contrle de cohrence. Pour le chiffrement, nous expliquons
les mthodes cl et introduisons la notion de cl publique cl
prive.
ManuelDowek.book Page 153 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
154
Pour reprsenter des informations, par exemple un texte, sous la forme
dune suite de 0 et de 1, nous avons prsent les formats standards,
comme ASCII ou UTF-8 (voir le chapitre 8). Il est galement possible
dutiliser un format particulier pour rendre la suite de bits exprimant ces
informations moins volumineuse, ou intelligible mme en cas derreurs
de transmissions, ou au contraire inintelligible, sauf pour son destina-
taire. Un tel format sappelle un code.
Compresser
La phrase je pense, donc je suis. peut se reprsenter en ASCII par la
suite 106, 101, 32, 112, 101, 110, 115, 101, 44, 32, 100, 111, 110, 99,
32, 106, 101, 32, 115, 117, 105, 115, 46 (voir le chapitre 8). Chacun de
ces nombres est exprim sur 8 bits. Il faut donc 23 8 = 184 bits pour
reprsenter cette phrase en entier.
Toutefois, seuls 13 symboles sont utiliss dans cette phrase : le c , le
d , le e , le i , le j , le n , le o , le p , le s , le u puis
lespace, la virgule et le point. On peut donc modifier le code, en repr-
sentant chaque symbole sur 4 bits et il ne faut alors plus que
23 4 = 92 bits pour reprsenter cette phrase.
On peut faire encore mieux. Le mot je suivi dun espace est rpt
deux fois dans la phrase ; on peut donc reprsenter chaque symbole sur
4 bits, en convenant, de plus, que le mot entier je suivi dun espace
est reprsent galement par une suite de 4 bits. Il suffit dsormais de
19 4 = 76 bits.
Cette ide est la base des mthodes de compression par dictionnaire. Un
dictionnaire est une fonction qui associe des suites de bits non pas des
symboles isols, mais des suites de symboles. La suite de bits associe
par un dictionnaire une suite de symboles est appele sa rfrence. Rem-
placer, dans un texte, chaque suite de symboles par sa rfrence exprime
donc ce texte en binaire, et remplacer chaque rfrence par la suite
laquelle elle est associe permet de retrouver le texte original. En asso-
ciant une rfrence aux suites longues et rptes dans le texte original,
on obtient une suite de bits plus courte que si on avait exprim le texte
en binaire, caractre par caractre.
On peut encore amliorer le rsultat en tirant parti des diffrences de fr-
quence dapparition des symboles et suites de symboles. En effet, dans la
phrase je pense, donc je suis. , le s est utilis 3 fois, le n , lespace, le
T Compresser des informations
On appelle compresser des informations le fait
de les exprimer sous la forme dune suite de bits,
avec un code choisi pour rendre cette suite aussi
courte que possible.
ALLER PLUS LOIN
Joindre le dictionnaire au message
Un dictionnaire tant construit sur mesure pour
chaque message, il faut ladjoindre au message
pour rendre la lecture de ce dernier possible. Ce
cot est cependant vite amorti quand le mes-
sage est long.
ManuelDowek.book Page 154 Monday, July 9, 2012 4:58 PM
12 Compresser, corriger, chiffrer
Groupe Eyrolles, 2012
155
e et la squence de symboles je sont utiliss 2 fois chacun, tandis que
le c , le d , le i , le o , le p , le u , la virgule et le point sont
utiliss 1 fois seulement. On peut donc rduire encore la taille du message
en utilisant des rfrences plus courtes pour les suites les plus frquentes et
plus longues pour les suites les plus rares, par exemple :
s : 000
c : 00100
d : 00101
i : 00110
o : 00111
e : 010
je : 011
p : 1000
u : 1001
, : 1010
. : 1011
n : 110
: 111
Ainsi, la phrase je pense, donc je suis. se reprsente par la suite de
69 bits suivante : 0111000010110000010101011100101001111100010
01110110001001001100001011. Un code qui utilise ainsi des rfrences
de longueurs diffrentes est appel un code de Huffman.
Quand une suite de bits reprsente un texte en ASCII, la dcouper en
symboles est facile, puisque chaque symbole est reprsent sur huit bits.
En revanche, quand les symboles sont reprsents par des rfrences de
longueurs diffrentes, la tche est plus ardue. Par exemple, en Morse, o
la lettre e se code par . et la lettre i par .. , la suite .. peut
ou bien reprsenter le message i ou bien le message ee . On dit que
le code de la lettre e est un prfixe de celui de la lettre i , car cest le
dbut du code de la lettre i . Le code Morse est donc ambigu et il est
ncessaire dutiliser un sparateur pour lever cette ambigut : .. pour
i , et . / . pour ee , ce qui a linconvnient dallonger la reprsen-
tation du texte, alors quon cherche prcisment la raccourcir.
Cependant, avec le code ci-avant, on peut se passer de sparateurs, car
aucun symbole na pour rfrence un prfixe de la rfrence dun autre
symbole. Ainsi, quand on dcode la suite 0111000010110000
01010101110010100111110001001110110001001001100001011 par
exemple, aucun symbole nayant pour rfrence 0, 01, 0111 ou 01110, le
ManuelDowek.book Page 155 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
156
premier symbole cod ne peut tre que je dont la rfrence est 011.
Une fois ce premier symbole dcod, on peut enlever sa rfrence de la
suite de bits dcoder et dcoder le symbole suivant : aucun symbole
nayant pour rfrence 1, 10, 100 ou 10000, le deuxime symbole ne peut
tre que p , dont la rfrence est 1000, et ainsi de suite.
Exercice 12.1
Un indicatif tlphonique international est un indicatif que lon doit ajouter
devant un numro de tlphone, quand on appelle ce numro depuis un
autre pays. Lindicatif de la France est 33, celui de la Chine est 86, celui des
tats-Unis 1, celui de Monaco 377, etc. Expliquer pourquoi le code dun pays
nest jamais un prfixe du code dun autre pays.
Lutilisation de dictionnaires et de rfrences de longueurs diffrentes
sont les deux ides la base des algorithmes de compression les plus cou-
rants, comme ZIP utilis par le logiciel gzip.
Exercice 12.2 (avec corrig)
Crer un fichier a.txt form de la lettre a rpte mille fois et un fichier
alea.txt form de mille lettres minuscules tires au hasard. Compresser ces
deux fichiers avec le programme gzip. Comparer les tailles des fichiers.
Le programme suivant affiche mille lettres tires au hasard.
SAVOIR-FAIRE Utiliser un logiciel de compression
Il est judicieux de compresser un fichier quand :
ce fichier est de taille importante,
il nest pas dj dans un format compress, comme MP3,
il comporte beaucoup de rptitions, comme une image avec de grandes zones unies,
on na pas besoin dy accder souvent,
on doit stocker ce fichier dans un espace limit ou le transmettre travers un rseau
faible dbit.
On peut, par exemple, utiliser le logiciel gzip, distribu avec Linux. On compresse un
fichier fichier.txt avec la commande gzip fichier.txt ; le fichier fichier.txt est
remplac par le fichier fichier.txt.gz, que lon dcompresse avec la commande
gunzip fichier.txt.gz.
for (i = 1; i <= 1000; i = i + 1) {
System.out.print(Isn.asciiString ((int)
Math.floor(Math.random() * 26 + 97)));}
ls -l a.txt
1001
ls -l alea.txt
1001
ManuelDowek.book Page 156 Monday, July 9, 2012 4:58 PM
12 Compresser, corriger, chiffrer
Groupe Eyrolles, 2012
157
Les deux fichiers a.txt et alea.txt ont la mme taille : 1 001 octets. En
revanche, le premier se compresse en un fichier de 36 octets et le second en un
fichier de 652 octets.
Exercice 12.3
Crer deux fichiers PGM, contenant des images de mme taille, lune unie et
lautre alatoire. Compresser ces deux fichiers avec le programme gzip et
comparer les tailles des fichiers.
Exercice 12.4
On veut dterminer le type de fichiers textes sur lequel la mthode ZIP est la
plus efficace.
La compression ZIP est-elle importante ou non sur un fichier contenant :
un texte littraire,
un extrait dannuaire tlphonique,
des caractres taps au hasard,
la liste des publicits diffuses sur une chane de tlvision pendant une
journe,
un fichier trs court : quelques caractres seulement.
Crer ou rcuprer sur le Web de tels fichiers et tester ses prdictions
laide dun logiciel de compression, par exemple gzip.
Compresser avec perte
Les techniques de compression des informations prsentes ci-avant
sont sans perte dinformations : en dcompressant les informations com-
presses, on retrouve exactement les informations originales. Il existe
dautres techniques de compression dites avec perte dinformations : au
prix dune infime diffrence entre les informations originales et les infor-
mations compresses puis dcompresses, on arrive un codage moins
volumineux encore.
Un exemple simple est celui dune image entirement blanche, lexcep-
tion dun pixel noir. Cette image peut tre approxime par une image
entirement blanche : lil nu, la diffrence est invisible et cette
gzip a.txt
gzip alea.txt
ls -l a.txt.gz
36
ls -l alea.txt.gz
652
ManuelDowek.book Page 157 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
158
seconde image se laisse beaucoup mieux compresser. Cette ide est uti-
lise dans les algorithmes de compression usuels comme JPG pour les
images ou MP3 pour les sons.
Exercice 12.5
En utilisant le logiciel Gimp, ouvrir une image au format PNG, puis lenregis-
trer au format JPG en qualit de 40% (avec Enregistrer sous). Ouvrir les deux
images et les comparer lil nu. Voit-on des diffrences ? Ouvrir ensuite en
tant que calques les deux images au format JPG et PNG. Dans le mode de cal-
ques, par dfaut rgl Normal, choisir maintenant le mode Diffrence, qui
compare les deux images en affichant la valeur absolue de la diffrence de la
valeur de chaque pixel dune image et de lautre. Quobserve-t-on ? Sachant
que PNG est un format de compression dimage sans perte et que JPG est un
format de compression avec perte, que peut-on en dduire ? Effectuer la
mme manipulation en comparant limage au format PNG et limage au
format JPG avec une qualit 20, puis une qualit 90. Observer comment la
taille du fichier JPG varie et comment la diffrence avec limage au format
PNG augmente ou diminue.
Exercice 12.6
Un exemple courant de compression des informations est lutilisation de la
moyenne pour compresser la suite de notes dun lve au cours dun trimestre.
Cette compression est-elle avec ou sans perte ? Quels sont les avantages et
inconvnients de cette mthode ? Proposer des mthodes de compression
alternatives qui attnuent ces inconvnients.
Corriger
Les rseaux transportent de grandes quantits dinformations (des cen-
taines de traoctets par seconde) et les mmoires, DVD, BluRay, disques
durs, mmoire flash, permettent souvent de stocker des traoctets. Avec
de telles quantits dinformations, il est invitable que se produisent
quelques erreurs dues au bruit sur la ligne de transmission, des rayures
dusure sur un disque ou des composants lectroniques dfaillants.
Cest pourquoi des algorithmes pour dtecter et corriger ces erreurs ont
t invents.
Une mthode simple pour dtecter et corriger une erreur dans une suite de
bits est dy introduire une forme de redondance, en rptant chacun des bits
plusieurs fois. Ainsi, au lieu de transmettre sur un rseau la suite de bits
10110110, on transmet la suite de bits 111000111111000111111000, o
chaque bit est rpt trois fois. Pour retrouver le message original, il suffit
de lire les bits reus trois par trois, en remplaant les triplets 000 par des 0
et les triplets 111 par des 1. Si lun des triplets reu nest ni 111 ni 000, par
exemple si cest 010 ou 001, on peut tre certain quune erreur sest glisse.
ManuelDowek.book Page 158 Monday, July 9, 2012 4:58 PM
12 Compresser, corriger, chiffrer
Groupe Eyrolles, 2012
159
On peut mme corriger lerreur : les 0 tant majoritaires, le triplet original
tait sans doute 000, et lon peut interprter le triplet 010 ou 001 par 0. Ce
code permet donc de dtecter et corriger toutes les erreurs, condition
quil y ait au plus une erreur par triplet. En revanche, si plusieurs erreurs
sont commises sur le mme triplet, elles peuvent passer inaperues ou tre
mal corriges. Cette mthode fonctionne donc bien, mais elle est coteuse
car la longueur du message est triple.
Dans certains cas, dtecter les erreurs sans les corriger est suffisant. Par
exemple, quand on transmet un message sur un rseau, la machine qui
reoit le message a souvent la possibilit de le redemander celle qui la
envoy, sil est erron. Une manire peu coteuse pour dtecter des
erreurs dans une suite de bits transmise est dajouter un bit de contrle
tous les 100 bits transmis, indiquant si le nombre de 1 dans ce paquet de
100 bits est pair (0) ou impair (1). La longueur des messages est ainsi
augmente de 1 % seulement. Si une erreur se produit lors de la trans-
mission des 101 bits, cest--dire si un 0 est remplac par un 1, ou un 1
par un 0, la parit du nombre de 1 est change et lerreur est dtecte.
En revanche, si deux erreurs se produisent dans la mme suite de
101 bits, elles passeront inaperues.
Dans dautres cas, il est ncessaire de corriger les erreurs. Par exemple,
quand on lit un DVD et que lon dtecte une erreur, on veut pouvoir la
corriger au vol et non demander au spectateur daller acheter un autre
DVD pour voir la fin du film. Une mthode de correction des erreurs
moins coteuse que le triplement des bits dcrit ci-avant consiste ajouter
seulement 20 bits de contrle tous les 100 bits, de la manire suivante : on
organise le paquet de 100 bits en un tableau de 10 lignes sur 10 colonnes
et on ajoute un bit de contrle par ligne et un bit de contrle par colonne,
soit 20 bits au total. Ce bit indique simplement si le nombre de 1 dans la
ligne ou la colonne est pair ou impair. Quand on reoit le message, si on
dtecte une erreur dans la ligne l et une erreur dans la colonne c, on sait
que le bit erron est celui qui se trouve dans le tableau la ligne l et la
colonne c ; il suffit, pour corriger le message, de remplacer ce bit par un 1
si cest un 0 ou par un 0 si cest un 1. Si on dtecte une erreur dans une
ligne, mais aucune erreur dans les colonnes, ou le contraire, cest que
lerreur porte sur le bit de contrle lui-mme et il ny a donc rien corriger
dans le message. Cette mthode demande donc dallonger le message de
20 % et elle permet de corriger toutes les erreurs condition quune erreur
au plus se produise dans chaque suite de 120 bits.
T Code correcteur derreurs
On appelle code correcteur derreurs un code
qui permet de retrouver les informations codes
mme en cas derreurs de transmission, de lecture
ou dcriture.
ALLER PLUS LOIN Longueur des suites
Plutt que des suites de 100 bits, on peut
prendre des suites de 10 bits ou de 1 000 bits.
Plus la suite est longue, plus la mthode est co-
nome, mais plus la probabilit de voir deux
erreurs se produire dans la mme suite, et donc
passer inaperues, est leve.
ManuelDowek.book Page 159 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
160
Exercice 12.7
On utilise la mthode dcrite prcdemment pour transmettre 16 bits. Par
exemple, pour transmettre le message 0011010111010111 on construit le
tableau :
et on transmet la suite 0011010111010111 0011 1100.
De combien de bits de contrle a-t-on besoin ?
Montrer que si on reoit le message 00?10?0111010?11 001?1100, o les ?
reprsentent des bits inintelligibles, il est possible de reconstituer entirement
les donnes qui ont t envoyes, y compris les bits de contrle.
Est-il possible de reconstituer le message original si on reoit la squence
suivante : 0??10?0111010?11001?1100 ?
Montrer que le message suivant : 101001111001001000010100, transmis sui-
vant la mme mthode, est incohrent. Expliquer cette incohrence. Comment
y remdier ?
Chiffrer
Une mthode pour protger les informations contre les actions dune
personne malveillante qui veut y accder alors quelles ne lui sont pas
destines consiste les chiffrer.
Cette ide de chiffrement est ancienne puisquon sait que Jules Csar
avait dj mis au point un algorithme pour transmettre des ordres ses
armes de manire secrte. Pour cela, il utilisait le code de Csar, qui con-
sistait remplacer chaque lettre dun message par celle situe trois lettres
plus loin dans lalphabet : les a taient replacs par des d , les b
par des e , etc. Ainsi Veni, vidi, vici se chiffrait en Zhqm, zmgm,
zmfm attention, il ny a pas de j , de u , ni de w en latin.
Cette mthode nest en fait pas trs bonne. Dune part, une fois quon la
connat, on peut dchiffrer tous les messages trs simplement. Dautre
part, mme si on ne connat pas la correspondance entre les lettres, celle-
ci est facile deviner, car la frquence des lettres, dans une langue
donne, est peu prs constante dun texte un autre. Ainsi, si le mes-
Colonne de contrle
0 0 1 1 0
0 1 0 1 0
1 1 0 1 1
0 1 1 1 1
Ligne de contrle 1 1 0 0
T Sret et scurit
Dans la section prcdente, nous avons prsent
des mthodes qui permettent de protger les infor-
mations contre des erreurs accidentelles. Cela
sappelle augmenter la sret des informa-
tions, cest--dire la protger des erreurs involon-
taires, telles les erreurs de transmission.
linverse, on cherche dans cette section aug-
menter la scurit des informations, cest--
dire la protger contre laction de personnes
malveillantes.
T Chiffrer
On appelle chiffrer des informations le fait de les
exprimer sous la forme dune suite de bits, avec un
code choisi pour rendre cette suite aussi inintelli-
gible que possible, sauf pour son destinataire.
ManuelDowek.book Page 160 Monday, July 9, 2012 4:58 PM
12 Compresser, corriger, chiffrer
Groupe Eyrolles, 2012
161
sage est en franais, il suffit de remarquer que la lettre h est la plus
frquente dans les messages chiffrs pour deviner que cette lettre est le
code de la lettre e , lettre la plus frquente en franais.
Des mthodes plus robustes ont donc t dveloppes. Une delles est la
mthode du masque jetable, dans laquelle les deux interlocuteurs se mettent
daccord, avant dchanger un message, sur une cl qui dfinit les bits du
message que lexpditeur laissera identiques et ceux quil inversera, cest--
dire remplacera par un 1 si cest un 0 ou par un 0 si cest un 1. Par
exemple, pour changer un message long de huit bits, les interlocuteurs se
mettent daccord sur le fait que lexpditeur le chiffrera en inversant le pre-
mier, le deuxime, le troisime, le septime et le huitime bit et en laissant
les autres inchangs. Ainsi le message 01101101 sera chiffr en 10001110.
Le rcepteur du message, connaissant lui aussi la cl, naura qu inverser
les mmes bits pour retrouver le message original : 01101101.
La cl qui indique quels bits laisser en ltat et quels bits inverser est elle-
mme exprime par une suite de bits : 0 signifiant quon laisse le bit
inchang et 1 indiquant quon linverse. Ainsi, la cl ci-avant sexprime par
la suite de bits : 11100011. Une cl, dans cette mthode, sappelle aussi un
masque. Chiffrer le message consiste effectuer un ou exclusif, bit bit,
entre le message et le masque. En effet, effectuer un ou exclusif entre un
bit du message et un 0 du masque laisse ce bit inchang (0 oux 0 = 0,
1 oux 0 = 1) et effectuer un ou exclusif entre un bit du message et un 1 du
masque inverse ce bit (0 oux 1 = 1, 1 oux 1 = 0). Cette mme opration
permet de retrouver le message original partir du message chiffr.
Cette mthode a t employe par les diplomates et les services secrets
depuis le dbut du XX
e
sicle, mais elle prsente plusieurs inconvnients.
Le premier est que le masque doit avoir la mme longueur que le message
lui-mme, il doit tre compltement alatoire et il ne doit jamais tre ruti-
lis, do le nom de masque jetable. Cette mthode demande donc de fabri-
quer des masques alatoires de trs grande taille, ce qui est plus difficile quil
ny parat. Un second problme est que ce masque doit tre secrtement
chang entre les interlocuteurs, avant la transmission du message, ce qui
est difficile. Si une personne malveillante arrive intercepter un masque au
cours de cet change, elle pourra dchiffrer les messages changs.
Cela a men la conception de mthodes alternatives qui ne reposent
pas sur lchange pralable dune cl secrte entre les interlocuteurs : les
mthodes cl publique cl prive.
Une mtaphore aide saisir le principe de ces mthodes : deux per-
sonnes, lexpditeur et le destinataire, souhaitent changer un message
confidentiel, mais elles nont pas la possibilit de se mettre daccord au
pralable sur une cl secrte. Une possibilit est que le destinataire
envoie par poste lexpditeur un cadenas ouvert dont il garde la cl.
ManuelDowek.book Page 161 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
162
Lexpditeur met son message dans une bote, quil ferme avec le cadenas
reu, et envoie cette bote au destinataire, qui na plus qu ouvrir le
cadenas avec la cl quil a garde. aucun moment, il ne sest spar de
la cl, si bien que ni le facteur, ni personne lexception du destinataire,
na le moyen douvrir la bote. Le message reste donc confidentiel, si lon
est certain que le cadenas utilis est bien celui du destinataire.
Le fait de pouvoir fermer un cadenas sans avoir la cl qui permet de louvrir
est ce qui permet cette mthode de fonctionner. Les mthodes cl
publique cl prive reposent sur un mcanisme similaire : la possibilit de
chiffrer un message sans disposer de la cl qui permet de le dchiffrer.
Une telle mthode recourt deux cls : une cl publique, diffuse tous
par le destinataire pour le chiffrement des messages, et une cl prive,
quil garde secrte, permettant de les dchiffrer. On peut schmatiser ce
mcanisme ainsi :
La mthode cl publique cl prive la plus utilise est la mthode
RSA, qui doit son nom celui de ses inventeurs : Rivest, Shamir et
Adleman. Dans cette mthode, la cl prive est formes de trois nom-
bres, d, e et n tels que pour tout entier w infrieur n, (w
e
% n)
d
% n = w,
o lopration % est le reste de la division euclidienne. La cl publique
correspondante est forme des nombres e et n uniquement.
Un message transmettre est dabord exprim sous la forme dune suite
de bits, que lon interprte comme un nombre entier w, infrieur n.
Lexpditeur le chiffre en w = w
e
% n, puis envoie ce message chiffr w
au destinataire, qui le dchiffre en calculant w
d
% n, qui est donc gal
(w
e
% n)
d
% n, cest--dire w, le message original. Pour chiffrer un
message, lexpditeur na pas besoin de connatre la cl prive, car le
nombre d nest utilis que dans la phase de dchiffrement.
Si une personne malveillante a accs aux nombres e et n et un message
chiffr w, elle peut essayer de dduire d de e et n ou directement trouver un
nombre w tel que w
e
%n = w. Lun et lautre de ces calculs sont possibles,
mais ils sont trs longs, pour peu que e et n soient assez grands. Les mthodes
les plus rapides que lon connaisse aujourdhui demandent plusieurs annes
de calcul, quand n est de lordre de quelques milliers de chiffres binaires.
Le destinataire : Lexpditeur :
envoie la cl publique
chiffre son message avec cette cl publique
envoie le message chiffr
reoit le message chiffr
et le dchiffre avec la cl prive
ManuelDowek.book Page 162 Monday, July 9, 2012 4:58 PM
12 Compresser, corriger, chiffrer
Groupe Eyrolles, 2012
163
Les mthodes cl publique cl prive sont donc, en thorie, dun niveau
de scurit infrieur aux mthodes cls secrtes : quand on connat la
mthode de chiffrement et un message chiffr w, on peut, en thorie,
essayer de chiffrer tous les messages w possibles, jusqu en trouver un qui
se code en w. Toutefois, cela demande en pratique un temps de calcul
norme. Cest donc un inconvnient ngligeable cot de lavantage que
prsente le fait de ne pas avoir besoin dchanger secrtement une cl.
ALLER PLUS LOIN Construire une cl RSA
Pour construire une cl RSA, il suffit de choisir deux
nombres premiers et distincts p et q, par exemple
p = 3017642249 et q = 6644055791. On choisit ensuite un
nombre d premier avec (p - 1) (q - 1), par exemple
d = 2596516757 et un nombre e tel que (e d) %((p -
1) (q - 1)) = 1, par exemple e = 35661169403325998333.
On pose ensuite n = pq, dans cet exemple
n = 20049383459634713959. La cl prive est forme des
nombres, d, e et n et la cl publique des nombres e et n
uniquement.
On dmontre alors que pour tout entier w infrieur n,
(w
e
%n)
d
%n = w. Pour cela, on montre que w
ed
w est
un multiple de p, en utilisant le petit thorme de
Fermat : si p est un nombre premier et w un nombre qui
nest pas un multiple de p alors w
p-1
%p = 1. La
dmonstration ne demande que quelques lignes. On
montre de mme que w
ed
w est un multiple de q.
Comme p et q sont deux nombres premiers et diffrents,
w
ed
w est un multiple de n = pq. Donc w
ed
%n = w,
cest--dire (w
e
%n)
d
%n = w.
La mthode connue la plus rapide pour dchiffrer un
message, quand on ne connat pas la cl prive, consiste
la dduire de la cl publique en factorisant le
nombre n en un produit de deux nombres premiers, on
obtient ainsi p et q, donc (p - 1) (q - 1), puis en connais-
sant (p - 1) (q - 1) et e, on peut retrouver d. Toutefois,
factoriser un nombre de quelques milliers de chiffres
binaires demande plusieurs annes de calcul.
ALLER PLUS LOIN Authentifier
Les mthodes cl publique cl prive permettent
aussi une autorit dauthentifier un utilisateur, cest--
dire de vrifier son identit. Pour cela, il lui suffit de
dtenir la cl publique de la personne authentifier et
de vrifier quelle dtient bien sa cl prive en lui fai-
sant dcoder un message.
On voit donc ici que seul un utilisateur qui dtient la cl
prive peut dchiffrer le message de test, ce qui garantit
lauthentification, si on fait lhypothse que la cl
publique utilise est bien celle de lutilisateur, et non
celle dun imposteur.
Lutilisateur : Lautorit :
dtient la cl prive ; dtient la cl publique ;
demande tre
authentifi ;
fabrique un message ;
chiffre ce message
avec la cl publique ;
envoie le message ;
dchiffre le message
avec la cl prive ;
envoie le message
de test dcod ;
vrifie si le message de test
a t dchiffr.
ManuelDowek.book Page 163 Monday, July 9, 2012 4:58 PM
Deuxime partie Informations
Groupe Eyrolles, 2012
164
Exercice 12.8
Utiliser la mthode du masque jetable pour transmettre un nombre
4 chiffres son voisin.
Exercice 12.9
Que se passerait-il si on dcouvrait un algorithme rapide pour factoriser un
nombre entier en un produit de nombres premiers ?
Exercice 12.10
Pour retirer de largent avec une carte de retrait, on doit entrer un code secret
compris entre 0000 et 9999 et la carte est avale au bout de trois erreurs :
quelle est la probabilit de russir utiliser une carte sans en avoir le code ? Et
si on pouvait, au bout de deux essais, aller essayer la carte dans un autre
distributeur ?
Exercice 12.11
Pour retirer de largent avec une carte de retrait, on doit entrer un code secret
compris entre 0000 et 9999. On suppose que lon peut essayer autant de codes
que lon veut, mais avec un dlai de 1 s entre le premier et le deuxime essai,
10 s entre le deuxime et le troisime, 100 s entre le troisime et le quatrime,
etc. Au bout de combien de temps est-on sr de pouvoir trouver le code ?
Quel est le temps moyen pour le trouver ? Cette mthode est utilise pour
protger les serveurs contre les attaques par des logiciels qui testent tous les
mots de passe possibles pour sauthentifier.
Exercice 12.12
Expliquer la mthode dauthentification prsente dans lencadr, avec la
mtaphore du cadenas, qui fait office de cl publique, et sa cl prive.
Exercice 12.13
Dans un univers imaginaire, Acha est la seule personne savoir factoriser
lexpression x
2
+ a x + b, mais tout le monde sait dvelopper lexpression (x -
u) (x - v). Imaginer une mthode qui permet Acha de recevoir dune autre
personne des messages chiffrs. Cette mthode permet-elle Acha denvoyer
des messages chiffrs ? Permet-elle lauthentification dAcha ou des autres
personnes de ce monde imaginaire ?
Ai-je bien compris ?
Quest-ce que compresser des informations ?
Quest-ce quun code correcteur derreurs ?
Quest-ce que chiffrer des informations ?
ManuelDowek.book Page 164 Monday, July 9, 2012 4:58 PM
TROISIME PARTIE
Machines
Dans cette troisime partie, nous voyons que derrire les
informations, il y a toujours des objets matriels : ordinateurs,
rseaux, robots, etc. Les premiers ingrdients de ces machines sont
des portes boolennes (chapitre 13) qui ralisent les fonctions
boolennes vues au chapitre 10. Ces portes demandent tre
compltes par dautres circuits, comme les mmoires et les
horloges, qui introduisent une dimension temporelle (chapitre 14).
Nous dcouvrons comment fonctionnent ces machines que nous
utilisons tous les jours (chapitre 15). Nous verrons que les rseaux,
comme les oignons, sorganisent en couches (chapitre 16*). Et nous
dcouvrons enfin les entrailles des robots, que nous apprenons
commander (chapitre 17*).
ManuelDowek.book Page 165 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 166 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
13
Les portes
boolennes
Frances Allen (1932-) est une pion-
nire de la paralllisation automa-
tique des programmes, cest--dire de
la transformation de programmes
destins tre excuts sur un ordi-
nateur squentiel contenant un
unique processeur en des pro-
grammes destins tre utiliss sur
un ordinateur parallle contenant
plusieurs processeurs. Elle est aussi
lorigine de nouvelles mthodes, fon-
des sur la thorie des graphes, pour
optimiser les programmes. Elle a reu
le prix Turing en 2006 pour ces tra-
vaux.
Au commencement tait le transistor,
puis nous crmes les portes boolennes
et, la fin de la journe, les ordinateurs.
Dans ce chapitre, nous voyons de quoi sont faits les ordinateurs
lchelle microscopique. Nous partons du transistor et
construisons successivement des circuits non et ou qui vont
nous permettre ensuite de construire les circuits de toutes les
fonctions boolennes, comme nous lavons vu au chapitre 10.
ManuelDowek.book Page 167 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
168
Nous connaissons des algorithmes depuis plus de quatre mille ans, pour-
tant nous navons pas cherch les exprimer dans des langages de pro-
grammation avant le milieu du XX
e
sicle. Cest en effet seulement ce
moment que les progrs de llectronique nous ont permis de construire
les premiers ordinateurs. La construction de ces machines a donc eu un
effet important sur la manire dont nous concevons aujourdhui les
notions dalgorithme, de langage et dinformation.
Le circuit NON
Comme beaucoup de systmes complexes, un ordinateur peut se dcrire
de nombreuses chelles. lchelle la plus petite, un ordinateur est un
assemblage de transistors. Un transistor est un circuit lectronique trois
fils appels le drain, la source et la grille. La rsistance entre le drain et la
source est ou bien trs petite ou bien trs grande en fonction de la ten-
sion applique entre la grille et la source. Quand cette tension est inf-
rieure un certain seuil, cette rsistance est trs grande, on dit que le
transistor est bloqu ; quand la tension est suprieure ce seuil, la rsis-
tance est trs petite, on dit que le transistor est passant. Avec un tran-
sistor, une rsistance et un gnrateur dont la tension est suprieure au
seuil de basculement du transistor, on peut construire le circuit .
Si on applique entre le point A et le point O une tension infrieure au seuil
de basculement du transistor, celui-ci est bloqu et le circuit est quivalent
au circuit , si bien que la tension entre les points B et O est gale la
tension dalimentation. Elle est donc suprieure au seuil de basculement.
Si, en revanche, on applique entre les points A et O une tension suprieure
au seuil de basculement du transistor, celui-ci est passant et le circuit est
quivalent au circuit , si bien que la tension entre les points B et O est
nulle. Elle est donc infrieure au seuil de basculement.
ALLER PLUS LOIN
Les circuits CMOS
Dans ce livre nous utilisons un seul type de tran-
sistors appels N-Mos. On construit aujourd'hui
plus souvent des circuits qui utilisent deux types
de transistors N-Mos et P-Mos, afin de mini-
miser la consommation d'lectricit et la pro-
duction de chaleur.
ManuelDowek.book Page 168 Monday, July 9, 2012 4:58 PM
13 Les portes boolennes
Groupe Eyrolles, 2012
169
Si on dcide quune tension infrieure au seuil de basculement reprsente
le bit 0 et quune tension suprieure ce seuil reprsente le bit 1, les deux
remarques prcdentes se reformulent ainsi : si on donne au circuit le
bit 0 en A, il donne le bit 1 en B ; si on lui donne le bit 1 en A, il donne
le bit 0 en B. Autrement dit, ce circuit calcule une fonction boolenne :
la fonction non.
Le circuit OU
Le circuit est construit selon les mmes principes, mais il a deux
entres A et B.
Si on donne aux deux entres A et B le bit 0, les deux transistors dans la
partie gauche du circuit sont bloqus, si bien que la tension entre les
points C et O est gale la tension dalimentation, suprieure au seuil de
basculement. Le transistor de droite est donc passant et la tension entre
les points D et O est nulle ; autrement dit le point D est dans ltat 0.
Si on donne lune ou lautre des entres A et B le bit 1, au moins lun
des deux transistors dans la partie gauche du circuit est passant, si bien
que la tension entre les points C et O est nulle. Le transistor de droite est
donc bloqu et la tension entre D et O est gale la tension dalimenta-
tion. Le point D est par consquent dans ltat 1.
La table de ce circuit est donc la suivante (voir ci-contre) o lon recon-
nat la table de la fonction ou.
On peut schmatiser ces circuits de manire plus succincte en rempla-
ant le morceau de dessin reprsentant le transistor et la rsistance enca-
drs dans la figure par un simple rectangle () et en remplaant de
mme le morceau de dessin reprsentant les trois transistors et les deux
rsistances encadrs dans la figure par un rectangle ().
A B D
0 0 0
0 1 1
1 0 1
1 1 1
ManuelDowek.book Page 169 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
170
On arrive ainsi une reprsentation, un autre niveau, du mme circuit.
Quelques autres portes
boolennes
Les circuits non et ou sappellent des portes boolennes ou parfois des portes
logiques.
Dans ce chapitre et le suivant, on constitue petit petit une bote outils
de circuits rutilisables pour concevoir des circuits plus sophistiqus. Les
portes non et ou sont les deux premiers lments de cette bote outils.
Bien souvent, quand on reprsente un circuit, on ne dessine pas le
gnrateur : il est implicite que chaque porte est alimente. On obtient
alors une troisime manire de reprsenter les circuits o le circuit est
reprsent comme sur le schma .
ManuelDowek.book Page 170 Monday, July 9, 2012 4:58 PM
13 Les portes boolennes
Groupe Eyrolles, 2012
171
Exercice 13.1 (avec corrig)
Quelle est la table du circuit suivant ?
Si on donne lune ou lautre des entres A et B le bit 1, au moins lun des
deux transistors dans la partie gauche du circuit est passant, si bien que le
point C est dans ltat 0. Sinon le point C est dans ltat 1.
La table de ce circuit est donc la suivante (voir ci-contre).
Il sagit de la table de la fonction boolenne qui A et B associe non (A ou B).
Exercice 13.2 (avec corrig)
Quelle est la table du circuit suivant ? Est-ce la table dune fonction boolenne
connue ?
A B C
0 0 1
0 1 0
1 0 0
1 1 0
ManuelDowek.book Page 171 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
172
La table de ce circuit est :
Cest celle de la fonction boolenne et.
Exercice 13.3
Construire un circuit ralisant la fonction boolenne ou exclusif, vue au
chapitre 10.
En plus des portes ou et non, on a dsormais dans sa bote outils les
portes et et oux :
Exercice 13.4 (avec corrig)
Construire un circuit ralisant la fonction multiplexeur vue au chapitre 10.
La fonction multiplexeur peut se dfinir par mux (A, B, C) = (non (A) et B)
ou (A et C). Un circuit, parmi dautres, ralisant cette fonction est donc :
On peut dsormais utiliser directement le circuit suivant, dont lunique sortie
transmet la valeur de B ou de C selon la valeur de A :
A B C
0 0 0
0 1 0
1 0 0
1 1 1
ManuelDowek.book Page 172 Monday, July 9, 2012 4:58 PM
13 Les portes boolennes
Groupe Eyrolles, 2012
173
Exercice 13.5 (avec corrig)
Construire le circuit ralisant le calcul de la fonction Cout dfinie par la table :
Quelle est cette fonction ?
On utilise la mthode de dcomposition par multiplexage (voir le chapitre 10).
La fonction Cout (Cin, A, B) scrit mux (Cin, g (A, B), g (A, B)), avec g (A, B) et
g (A, B) dfinies par les tables ci-contre :
On reconnat les tables des fonctions et et ou, respectivement. Si bien que
Cout (A, B , Cin) = mux (Cin, A et B, A ou B).
Un circuit calculant cette fonction est donc :
Cette fonction est la fonction chiffre des deuzaines de A + B + Cin, qui sert au
calcul de la retenue dans lalgorithme de laddition (voir le chapitre 18). Ce cir-
cuit porte le nom de Carry out (retenue sortante).
Exercice 13.6
Construire un circuit ralisant les oprations calculant la fonction chiffre des
units de A + B + Cin (voir le chapitre 18). Construire un circuit additionneur
un bit qui prend en entre deux nombres de un bit et donne en sortie leur
somme, sur deux bits.
Construire un circuit quatre entres et trois sorties, qui ajoute deux nombres
exprims sur deux bits.
Construire un circuit seize entres et neuf sorties qui ajoute deux nombres
binaires de huit bits.
A B Cin Cout
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1
g (A, B) g (A, B)
A B g A B g'
0 0 0 0 0 0
0 1 0 0 1 1
1 0 0 1 0 1
1 1 1 1 1 1
ManuelDowek.book Page 173 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
174
Exercice 13.7
Construire un circuit 9 entres A
0
A
7
et D et 8 sorties B
0
B
7
telles que :
lorsque D = 0, B
i
= A
i
pour i compris entre 0 et 7,
lorsque D = 1, B
i
= A
i-1
pour i compris entre 1 et 7 et B
0
= 0.
Quand D = 1, ce circuit ralise un dcalage gauche dun nombre exprim en
binaire sur huit bits, ce qui correspond la multiplication par 2 de ce nombre.
Dans cette multiplication, le chiffre le plus gauche, A
7
, est oubli afin de
faire tenir le rsultat sur huit bits.
Exercice 13.8
Construire un circuit 11 entres A
0
A
7
et D
0
D
2
et 8 sorties B
0
B
7
telles que B
i
= A
i-d
pour i entre d et 7 et B
i
= 0 pour i entre 0 et (d - 1), o d est
le nombre entre 0 et 7 reprsent en binaire par D
0
D
2
. Ce circuit ralise un
dcalage gauche de d bits dun nombre binaire de huit bits, ce qui corres-
pond la multiplication par 2
d
. Ce circuit est un composant important dun cir-
cuit ralisant une multiplication binaire.
lissue de ce chapitre, on dispose donc, parmi dautres, des circuits
boolens suivants dans sa bote outils :
les portes boolennes non, ou, et et oux,
le multiplexeur mux,
des additionneurs de nombres de diffrentes tailles,
des multiplieurs par 2 et par 2
d
.
ALLER PLUS LOIN Penser les systmes complexes
Au cours de ce chapitre, nous sommes partis dune
manire de dcrire des circuits forms de transistors et
de rsistances pour, peu peu, faire merger une autre
manire de dcrire certains de ces circuits, sous la forme
dassemblages de portes boolennes. Comme chaque
porte est constitue de plusieurs composants lectroni-
ques, cette description sous la forme dun assemblage
de portes boolennes est une description plus grande
chelle que celle sous forme de transistors et de rsis-
tances. Une question se pose alors : peut-on concevoir
des circuits en assemblant des portes boolennes et en
ignorant compltement la manire dont ces portes sont
ralises avec des transistors ?
Cette question demande une rponse nuance : com-
prendre la fois lchelle des portes boolennes et celle
des transistors permet parfois de raliser des circuits plus
petits, donc moins chers et plus rapides. Par exemple, si
on veut construire un circuit qui ralise lopration boo-
lenne qui A et B associe non (A ou B) et si lon sait uni-
quement associer des portes boolennes, on construira
le circuit suivant
qui, in fine, utilise quatre transistors, trois pour la porte
ou et un pour la porte non. Si, en revanche, on sait aussi
comment ces portes sont construites avec des transis-
tors, on peut remarquer que le circuit
qui ne comporte que deux transistors, convient. Rai-
sonner une petite chelle permet donc dconomiser
deux transistors. Il est souvent utile, quand on raisonne
une chelle donne, de faire une incursion lchelle
infrieure ou lchelle suprieure.
ManuelDowek.book Page 174 Monday, July 9, 2012 4:58 PM
13 Les portes boolennes
Groupe Eyrolles, 2012
175
Cela dit, il y a aussi des avantages construire des cir-
cuits avec des portes boolennes en ignorant, ou en fei-
gnant dignorer, les chelles infrieures. Par exemple, les
portes boolennes sont aujourdhui fabriques avec des
transistors, mais par le pass, elles ont t fabriques
avec dautres composants : des relais, des tubes vide,
etc. et il est possible que, dans le futur, elles soient rali-
ses avec dautres composants, aujourdhui non encore
invents. Raisonner lchelle des portes boolennes,
sans prendre en compte la manire dont elles sont fabri-
ques, permet de conserver la mme organisation des
circuits lchelle des portes, mme quand la manire
dont ces portes sont fabriques change.
De plus, il est illusoire desprer penser simultanment
un systme aussi complexe quun ordinateur toutes les
chelles. Sil est donc, bien entendu, utile davoir une
culture gnrale qui donne une ide de la manire dont
un ordinateur se dcrit toutes les chelles, il est aussi
souvent ncessaire de savoir penser une chelle
unique, en ignorant, ou en feignant dignorer, la
manire dont les composants que lon assemble sont
fabriqus. Ainsi, aux chapitres 14 et 15, on construira
des circuits de plus en plus labors en rutilisant les cir-
cuits prcdents comme de nouveaux composants.
ALLER PLUS LOIN Qui a invent lordinateur ?
Contrairement la pnicilline, il est trs difficile de dire
qui a invent lordinateur.
Sans remonter aux machines calculer du XVII
e
sicle de
Wilhelm Schickard, Blaise Pascal, Gottfried Wilhelm
Leibniz, etc., ou la machine analytique imagine au
XIX
e
sicle par Charles Babbage, lapparition de lordi-
nateur a t prpare par une grande crativit dans le
domaine de la construction de machines la fin du
XIX
e
sicle et au dbut du XX
e
sicle, avec, par exemple,
la machine recensement de Herman Hollerith cons-
truite en 1889 ou lanalyseur diffrentiel de Harold
Locke Hazen et Vannevar Bush construit entre 1928 et
1931, qui taient dj des machines polyvalentes.
La notion duniversalit a t dfinie mathmatique-
ment en 1936 par Alonzo Church et Alan Turing et il
semble que la premire machine universelle ait t le
Z3, construite en 1941 par Konrad Zuse, mme si on ne
sen est rendu compte qua posteriori. La premire
machine lectronique utiliser le binaire semble avoir
t la machine Colossus, construite par Thomas Flowers
au cours de la seconde guerre mondiale, mais cette
machine ntait pas universelle. La premire machine
conue pour tre universelle fut sans doute lENIAC,
construite en 1946 par John Mauchly, Presper Eckert et
John Von Neumann. Pour certains nanmoins, ce ntait
pas encore un ordinateur, son programme ntant pas
enregistr dans la mmoire. La premire machine pro-
gramme enregistr a sans doute t la machine Baby,
construite Manchester en 1948 par Frederic Williams,
Tom Kilburn et Geoff Tootill.
Il semble donc difficile dattribuer linvention de lordi-
nateur un inventeur unique. Il y a plutt eu un foison-
nement dinnovations de la fin des annes trente au
dbut des annes cinquante qui, chacune sa manire,
ont contribu linvention de lordinateur.
Ai-je bien compris ?
Comment raliser une porte non avec des transistors ?
Comment raliser une porte ou avec des transistors ?
Est-il ncessaire de savoir raliser une porte non et une porte ou avec des transistors
pour les assembler en des circuits plus complexes ?
ManuelDowek.book Page 175 Monday, July 9, 2012 4:58 PM
ManuelDowek.book Page 176 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
14
Le temps
et la mmoire
Otto Schmitt (1913-1998) est un
pionnier du gnie biomdical. En
1934, en tudiant la propagation de
linflux nerveux dans les nerfs des cal-
mars, il a compris quun circuit en
boucle ferme positive cest--dire
dans lequel la sortie est connecte
lentre, sans inversion de valeur
avait deux tats stables et pouvait
donc tre utilis pour mmoriser une
grandeur. En lectronique, une bas-
cule de Schmitt est une forme de cir-
cuit bistable, qui utilise cette ide de
boucle ferme positive.
Le temps est ce qui permet dviter de tout faire
en mme temps.
Dans ce chapitre, nous voyons comment les circuits
lectroniques prennent le temps en compte. Nous voyons
dabord comment fabriquer un circuit mmoire. Puis,
comment un circuit particulier, lhorloge, permet
de synchroniser tous les autres.
ManuelDowek.book Page 177 Monday, July 9, 2012 4:58 PM
Troisime partie Machines
Groupe Eyrolles, 2012
178
Les circuits que nous avons vus au chapitre 13, par exemple le circuit
illustr ci-contre, ont des entres (deux gauche sur la figure) et des sor-
ties (une droite sur la figure) et ltat des sorties est dtermin par celui
des entres. Dans cet exemple, la sortie est dans ltat 1 quand les deux
entres sont dans ltat 1 et elle est dans ltat 0 quand au moins lune
des entres est dans ltat 0. Ltat des sorties un instant donn dpend
de ltat des entres ce mme instant, mais pas de ltat des entres une
seconde ou une minute plus tt. Un tel circuit, qui ignore le temps,
sappelle un circuit combinatoire. Il y a, autour de nous, beaucoup de cir-
cuits combinatoires. Par exemple, une lampe est allume quand son
interrupteur est ferm et elle est teinte quand cet interrupteur est
ouvert ; ltat de la lampe dpend de la position de linterrupteur, mais
pas de la position de linterrupteur une seconde ou une minute plus tt.
Cependant, il y a aussi autour de nous des circuits moins amnsiques,
dont ltat un instant donn dpend non seulement de ltat de ses
entres cet instant, mais aussi de leur tat pass. Par exemple, quand
nous appuyons sur la touche 1 dune calculatrice, le chiffre 1 apparat sur
lcran, mais quand nous relchons cette touche, le chiffre 1 ne disparat
pas : ltat de lcran un instant donn dpend donc non seulement de
ltat du clavier ce mme instant, mais aussi de toute lhistoire du cla-
vier. Un tel circuit sappelle un circuit squentiel. Les ordinateurs sont,
bien entendu, des circuits squentiels car, comme nous lavons vu au
chapitre 1, lexcution dun programme modifie un tat, qui est une des-
cription abstraite de ltat de lordinateur et dpend donc de toutes les
instructions excutes dans le pass.
La mmoire
Le circuit squentiel le plus simple est le circuit mmoire un bit qui permet
de mmoriser un 0 ou un 1. Construire un tel circuit nest pas difficile,
mais il faut procder en plusieurs tapes. La premire est de construire un
circuit qui a deux tats stables, par exemple celui de la figure ci-contre.
Ce circuit a deux tats stables car :
Si la sortie A de la premire porte non est dans ltat 0, alors lentre
de la seconde porte non, qui est A galement, est aussi dans ltat 0 ;
par consquent, sa sortie B est dans ltat 1, donc lentre de la pre-
mire porte, qui est B galement, est dans ltat 1, ce qui participe
perptuer le fait que sa sortie A soit dans ltat 0.
(r[0] 2
0
) + c 2
1
= (n[0] 2
0
) + (p[0] 2
0
)
a = n[1];
b = p[1];
r[1] = (a && !b && !c) || (!a && b && !c) || (!a && !b && c)
|| (a && b && c);
c = (a && b) || (b && c) || (a && c);
i = i + 1;
ManuelDowek.book Page 234 Monday, July 9, 2012 4:58 PM
18 Ajouter deux nombres exprims en base deux
Groupe Eyrolles, 2012
235
Montrer que dans cet tat :
La dmonstration de
correction du programme
Quand on conoit un tel programme, une question se pose
naturellement : comment sait-on quil calcule la somme des deux nom-
bres entiers ?
Une premire manire de sassurer quun programme fait bien ce quon
attend de lui est de le tester (voir le chapitre 1). Il faut essayer diffrentes
valeurs pour les nombres x et y et vrifier que le programme affiche bien la
valeur x + y dans tous les cas. On estime, en gnral, que le cot du test
dun programme est du mme ordre de grandeur que celui de son dvelop-
pement. Cependant, le test prsente deux limites importantes : la premire
est que lon ne peut pas tester le programme sur toutes les valeurs dentre
possibles, qui sont souvent trs nombreuses, voire en nombre infini. La
seconde est que pour tester un programme, il faut savoir ce que lon attend
de lui. Or, ce nest pas le cas quand on crit, par exemple, un programme
qui calcule la millime dcimale du nombre , ou la position de la Lune
dans mille ans, car la raison pour laquelle on crit un tel programme est
prcisment que lon ignore la millime dcimale du nombre ou la posi-
tion de la Lune dans mille ans. De ce fait, comment le tester ?
Une autre manire de sassurer quun programme fait bien ce quon
attend de lui est de le dmontrer. Par exemple, on peut dmontrer que le
programme prcdent calcule bien la somme des nombres x et y. Plus
prcisment, on veut dmontrer que si, au moment o lon excute ce
programme, les tableaux n et p contiennent la reprsentation binaire de
deux entiers de dix chiffres, cest--dire si :
et :
(r[0] 2
0
+ r[1] 2
1
) + c 2
2
= (n[0] 2
0
+ n[1] 2
1
) + (p[0] 2
0
+ p[1] 2
1
)
x = n[0] 2
0
+ n[1] 2
1
+ + n[8] 2
8
+ n[9] 2
9
y = p[0] 2
0
+ p[1] 2
1
+ + p[8] 2
8
+ p[9] 2
9
ManuelDowek.book Page 235 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
236
alors la fin de lexcution de ce programme, le tableau r contient un
nombre de onze chiffres qui est la reprsentation binaire de x + y, cest-
-dire que :
Le programme qui ajoute deux nombres exprims en binaire est form
dune boucle, dans laquelle on calcule dabord le chiffre des units, puis
les chiffres des deuzaines, des quatraines, etc. du rsultat. Aprs avoir
achev les tours 0, i - 1 et au moment de commencer le tour i, on a
donc calcul la somme des deux nombres forms des i - 1 premiers
chiffres, en partant de la droite, des nombres x et y. Cest linvariant que
lon va montrer par rcurrence. la fin de la boucle, linvariant indiquera
que lalgorithme a effectu laddition souhaite.
Par exemple, si au cours de laddition de x = 1011001101 et
y = 1101101011 () on sarrte aprs avoir effectu les tours 0 et 1 de la
boucle et avant de commencer le tour 2, on a dj calcul la somme des
nombres 01 et 11, cest--dire 1 et 3 . Le rsultat de cette addition
nest pas exactement le nombre reprsent par les deux chiffres dj
poss 00, car il faut tenir compte de la retenue. La proprit exacte est
que si on pose la retenue dans la colonne i, ce qui donne dans cet
exemple le nombre 100 cest--dire 4, on obtient la somme des deux
nombres forms des i - 1 premiers chiffres des nombres x et y.
Autrement dit, au moment de commencer le tour i de la boucle, ltat
vrifie la proprit :
On dmontre maintenant cette proprit.
la premire excution, i = 0, la somme (r[0] 2
0
+ + r[i-1] 2
i-1
) ne
contient aucun terme ; elle vaut donc 0. Il en est de mme pour les sommes
(n[0] 2
0
+ + n[i-1] 2
i-1
) et (p[0] 2
0
+ + p[i-1] 2
i-1
).
Comme par ailleurs, la retenue c vaut 0, les deux membres de lgalit sont
nuls.
x + y = r[0] 2
0
+ r[1] 2
1
+ + r[9] 2
9
+ r[10] 2
10
.
T Invariant
Un invariant dune boucle est une proprit qui
est vrifie chaque excution du corps de cette
boucle. En gnral, pour la dernire excution,
cette proprit traduit le fait que la boucle ralise
bien la tche souhaite. On montre quune pro-
prit est un invariant dune boucle par un raison-
nement par rcurrence :
on montre que la proprit est vrifie la pre-
mire excution du corps de la boucle,
on montre que si linvariant est vrifi une
excution donne du corps de la boucle, il est
encore vrifi lexcution suivante.
Linvariant est alors vrifi la fin de boucle, qui
fournit donc le rsultat attendu.
(r[0] 2
0
+ + r[i-1] 2
i-1
) + c 2
i
= (n[0] 2
0
+ + n[i-1] 2
i-1
) + (p[0] 2
0
+ + p[i-1] 2
i-1
)
ManuelDowek.book Page 236 Monday, July 9, 2012 4:58 PM
18 Ajouter deux nombres exprims en base deux
Groupe Eyrolles, 2012
237
On suppose maintenant que cette proprit est vrifie dans ltat dans lequel
sexcute le tour i de la boucle et on veut montrer quelle est encore vrifie
dans ltat dans lequel sexcute le tour suivant. Au dbut du tour i, on a :
et donc en ajoutant n[i] 2
i
+ p[i] 2
i
dans les deux membres de
lgalit on obtient que, au dbut du tour i de la boucle :
Au cours de ce tour de la boucle, on ajoute les trois chiffres n[i], p[i]
et c, et le rsultat de cette addition a pour chiffre des units r[i] et pour
chiffre des deuzaines la nouvelle valeur de c, si bien que, dans ltat
atteint la fin de ce tour de la boucle :
cest--dire :
Au dbut du tour suivant, la variable i a t augmente de 1, si bien que :
La proprit est donc encore vrifie au dbut du tour suivant. Elle est
donc vrifie chacun des tours de boucles : cest un invariant de la boucle.
la fin du dernier tour, i est gal 10 et donc :
On affecte alors la case 10 du tableau r avec la retenue si bien que, quand
lexcution est termine :
Cest ce quil fallait dmontrer : le tableau r contient la reprsentation
binaire du nombre x + y.
(r[0] 2
0
+ + r[i-1] 2
i-1
) + c 2
i
= (n[0] 2
0
+ + n[i-1] 2
i-1
) + (p[0] 2
0
+ + p[i-1] 2
i-1
)
(r[0] 2
0
+ + r[i-1] 2
i-1
) + (n[i] + p[i] + c) 2
i
= (n[0] 2
0
+ + n[i] 2
i
) + (p[0] + + p[i] 2
i
)
(r[0] 2
0
+ + r[i-1] 2
i-1
) + (r[i] + 2 c) 2
i
= (n[0] 2
0
+ + n[i] 2
i
) + (p[0] 2
0
+ + p[i] 2
i
)
(r[0] 2
0
+ + r[i] 2
i
) + c 2
i+1
= (n[0] 2
0
+ + n[i] 2
i
) + (p[0] 2
0
+ + p[i] 2
i
)
(r[0] 2
0
+ + r[i-1] 2
i-1
) + c 2
i
= (n[0] 2
0
+ + n[i-1] 2
i-1
) + (p[0] 2
0
+ + p[i-1] 2
i-1
)
(r[0] 2
0
+ + r[9] 2
9
) + c 2
10
= (n[0] 2
0
+ + n[9] 2
9
) + (p[0] 2
0
+ + p[9] 2
9
)
= x + y
r[0] 2
0
+ + r[10] 2
10
= x + y
ManuelDowek.book Page 237 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
238
ALLER PLUS LOIN Lautonomie de la notion dalgorithme
Dans ce chapitre, nous avons tudi un programme,
crit en Java, qui additionne deux nombres crits en
base deux. Il est possible dcrire des programmes trs
similaires dans dautres langages de programmation. La
mthode pour ajouter deux nombres en base deux est
indpendante dun langage de programmation
particulier : cest une mthode abstraite qui peut
sexprimer dans divers langages. Une telle mthode sys-
tmatique qui permet de rsoudre un problme
sappelle un algorithme. Il est important de distinguer
un algorithme, mthode indpendante de tout langage,
dun programme, qui est lincarnation dun algorithme
dans un langage particulier.
Cette distinction entre les notions dalgorithme et de
programme doit galement son importance au fait que
nous ayons utilis des algorithmes pour faire des addi-
tions dans diverses bases depuis des millnaires, bien
avant que nous ayons pens exprimer cet algorithme
dans un langage de programmation. Nous avons mme
utilis des algorithmes, transmis de gnration en gn-
ration par observation et imitation, pour fabriquer des
objets en cramique, tisser des toffes, nouer des cor-
dages, prparer les aliments, etc. avant linvention de
lcriture.
ALLER PLUS LOIN Dfinitions algorithmiques et non algorithmiques
Lapprentissage des mathmatiques commence par
lapprentissage dalgorithmes qui permettent deffec-
tuer des additions, des soustractions, etc.
Mme au-del de ces mathmatiques lmentaires,
beaucoup de dfinitions mathmatiques sont algorith-
miques. Par exemple, la dfinition du nombre n - m
comme le nombre obtenu en mettant n cailloux dans un
sac, en en tant m et en comptant ceux qui restent est
algorithmique. Mais la dfinition du nombre n - m
comme le nombre p tel que p + m = n ne lest pas : con-
trairement la premire, cette dfinition ne dit pas ce
que lon doit faire pour connatre le nombre n - m
quand on connat les nombres n et m.
De mme, la dfinition selon laquelle deux vecteurs non
nuls du plan, donns par leurs coordonnes (x
1
; y
1
) et
(x
2
; y
2
) dans une base, sont colinaires quand
x
1
y
2
= x
2
y
1
est algorithmique, mais pas celle selon
laquelle ces deux vecteurs sont colinaires sil existe un
facteur de proportion k tel que x
1
= k x
2
et y
1
= k y
2
. Si
deux vecteurs sont donns par leurs coordonnes dans
une base, par exemple (4 ; 10) et (6 ; 15), la premire
dfinition donne une mthode pour dterminer sils
sont colinaires, puisquil suffit de calculer 4 15 et
10 6 et de vrifier que lon obtient bien le mme
nombre dans les deux cas, mais pas la seconde, qui
demande de trouver le facteur de proportion, sans indi-
quer de mthode pour le faire.
Ai-je bien compris ?
En quelles bases lalgorithme de laddition peut-il tre utilis ?
Que veut-on dire lorsquon affirme que lalgorithme de laddition est correct ?
Quest-ce quun invariant ?
ManuelDowek.book Page 238 Monday, July 9, 2012 4:58 PM
Groupe Eyrolles, 2012
19 Dessiner
Ivan Sutherland (1938-) est un des
pionniers de linformatique gra-
phique. Il est lauteur du logiciel Sket-
chpad (1963) qui est lun des premiers
logiciels de conception assiste par
ordinateur. Ivan Sutherland a aussi
t lorigine de lun des premiers
systmes de ralit virtuelle muni
dun visiocasque. Il est lun des pion-
niers des architectures dordinateurs
spcialises pour le temps rel et le
graphisme.
Ou comment devenir Botticelli sans se tacher
les doigts.
Dans ce chapitre, nous voyons comment programmer un
ordinateur pour dessiner ou modifier une image sans utiliser
un logiciel de retouche photo ! Nous voyons comment ouvrir
une fentre graphique, crer une image, dessiner en trois
dimensions, lire et produire des fichiers contenant des images,
transformer des images.
ManuelDowek.book Page 239 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
240
Dessiner dans une fentre
Deux instructions permettent douvrir une fentre graphique (cest--dire
une fentre dans laquelle on peut dessiner) et dy dessiner un pixel.
Excuter linstruction Isn.initDrawing("Mon premier dessin",x,y,largeur,
hauteur); a pour effet douvrir une fentre de largeur pixels de large, sur
hauteur pixels de haut, qui porte le nom Mon premier dessin et dont le
coin en haut gauche est au pixel de coordonnes (x ; y) de lcran.
Excuter linstruction Isn.drawPixel(x,y,rouge,vert,bleu); a pour effet de
dessiner un pixel dans la x-me colonne et la y-me ligne de cette fentre,
dont la couleur est dcrite par les nombres rouge, vert et bleu (voir le
chapitre 9). La coordonne x varie entre 0 et largeur - 1 et la coordonne y
entre 0 et hauteur - 1. Les nombres rouge, vert et bleu varient entre 0 et 255.
Exercice 19.1 (avec corrig)
Dans une fentre de 400 pixels sur 400 pixels, dessiner un carr rouge form
des points dont labscisse est comprise entre 100 et 250 et lordonne comprise
entre 50 et 200.
Un pixel de coordonnes (x ; y) appartient ce carr si et seulement si
100 <= x && x <= 250 && 50 <= y && y <= 200. On obtient donc le
programme :
Dans ce cas, il nest cependant pas ncessaire de balayer toute la fentre gra-
phique et un autre programme possible est :
ATTENTION Axe vertical
De mme que les Anglais roulent gauche,
laxe vertical, en gomtrie algorithmique, est
orient vers le bas.
SAVOIR-FAIRE Crer une image
1 tablir une condition sur les coordonnes dun pixel qui permette de dcider sil
appartient ou non la figure tracer.
2 crire une instruction qui balaye la fentre graphique, au moyen de deux boucles
imbriques, lune sur les abscisses et lautre sur les ordonnes.
3 Dans le corps de la boucle la plus interne, affecter la couleur approprie chaque pixel,
selon quil appartient ou non la figure.
Isn.initDrawing("Carr rouge",10,10,400,400);
for (x = 0; x <= 399; x = x + 1) {
for (y = 0; y <= 399; y = y + 1) {
if (100 <= x && x <= 250 && 50 <= y && y <= 200) {
Isn.drawPixel(x,y,255,0,0);}}}
Isn.initDrawing("Carr rouge",10,10,400,400);
for (x = 100; x <= 250; x = x + 1) {
for (y = 50; y <= 200; y = y + 1) {
Isn.drawPixel(x,y,255,0,0);}}
ManuelDowek.book Page 240 Monday, July 9, 2012 4:58 PM
19 Dessiner
Groupe Eyrolles, 2012
241
Exercice 19.2
crire un programme qui dessine ce mme carr mais sans le remplir.
Exercice 19.3
crire un programme qui dessine un disque de centre (a ; b) et de rayon r
.
Exercice 19.4
Tracer un segment pixel par pixel est facile quand ce segment est horizontal
ou vertical, mais cela est un peu plus difficile quand il est oblique. Pour tracer
un segment qui va du point (x ; y) au point (x ; y) quand |y - y| |x - x|, cest-
-dire quand le segment est plutt horizontal, on cherche dessiner un pixel
dans chaque colonne dabscisse comprise entre x et x.
Dterminer une quation cartsienne de la droite passant par les points de
coordonnes (x ; y) et (x ; y).
En supposant que x x, montrer que le point de la droite dabscisse X a
pour ordonne y + (X - x)(y - y) / (x - x). Dans la pratique, pour dessiner
effectivement le pixel, ce nombre sera arrondi lentier le plus proche.
crire un programme qui trace ainsi un segment de type plutt
horizontal . On prendra soin de prvoir le cas o x x.
De mme, quand le segment est plutt vertical, cest--dire quand |x -
x| |y - y|, on cherche dessiner un pixel dans chaque ligne dordonne
comprise entre y et y. Dterminer labscisse du point de la droite dont
lordonne est y et complter lalgorithme pour le cas des segments plutt
verticaux.
Rechercher sur le Web ce quest lalgorithme de Bresenham et comment il
amliore celui que lon vient de construire.
Exercice 19.5
Tracer un cercle de centre (a ; b) et de rayon r en balayant les abscisses x de a - r
a + r et en calculant les valeurs de y partir de lquation (x - a)
2
+ (y - b)
2
= r
2
.
Mme question en balayant les ordonnes. Comment viter les discontinuits ?
Exercice 19.6
Tracer, pour t variant de 0 10 000, la courbe dfinie par
x(t) = 256 + 250 cos(0,0015 t) et y(t) = 256 + 250 sin(kt), avec k = 0,0045, ceci
dans une fentre de 512 pixels sur 512 pixels. Cest une courbe de Lissajous.
Faire varier k de 0,0015 0,0090 et explorer les diffrentes courbes obtenues.
Dautres instructions dessinent des segments, des cercles et des disques, sans
avoir le faire pixel par pixel.
Linstruction Isn.drawLine(x1,y1,x2,y2,rouge,vert,bleu); trace un segment,
de couleur rouge, vert, bleu, qui va du point (x1 ; y1) au point (x2 ; y2).
Linstruction Isn.drawCircle(x,y,rho,rouge,vert,bleu); trace un cercle, de
couleur rouge, vert, bleu, de centre (x ; y) et de rayon rho.
Linstruction Isn.paintCircle(x,y,rho,rouge,vert,bleu); trace un disque, de
couleur rouge, vert, bleu, de centre (x ; y) et de rayon rho.
ManuelDowek.book Page 241 Monday, July 9, 2012 4:58 PM
Quatrime partie Algorithmes
Groupe Eyrolles, 2012
242
Dessiner en trois
dimensions
Les mthodes que lon utilise aujourdhui pour dessiner des images en
trois dimensions remontent la Renaissance quand, bien avant que les
ordinateurs existent, les peintres ont commenc mettre au point diff-
rentes mthodes de reprsentation de lespace en perspective et les uti-
liser dans leurs tableaux. Ces peintres sont finalement arrivs une
conclusion qui, en langage moderne, sexprime assez simplement : un
point de lespace de coordonnes (x ; y ; z) o laxe des x va de gauche
droite, laxe des y de bas en haut et celui des z de proche loin, doit tre
reprsent sur un tableau par un point de coordonnes X = x / z et Y = y /
z. Par exemple, le point de coordonnes (0 ; 1 ; 2) est reprsent sur le
tableau par le point de coordonnes (0 ; 1/2). Dans ce systme de repr-
sentation, la coordonne z doit toujours tre strictement positive : les
points dont la coordonne z est ngative correspondent aux points de
lespace qui sont dans le dos du peintre et quil ne reprsente donc pas.
Les points de coordonnes (0 ; 0 ; 1) et (0 ; 1 ; 1), qui sont une
distance 1 dans lespace, sont reprsents par deux points (0 ; 0) et (0 ; 1),
qui sont aussi une distance 1 sur le tableau. En revanche, les points de
coordonnes (0 ; 0 ; 2) et (0 ; 1 ; 2) qui sont aussi une distance 1 dans
lespace, sont reprsents par deux points (0 ; 0) et (0 ; 1/2), qui sont
une distance 1/2 sur le tableau : plus un objet est loin, plus sa reprsenta-
tion sur le tableau est petite.
Si lon veut maintenant reprsenter un tableau o les points sont reprs
par des coordonnes (X ; Y) qui varient entre -1 et 1 dans une fentre
ALLER PLUS LOIN Taille du tableau
La taille du tableau est dtermine par la partie de lespace que lon
veut reprsenter. Si lon dcide, par exemple, que x et y varient entre -1
et 1 et z entre 1 et linfini, alors les coordonnes sur le tableau varient
entre -1 et 1 : un objet peut tre lextrieur du tableau parce quil est
trop gauche, trop droite, trop en haut, trop en bas ou trop prs, mais
pas parce quil est trop loin. Cela est souvent rappel dans les tableaux
de la Renaissance : quand le peintre reprsente une scne qui se passe
dans une pice, il laisse souvent une porte ou une fentre ouverte sur
une petite scne beaucoup plus loin. Cest, par exemple, le cas de cette
Annonciation de Botticelli.
ManuelDowek.book Page 242 Monday, July 9, 2012 4:58 PM
19 Dessiner
Groupe Eyrolles, 2012
243
graphique o les points sont reprs par des coordonnes (i ; j) qui
varient entre 0 et 399, il faut faire un changement de repre et repr-
senter le point du tableau de coordonnes (X ; Y) par le pixel de coor-
donnes i = 200 + 200 X et j = 200 - 200 Y. Le signe - est d au fait que
laxe vertical est orient vers le haut dans le tableau et vers le bas dans la
fentre graphique. Au bout du compte, le point de lespace de coordon-
nes (x ; y ; z) est reprsent par le pixel de coordonnes
i = 200 + 200 x / z et j = 200 - 200 y / z.
Par exemple, on dessine le cube dont une face ABCD est dans le plan
z = 2 et une autre face ABCD est plus loin, dans le plan z = 4 :
A = (-1 ; -1 ; 2), B = (-1 ; 1 ; 2), C = (1 ; 1 ; 2), D = (1 ; -1 ; 2) ;
A = (-1 ; -1 ; 4), B = (-1 ; 1 ; 4), C = (1 ; 1 ; 4), D = (1 ; -1 ; 4).
On commence par calculer les coordonnes des pixels reprsentant
chacun de ces points en utilisant les formules i = 200 + 200 x / z et
j = 200 - 200 y / z :
A : (100 ; 300), B : (100 ; 100), C : (300 ; 100), D : (300 ; 300) ;
A : (150 ; 250), B : (150 ; 150), C : (250 ; 150), D : (250 ; 250).
Il ne reste plus qu tracer les quatre segments de la premire face ([AB],
[BC], [CD] et [DA]), les quatre de la seconde ([AB], [BC], [CD] et
[DA]) et les quatre qui relient chaque sommet dune face au sommet
homologue de lautre ([AA], [BB], [CC], [DD]).
On obtient alors limage o la face du cube la plus proche est repr-
sente par le grand carr, la face la plus lointaine par le petit carr et les
quatre autres par des trapzes. Dans ce dessin, on suppose que la face
antrieure du cube est transparente, si bien que lon voit lintrieur du
cube. Si on lavait suppose opaque, il aurait fallu ne pas dessiner la
partie du dessin cache par cette face.
// Face avant
Isn.drawLine(100,300,100,100,0,0,0);
Isn.drawLine(100,100,300,100,0,0,0);
Isn.drawLine(300,100,300,300,0,0,0);
Isn.drawLine(300,300,100,300,0,0,0);
// Face arrire
Isn.drawLine(150,250,150,150,0,0,0);
Isn.drawLine(150,150,250,150,0,0,0);
Isn.drawLine(250,150,250,250,0,0,0);
Isn.drawLine(250,250,150,250,0,0,0);
// Artes fuyantes
Isn.drawLine(100,300,150,250,0,0,0);
Isn.drawLine(100,100,150,150,0,0,0);
Isn.drawLine(300,100,250,150,0,0,0);
Isn.drawLine(300,300,250,250,0,0,0);