Vous êtes sur la page 1sur 1018

Les bases de l'informatique

et de
la programmation
Le contenu de ce livre pdf de cours d'initiation la
programmation est inclus dans un ouvrage papier de 1372
pages dit en Novembre 2004 par les ditions Berti
Alger.
http://www.berti-editions.com
L'ouvrage est accompagn d'un CD-ROM contenant les
assistants du package pdagogique.
Rm di Scala
Corrections du 04.01.05
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 1
SOMMAIRE
Introduction 4
Chapitre 1.La machine
1.1.Ordinateur et volution 6
1.2.Les circuits logiques 14
1.3.Codage et numration 44
1.4.Formalisation de la notion dordinateur 55
1.5.Architecture de lordinateur 66
1.6.Systme dexploitation 100
1.7.Les rseaux 126
Exercices avec solutions 145
Chapitre 2.Programmer avec un langage
2.1.Les langages 147
2.2.Relations binaires 155
2.3.Thorie des langages 161
2.4.Les bases du langage Delphi 177
Exercices avec solutions 219
Chapitre 3.Dvelopper du logiciel avec mthode
3.1.Dveloppement mthodique du logiciel 223
.Machines abstraites : exemple 259
3.2.Modularit 269
3.3.Complexit, tri, recherche 278
tri bulle 286
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 2
tri par slection 292
tri par insertion 300
tri rapide 306
tri par tas 316
recherche en table 331
Exercices avec solutions 336
Chapitre 4. Structures de donnes
4.1.spcifications abstraites de donnes 355
4.2 types abstraits TAD et implantation 371
exercice TAD et solution d'implantation 379
4.3 structures d'arbres binaires 382
Exercices avec solutions 413
Chapitre 5. Programmation objet et vnementielle
5.1.Introduction la programmation oriente objet 445
5.2.Programmez objet avec Delphi 462
5.3.Polymorphisme avec Delphi 489
5.4.Programmation vnementielle et visuelle 523
5.5.Les vnements avec Delphi 537
5.6.Programmation dfensive 564
Exercices avec solutions 582
Chapitre 6. Programmez avec des grammaires
6.1.Programmation avec des grammaires 605
6.2.Automates et grammaires de type 3 628
6.3.projet de classe mini-interprteur 647
6.4.projet d'indentateur de code 667
Exercices avec solutions 691
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 3
Chapitre 7. Communication homme-machine
7.1.Les interfaces de communication logiciel/utilisateur 707
7.2. Grammaire pour analyser des phrases 714
7.3. Interface et pilotage en mini-franais 734
7.4. Projet d'IHM : enqute fumeurs 754
7.5. Utilisation des bases de donnes 766
Exercices avec solutions 802
Chapitre 8. Les composants sont des logiciels rutilisables
8.1.Construction de composants avec Delphi 861
8.2. Les messages Windows avec Delphi 902
8.3. Cration d'un vnement associ un message 923
8.4. ActiveX avec la technologie COM 930
Exercices avec solutions 948
Annexes
Notations mathmatiques utilises dans l'ouvrage 982
Syntaxe compare LDFA- Delphi-Java/C# 988
Choisir entre agrgation ou hritage 990
5 composants logiciels en Delphi, Java swing et C# 995
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 4
Introduction
Issu d'un cours de programmation l'universit de Tours en premier cycle scientifique, en DESS,
Master Sciences et technologie comptence complmentaire informatique et en Diplme
Universitaire ( DU ) comptence complmentaire informatique pour les NTIC (rservs des non-
informaticiens), cet ouvrage est une synthse (non exhaustive)sur les minima connatre sur le sujet.
Il permettra au lecteur d'aborder la programmation objet et l'criture d'interfaces objets
vnementielles sous Windows en particulier.
Ce livre sera utile un public tudiant (IUT info, BTS info, IUP informatique et scientifique,
DEUG sciences, licence pro informatique, Dess, Master et DU comptence complmentaire en
informatique) et de toute personne dsireuse de se former par elle-mme (niveau prrequis Bac
scientifique).
Le premier chapitre rassemble les concepts essentiels sur la notion d'ordinateur, de codage, de
systme d'exploitation, de rseau, de programme et d'instruction au niveau machine.
Le second chapitre introduit le concept de langage de programmation et de grammaire de
chomsky, le langage pascal de Delphi sert d'exemple.
Le chapitre trois forme le noyau dur d'une approche mthodique pour dvelopper du logiciel, les
thmes abords sont : algorithme, complexit, programmation descendante, machines abstraites,
modularit. Ce chapitre fournit aussi des outils de tris sur des tableaux. montre comment utiliser
des grammaires pour programmer en mode gnration ou en mode analyse.
Le chapitre quatre dfini la notion de types abstraits. Il propose l'tude de type abstrait de
structures de donnes classiques : liste, pile, file, arbre avec des algorithmes classiques de traitement
d'arbres binaires.
Le chapitre cinq contient les lments fondamentaux de la programmation oriente objet, du
polymorphisme d'objet, du polymorphisme de mthode, de la programmation vnementielle et
visuelle, de la programmation dfensive. Le langage Delphi sert de support l'implantation pratique
de ces notions essentielles.
Le chapitre six montre comment utiliser la programmation par les grammaire avec des outils
pratiques comme les automates de type 3 et les automates piles simples. Deux projets complets sont
traits dans ce chapitre.
Le chapitre sept correspond la construction d'interface homme-machine, et l'utilisation des bases
de donnes avec des exemples pratiques en Delphi et Access.
Le chapitre huit composant avec Delphi, puis aborde le traitement des messages dans Windows et
comment programmer des applications utilisant les messages systme pour communiquer. Il fournit
aussi une notice pratique pour construire un composant ActiveX et le dployer sur le web avec
Delphi.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 5
Chapitre 1 : La machine
1.1.Ordinateur et volution
- les 3 grandes lignes de penses
- les gnrations d'ordinateurs
- l'ordinateur
- information-informatique
1.2.Les circuits logiques
- logique lmentaire pour l'informatique
- algbre de Boole
- circuits boolens
1.3.Codage numration
- codage de l'information
- numration
1.4.Formalisation de la notion dordinateur
- machine de Tring thorique
- machine de Tring physique
1.5.Architecture de lordinateur
- les principaux constituants
- mmoires, mmoire centrale
- une petite machine pdagogique
1.6.Systme dexploitation
- notion de systme d'exploitation
- systmes d'exploitation des micro-ordinateurs
1.7.Les rseaux
- les rseaux d'ordinateurs
- liaisons entre rseaux
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 6
1.1 Ordinateur et volution
Plan du chapitre:
1. Les 3 grandes lignes de pense
1.1 Les machines calculer
1.2 Les automates
1.3 Les machines programmables
2. Les gnrations de matriels
2.1 Premire gnration 1945-1954
2.2 Deuxime gnration 1955-1965
2.3 Troisime gnration 1966-1973
2.4 Quatrime gnration partir de 1974
3. Lordinateur
3.1 Utilit de lordinateur
3.2 Composition minimale dun ordinateur
3.3 Autour de lordinateur : les priphriques
3.4 Pour relier tout le monde
4. Information - Informatique
4.1 Les dfinitions
4.2 Critre algorithmique lmentaire
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 7
1. Les 3 grandes lignes de pense
Lhistoire de linformatique dbute par linvention de machines (la fonction cre lorgane) qui au
dpart correspondent des lignes de pense diffrentes. Linformatique rsultera de la fusion des
savoirs acquis dans ces domaines. Elle nest pas une synthse de plusieurs disciplines, mais plutt
une discipline entirement nouvelle puisant ses racines dans le pass. Seul leffort permanent du
gnie cratif humain la rendue accessible au grand public de nos jours.
1.1 Les machines calculer
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 8
La Pascaline de Pascal, 17
me
sicle. Pascal invente la Pascaline, premire machine calculer
(addition et soustraction seulement), pour les calculs de son pre.
La machine multiplicatrice de Leibniz, 17
me
sicle. Leibniz amliore la machine de Pascal pour avoir
les quatre oprations de base (+,-,*,/).
1.2 Les automates
Les automates, les horloges astronomiques, les machines militaires ds le 12
me
sicle.
1.3 Les machines programmables
Le mtier tisser de Jacquard, 1752-1834
Dbut de commercialisation des machines mcaniques scientifiques (usage militaire en gnral).
Babage invente la premire machine analytique programmable.
2. Les gnrations de matriels
On admet gnralement que l're de l'informatique qui couvre peu de dcennies se divise en plusieurs
gnrations essentiellement marques par des avances technologiques
2.1 Premire gnration 1945 - 1954
Informatique scientifique et militaire.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 9
Il faut rsoudre les problmes des calculs rptitifs.
Cration de langages avec succs et checs dans le but de rsoudre les problmes prcdents.
Technologie lourde (Tube et tore de ferrite), qui pose des problmes de place et de consommation
lectrique.
Les trs grandes nations seules possdent loutil informatique.
2.2 Deuxime gnration 1955-1965
Naissance de linformatique de gestion.
Nouvelle technologie base sur le transistor et le circuit imprim. Le langage Fortran rgne en
matre incontest. Le langage de programmation Cobol orient gestion, devient un concurrent de
Fortran.
Les nations riches et les trs grandes entreprises accdent loutil informatique.
2.3 Troisime gnration 1966-1973
Naissance du circuit intgr.
Nouvelle technologie base sur le transistor et le circuit intgr.
Les ordinateurs occupent moins de volume, consomment moins dlectricit et sont plus rapides. Les
ordinateurs sont utiliss le plus souvent pour des applications de gestion.
Les PME et PMI de tous les pays peuvent se procurer des matriels informatiques.
2.4 Quatrime gnration partir de 1974
Naissance de la micro-informatique
La cration des microprocesseurs permet la naissance de la micro-informatique(le micro-ordinateur
Micral de R2E est invent par un franais Franois Gernelle en 1973). Steve Jobs (Apple) invente
un nouveau concept vers la fin des annes 70 en recopiant et en commercialisant les ides de Xerox
parc travers le MacIntosh et son interface graphique.
Un individu peut actuellement acheter son micro-ordinateur dans un supermarch.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 10
Nous observons un phnomne fondamental :
La dmocratisation dune science travers un outil. Linformatique qui ses dbuts tait une
affaire de spcialistes, est aujourdhui devenue laffaire de tous; do limportance dune
solide formation de tous aux diffrentes techniques utilises par la science informatique, car
la banalisation dun outil ou dune science a son revers : lassoupissement de lattention
envers les inconvnients inhrents tout progrs technique.
Tableau synoptique des gnrations dordinateurs :
3. L'ordinateur
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 11
3.1 Utilit de lordinateur
Un ordinateur est une machine traiter de linformation.
Linformation est fournie sous forme de donnes traites par des programmes (excuts par
des ordinateurs).
3.2 Composition minimale dun ordinateur : le cur
Une mmoire Centrale .
Une unit de traitement avec son UAL (unit de calcul).
Une unit de commande ou contrle.
Une ou plusieurs units dchanges.
Schma simplifi du cur de lordinateur
3.3 Autour de lordinateur : les priphriques
Les priphriques sont chargs deffectuer des tches dentres et/ou de sortie de linformation.
En voici quelques uns.
Priphriques dentre
Clavier, souris, crayon optique, cran tactile, stylo code barre, carte son,
scanner, camra, etc.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 12
Priphriques de sortie
Ecran, imprimante, table traante, carte son, tlcopie, modem etc.
Priphriques dentre sortie
Mmoire auxiliaire (sert stocker les donnes et les programmes):
1. Stockage de masse sur disque dur ou disquette.
2. Bande magntique sur drouleur (ancien) ou sur
streamer.
3. Mmoire clef USB
4. CD-Rom, DVD, disque magnto-lectrique etc
3.4 Pour relier tout le monde : Les Bus
Les Bus reprsentent dans lordinateur le systme de communication entre ses divers constituants. Ils
sont au nombre de trois :
le Bus dadresses, (la notion dadresse est prsente plus loin)
le Bus de donnes,
le Bus de contrle.
4. Information - informatique
4.1 Les dfinitions
Linformation est le support formel dun lment de connaissance humaine
susceptible dtre reprsente laide de conventions (codages) afin dtre
conserve, traite ou communique.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 13
Linformatique est la science du traitement de linformation dans les domaines
scientifiques, techniques, conomiques et sociaux.
Une donne est la reprsentation dune information sous une forme
conventionnelle (code) destine faciliter son traitement.
schma simplifi du traitement de linformation
4.2 Critre algorithmique lmentaire
Une application courante est justiciable dun traitement
informatique si :
Il est possible de dfinir et de dcrire parfaitement les donnes dentre et les rsultats de sortie.
Il est possible de dcomposer le passage de ces donnes vers ces rsultats en une suite doprations
lmentaires dont chacune peut tre excute par une machine.
Nous pouvons considrer ce critre comme une dfinition provisoire dun algorithme.
Actuellement linformatique intervient dans tous les secteurs dactivit de la vie quotidienne :
dmontrer un thorme (mathmatique)
faire jouer aux checs (intelligence artificielle)
dpouiller un sondage (conomie)
grer un robot industriel (atelier)
facturation de produits (entreprise)
traduire un texte (linguistique)
imagerie mdicale (mdecine)
formation distance (ducation)
Internet (grand public)...etc
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
14
1.2 Les circuits logiques
Plan du chapitre:
1. Logique lmentaire pour linformatique
1.1 Calcul propositionnel naf
1.2 Proprits des connecteurs logiques
1.3 Rgles de dduction
2. Algbre de Boole
2.1 Axiomatique pratique
2.2 Exemples dalgbre de Boole
2.3 Notation des lectroniciens
3.Circuits boolens ou logiques
3.1 Principaux circuits
3.2 Fonction logique associe un circuit
3.3 Circuit logique associ une fonction
3.4 Additionneur dans lUAL
3.5 Circuit multiplexeur
3.6 Circuit dmultiplexeur
3.7 Circuit dcodeur d'adresse
3.8 Circuit comparateur
3.9 Circuit bascule
3.10 Registre
3.11 Mmoires SRAM et DRAM
3.12 Afficheur LED
3.13 Compteurs
3.14 Ralisation lectronique de circuits boolens
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
15
1. Logique lmentaire pour linformatique
1.1 Calcul propositionnel naf
Construire des programmes est une activit scientifique fonde sur le raisonnement logique. Un peu
de logique simple va nous aider disposer doutils pratiques mais rigoureux pour construire des
programmes les plus justes possibles. Si la programmation est un art, cest un art rigoureux et
logique. La rigueur est dautant plus ncessaire que les systmes informatiques manquent totalement
de sens artistique.
Une proposition est une proprit ou un nonc qui peut avoir une valeur de vrit vraie (note V) ou
fausse (note F).
" 2 est un nombre impair " est une proposition dont la valeur de vrit est F.
Par abus de langage nous noterons avec le mme symbole une proposition et sa valeur de vrit,
car seule la valeur de vrit dune proposition nous intresse ici.
Soit lensemble P = { V , F } des valeurs des propositions.
On le munit de trois oprateurs appels connecteurs logiques : , . , v.
. : P x PP (se lit " et ")
v : P x PP (se lit " ou ")
: P P (se lit " non ")
Ces connecteurs sont dfinis en extension par leur tables de vrit :
p q p p . q p v q
V V F V V
V F F F V
F V V F V
F F V F F
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
16
1.2 Proprits des connecteurs logiques
- Nous noterons p = q , le fait la proposition p et la proposition q ont la mme valeur de vrit.
- Le lecteur pourra dmontrer laide des tables de vrit par exemple, que v et . possdent les
proprits suivantes :
p v q = q v p
p . q = q . p
p v (q v r) = (p v q) v r
p . (q . r) = (p . q) . r
p v (q . r) = (p v q) . (p v r)
p . (q v r) = (p . q) v (p . r)
p v p = p
p . p = p
p = p
(p v q) = p . q
(p . q) = p v q
Nous notons p q , la proposition : p v q (limplication).
Table de vrit du connecteur :
p q p q
V V V
V F F
F V V
F F V
Il est aussi possible de prouver des " galits " de propositions en utilisant des combinaisons de
rsultats prcdents.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
17
Exemple : Montrons que : p q = q p (implication contrappose), par dfinition et
utilisation vidente des proprits :
p q = p v q = q v p = ( q) v p = q p
1.3 Rgles de dduction
Assertion :
cest une proposition construite laide des connecteurs logiques ( , . , v, en particulier) dont la
valeur de vrit est toujours V (vraie).
Les rgles de dduction permettent de faire du calcul sur les assertions. Nous abordons ici le
raisonnement rationnel sous son aspect automatisable, en donnant des rgles dinfrences
extraites du modle du raisonnement logique du logicien Gentzen. Elles peuvent tre une aide
trs apprciable lors de la construction et la spcification dun programme.
Les rgles de dduction sont spares en deux membres. Le premier contient les prmisses ou
hypothses de la rgle, le deuxime membre est constitu par une conclusion unique. Les deux
membres sont spars par un trait horizontal. Gentzen classe les rgles de dduction en deux
catgories : les rgles dintroduction car il y a utilisation dun nouveau connecteur, et les rgles
dliminations qui permettent de diminuer dun connecteur une proposition.
Syntaxe dune telle rgle :
Quelques rgles de dductions pratiques :
Rgle dintroduction du . :
Rgle dintroduction du v :
Rgle dintroduction du :
Rgles dlimination du . :
,
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
18
Rgle du modus ponens :
Rgle du modus tollens :
Le systme de Gentzen contient dautres rgles sur le ou et sur le non. Enfin il est possible de
construire dautres rgles de dduction partir de celles-ci et des proprits des connecteurs
logiques. Ces rgles permettent de prouver la valeur de vrit dune proposition. Dans les cas
pratiques lessentiel des raisonnements revient des dmonstrations de vracit dimplication.
La dmarche est la suivante : pour prouver quune implication est vraie, il suffit de supposer que le
membre gauche de limplication est vrai et de montrer que sous cette hypothse le membre de droite
de limplication est vrai.
Exemple :
soit montrer que la rgle de dduction R
0
suivante est exacte :
R
0
: (transitivit de )
Hypothse : pest vrai
nous savons que : p q est vrai et que q r est vrai
- En appliquant le modus ponens : nous dduisons que : q est vrai.
- En appliquant le modus ponens (q , q r) nous dduisons que : r est vrai.
- Comme p est vrai (par hypothse) on applique la rgle dintroduction de sur (p , r) nous
dduisons que : p r est vrai (cqfd).
Nous avons prouv que R
0
est exacte. Ainsi nous avons construit une nouvelle rgle de dduction qui
pourra nous servir dans nos raisonnements.
Nous venons d'exhiber un des outils permettant la construction raisonne de programmes. La logique
interne des ordinateurs est encore actuellement plus faible puisque base sur la logique boolenne, en
attendant que les machines de 5
me
gnration bases sur la logique du premier ordre (logique des
prdicats, suprieure la logique propositionnelle) soient dfinitivement oprationnelles.
2. Algbre de Boole
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
19
2.1 Axiomatique pratique
Du nom du mathmaticien anglais G.Boole qui linventa. Nous choisissons une axiomatique
compacte, laxiomatique algbrique :
On appelle algbre de Boole tout ensemble E muni de :
deux lois de compositions internes notes par exemple : - et ,
une application involutive f (f
2
= Id ) de E dans lui-mme,note
chacune des deux lois - , , est associative et commutative,
chacune des deux lois - , , est distributive par rapport lautre,
la loi - admet un lment neutre unique not e
1
,
xeE, x - e
1
= x
la loi admet un lment neutre not e
0
,
xeE, x e
0
= x
tout lment de E est idempotent pour chacune des deux lois :
xeE, x - x = x et x x = x
axiomes de complmentarit :
lois de Morgan :
(x,y) e E
2
,
(x,y) e E
2
,
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
20
2.2 Exemples dalgbre de Boole
a) Lensemble P(E) des parties dun ensemble E, muni des oprateurs intersection ,union , et
lapplication involutive complmentaire dans E C
E
, (si E = C ), si E est fini et possde n
lments, P(E) est de cardinal 2
n
.
Il suffit de vrifier les axiomes prcdents en substituant les lois du nouvel ensemble E aux lois - ,
, et . Il est montr en mathmatiques que toutes les algbres de Boole finies sont isomorphes un
ensemble (P(E), , , C
E
) : elles ont donc un cardinal de la forme 2
n
.
b) Lensemble des propositions (en fait l'ensemble de leurs valeurs {V, F} ) muni des connecteurs
logiques (lapplication involutive) , . , v , est une algbre de Boole minimale deux lments.
2.3 Notation des lectroniciens
Lalgbre des circuits lectriques est une algbre de Boole minimale deux lments :
Lensemble E = {0,1} muni des lois " - " et " + " et de lapplication complmentaire .
Formules pratiques et utiles (rsultant de laxiomatique) :
a + 1 = 1
a + 0 = a
a + a = a
= 1
=
a.1 = a
a.0 = 0
a.a = a
= 0
=
Formule dabsorbtion :
a+(b.a) = a.(a+b) = (a+b).a = a+b.a = a
Montrons par exemple : a+(b.a) = a
a+(b.a)= a+a.b = a.1+a.b = a.(1+b) = a.1 = a
Le reste se montrant de la mme faon.
Cette algbre est utile pour dcrire et tudier les schmas lectroniques, mais elle sert aussi dans
dautres domaines que llectricit. Elle est tudie ici parce que les ordinateurs actuels sont bass sur
des composants lectroniques. Nous allons descendre un peu plus bas dans la ralisation interne du
cur dun ordinateur, afin daboutir la construction dun additionneur en binaire dans lUAL.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
21
Tables de vrit des trois oprateurs :
x y x . y x + y
1 1 0 1 1
1 0 0 0 1
0 1 1 0 1
0 0 1 0 0
3. Circuits boolens ou logiques
Nous reprsentons par une variable boolenne x e{0,1} le passage dun courant lectrique.
Lorsque x = 0, nous dirons que x est ltat 0 (le courant ne passe pas)
Lorsque x = 1, nous dirons que x est ltat 1 (le courant passe)
Une telle variable boolenne permet ainsi de visualiser, sous forme dun bit dinformation (0,1) le
comportement dun composant physique laissant ou ne laissant pas passer le courant.
Nous ne nous proccuperons pas du type de circuits lectriques permettant de construire un circuit
logique (les composants lectriques sont bass sur les circuits intgrs). Nous ne nous intresserons
qu la fonction logique (boolenne) associe un tel circuit.
En fait un circuit logique est un oprateur dune algbre de Boole cest--dire une combinaison de
symboles de lalgbre {0,1}, . ,+, ).
3.1 Principaux circuits
Nous proposons donc 3 circuits logiques de base correspondant aux deux lois internes et loprateur
de complmentation involutif.
Le circuit OU associ la loi " + " :
La table de vrit de ce circuit est celle de
l'oprateur +
Le circuit ET associ la loi "-" :
La table de vrit de ce circuit est celle de
l'oprateur -
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
22
Le circuit NON associ la loi " " :
la table de vrit est celle de l'oprateur involutif
On construit deux circuits classiques laide des circuits prcdents :
Loprateur XOR = " ou exclusif " :
dont voici le schma :
Table de vrit du ou exclusif :
a b a b
1 1 0
1 0 1
0 1 1
0 0 0
Loprateur NAND (le NON-ET):
dont voici le schma :
Table de vrit du Nand :
a b
1 1 0
1 0 1
0 1 1
0 0 1
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
23
Loprateur NOR (le NON-OU):
dont voici le schma :
Table de vrit du Nor :
a b a O b
1 1 0
1 0 0
0 1 0
0 0 1
L'on montre facilement que les deux oprateurs NAND et NOR rpondent aux critres axiomatiques
d'une algbre de Boole, ils sont ralisables trs simplement avec un minimum de composants
lectroniques de type transistor et diode (voir paragraphes plus loin). Enfin le NOR et le NAND
peuvent engendrer les trois oprateurs de base non, et , ou. :
Oprateur de base Ralisation de l'oprateur en NAND ou en NOR
circuit ET
circuit OU
circuit NON
Expression des 3 premiers oprateurs (x , + , . ) l'aide de NAND et de NOR
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
24
3.2 Fonction logique associe un circuit
Un circuit logique est un systme de logique squentielle o la valeur de sortie
S (tat de la variable boolenne S de sortie) dpend des valeurs des entres
e
1
,e
2
,...,e
n
(tats des variables boolennes dentres e
i
). Sa valeur de sortie est
donc une fonction S = f(e
1
,e
2
,...,e
n
).
Pour calculer la fonction f partir dun schma de circuits logiques, il suffit dindiquer la sortie de
chaque oprateur (circuit de base) la valeur de lexpression boolenne en cours. Puis, la fin, nous
obtenons une expression boolenne que lon simplifie laide des axiomes ou des thormes de
lalgbre de Boole.
Exemple :
En simplifiant S : (a+b).b+ = b + (formule dabsorbtion)
b + = 1.
3.3 Circuit logique associ une fonction
A linverse, la cration de circuits logiques partir dune fonction boolenne f n entres est aussi
simple. Il suffit par exemple, dans la fonction, dexprimer graphiquement chaque oprateur par un
circuit, les entres tant les oprandes de loprateur. En rptant laction sur tous les oprateurs, on
construit un graphique de circuit logique associ la fonction f.
Exemple : Soit la fonction f de 3 variables boolennes, f (a,b,c) = (a+b)+(b.c)
Construction progressive du circuit associ.
1) oprateur " + " :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
25
2) branche suprieure de loprateur " + " :
3) branche infrieure de loprateur " + " :
Les lectroniciens classent les circuits logiques en deux catgories : les circuits combinatoires et les
circuits squentiels (ou mmoire).
Un circuit combinatoire est un circuit logique n entres dont la fonction de sortie ne dpend
uniquement que des variables d'entres.
Un circuit mmoire (ou squentiel) est un circuit logique n entres dont la fonction de sortie
dpend la fois des variables d'entres et des tats antrieurs dj mmoriss des variables de sorties.
Exemple de circuit mmoire
f( a , b , S
3
) = S
3
La sortie intermdiaire S
2
est value en fonction
de la sortie S
3
: S
2
= b . S
3
(valeur de S3 un temps
avant)
Si b=0 alors S
2
= 0
Si b=1 alors S
2
= S
3
Nous avons S
3
= S
1
+ S
2
En notant S'
3
la valeur au temps t
0
et S
3
la valeur
au temps t
0
+dt, il vient que S
3
= S
1
+ b . S'
3
Table de vrit associe ce circuit :
a b S
1
S
2
S
3
f(a,b,S
3
)
1 1 0 S'
3
S'
3 S'
3
1 0 0 0 0 1
0 1 1 S'
3
1 0
0 0 1 0 1 0
Dans le cas a=1 et b=1 ce circuit fictif fournit le complment de la valeur antrieure.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
26
Quelques noms de circuits logiques utiliss dans un ordinateur
Circuit combinatoire : additionneur, multiplexeur, dcodeur, dcaleur, comparateur.
Circuit mmoire : bascules logiques.
3.4 Additionneur dans lUAL (circuit combinatoire)
a) Demi-additionneur
Reprenons les tables de vrits du " " (Xor), du " + " et du " - " et adjoignons la table de calcul de
laddition en numration binaire.
Tout dabord les tables compares des oprateurs boolens :
a b a b a+b a.b
1 1 0 1 1
1 0 1 1 0
0 1 1 1 0
0 0 0 0 0
Rappelons ensuite la table daddition en numration binaire :
+ 0 1
0 0 1
1 1 0(1)
0(1) reprsente la retenue 1 reporter.
En considrant une addition binaire comme la somme effectuer sur deux mmoires un bit, nous
observons dans laddition binaire les diffrentes configurations des bits concerns (nots aet b).
Nous aurons comme rsultat un bit de sommeet un bit de retenue:
bit a bit b bit somme bit de retenue
1 + 1 = 0 1
1 + 0 = 1 0
0 + 1 = 1 0
0 + 0 = 0 0
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
27
Si lon compare avec les tables doprateurs boolens, on saperoit que loprateur "" (Xor) fournit
en sortie les mmes configurations que le bit de somme, et que loprateur "-" (Et) dlivre en sortie
les mmes configurations que le bit de retenue.
Il est donc possible de simuler une addition binaire (arithmtique binaire) avec les deux oprateurs
"" et "-". Nous venons de construire un demi-additionneur ou additionneur sur un bit. Nous
pouvons donc raliser le circuit logique simulant la fonction complte daddition binaire, nous
lappellerons " additionneur binaire "(somme arithmtique en binaire de deux entiers en binaire).
schma logique dun demi-additionneur
Ce circuit est not :
b)Additionneur complet
Une des constructions les plus simples et la plus pdagogique dun additionneur complet est de
connecter entre eux et en srie des demi-additionneurs (additionneurs en cascade). Il existe une autre
mthode dnomme " diviser pour rgner " pour construire des additionneurs complets plus rapides
lexcution que les additionneurs en cascade. Toutefois un additionneur en cascade pour UAL 32
bits, utilise 2 fois moins de composants lectroniques quun additionneur diviser pour rgner.
Nous concluons donc quune UAL neffectue en fait que des oprations logiques (algbre de Boole)
et simule les calculs binaires par des combinaisons doprateurs logiques
Soient a et b deux nombres binaires additionner dans lUAL. Nous supposons quils sont stocks
chacun dans une mmoire n bits. Nous notons a
p
et b
p
leur bit respectif de rang p. Lors de laddition
il faut non seulement additionner les bits a
p
et b
p
laide dun demi-aditionneur, mais aussi
lventuelle retenue note Rp provenant du calcul du rang prcdent.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
28
additionneur en cascade (addition sur le bit de rang p)
On radditionne Rp laide dun demi-additionneur la somme de a
p
et b
p
et lon obtient le bit de
somme du rang p not Sp. La propagation de la retenue Rp
+1
est faite par un " ou " sur les deux
retenues de chacun des demi-additionneurs et passe au rang p+1. Le processus est itratif sur tous les
n bits des mmoires contenant les nombres a et b.
Notation du circuit additionneur :
Soit un exemple fictif de ralisation d'un demi-additionneur simulant l'addition binaire suivante :
0 + 1 = 1. Nous avons figur le passage ou non du courant l'aide de deux interrupteurs (valeur = 1
indique que l'interrupteur est ferm et que le courant passe, valeur = 0 indique que l'interrupteur est
ouvert et que le courant ne passe pas)
Le circuit et fournit le bit de retenue soit : 0 -1 = 0
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
29
Le circuit Xor fournit le bit de somme soit : 0 1 = 1
Nous figurons le dtail du circuit Xor du schma prcdent lorsqu'il reoit le courant des deux
interrupteurs prcdents dans la mme position (l'tat lectrique correspond l'opration 0 1 = 1 )
Si lUAL effectue des additions sur 32 bits, il y aura 32 circuits comme le prcdent, tous relis en
srie pour la propagation de la retenue.
Un exemple d'additionneur sur deux mmoires a et b 2 bits contenant respectivement les nombres 2
et 3 :
Les 4 interrupteurs figurent le passage du courant sur les bits de mme rang des mmoires a=2 et
b=3, le rsultat obtenu est la valeur attendue soit 2+3 = 5.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
30
Notation du circuit additionneur sur 2 bits :
Remarque :
Ce circuit d'addition sur 2 bits engendre en fait en plus des bits de somme un troisime bit de retenue
qui sera gnralement mmoris dans le bit de retenue (bit de carry not C) du mot d'tat programme
ou PSW (Progral Status Word) du processeur. C'est le bit C de ce mot qui est consult par exemple
afin de savoir si l'opration d'addition a gnr un bit de retenu ou non.
3.5 Circuit multiplexeur (circuit combinatoire)
C'est un circuit d'aiguillage comportant 2
n
entres, n lignes de slection et une seule sortie. Les n
lignes de slection permettent de "programmer" le numro de l'entre qui doit tre slectionne pour
sortir sur une seule sortie (un bit). La construction d'un tel circuit ncessite 2
n
circuits "et", n circuits
"non" et 1 circuit "ou".
Notation du multiplexeur :
3.6 Circuit dmultiplexeur (circuit combinatoire)
C'est un circuit qui fonctionne l'inverse du circuit prcdent, il permet d'aiguiller une seule entre
(un bit) sur l'une des 2
n
sorties possibles, selon la "programmation"( l'tat ) de ses n lignes de
slection.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
31
Notation du dmultiplexeur :
3.7 Circuit dcodeur d'adresse (circuit combinatoire)
C'est un circuit compos de n lignes d'entres qui reprsentent une adresse sur n bits et de 2
n
lignes de
sortie possibles dont une seule est slectionne en fonction de la "programmation" des n lignes
d'entres.
Notation du dcodeur d'adresse :
Exemple d'utilisation d'un dcodeur d'adresse 8 bits :
On entre l'adresse de la ligne slectionner soit 10100010 ( A
0
=1 , A
1
= 0, A
2
= 1, , A
7
= 0 ) ce
nombre binaire vaut 162 en dcimal, c'est donc la sortie S
162
qui est active par le composant comme
le montre la figure ci-dessous.
La construction d'un circuit dcodeur d'adresse n bits ncessite 2
n
circuits "et", n circuits "non". Ce
genre de circuits trs frquent dans un ordinateur sert slectionner des registres, des cellules
mmoires ou des lignes de priphriques.
3.8 Circuit comparateur (circuit combinatoire)
C'est un circuit ralisant la comparaison de deux mots X et Y de n bits chacun et sortant une des trois
indication possible X+Y ou bien X>Y ou X<Y. Il possde donc 2n entres et 3 sorties.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
32
Notation du comparateur de mots n bits :
3.9 Circuit bascule (circuit mmoire)
C'est un circuit permettant de mmoriser l'tat de la valeur d'un bit. Les bascules sont les principaux
circuits constituant les registres et les mmoires dans un ordinateur.
Les principaux types de bascules sont RS, JK et D, ce sont des dispositifs chargs de "conserver" la
valeur qu'ils viennent de prendre.
Schma lectronique et notation de bascule RS minimale thorique
notation
Table de vrit associe cette bascule :
R S Qt+dt
1 1 ------
1 0 0
0 1 1
0 0 Qt
Qt reprsente la valeur de la sortie au temps t , Qt+dt
reprsente la valeur de cette mme sortie un peu plus tard au
temps t+dt.
L'tat R=1 et S=1 n'est pas autoris
L'tat R=0 et S=0 fait que Qt+dt = Qt , la sortie Qconserve la
mme valeur au cours du temps, le circuit "mmorise" donc un
bit.
Si l'on veut que le circuit mmorise un bit gal 0 sur sa sortie Q, on applique aux entres les valeurs
R=1 et S=0 au temps t
0
, puis t
0
+dt on applique les valeurs R=0 et S=0. Tant que les entres R et S
restent la valeur 0, la sortie Q conserve la mme valeur (dans l'exemple Q=0).
En pratique ce sont des bascules RS synchronises par des horloges (CLK pour clock) qui sont
utilises, l'horloge sert alors commander l'tat de la bascule. Seule la sortie Q est considre.
Dans une bascule RS synchronise, selon que le top d'horloge change d'tat ou non et selon les
valeurs des entres R et S soit d'un top l'autre la sortie Q du circuit ne change pas soit la valeur du
top d'horloge fait changer (basculer) l'tat de la sortie Q.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
33
Schma lectronique gnral et notation d'une bascule RS synchronise
notation
Remarque
Certains types de mmoires ou les registres dans un ordinateur sont conus avec des variantes de
bascules RS (synchronises) note JK ou D.
Schma lectronique gnral et notation d'une bascule de type D
notation
Fonctionnement pratique d'une telle bascule D dont les entres sont relies entre elles. Supposons que
la valeur de l'entre soit le boolen x (x=0 ou bien x=1) et que l'horloge soit 0.
En simplifiant le schma nous obtenons une autre prsentation faisant apparatre la bascule RS
minimale thorique dcrite ci-haut :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
34
Or la table de vrit de cet lment lorsque les entres sont gales 0 indique que la bascule conserve
l'tat antrieur de la sortie Q:
R S Qt+dt
0 0 Qt
Conclusion pour une bascule D
Lorsque l'horloge est 0, quelque soit la valeur de l'entre D (D=0 ou D=1) une bascule D
conserve la mme valeur sur la sortie Q.
Que se passe-t-il lorsque lors d'un top d'horloge celle-ci passe la valeur 1 ?
Reprenons le schma simplifi prcdent d'une bascule D avec une valeur d'horloge gale 1.
Nous remarquons que sur les entre R et S nous trouvons la valeur x et son complment x , ce qui
limine deux couples de valeurs d'entres sur R et S (R=0 , S=0) et (R=1 , S=1). Nous sommes srs
que le cas d'entres non autoris par un circuit RS (R=1 , S=1) n'a jamais lieu dans une bascule de
type D. Il reste envisager les deux derniers couples (R=0 , S=1) et (R=1 , S=0). Nous figurons ci-
aprs la table de vrit de la sortie Q en fonction de l'entre D de la bascule (l'horloge tant
positionne 1) et pour clairer le lecteur nous avons ajout les deux tats associs des entres
internes R et S :
x R S Q
0 1 0 0
1 0 1 1
Nous remarquons que la sortie Q prend la
valeur de l'entre D (D=x ), elle change donc
d'tat.
Conclusion pour une bascule D
Lorsque l'horloge est 1, quelque soit la valeur de l'entre D (D=0 ou D=1) une bascule D
change et prend sur la sortie Q la valeur de l'entre D.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
35
3.10 Registre (circuit mmoire)
Un registre est un circuit qui permet la mmorisation de n bits en mme temps. Il existe dans un
ordinateur plusieurs varits de registres, les registres parallles, les registres dcalage (dcalage
droite ou dcalage gauche) les registres sries.
Les bascules de type D sont les plus utilises pour construire des registres de diffrents types en
fonction de la disposition des entres et des sorties des bascules : les registres entre srie/sortie
srie, entre srie/sortie parallle, entre parallle/sortie parallle, entre parallle/sortie srie.
Voici un exemple de registre n entres parallles (a
0
,a
1
,,a
n-1
) et n sorties parallles (s
0
,s
1
,,s
n-1
)
construit avec des bascules de type D :
Examinons le fonctionnement de ce "registre parallle n bits"
La ligne CLK fournit le signal d'horloge, la ligne RAZ permet l'effacement de toutes les sorties s
k
du
registre, on dit qu'elle fournit le signal de validation :
Lorsque RAZ = 0 on a (s
0
=0, s
1
=0, , s
n-1
=0)
Lorsque RAZ = 1 on a (s
0
= q
0
, s
1
= q
1
, , s
n-1
= q
n-1
)
Donc RAZ=0 sert effacer tous les bits de sortie du registre, dans le cas o RAZ=1 qu'en est-il des
sorties s
k
. D'une manire gnrale nous avons par construction s
k
= RAZ . q
k
:
- Tant que CLK = 0 alors, comme RAZ=1 nous avons s
k
= q
k
(q
k
est l'tat antrieur de la
bascule). Dans ces conditions on dit que l'on "lit le contenu actuel du registre".
- Lorsque CLK = 1 alors, tous les q
k
basculent et chacun d'eux prend la nouvelle valeur de
son entre a
k
. Comme RAZ=1 nous avons toujours s
k
= q
k
(q
k
est le nouvel tat de la
bascule). Dans ces conditions on dit que l'on vient de "charger le registre" avec une
nouvelle valeur.
Notations des diffrents type de registres :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
36
registre srie/srie
registre srie/parallle
registre parallle/srie registre parallle/parallle
Registre dcalage
C'est un registre entre srie ou parallle qui dcale de 1 bit tous les bits d'entre soit vers "la
droite" (vers les bits de poids faibles), soit vers "la gauche" (vers les bits de poids forts). Un registre
dcalage dans un ordinateur correspond soit une multiplication par 2 dans le cas du dcalage
gauche, soit une division par 2 dans le cas du dcalage droite.
Conclusion mmoire-registre
Nous remarquons donc que les registres en gnral sont des mmoires construites avec des bascules
dans lesquelles on peut lire et crire des informations sous forme de bits. Toutefois ds que la
quantit d'information stocker est trs grande les bascules prennent physiquement trop de place (2
NOR, 2 AND et 1 NON). Actuellement, pour laborer une mmoire stockant de trs grande quantit
d'informations, on utilise une technologie plus compacte que celle des bascules, elle est fonde sur la
reprsentation d'un bit par 1 transistor et 1 condensateur. Le transistor ralise la porte d'entre du bit
et la sortie du bit, le condensateur selon sa charge ralise le stockage du bit.
Malheureusement un condensateur ne conserve pas sa charge au cours du temps (courant de fuite
inhrent au condensateur), il est alors indispensable de restaurer de temps en temps la charge du
condensateur (opration que l'on dnomme rafrachir la mmoire) et cette opration de
rafrachissement mmoire a un cot en temps de ralisation. Ce qui veut donc dire que pour le mme
nombre de bits stocker un registre bascule est plus rapide lire ou crire qu'une mmoire
transistor, c'est pourquoi les mmoires internes des processeurs centraux sont des registres.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
37
3.11 Mmoire SRAM et mmoire DRAM
Dans un ordinateur actuel coexistent deux catgories de mmoires :
1) Les mmoires statiques SRAM labores l'aide de bascules : trs rapides mais volumineuses
(plusieurs transistors pour 1 bit).
2) Les mmoires dynamiques DRAM labores avec un seul transistor coupl un condensateur :
trs facilement intgrables dans une petite surface, mais plus lente que les SRAM cause de la
ncessit du rafrachissement.
Voici titre indicatif des ordres de grandeur qui peuvent varier avec les innovations technologiques
rapides en ce domaine :
SRAM temps d'accs une information : 5 nanosecondes
DRAM temps d'accs une information : 50 nanosecondes
Fonctionnement d'une DRAM de 256 Mo fictive
La mmoire physique aspect extrieur :
Le schma gnral de la mmoire :
Vcc = alimentation lectrique
D1 D8 = bits de donnes (1 octet ici)
Ligne, Colonne = lignes de slection soit d'une adresse de
ligne soit d'une adresse de colonne
W = autorisation d'criture
R = validation de lecture
A0, , A13 = adresse d'une ligne ou adresse d'une colonne
= symbole de mise la masse
Nous adoptons une vision abstraite de l'organisation interne de cette mmoire sous forme d'une
matrice de 2
14
lignes et 2
14
colonnes soient en tout 2
14
. 2
14
= 2
28
cellules de 1 octet chacune (2
28
octets
= 2
8
. 2
20
o = 256 . 2
20
o = 256 Mo, car 1 Mo = 2
20
o)
Ce qui donne une matrice de 16384 lignes et 16384 colonnes, numrotes par exemple de 2
0
= 1
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
38
jusqu' 2
14
= 16384, selon la figure ci-dessous :
Dans l'exemple gauche :
La slection d'une ligne de numro mdonn
(d'adresse m-1 donne) et d'une colonne de
numro k donn (d'adresse k-1 donne) permet
de slectionner directement une cellule
contenant 8 bits.
Exemple de slection de ligne dans la matrice mmoire partir d'une adresse (A0, , A13) , dans
notre exemple thorique la ligne de numro 2
0
= 1 a pour adresse (0,0,,0) et la ligne de numro 2
14
= 16384 a pour adresse (1,1,,1). Lorsque l'adresse de slection d'une ligne arrive sur les pattes (A0,
, A13) de la mmoire elle est range dans un registre interne (not tampon) puis passe un
circuit interne du type dcodeur d'adresse 14 bits (14 entres et 2
14
= 16384 sorties) qui slectionne
la ligne adquate.
Il en va de mme pour la slection d'une colonne :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
39
La slection d'une ligne, puis d'une colonne permet d'obtenir sur les pattes D, D2, , D8 de la puce
les 8 bits slectionns. Ci dessous une slection en mode lecture d'une cellule de notre mmoire de
256 Mo :
Il est possible aussi d'crire dans une cellule de la mmoire selon la mme dmarche de slection.
Pour oprer une lecture il faut que la ligne de validation R de la mmoire soit active, pour oprer
une criture, il faut que la ligne de validation Wde la mmoire soit active.
En attendant une nouvelle technologie (optique, quantique, organique,) les constituants de base
d'un ordinateur sont fonds sur l'lectronique base de transistor dcouverts la fin des annes
quarante. De nos jours deux technologie de transistor sont prsentes sur le march : la technologie
TTL (Transistor Transistor Logic) la plus ancienne et la technologie MOS (Metal Oxyde Semi-
conductor).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
40
3.12 Afficheur LED 7 segments
On utilise dans les ordinateurs des afficheurs LED, composs de 7 led diffrentes qui sont allumes
indpendamment les unes des autres, un circuit dcodeur 3 bits permet de raliser simplement cet
affichage :
3.13 Compteurs
Ce sont des circuits chargs d'effectuer un comptage cumulatif de divers signaux.
Par exemple considrons un compteur sur 2 bits avec retenue ventuelle, capable d'tre activ ou
dsactiv, permettant de compter les changement d'tat de la ligne d'horloge CLK. Nous proposons
d'utiliser deux demi-additionneurs et deux bascules de type D pour construire le circuit.
Le circuit compteur de gauche possde deux
entres En et CLK, il possde trois sorties a
0
, a
1
et
carry.
Ce compteur sort sur les bits a
0
, a
1
et sur le bit de
carry le nombre de changements en binaire de la
ligne CLK (maximum 4 pour 2 bits) avec retenue
s'il y a lieu.
La ligne d'entre En est charge d'activer ou de
dsactiver le compteur
Notation pour ce compteur :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
41
Fonctionnement de l'entre En (enable) du compteur prcdent :
- Lorsque En = 0, sur la premire bascule en entre D nous avons D = a
0
0 (or nous
savons que : x, x 0 = x ), donc D = a
0
et Q ne change pas de valeur. Il en est de mme
pour la deuxime bascule et son entre D vaut a
1
. Donc quoiqu'il se passe sur la ligne
CLK les sorties a
0
et a
1
ne changent pas, on peut donc dire que le comptage est dsactiv
lorsque le enable est zro.
- Lorsque En = 1, sur la premire bascule en entre D nous avons D = a
0
1 (or nous
savons que : x, x 1 = x ), donc Q change de valeur. On peut donc dire que le
comptage est activ lorsque le enable est un.
Utilisons la notation du demi-additionneur pour reprsenter ce compteur 2 bits :
un demi-additionneur
le compteur 2 bits
En gnralisant la notion de compteur n bits nous obtenons le schma ci-aprs :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
42
3.14Ralisation lectronique de circuits boolens
Dans ce paragraphe nous indiquons pour information anecdotique au lecteur, partir de quelques
exemples de schmas lectroniques de base, les ralisation physiques possibles de diffrents
oprateurs de l'algbre de Boole.
Le transistor est principalement utilis comme un interrupteur lectronique, nous utiliserons les
schmas suivants reprsentant un transistor soit en TTL ou MOS et une diode.
Circuits (ET, OU , NON) labors partir de diodes :
NON
OU
ET
Circuits (NOR, NAND , NON) labors partir de transistor MOS :
NON
NAND
NOR
Ce sont en fait la place occupe par les composants lectroniques et leur cot de production qui sont
les facteurs essentiels de choix pour la construction des oprateurs logiques de base.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
43
Voici par exemple une autre faon de construire une circuit NOR partir de transistor et de diodes :
Le lecteur intress consultera des ouvrages d'lectronique spcialiss afin d'approfondir ce domaine
qui dpasse le champ de l'informatique qui n'est qu'une simple utilisatrice de la technologie
lectronique en attendant mieux !
Finissons ce paragraphe, afin de bien fixer nos ides, par un schma montrant comment dans une
puce lectronique sont situs les circuits boolens :
Supposons que la puce prcdente permette de raliser plusieurs fonctions et contienne par exemple
4 circuits boolens : un OU, un ET, deux NON. Voici figur une possible implantation physique de
ces 4 circuits dans la puce, ainsi que la liaison de chaque circuit boolen avec les pattes du composant
physique :
Pour information, le micro-processeur pentium IV Northwood de la socit Intel contient environ 55
000 000 (55 millions) de tansistors, le micro-processeur 64 bits Opteron de la socit concurrente
AMD plus rcent que le pentium IV, contient 105 000 000 (105 millions) de transistor.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
44
1.3 Codage numration
Plan du chapitre:
1. Codage de linformation
1.1 Codage en gnral : le pourquoi
1.2 Codage des caractres : code ASCII
1.3 Codage des nombres entiers : numration
1.4 Les entiers dans une mmoire n+1 bits
1.5 Codage des nombres entiers
1.6 Un autre codage des nombres entiers
2. Numration
2.1 Oprations en binaire
2.2 Conversions base quelconque dcimal
2.3 Exemple de conversion dcimal binaire
2.4 Exemple de conversion binaire dcimal
2.5 Conversion binaire hexadcimal
2.6 Conversion hexadcimal binaire
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
45
1. Codage de linformation
1.1 Codage en gnral : le pourquoi
- Dans une machine, toutes les informations sont codes sous forme d'une suite de "0" et de "1"
(langage binaire). Mais l'tre humain ne parle gnralement pas couramment le langage
binaire.
- Il doit donc tout "traduire" pour que la machine puisse excuter les instructions relatives aux
informations qu'on peut lui donner.
- Le codage tant une opration purement humaine, il faut produire des algorithmes qui
permettront la machine de traduire les informations que nous voulons lui voir traiter.
Le codage est une opration tablissant une bijection entre une information et une suite de " 0 " et
de " 1 " qui sont reprsentables en machine.
1.2 Codage des caractres : code ASCI I
Parmi les codages les plus connus et utiliss, le codage ASCII (American Standard Code for
Information Interchange)tendu est le plus courant (version ANSI sur Windows).
Voyons quelles sont les ncessits minimales pour lcriture de documents alphanumriques simples
dans la civilisation occidentale. Nous avons besoin de :
Un alphabet de lettres minuscules ={a, b, c,...,z}
soient 26 caractres
Un alphabet de lettres majuscules ={A,B,C,...,Z}
soient 26 caractres
Des chiffres {0,1,...,9}
soient 10 caractres
Des symboles syntaxiques {? , ; ( " ...
au minimum 10 caractres
Soit un total minimal de 72 caractres
Si lon avait choisi un code 6 bits le nombre de caractres codables aurait t de 2
6
= 64 ( tous les
nombres binaires compris entre 000000 et 111111), nombre donc insuffisant pour nos besoins.
Il faut au minimum 1 bit de plus, ce qui permet de dfinir ainsi 2
7
= 128 nombres binaires diffrents,
autorisant alors le codage de 128 caractres.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
46
Initialement le code ASCII est un code 7 bits (2
7
= 128 caractres). Il a t tendu un code sur 8
bits ( 2
8
= 256 caractres ) permettant le codage des caractres nationaux (en France les caractres
accentus comme : ,,,,,...etc) et les caractres semi-graphiques.
Les pages HTML qui sont diffuses sur le rseau Internet sont en code ASCII 8 bits.
Un codage rcent dit " universel " est en cours de diffusion : il sagit du codage Unicode sur 16 bits
(2
16
= 65536 caractres).
De nombreux autres codages existent adapts diverses solution de stockage de linformation (DCB,
EBCDIC,...).
1.3 Codage des nombres entiers : numration
Les nombres entiers peuvent tre cods comme des caractres ordinaires. Toutefois les codages
adopts pour les donnes autres que numriques sont trop lourds manipuler dans un ordinateur. Du
fait de sa constitution, un ordinateur est plus " habile " manipuler des nombres crits en numration
binaire (qui est un codage particulier).
Nous allons dcrire trois modes de codage des entiers les plus connus.
Nous avons lhabitude dcrire nos nombres et de calculer dans le systme dcimal. Il sagit en fait
dun cas particulier de numration en base 10.
Il est possible de reprsenter tous les nombres dans un systme base b (b entier, b1). Nous ne
prsenterons pas ici un cours darithmtique, mais seulement les lments ncessaires lcriture
dans les deux systmes les plus utiliss en informatique : le binaire (b=2) et lhexadcimal (b=16).
Lorsque nous crivons 5876 en base 10, la position des chiffres 5,8,7,6 indique la puissance de 10
laquelle ils sont associs :
5 est associ 10
3
8 est associ 10
2
7 est associ 10
1
6 est associ 10
0
Il en est de mme dans une base b quelconque (b=2, ou b=16). Nous conviendrons de mentionner la
valeur de la base au dessus du nombre afin de savoir quel est son type de reprsentation.
Soit un nombre x crit en base b avec n+1 symboles.
- " x
k
" est le symbole associ la puissance " b
k
"
- " x
k
" e {0,1, ... , b-1}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
47
Lorsque b=2 (numration binaire)
Chaque symbole du nombre x, " x
k
" e {0,1}; autrement dit les nombres binaires sont donc crits
avec des 0 et des 1, qui sont reprsents physiquement par des bits dans la machine.
Voici le schma dune mmoire n+1 bits (au minimum 8 bits dans un micro-ordinateur) :
Les cases du schma reprsentent les bits, le chiffre marqu en dessous dune case, indique la
puissance de 2 laquelle est associ ce bit (on dit aussi le rangdu bit).
Le bit de rang 0 est appel le bit de poids faible.
Le bit de rang n est appel le bit de poids fort.
1.4 Les entiers dans une mmoire n+1 bits : binaire pur
Ce codage est celui dans lequel les nombres entiers naturels sont crits en numration binaire (en
base b=2).
Le nombre " dix " scrit 10 en base b=10, il scrit 1010 en base b=2. Dans la mmoire ce nombre
dix est cod en binaire ainsi:
Une mmoire n+1 bits (n>0), permet de reprsenter sous forme binaire (en binaire pur) tous les
entiers naturels de l'intervalle [ 0 , 2
n+1
-1 ].
- soit pour n+1=8 bits, tous les entiers de l'intervalle [ 0 , 255 ]
- soit pour n+1=16 bits, tous les entiers de l'intervalle [ 0 , 65535 ]
1.5 Codage des nombres entiers : binaire sign
Ce codage permet la reprsentation des nombres entiers relatifs.
Dans la reprsentation en binaire sign, le bit de poids fort ( bit de rang n associ 2
n
) sert
reprsenter le signe (0 pour un entier positif et 1 pour un entier ngatif), les n autres bits reprsentent
la valeur absolue du nombre en binaire pur.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
48
Exemple du codage en binaire sign des nombres +14 et -14 :
+14 est reprsent par 0000...01110 -14 est reprsent par 1000...01110
Une mmoire n+1 bits (n>0), permet de reprsenter sous forme binaire (en binaire sign) tous les
entiers naturels de l'intervalle [- (2
n
- 1) , (2
n
-1)]
- soit pour n+1=8 bits, tous les entiers de l'intervalle [-127 , 127]
- soit pour n+1=16 bits, tous les entiers de l'intervalle [-32767 , 32767]
Le nombre zro est reprsent dans cette convention (dites du zro positif) par : 0000...00000
Remarque : Il reste malgr tout une configuration mmoire inutilise : 1000...00000. Cet tat
binaire ne reprsente priori aucun nombre entier ni positif ni ngatif de lintervalle [- (2
n
- 1)
, (2
n
-1)]. Afin de ne pas perdre inutilement la configuration " 1000...00000 ", les
informaticiens ont dcid que cette configuration reprsente malgr tout un nombre ngatif
parce que le bit de signe est 1, et en mme temps la puissance du bit contenant le "1", donc
par convention -2
n
.
Lintervalle de reprsentation se trouve alors augment dun nombre :
il devient :[-2
n
,2
n
-1]
- soit pour n+1=8 bits, tous les entiers de l'intervalle [-128 , 127]
- soit pour n+1=16 bits, tous les entiers de l'intervalle [-32768 , 32767]
Ce codage nest pas utilis tel quel, il est donn ici titre pdagogique. En effet le traitement
spcifique du signe cote cher en circuits lectroniques et en temps de calcul. Cest une version
amliore qui est utilise dans la plupart des calculateurs : elle se nomme le complment deux.
1.6 Un autre codage des nombres entiers : complment deux
Ce codage, purement conventionnel et trs utilis de nos jours, est driv du binaire sign ; il sert
reprsenter en mmoire les entiers relatifs.
Comme dans le binaire sign, la mmoire est divise en deux parties ingales; le bit de poids fort
reprsentant le signe, le reste reprsente la valeur absolue avec le codage suivant :
Supposons que la mmoire soit n+1 bits, soit x un entier relatif reprsenter :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
49
si x > 0, alors c'est la convention en binaire sign qui s'applique (le bit de signe vaut 0, les n bits
restants codent le nombre), soit pour le nombre +14 :
+14 est reprsent par 0000...01110
si x < 0, alors (3 tapes suivre)
- On code la valeur absolue du nombre x, |x| en binaire sign.
- Puis lon complmente tous les bits de la mmoire (complment 1 ou complment restreint).
Cette opration est un non logique effectu sur chaque bit de la mmoire.
- Enfin lon additionne +1 au nombre binaire de la mmoire (addition binaire).
Exemple, soit reprsenter le nombre -14 en suivant les 3 tapes :
- codage de |-14|= 14
- complment 1
- addition de 1
Le nombre -14 s'crit donc en complment 2 : 1111..10010.
Un des intrts majeurs de ce codage est dintgrer la soustraction dans lopration de codage et de
ne faire effectuer que des oprations simples et rapides (non logique, addition de 1).
Nous venons de voir que le codage utilisait essentiellement la reprsentation d'un nombre en binaire
(la numration binaire) et qu'il fallait connatre les rudiments de l'arithmtique binaire. Le paragraphe
ci-aprs traite de ce sujet.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
50
2. Numration
Ce paragraphe peut tre ignor par ceux qui connaissent dj les lments de base des calculs en
binaire et des conversions binaire-dcimal-hexadcimal, dans le cas contraire, il est conseill de le
lire.
Pour des commodits d'criture, nous utilisons la notation indice pour reprsenter la base d'un
nombre en parallle de la reprsentation avec la barre au dessus. Ainsi 145
10
signifie le nombre 145
en base dix; 1101011
2
signifie 1101011 en binaire.
2.1 Oprations en binaire
Nous avons parl daddition en binaire ; comme dans le systme dcimal, il nous faut connatre les
tables daddition, de multiplication, etc... afin deffectuer des calculs dans cette base. Heureusement
en binaire, elles sont trs simples :
Exemples de calculs (109+19=128
10
=10000000
2
) et (22x5=110) :
addition multiplication
1101101
+ 10011
_____________
10000000
2
=128
10
10110
x 101
____________
10110
10110..
___________
1101110
2
=110
10
Vous noterez que le procd est identique celui que vous connaissez en dcimal. En hexadcimal
(b=16) il en est de mme. Dans ce cas les tables doprateurs sont trs longues apprendre.
Etant donn que le systme classique utilis par chacun de nous est le systme dcimal, nous nous
proposons de fournir dune manire pratique les conversions usuelles permettant d'crire les diverses
reprsentations dun nombre entre les systmes dcimal, binaire et hexadcimal.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
51
2.2 Conversions base quelconque dcimal
Voici ci-dessous un rappel des mthodes gnrales permettant de convertir un nombre en base b
(b>1)en sa reprsentation dcimale et rciproquement.
A ) Soit un nombre crit en base b.
Pour le convertir en dcimal (base 10), il faut :
- convertir chaque symbole x
k
en son quivalent a
k
en base 10, nous obtenons ainsi la suite de
chiffres : a
n
,....,a
0
Exemple, soit b=13, les symboles de la base 13 sont : { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C }
Si le chiffre x
k
de rang k du nombre s'crit C, son quivalent en base 10 est a
k
=12
- rcrire le nombre comme une somme :
- effectuer tous les calculs en base 10 (somme, produit, puissance).
B ) Soit " a " un nombre crit dcimal et reprsenter en base b :
La mthode utilise est un algorithme fond sur la division euclidienne.
- Si a < b, il n'a pas besoin d'tre converti.
- Si a = b, on peut diviser a par b. Et lon divise successivement les diffrents quotients q
k
obtenus
par la base b.
De manire gnrale on aura :
a = b
k
.r
k
+ b
k-1
.r
k-1
+ ... + b.r
1
+ r
0
(o r
i
est le reste de la division de a par b).
En remplaant chaque r
i
par son symbole quivalent p
i
en base b, nous obtenons :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
52
Cet algorithme permet d'obtenir une reprsentation de a dans la base b.
Les p
i
quivalents en base 13 sont:
r
0
= 8 p
0
= 8
r
1
= 11 p
1
= B
r
2
= 10 p
2
= A
r
3
= 2 p
3
= 2 Donc 6235
10
= 2AB8
13
Dans les deux paragraphes suivants nous allons expliciter des exemples pratiques de ces mthodes
dans le cas o la base est 2 (binaire).
2.3 Exemple de conversiondcimal binaire
Soit le nombre dcimal 35
10
, appliquons l'algorithme prcdent afin de trouver les restes successifs :
Donc : 35
10
= 100011
2
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
53
2.4 Exemple de conversion binaire dcimal
Soit le nombre binaire : 1101101
2
sa conversion en dcimal est immdiate :
1101101
2
= 2
6
+2
5
+2
3
+2
3
+2
2
+1 =64+32+8+4+1 =109
10
Les informaticiens, pour des raisons de commodit (manipulations minimales de symboles),
prfrent utiliser lhexadcimal plutt que le binaire. Lhumain, contrairement la machine, a
quelques difficults fonctionner sur des suites importantes de 1 et de 0. Ainsi lhexadcimal (sa
base b=2
4
tant une puissance de 2) permet de diviser, en moyenne, le nombre de symboles par
un peu moins de 4 par rapport au mme nombre crit en binaire. Cest lunique raison pratique
qui justifie son utilisation ici.
2.5 Conversion binaire hexadcimal
Nous allons dtailler laction de conversion en 6 tapes pratiques :
- Soit a un nombre crit en base 2 (tape 1).
- On dcompose ce nombre par tranches de 4 bits partir du bit de poids faible (tape 2).
- On complte la dernire tranche (celle des bits de poids forts)par des 0 sil y a lieu (tape 3).
- On convertit chaque tranche en son symbole de la base 16(tape 4).
- On rcrit sa place le nouveau symbole par changements successifs de chaque groupe de 4
bits,(tape 5).
- Ainsi, on obtient le nombre crit en hexadcimal (tape 6).
Exemple :
Soit le nombre 111101
2
convertir en hxadcimal.
Rsultat obtenu :
111101
2
= 3D
16
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
54
2.6 Conversion hexadcimal binaire
Cette conversion est lopration inverse de la prcdente. Nous allons la dtailler en 4 tapes :
- Soit a un nombre crit en base 16 (ETAPE 1).
- On convertit chaque symbole hexadcimal du nombre en son criture binaire (ncessitant au plus
4 bits) (ETAPE 2).
- Pour chaque tranche de 4 bits, on complte les bits de poids fort par des 0 s'il y a lieu (ETAPE 3).
- Le nombre " a " crit en binaire est obtenu en regroupant toutes les tranches de 4 bits partir du
bit de poids faible, sous forme dun seul nombre binaire(ETAPE 4).
Exemple :
Soit le nombre 23D5
16
convertir en binaire.
Rsultat obtenu :
23D5
16
= 10001111010101
2
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
55
1.4 Formalisation de la notion
d'ordinateur
Plan du chapitre:
1. Machine de Turing thorique
1.1 Dfinition : machine de Turing
1.2 Dfinition : Etats de la machine
1.3 Dfinition : Les rgles de la machine
2. La Machine de Turing physique
2.1 Constitution interne
2.2 Fonctionnement
2.3 Exemple : machine de Turing arithmtique
2.4 Machine de Turing informatique
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
56
1. La Machine de Turing thorique
Entre 1930 et 1936 le mathmaticien anglais A.Turing invente sur le papier une machine fictive qui
ne pouvait effectuer que 4 oprations lmentaires que nous allons dcrire. Un des buts de Turing
tait de faire rsoudre par cette " machine " des problmes mathmatiques, et dtudier la classe des
problmes que cette machine pourrait rsoudre.
Dfinitions et notations (modle dterministe)
Soit A un ensemble fini appel alphabet dfini ainsi :
A = { a
1
,..., a
n
} ( A = C )
Soit O = { D,G } une paire
1.1 Dfinition : machine de Turing
Nous appellerons machine de Turing toute application T :
T : E N x ( O A)
o E est un ensemble fini non vide : E c N x A
1.2 Dfinition : Etats de la machine
Nous appellerons E
t
ensemble des tats intrieurs de la machine T:
E
t
= { q
i
e N , (-a
i
e A / (q
i
,a
i
) e Dom(T)) o (- x e O / (q
i
, x) e Im(T)) }
Dom(T) : domaine de dfinition de T.
Im(T) : image de T (les lments T(a) de N x ( O A), pour a e E)
Comme E est un ensemble fini, E
t
est ncessairement un ensemble fini, donc il y a un nombre fini
dtats intrieurs nots q
i
.
1.3 Dfinition : Les rgles de la machine
Nous appellerons " ensemble des rgles " de la machine T, le graphe G de lapplication T. Une rgle
de T est un lment du graphe G de T.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
57
On rappelle que le graphe de T est dfini comme suit :
G = {(a,b) e E x [E
t
x ( O A)] / b = T(a) }
- Notation : afin dviter une certaine lourdeur dans lcriture nous conviendrons dcrire les
rgles en omettant les virgules et les parenthses.
- Exemple : la rgle ( (q
i
,a) , (q
k
,b) ) est note : q
i
a q
k
b
2. La Machine de Turing physique
2.1 Constitution interne
Nous construisons une machine de Turing physique constitue de :
- Une bote note UC munie dune tte de lecture-criture et dun registre dtat.
- Un ruban de papier suppos sans limite vers la gauche et vers la droite.
- Sur le ruban se trouvent des cases contigus contenant chacune un seul lment de lalphabet
A.
- La tte de lecture-criture travaille sur la case du ruban situe devant elle ; elle peut lire le
contenu de cette case ou effacer ce contenu et y crire un autre lment de A.
- Il existe un dispositif dentranement permettant de dplacer la tte de lecture-criture dune
case vers la Droite ou vers la Gauche.
- Dans la tte lecture-criture il existe une case spciale note registre dtat, qui sert recevoir
un lment q
i
de E
t
.
Cette machine physique est une reprsentation virtuelle d'une machine de Turing thorique T,
d'alphabet A, dont l'ensemble des tats est E
t
, dont le graphe est donn ci-aprs :
G = {(a,b) e E x [E
t
x ( O A)] / b = T(a) }
Donnons une visualisation schmatique d'une telle machine en cours de fonctionnement. La tte de
lecture/criture pointe vers une case contenant l'lment a
i
de A, le registre d'tat ayant la valeur q
k
:
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
58
2.2 Fonctionnement
Dpart :
On remplit les cases du ruban dlments a
i
de A.
On met la valeur " q
k
" dans le registre dtat.
On positionne la tte sur une case contenant " a
i
".
Actions : (la machine se met en marche)
La tte lit le " a
i
". LUC dont le registre dtat vaut " q
k
", cherche dans la liste des rgles si le couple
(q
k
, a
i
) e Dom(T).
Si la rponse est ngative on dit que la machine " bloque " (elle sarrte par blocage).
Si la rponse est positive alors le couple (q
k
, a
i
) a une image unique (machine dterministe)que nous
notons (q
n
, y). Dans ce couple, y ne peut prendre que l'un des 3 types de valeurs possibles a
p
, D , G :
- a) soit y=a
p
, dans ce cas la rgle est donc de la forme q
k
a
i
q
n
a
p
a.1) LUC fait effacer le a
i
dans la case et le
remplace par llment a
p
.
a.2) LUC crit q
n
dans le registre dtat en
remplacement de la valeur q
k
.
- b) soit y = D , ici la rgle est donc de la forme q
k
a
i
q
n
D
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
59
b.1) LUC fait dplacer la tte vers la droite dune
case.
b.2) LUC crit q
n
dans le registre dtat en
remplacement de la valeur q
k
.
- c) soit y = G , dans ce cas la rgle est donc de la forme q
k
a
i
q
n
G
c.1) LUC fait dplacer la tte vers la gauche
d'une case.
c.2) LUC crit q
n
dans le registre dtat en
remplacement de la valeur q
k
.
Puis la machine continue fonctionner en recommenant le cycle des actions depuis le dbut : lecture
du nouvel lment a
k
etc...
2.3 Exemple : machine de Turing arithmtique
Nous donnons ci-dessous une machine T
1
additionneuse en arithmtique unaire.
A = {#,1}
O ={D,G}
un entier n est reprsent par n+1 symboles " 1 " conscutifs (de faon pouvoir reprsenter " 0 " par
un unique " 1 ").
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
60
Etat initial du ruban avant actions :
2 3
2 est reprsent par 111
3 est reprsent par 1111
Rgles T
1
: (application des rgles suivantes pour simulation de 2+3)
q
1
1 q
2
D q
6
1 q
7
D q
11
1 q
12
#
q
2
1 q
3
D q
7
1 q
8
D q
12
# q
13
G
q
3
1 q
4
D q
8
1 q
9
D q
13
1 q
14
#
q
4
# q
5
1 q
9
1 q
10
D
q
5
1 q
6
D q
10
# q
11
G
En dmarrant la machine sur la configuration prcdente on obtient :
Etat final du ruban aprs actions : (Cette machine ne fonctionne que pour additionner 2 et 3)
. 5 .
.
Gnralisation de la machine additionneuse
Il est facile de fournir une autre version plus gnrale T
2
fonde sur la mme stratgie et le mme tat
initial permettant d'additionner non plus seulement les nombres 2 et 3, mais des nombres entiers
quelconques n et p. Il suffit de construire des nouvelles rgles.
Rgles de T
2
:
q
1
1 q
1
D q
3
1 q
3
#
q
1
# q
2
1 q
3
# q
4
G
q
2
1 q
2
D q
4
1 q
5
#
q
2
# q
3
G
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
61
Cette machine de Turing T
2
applique l'exemple prcdent (addition de 2 et 3) laisse le ruban dans
le mme tat final, mais elle est construite avec moins dtats intrieurs que la prcdente.
En fait elle fonctionne aussi si la tte de lecture-criture est positionne sur nimporte lequel des
lments du premier nombre n. et les nombres n et p sont quelconques :
Et at i ni t i al sur l e nombr e de gauche
Et at f i nal l a f i n du nombr e cal cul ( i l y a n+p+1 symbol es " 1 " )
Nous dirons que T
2
est plus " puissante " que T
1
au sens suivant :
- T
2
a moins dtats intrieurs que T
1
.
- T
2
permet dadditionner des entiers quelconques.
- Il est possible de dmarrer ltat initial sur nimporte lequel des " 1 " du nombre de gauche.
On pourrait toujours en ce sens chercher une machine T
3
qui possderait les qualits de T
2
, mais qui
pourrait dmarrer sur nimporte lequel des " 1 " de lun ou lautre des deux nombres n ou p, le lecteur
est encourag chercher crire les rgles d'une telle machine.
Nous voyons que ces machines sont capables deffectuer des oprations, elles permettent de dfinir la
classe des fonctions calculables (par machines de Turing).
Un ordinateur est fond sur les principes de calcul dune machine de Turing. J. Von Neumann a
dfini la structure gnrale dun ordinateur partir des travaux de A.Turing. Les lments physiques
supplmentaires que possde un ordinateur moderne naugmentent pas sa puissance thorique. Les
fonctions calculables sont les seules que lon puisse implanter sur un ordinateur. Les priphriques et
autres dispositifs auxiliaires extrieurs ou intrieurs nont pour effet que damliorer la " puissance "
en terme de vitesse et de capacit. Comme une petite voiture de srie et un bolide de formule 1
partagent les mmes concepts de motorisation, de la mme manire les diffrents ordinateurs du
march partagent les mmes fondements mathmatiques.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
62
2.4 Machine de Turing informatique
Nous faisons voluer la reprsentation que nous avons de la machine de Turing afin de pouvoir
mieux la programmer, c'est dire pouvoir crire plus facilement les rgles de fonctionnement d'une
telle machine.
Nous dfinissons ce qu'est un algorithme pour une machine de Turing et nous proposons une
description graphique de cet algorithme l'aide de schmas graphiques symboliques dcrivant des
actions de base d'une machine de Turing.
A) Une machine de Turing informatique est dite normalise au sens suivant :
- Lalphabet A contient toujours le symbole " # "
- Lensemble des tats E contient toujours deux tats distingus q
0
(tat initial) et q
f
(tat final).
- La machine dmarre toujours ltat initial q
0
.
- Elle termine sans blocage toujours ltat q
f
.
- Dans les autres cas on dit que la machine " bloque ".
B)Algorithme dune machine de Turing informatique
Cest lensemble des rgles prcises qui dfinissent un procd de calcul destin obtenir en sortie
un " rsultat " dtermin partir de certaines " donnes " initiales.
C) Algorithme graphique dune machine de Turing
Nous utilisons cinq classes de symboles graphiques
Positionne la tte de lecture sur le
symbole voulu, met la machine ltat
initial q
0
et fait dmarrer la machine.
Signifie que la machine termine
correctement son calcul en sarrtant
ltat final q
f
.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
63
Aucune rgle de la machine ne permettant
la poursuite du fonctionnement, arrt de
la machine sur un blocage.
Dplacer la tte dune case vers la gauche
(la tte de lecture se positionne sur la case
davant la case actuelle contenant le
symbole a
p
).
Correspond la rgle :
q
i
a
p
q
j
G
Correspond laction excuter dans la deuxime partie de la
rgle :
q
i
a
p
q
j
a
k
(la machine crit a
k
dans la case actuelle et passe ltat q
j
).
Correspond laction excuter dans la premire
partie de la rgle :
q
j
a
k
...
ou q
i
# ...
(la machine teste le contenu de la case actuelle et
passe ltat q
j
ou ltat q
i
selon la valeur du
contenu).
D) Organigramme dune machine de Turing
On appelle organigramme dune machine de Turing T, toute reprsentation graphique constitue de
combinaisons des symboles des cinq classes prcdentes.
Les rgles de la forme q
n
a
k
q
n
Gou q
n
a
k
q
n
Dse traduisent par des schmas " boucls " ce qui
donne des organigrammes non linaires.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
64
diagramme pour :q
0
a q
0
G diagramme pour :q
0
a q
0
D
Exemple : organigramme de la machine T
2
normalise(additionneuse n+p)
Rgles de T
2
normalise :
q
0
1 q
0
D q
2
1 q
2
#
q
0
# q
1
1 q
2
# q
3
G
q
1
1 q
1
D q
3
1 q
f
#
q
1
# q
2
G
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
65
Nous voyons que ce symbolisme graphique est un outil de description du mode de traitement de
linformation au niveau machine. Cest dailleurs historiquement dune faon semblable que les
premiers programmeurs dcrivaient leur programmes.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
66
1.5 Architecture de l'ordinateur
Plan du chapitre:
Les principaux constituants
1.1 Dans lUnit Centrale : lunit de traitement
1.2 Dans lUnit Centrale : lunit de commande
1.3 Dans lUnit Centrale : les Units dchange
1.4 Exemples de machine une adresse : un micro-processeur simple
1.5 Les Bus
1.6 Schma gnral dune micro-machine fictive
1.7 Notion de jeu dinstructions-machine
1.8 Architectures RISC et CISC
1.9 Pipe line dans un processeur
1.10 Architectures super-scalaire
1.11 Principaux modes d'adressages des instructions machines
2. Mmoires : Mmoire centrale - Mmoire cache
2.1 Mmoire
2.2 Les diffrents types de mmoires
2.3 Les units de capacit
2.4 Mmoire centrale : dfinitions
2.5 Mmoire centrale : caractristiques
2.6 Mmoire cache ( ECC, associative )
3. Une petite machine pdagogique 8 bits " PM "
3.1 Unit centrale de PM (pico-machine)
3.2 Mmoire centrale de PM
3.3 Jeu dinstructions de PM
4. Mmoire de masse (auxiliaire ou externe)
4.1 Disques magntiques - disques durs
4.2 Disques optiques compacts - CD / DVD
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
67
1. Les principaux constituants d'une machine minimale
Un ordinateur, nous lavons dj not, est compos dun centre et dune priphrie. Nous allons nous
intresser au cur dun ordinateur fictif mono-processeur. Nous savons que celui-ci est compos de :
Une Unit centrale comportant :
- Unit de traitement,
- Unit de contrle,
- Units dchanges.
- Une Mmoire Centrale.
Nous dcrivons ci-aprs l'architecture minimale illustrant simplement le fonctionnement d'un
ordinateur (machine de Von Neumann).
1.1 Dans lUnit Centrale : lUnit de Traitement
Elle est charge deffectuer les traitements des oprations de types arithmtiques ou boolennes.
LUAL est son principal constituant.
Elle est compose au minimum :
- dun registre de donnes RD
- dun accumulateur ACC (pour les machines une adresse)
- des registres spcialiss (pour les machines plusieurs adresses)
- dune unit arithmtique et logique : UAL
Schma gnral thorique de lunit de traitement :
machine une adresse
machine plusieurs adresses
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
68
La fonction du registre de donnes (mmoire rapide) est de contenir les donnes transitant entre
lunit de traitement et lextrieur.
La fonction de laccumulateur est principalement de contenir les oprandes ou les rsultats des
oprations de lUAL.
La fonction de lUAL est deffectuer en binaire les traitements des oprations qui lui sont soumises et
qui sont au minimum:
- Oprations arithmtiques binaires: addition,multiplication, soustraction, division.
- Oprations boolennes : et, ou, non.
- Dcalages dans un registre.
Le rsultat de lopration est mis dans laccumulateur (Acc) dans le cas d'une machine une adresse,
dans des registres internes dans le cas de plusieurs adresses.
1.2 Dans lUnit Centrale : lUnit de Contrle ou de Commande
Elle est charge de commander et de grer tous les diffrents constituants de lordinateur (contrler
les changes, grer lenchanement des diffrentes instructions, etc...)
Elle est compose au minimum de :
- dun registre instruction RI,
- dun compteur ordinal CO,
- dun registre adresse RA,
- dun dcodeur de fonctions,
- dune horloge.
Schma gnral de lunit de contrle
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
69
Vocabulaire:
Bit = plus petite unit dinformation binaire (un objet physique ayant deux tats
reprsente un bit).
Processeur central = unit de commande + unit de traitement. IL a pour
fonction de lire squentiellement les instructions prsentes dans la mmoire, de
dcoder une instruction, de lire, crire et traiter les donnes situes dans la
mmoire.
Instruction = une ligne de texte comportant un code opration, une ou plusieurs
rfrences aux oprandes.
Soit linstruction fictive daddition du contenu des deux mmoires x et y dont le rsultat est mis dans
une troisime mmoire z :
(exemple d'instruction trois adresses)
| Oprateur | rfrences oprandes |
Registre instruction = contient linstruction en cours dexcution, elle demeure
dans ce registre pendant toute la dure de son excution.
Compteur ordinal = contient le moyen de calculer ladresse de la prochaine
instruction excuter.
Registre adresse = contient ladresse de la prochaine instruction excuter.
Dcodeur de fonction = associ au registre instruction, il analyse linstruction
excuter et entreprend les actions appropries dans lUAL ou dans la mmoire
centrale.
Au dbut, la diffrentiation des processeurs s'effectuait en fonction du nombre d'adresses contenues
dans une instruction machine. De nos jours, un micro-processeur comme le pentium par exemple,
possde des instructions une adresse, deux adresses, voir trois adresses dont certaines sont des
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
70
registres. En fait deux architectures machines coexistent sur le march : l'architecture RISC et
l'architecture CISC, sur lesquelles nous reviendrons plus loin. Historiquement l'architecture CISC est
la premire, mais les micro-processeur rcents semblent utiliser un mlange de ces deux architectures
profitant ainsi du meilleur de chacune d'elle.
Il existe de trs bons ouvrages spcialiss uniquement dans l'architecture des ordinateurs nous
renvoyons le lecteur certains d'entre eux cits dans la bibliographie. Dans ce chapitre notre objectif
est de fournir au lecteur le vocabulaire et les concepts de bases qui lui sont ncessaires et utiles sur le
domaine, ainsi que les notions fondamentales qu'il retrouvera dans les architectures de machines
rcentes. L'volution matrielle est actuellement tellement rapide que les ouvrages spcialiss sont
mis jour en moyenne tous les deux ans.
1.3 Dans lUnit Centrale : les Units dchange
- Une unit dchange est spcialise dans les entres/sorties.
- Ce peut tre un simple canal, un circuit ou bien un processeur particulier.
- Cet organe est plac entre la mmoire et un certain nombre de priphriques (dans un micro-
ordinateur ce sont des cartes comme la carte son, la carte vido, etc...).
Une unit dchange soulage le processeur central dans les tches de gestion du transfert de
linformation.
Les priphriques sont trs lents par rapport la vitesse du processeur (rapport de 1 10
9
). Si le
processeur central tait charg de grer les changes avec les priphriques il serait tellement ralenti
quil passerait le plus clair de son temps attendre.
1.4 Exemple de machine une adresse : un micro-processeur simple
Un micro-processeur simple a les mmes caractristiques que celles dun processeur central avec un
niveau de complexit et de sophistication moindre. Il faut savoir que plus une instruction machine
contient d'adresses (de rfrences des oprandes), plus le processeur est complexe. En effet avec les
instructions une adresse, le processeur est moins complexe en contre partie les programmes (listes
d'instructions machines) contiennent beaucoup d'instructions et sont donc plus longs excuter que
sur un matriel dont le jeu d'instruction est plusieurs adressses.
Un micro-processeur simple est essentiellement une machine une adresse, cest dire une partie
code oprande et une rfrence un seul oprande. Ce genre de machine est fond sur un cycle de
passage par laccumulateur.
Lopration prcdente z = x + y , se dcompose dans une telle machine fictivement en 3 oprations
distinctes illustres par la figure ci-aprs :
LoadAcc x { chargement de laccumulateur avec x : (1) }
Add y { prparation des oprandes x et y vers lUAL : (2) }
{ lancement commande de lopration dans lUAL : (3) }
{ rsultat transfr dans laccumulateur : (3) }
Store z { copie de laccumulateur dans z : (4) }
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
71
Laccumulateur gardant son contenu au final.
Comparaison de "programme" ralisant le calcul de l'opration prcdente "z = x + y "avec une
machine une adresse et une machine trois adresses :
Une machine une adresse
(3 instructions)
Une machine trois adresses
(1 instruction)
1.5 Les Bus
Un bus est un dispositif destin assurer le transfert simultan dinformations entre les divers
composants dun ordinateur.
On distingue trois catgories de Bus :
Bus dadresses (unidirectionnel)
il permet lunit de commande de transmettre les adresses rechercher et stocker.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
72
Bus de donnes (bi-directionnel)
sur lequel circulent les instructions ou les donnes traiter ou dj traites en vue de leur rangement.
Bus de contrle (bi-directionnel)
transporte les ordres et les signaux de synchronisation provenant de lunit de commande vers les
divers organes de la machine. Il vhicule aussi les divers signaux de rponse des composants.
Largeur du bus
Pour certains Bus on dsigne par largeur du Bus, le nombre de bits qui peuvent tre transports en
mme temps par le Bus, on dit aussi transports en parallle.
Les principaux Bus de donnes rcents de micro-ordinateur
Les Bus de donnes sont essentiellement des bus "synchrones", c'est dire qu'ils sont cadencs par
une horloge spcifique qui fonctionne un frquence fixe. Entre autres informations commerciales,
les constructeurs de Bus donnent en plus de la frquence et pour des raison psychologiques, le dbit
du Bus qui est en fait la valeur du produit de la frquence par la largeur du Bus, ce dbit correspond
au nombre de bits par seconde transports par le Bus.
Quelques chiffres sur des Bus de donnes parallles des annes 2000
BUS Largeur Frquence Dbit Utilisation
PCI 64 bits 66 MHz 528 Mo/s
Processeur/priphrique
non graphique
AGP 32 bits 66 MHz x 8 4 Go/s
Processeur/carte
graphique
SCSI 16 bits 40 MHz 80 Mo/s
Echanges entres
priphriques
Il existe aussi des "Bus srie" ( Bus qui transportent les bits les uns la suite des autres,
contrairement aux Bus parallles), les deux plus rcents concurrents quipent les matriels de grande
consommation : USB et Firewire.
BUS Dbit Nombre de priphriques accepts
USB 1,5 Mo/s
127
USB2 60 Mo/s 127
Firewire 50 Mo/s
63
FirewireB 200 Mo/s
63
Ces Bus vitent de connecter des
priphriques divers comme les
souris, les lecteurs de DVD, les
GSM, les scanners, les imprimantes,
les appareils photo, , sur des ports
spcifiques de la machine
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
73
1.6 Schma gnral dune micro-machine fictive une adresse
1.7 Notion de jeu dinstructions-machine : Les premiers programmes
Comme dfini prcdemment, une instruction-machine est une instruction qui est directement
excutable par le processeur.
Lensemble de toutes les instructions-machine excutables par le processeur sappelle le " jeu
dinstructions " de lordinateur. Il est compos au minimum de quatre grandes classes dinstructions
dans les micro-processeurs :
- instructions de traitement
- instructions de branchement ou de droutement
- instructions dchanges
- instructions de comparaisons
Dautres classes peuvent tre ajoutes pour amliorer les performances de la machine (instructions de
gestion mmoire, multimdias etc..)
1.8 Architectures CI SC et RI SC
Traditionnellement, depuis les annes 70 on dnomme processeur architecture CISC (Complex
Instruction Set Code) un processeur dont le jeu d'instructions possde les proprits suivantes :
- Il contient beaucoup de classes d'instructions diffrentes.
- Il contient beaucoup de type d'instructions diffrentes complexes et de taille variable.
- Il se sert de beaucoup de registres spcialiss et de peu de registres gnraux.
L'architecture RISC (Reduced Instruction Set Code) est un concept mis en place par IBM dans les
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
74
annes 70, un processeur RISC est un processeur dont le jeu d'instructions possde les proprits
suivantes :
- Le nombre de classes d'instructions diffrentes est rduit par rapport un CISC.
- Les instructions sont de taille fixe.
- Il se sert de beaucoup de registres gnraux.
- Il fonctionne avec un pipe-line
Depuis les dcennies 90, les microprocesseur adoptent le meilleur des fonctionnalits de chaque
architecture provoquant de fait la disparition progressive de la diffrence entre RISC et CISC et le
invitables polmiques sur l'efficacit suppose meilleure de l'une ou de l'autre architecture.
1.9 Pipe-line dans un processeur
Soulignons qu'un processeur est une machine squentielle ce qui signifie que le cycle de traitement
d'une instruction se droule squentiellement. Supposons que par hypothse simplificatrice, une
instruction machine soit traite en 3 phases :
1 - lecture : dans le registre instruction (RI)
2 - dcodage : extraction du code opration et des oprandes
3 - excution : du traitement et stockage ventuel du rsultat.
Reprsentons chacune de ces 3 phases par une unit matrielle distinctes dans le processeur (on
appelle cette unit un "tage") et figurons schmatiquement les 3 tages de traitement d'une
instruction :
Supposons que suivions pas pas l'excution des 4 instructions machines suivants le long des 3
tages prcdents :
ADD 100, 200, 300
MUL 150, 250, 350
DIV 300, 200, 120
MOV 100, 500
Chacune des 4 instruction est traite squentiellement en 3 phases sur chacun des tages; une fois une
instruction traite par le dernier tage (tage d'excution) le processeur passe l'instruction suivante
et la traite au premier tage et ainsi de suite :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
75
Traitement de la premire instruction
ADD 100, 200, 300
On remarquera que :
- Pendant le temps d'activation d'un
tage, les deux autres restent
inactifs.
- Il faut attendre la fin du traitement
de l'instruction ADD 100, 200, 300
pour pouvoir passer au traitement de
l'instruction MUL 150, 250, 350
etc
Le cycle recommence identique pour
l'instruction MUL 150, 250, 350
L'architecture pipe-line consiste optimiser les temps d'attente de chaque tage, en commenant le
traitement de l'instruction suivante ds que l'tage de lecture a t libr par l'instruction en cours, et
de procder identiquement pour chaque tage de telle faon que durant chaque phase, tous les tages
soient occups fonctionner (chacun sur une instruction diffrente).
A un instant t
0
donn l'tage d'excution travaille sur les actions effectuer pour l'instruction de rang
n, l'tage de dcodage travaille sur le dcodage de l'instruction de rang n+1, et l'tage de lecture sur
la lecture de l'instruction de rang n+2.
Il est clair que cette technique dnomme architecture pipe-line acclre le traitement d'une
instruction donne, puisqu' la fin de chaque phase une instruction est traite en entier. Le nombre
d'units diffrentes constituant le pipe-line s'appelle le nombre d'tages du pipe-line.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
76
La figure ci-dessous illustre le dmarrage du traitement des 4 instructions selon un pipe-line 3
tages (lecture, dcodage, excution) :
etc
Priode initiale (une seule fois au
dmarrage)
Chaque tage se met en route
Excution de l'instruction ADD
Excution de l'instruction MUL
La prochaine phase verra la fin de
l'excution de l'instruction DIV,
1.10 Architecture super-scalaire
On dit qu'un processeur est super-scalaire lorsqu'il possde plusieurs pipe-lines indpendants dans
lesquels plusieurs instructions peuvent tre traites simultanment. Dans ce type d'architecture
apparat la notion de paralllisme avec ses contraintes de dpendances (par exemple lorsqu'une
instruction ncessite le rsultat de la prcdente pour s'excuter, ou encore lorsque deux instructions
accdent la mme ressource mmoire,).
Examinons l'excution de notre exemple 4 instructions sur un processeur super-scalaire 2 pipe-
lines. Nous supposons nous trouver dans le cas idal pour lequel il n'y a aucune dpendance entre
deux instructions, nous figurons sparment le schma temporel d'excution de chacun des deux
pipe-lines aux t, t+dt, t+2dt et t+3dt afin d'observer leur comportement et en sachant que les deux
fonctionnent en mme temps un instant quelconque.
Le processeur envoie les deux premires instruction ADD et MUL au pipe-line n1, et les deux
suivantes DIV et MOV au pipe-line n2 puis les tages des deux pipe-lines se mettent fonctionner.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
77
PI PE-LI NE n1
PI PE-LI NE n2
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
78
nous remarquerons qu'aprs de t+dt, chaque phase voit s'excuter 2 instructions :
t+2dt ce sont ADD et DIV
t+3dt se sont MUL et MOV
Rappelons au lecteur que nous avons suppos par simplification de l'explication que ces 4
instructions sont indpendantes et donc leur ordre d'excution est indiffrent. Ce n'est dans la ralit
pas le cas car par exemple si l'instruction DIV 300, 200, 120 utilise le contenu de la mmoire 300
pour le diviser par le contenu de la mmoire 200, et que l'instruction ADD 100, 200, 300 range dans
cette mmoire 300 le rsultat de l'addition des contenus des mmoires 100 et 200, alors l'excution de
DIV dpend de l'excution de ADD. Dans cette ventualit t+2dt, le calcul de DIV par le second
pipe-line doit "attendre" que le calcul de ADD soit termin pour pouvoir s'excuter sous peine
d'obtenir une erreur en laissant le paralllisme fonctionner : un processeur super-scalaire doit tre
capable de dsactiver le paralllisme dans une telle condition. Par contre dans notre exemple,
t+3dt le paralllisme des deux pipe-lines reste efficace MUL et MOV sont donc excutes en mme
temps.
Le pentium IV de la socit Intel intgre un pipe-line 20 tages et constitue un exemple de
processeur combinant un mlange d'architecture RISC et CISC. Il possde en externe un jeu
d'instruction complexes (CISC), mais dans son cur il fonctionne avec des micro-instructions de type
RISC traites par un pipe-line super-scalaire.
L'AMD 64 Opteron qui est un des micro-processeur de l'offre 64 bits du deuxime constructeur
mondial de micro-processeur derrire la socit Intel, dispose de 3 pipe-lines d'excution identiques
pour les calculs en entiers et de 3 pipe-lines spcialiss pour les calculs en virgules flottante. L'AMD
64 Opteron est aussi un mlange d'architecture RISC-CISC avec un cur de micro-instructions RISC
comme le pentium IV.
Nous figurons ci-dessous les 3 pipe-lines d'excution (sur les entiers par exemple) :
Chacune des 3 UAL effectue les fonctions classiques d'une UAL, plus des oprations de
multiplexage, de drapeau, des fonctions conditionnelles et de rsolution de branchement. Les
multiplications sont traites dans une unit part de type pipe-line et sont diriges vers les pipe-lines
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
79
UAL0 et UAL1.
1.11 Principaux modes d'adressage des instructions machines
Nous avons indiqu prcdemment qu'une instruction machine contenait des adresses d'oprandes
situes en mmoire centrale. En outre, il a t indiqu que les processeurs centraux disposaient de
registres internes. Les informaticiens ont mis au point des techniques d'adressages diffrentes en vue
d'accder un contenu mmoire. Nous dtaillons dans ce paragraphe les principales d'entre ces
techniques d'adressage. Afin de conserver un point de vue pratique, nous montrons le fonctionnement
de chaque mode d'adressage l'aide de schmas reprsentant le cas d'une instruction LOAD de
chargement d'un registre nomm ACC d'une machine une adresse, selon 6 modes d'adressages
diffrents.
Environnement d'excution d'un LOAD
Soit considrer un processeur contenant en particulier deux registres X charg de la valeur entire
100 et ACC (accumulateur de machine une adresse) et une mmoire centrale dans laquelle nous
exhibons 5 mots mmoire d'adresses 15, 20, 50, 100, 115. Chaque mot et contient un entier
respectivement dans l'ordre 50, 70, 80, 20, 60, comme figur ci-dessous :
L'instruction "LOAD Oper" a pour fonction de charger le contenu du registre ACC avec un oprande
Oper qui peut prendre 6 formes, chacune de ces formes reprsente un mode d'adressage particulier
que nous dfinissons maintenant.
Adressage immdiat
L'oprande Oper est considr comme une valeur charger immdiatement (dans le registre ACC
ici). Par exemple, nous noterons LOAD #15, pour indiquer un adressage immdiat (c'est dire un
chargement de la valeur 15 dans le registre ACC).
Adressage direct
L'oprande Oper est considr comme une adresse en mmoire centrale. Par exemple, nous noterons
LOAD 15, pour indiquer un adressage direct (c'est dire un chargement du contenu 50 du mot
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
80
mmoire d'adresse 15 dans le registre ACC).
Adressage direct avec registre
L'oprande Oper est un registre interne du processeur (not X dans l'exemple), un tel mode
d'adressage indique de charger dans ACC le contenu du registre Oper. Par exemple, nous noterons
LOAD X, pour indiquer un adressage direct avec registre qui charge l'accumulateur ACC avec la
valeur 100 contenue dans X.
Adressage indirect
L'oprande Oper est considr comme l'adresse d'un mot
1
en mmoire centrale, mais ce mot
1
contient
lui-mme l'adresse d'un autre mot
2
dont on doit charger le contenu dans ACC. Par exemple, nous
noterons LOAD (15), pour indiquer un adressage indirect (c'est dire un chargement dans le registre
ACC, du contenu 80 du mot
2
mmoire dont l'adresse 50 est contenue dans le mot
1
d'adresse 15).
Adressage indirect avec registre
L'oprande Oper est considr comme un registre dont le contenu est l'adresse du mot dont on doit
charger la valeur dans ACC. Par exemple, nous noterons LOAD (X), pour indiquer un adressage
indirect avec le registre X (c'est dire un chargement dans le registre ACC, du contenu 20 du mot
mmoire dont l'adresse 100 est contenue dans le registre X).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
81
Adressage index
L'oprande Oper est un couple form par un registre R et une adresse adr. La connaissance de
l'adresse du mot dont on doit charger la valeur est obtenue par addition de l'adresse adr au contenu
du registre R. Par exemple, nous noterons LOAD 15, X , pour indiquer un adressage index par le
registre X (c'est dire un chargement dans le registre ACC, du contenu 60 du mot mmoire dont
l'adresse 115 est obtenue par addition de 15 et du contenu 100 du registre X).
Quelques remarques sur les diffrents modes d'adressages (avec l'exemple du LOAD) :
- Le mode direct correspond des proccupations de chargement de valeur des emplacements
fixs.
- Les modes indirects permettent partir d'un emplacement mmoire quelconque d'atteindre un
autre emplacement mmoire et donc autorise des traitements sur les adresses elles-mmes.
- Le mode index est trs utile lorsque l'on veut atteindre une famille de cellules mmoires
contigus possdant une adresse de base (comme pour un tableau). L'instruction LOAD 15,X
permet si l'on fait varier le contenu du registre X de la valeur 0 la valeur 10 (dans une
itration par exemple) d'atteindre les mots d'adresse 15, 16, , 25.
Les registres sont trs prsents dans les micro-processeurs du march
Le processeur AMD 64 bits Optron travaille avec 16 registres gnraux de 64 bits et 16 registres
gnraux de 128 bits.
Le processeur pentium IV travaille avec 8 registres gnraux 32 bits et 8 registres gnraux 80 bits.
L'architecture IA 64 d'Intel et HP est fonde sur des instructions machines trs longues travaillant
avec 128 registres gnraux 64 bits et 128 registres gnraux 82 bits pour les calculs classiques.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
82
Il en est des processeurs comme il en est des moteurs explosion dans les voitures, quelle que soit
leur sophistication technique (processeur vectoriel, machine parallle, machine multi-processeur,
)leurs fondements restent tablis sur les principes d'une machine de Von Neumann ( mmoire,
registre, adresse, transfert).
2. Mmoires : mmoire Centrale , mmoire cache
2.1 Mmoire
Mmoire :cest un organe (lectronique de nos jours), capable de contenir, de
conserver et de restituer sans les modifier de grandes quantits dinformation.
2.2 Les diffrents types de mmoires
La mmoire vive RAM (Random Access Memory)
- Mmoire dans laquelle on peut lire et crire.
- Mmoire volatile (perd son contenu ds la coupure du courant).
La mmoire morte ROM (Read Only Memory)
- Mmoire dans laquelle on ne peut que lire.
- Mmoire permanente (conserve indfiniment son contenu).
Les PROM (Programable ROM)
- Ce sont des mmoires vierges programmables une seule fois avec un outil spcialis sappelant
un programmateur de PROM.
- Une fois programmes elles se comportent dans lordinateur comme des ROM.
Les EPROM (Erasable PROM)
- Ce sont des PROM effaables (gnralement sous rayonnement U.V),
- elles sont reprogrammables avec un outil spcialis,
- elles se comportent comme des ROM en utilisation courante.
- Les EEPROM (Electrical EPROM) sont effaables par signaux lectriques.
- Les FLASH EEPROM sont des EEPROM effaables par bloc.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
83
2.3 Les units de capacit
Les units de mesure de stockage de linformation sont :
Le bit (pas de notation)
Loctet = 2
3
bits = 8 bits. (not 1 o)
Le Kilo-octet = 2
10
octets =1024 o (not 1 Ko)
Le Mga-octet = 2
20
octets =(1024)
2
o (not 1 Mo)
Le Giga-octet = 2
30
octets =(1024)
3
o (not 1 Go)
Le Tra-octet = 2
40
octets =(1024)
4
o (not 1 To)
Les autres sur-units sont encore peu employes actuellement.
2.4 Mmoire centrale : dfinitions
Mot : cest un regroupement de n bits constituant une case mmoire dans la
mmoire centrale. Ils sont tous numrots.
Adresse : cest le numro dun mot-mmoire (case mmoire) dans la mmoire
centrale.
Programme : cest un ensemble dinstructions pralablement codes (en binaire)
et enregistres dans la mmoire centrale sous la forme dune liste squentielle
dinstructions. Cette liste reprsente une suite dactions lmentaires que
lordinateur doit accomplir sur des donnesen entre, afin datteindre le rsultat
recherch.
Organisation : La mmoire centrale est organise en bits et en mots. Chaque mot-
mmoire est repr bijectivement par son adresse en mmoire centrale.
Contenu : La mmoire centrale contient en binaire, deux sortes dinformations
- des programmes,
- des donnes.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
84
Composition : Il doit tre possible de lire et dcrire dans une mmoire centrale.
Elle est donc habituellement compose de mmoires de type RAM.
Remarques
- Un ordinateur dot dun programme est un automatisme apte
seulement rpter le mme travail(celui dict par le programme).
- Si lon change le programme en mmoire centrale, on obtient un
nouvel automatisme.
2.5 Mmoire centrale : caractristiques
La mmoire centrale peut tre ralise grce des technologies diffrentes. Elle possde toujours des
caractristiques gnrales qui permettent de comparer ces technologies. En voici quelques unes :
La capacit reprsente le nombre maximal de mots que la mmoire peut stocker
simultanment.
Le temps daccs est le temps qui scoule entre le stockage de ladresse du mot
slectionner et lobtention de la donne.
Le temps de cycle ou cycle mmoire est gal au temps daccs ventuellement
additionn du temps de rafrachissement ou de rcriture pour les mmoires qui
ncessitent ces oprations.
Le dbit d'une mmoire : c'est l'inverse du cycle mmoire en octet par seconde
La volatilit, la permanence.
Terminons ce survol des possibilits dune mmoire centrale, en indiquant que le mcanisme daccs
une mmoire centrale par le processeur est essentiellement de type squentiel et se dcrit selon trois
phases :
- stockage,
- slection,
- transfert.
Pour l'instant :
Un ordinateur est une machine squentielle de Von Neumann dans
laquelle sexcutent ces 3 phases dune manire immuable, que ce soit
pour les programmes ou pour les donnes et aussi complexe que soit la
machine.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
85
La mmoire centrale est un lment d'importance dans l'ordinateur, nous avons vu qu'elle est
compose de RAM en particulier de RAM dynamiques nommes DRAM dont on rappelle que sont
des mmoires construite avec un transistor et un condensateur. Depuis 2004 les micro-ordinateurs du
commerce sont tous quips de DRAM, le sigle employ sur les notices techniques est DDR qui est
l'abrviation du sigle DDR SDRAM dont nous donnons l'explication :
Ne pas confondre SRAM et SDRAM
Une SRAM est une mmoire statique (SRAM= Statique RAM) construite avec des bascules,
une SDRAM est une mmoire dynamique DRAM qui fonctionne la vitesse du bus mmoire,
elle est donc synchrone avec le fonctionnement du processeur le "S" indique la synchronicit
(SDRAM = Synchrone DRAM).
Une DDR SDRAM
C'est une SDRAM double taux de transfert pouvant expdier et recevoir des donnes deux
fois par cycle d'horloge au lieu d'une seule fois. Le sigle DDR signifie Double Data Rate.
Les performances des mmoires s'amliorent rgulirement, le secteur d'activit est trs innovant, le
lecteur retiendra que les mmoires les plus rapides sont les plus chres et que pour les comparer en ce
domaine, il faut utiliser un indicateur qui se nomme le cycle mmoire.
Temps de cycle d'une mmoire ou cycle mmoire : le processeur attend
Nous venons de voir qu'il reprsente l'intervalle de temps qui s'coule entre deux accs conscutif
la mmoire toutes opration cumules. Un processeur est cadenc par une horloge dont la frquence
est donne actuellement en MHz (Mga Hertz). Un processeur fonctionne beaucoup plus rapidement
que le temps de cycle d'une mmoire, par exemple prenons un micro-processeur cadenc 5 MHz
auquel est connecte une mmoire SDRAM de temps de cycle de 5 ns (ordre de grandeur de
matriels rcents). Dans ces conditions le processeur peut accder aux donnes selon un cycle qui lui
est propre 1/5MHz soit un temps de 2.10
-1
ns, la mmoire SDRAM ayant un temps de cycle de 5 ns,
le processeur doit attendre 5ns / 2.10
-1
ns = 25 cycles propres entre deux accs aux donnes de la
mmoire. Ce petit calcul montre au lecteur l'intrt de l'innovation en rapidit pour les mmoires.
C'est aussi pourquoi on essaie de ne connecter directement au processeur que des mmoires qui
fonctionnent une frquence proche de celle du processeur.
Les registres d'un processeur sont ses mmoires les plus rapides
Un processeur central est quip de nombreux registres servant diffrentes fonctions, ce sont en
gnral des mmoires qui travaillent une frquence proche de celle du processeur , actuellement
leur architecture ne leur permet pas de stocker de grandes quantits d'informations. Nous avons vu au
chapitre consacr aux circuits logiques les principaux types de registres (registres parallles, registres
dcalages, registres de comptage, )
Nous avons remarqu en outre que la mmoire centrale qui stocke de trs grandes quantits
d'informations (relativement aux registres) fonctionne une vitesse plus lente que celle du
processeur. Nous retrouvons alors la situation classique d'quilibre entre le dbit de robinets qui
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
86
remplissent ou vident un rservoir. En informatique, il a t prvu de mettre entre le processeur et la
mmoire centrale une sorte de rservoir de mmoire intermdiaire nomme la mmoire cache.
2.6 Mmoire cache
La mmoire cache (on dit aussi le cache) est une varit de mmoire plus rapide que la mmoire
centrale (un peu moins rapide que les registres). La particularit technique actuelle de la mmoire
cache est que plus sa taille est grande plus son dbit a tendance ralentir.
La caractristique fonctionnelle du cache est de servir stocker des instructions et des donnes
provenant de la mmoire centrale et qui ont dj t utilises les plus rcemment par le
processeur central.
Actuellement le cache des micro-processeurs rcents du march est compos de deux niveaux de
mmoires de type SRAM la plus rapide (type de mmoire RAM statique semblable celle des
registres) : le cache de niveau un est not L1, le cache de niveau deux est not L2.
Le principe est le suivant :
Le cache L1 est form de deux blocs spars, l'un servant au stockage des donnes, l'autre servant au
stockage des instructions.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
87
Si un tage du processeur cherche une donne, elle va tre d'abord recherche dans le cache de
donne L1 et rapatrie dans un registre adquat, si la donne n'est pas prsente dans le cache L1, elle
sera recherche dans le cache L2.
Si la donne est prsente dans L2, elle est alors rapatrie dans un registre adquat et recopie dans
le bloc de donne du cache L1. Il en va de mme lorsque la donne n'est pas prsente dans le cache
L2, elle est alors rapatrie depuis la mmoire centrale dans le registre adquat et recopie dans le
cache L2.
Gnralement la mmoire cache de niveau L1 et celle de niveau L2 sont regroupes dans la mme
puce que le processeur (cache interne).
Nous figurons ci-dessous le facteur d'chelle relatif entre les diffrents composants mmoires du
processeur et de la mmoire centrale (il s'agit d'un coefficient de multiplication des temps d'accs
une information selon la nature de la mmoire qui la contient). Les registres, mmoires les plus
rapides se voient affecter la valeur de rfrence 1 :
L'accs par le processeur une information situe dans la DDR SDRAM de la mmoire centrale est
100 fois plus lente qu'un accs une information contenue dans un registre.
Par exemple, le processeur AMD 64 bits Optron travaille avec un cache interne L1 de 64 Ko
constitu de mmoires associatives (type ECC pour le bloc L1 de donnes et type parit pour
le bloc L1 d'instructions), le cache L2 de l'Optron a une taille de 1 Mo constitu de mmoires
64 bits associatives de type ECC, enfin le contrleur de mmoire accepte de la DDR SDRAM
128 bits jusqu' 200 Mhz en qualit ECC.
Dfinition de mmoire ECC (mmoire code correcteur d'erreur)
Une mmoire ECC est une mmoire contenant des bits supplmentaires servant dtecter et
corriger une ventuelle erreur ou altration de l'information qu'elle contient (par exemple lors d'un
transfert).
La technique la plus simple est celle du bit de parit (Parity check code), selon cette technique
l'information est code sur n bits et la mmoire contient un n+1 me bit qui indique si le nombre de
bits codant l'information contenue dans les n bits est pair (bit=0)ou impair(bit=1). C'est un code
dtecteur d'erreur.
Exemple d'une mmoire 4 bits plus bit de parit (le bit de poids faible contient la parit) :
Information 10010 bit de parit = 0 , car il y a deux bits gaux 1 (nombre pair)
Information 11110 bit de parit = 0 , car il y a quatre bits gaux 1 (nombre pair)
Information 11011 bit de parit = 1 , car il y a trois bits gaux 1 (nombre impair)
Une altration de deux bits (ou d'un nombre pair de bits) ne modifiant pas la parit du dcompte ne
sera donc pas dcele par ce code :
Supposons que l'information 10010 soit altre en 01100 ( le bit de parit ne change pas car le
nombre de 1 de l'information altre est toujours pair, il y en a toujours 2 ! ). Ce code est simple peu
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
88
coteux, il est en fait un cas particulier simple de codage linaire systmatique invents par les
spcialistes du domaine.
Mmoire ECC gnrale
Les mathmaticiens mis contribution travers la thorie des groupes et des espaces vectoriels
fournissent des modles de codes dtecteur et correcteur d'erreurs appels codes linaire cycliques,
les codes de Hamming sont les plus utiliss. Pour un tel code permettant de corriger d'ventuelles
erreur de transmission, il faut ajouter aux n bits de l'information utile, un certain nombre de bits
supplmentaires reprsentant un polynme servant corriger les n bits utiles.
Pour une mmoire ECC de 64 bits utiles, 7 supplmentaires sont ncessaires pour le polynme de
correction, pour une mmoire de 128 bits utiles, 8 bits sont ncessaires. Vous remarquez que
l'Optron d'AMD utilise de la mmoire ECC pour le cache L1 de donnes et de la mmoire parit
pour le cache instruction. En effet, si un code d'instruction est altr, l'tage de dcodage du
processeur fera la vrification en bloquant l'instruction inexistante, la protection apporte par la parit
est suffisante; en revanche si c'est une donne qui est altre dans le cache L1 de donnes, le
polynme de correction aidera alors restaurer l'information initiale.
Mmoire associative
C'est un genre de mmoire construit de telle faon que la recherche d'une information s'effectue non
pas travers une adresse de cellule, la mmoire renvoyant alors le contenu de la cellule, mais plutt
en donnant un "contenu" rechercher dans la mmoire et celle-ci renvoie l'adresse de la cellule.
Une mmoire cache est une mmoire associative, ainsi elle permet d'adresser directement dans la
mmoire centrale qui n'est pas associative.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
89
On peut considrer une mmoire cache comme une sorte de table de recherche contenant des
morceaux de la mmoire centrale. La mmoire centrale est divise en blocs de n mots, et la mmoire
cache contient quelques un de ces blocs qui ont t chargs prcdemment.
Notation graphiques utilises :
Mcanisme synthtique de lecture-criture avec cache :
Le processeur fournit l'adresse d'un mot lire :
1) Si ce mot est prsent dans le cache, il se trouve dans un bloc dj copi partir de son original
dans le MC (mmoire centrale), il est alors envoy au processeur :
2) Si ce mot n'est pas prsent dans le
cache, l'adresse porte alors sur un mot
situ dans un bloc prsent dans la MC
(mmoire centrale).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
90
Dans cette ventualit le bloc de la MC dans lequel se trouve le mot, se trouve recopi dans le cache
et en mme temps le mot est envoy au processeur :
Pour l'criture l'opration est semblable, selon que le mot est dj dans le cache ou non.
Lorsque le mot est prsent dans le cache et qu'il est modifi par une criture il est modifi dans le
bloc du cache et modifi aussi dans la MC :
Ce fonctionnement montre qu'il est donc ncessaire que la mmoire cache soit lie par une
correspondance entre un mot situ dans elle-mme et sa place dans la MC. Le fait que la mmoire
cache soit constitue de mmoires associatives, permet la mmoire cache lorsqu'un mot est
slectionn de fournir l'adresse MC de ce mot et donc de pouvoir le modifier.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
91
3. Une petite machine pdagogique 8 bits
( assistant du package pdagogique prsent sur le CD-ROM )
3.1 Unit centrale de PM (pico-machine)
Objectif:
Support pdagogique interactif destin faire comprendre
l'analyse et le cheminement des informations dans un processeur
central d'ordinateur fictif avec accumulateur.
- La mmoire centrale est mots de 8 bits, les adresses sont sur 16 bits.
- le processeur est dot d'instructions immdiates ou relatives.
- Les instructions sont de 3 types 1 octet (immdiat), 2 octets (court) ou 3 octets (long).
- Les instructions sont adressages immdiat et adressage direct.
Interface utilisateur de l'assistant :
Description gnrale de lunit centrale de PM simule sur le tableau de bord ci-dessous :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
92
RA = Registre Adresse sur 16 bits
CO = Compteur Ordinal sur 16 bits
DC = Registre de formation d'adresse sur 16 bits
RD = Registre de Donnes sur 8 bits
UAL = Unit Arithmtique et Logique effectuant les calculs sur 8 bits avec possibilit de
dbordement.
Acc = Accumulateur sur 8 bits (machine une adresse).
RI = Registre Instruction sur 8 bits (instruction en cours d'excution).
Dcodeur de fonction.
squenceur
Horloge
CCR = un Registre de 4 Codes Condition N, V, Z, C,
BUS de contrle (bi-directionnel)
BUS interne (circulation des informations internes).
3.2 Mmoire centrale de PM
La mmoire centrale de PM est de 512 octets, ce qui permet dans une machine 8 bits de voir
comment est construite la technique d'adressage court (8 bits) et d'adressage long (16 bits).
|adresse|contenu|
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
93
Elle est connecte lunit centrale travers deux bus : un bus dadresse et un bus de donnes.
3.3 Jeu dinstructions de PM
PM est dot du jeu d'instructions suivant :
L'adressage immdiat d'une instruction INSTR est not : INSTR #<valeur>
L'adressage direct d'une instruction INSTR est not : INSTR <valeur>
addition avec l'accumulateur
ADD #<valeur> 2 octets code=16
ADD <adr 16 bits> 3 octets code=18
ADD <adr 8 bits> 2 octets code=17
chargement de l'accumulateur
LDA #<valeur> 2 octets code=10
LDA <adr 16 bits> 3 octets code=12
LDA <adr 8 bits> 2 octets code=11
rangement de l'accumulateur
STA <adr 16 bits> 3 octets code=15
STA <adr 8 bits> 2 octets code=14
positionnement indicateurs CNVZ
STC (C=1) 1 octet code=100
STN (N=1) 1 octet code=101
STV (V=1) 1 octet code=102
STZ (Z=1) 1 octet code=103
CLC (C=0) 1 octet code=104
CLN (N=0) 1 octet code=105
CLV (V=0) 1 octet code=106
CLZ (Z=0) 1 octet code=107
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
94
branchement relatif sur indicateur
BCZ (brancht.si C=0) 2 octets code=22
BNZ (brancht.si N=0) 2 octets code=23
BVZ (brancht.si V=0) 2 octets code=24
BZZ (brancht.si Z=0) 2 octets code=25
END (fin programme) 1 octet code=255
Dans le CCR les 4 bits indicateurs sont dans cet ordre : N V Z C.
Ils peuvent tre :
- soit positionns automatiquement par la machine:
N = le bit de poids fort de l'Accumulateur
V = 1 si overflow (dpassement capacit) 0 sinon
Z = 1 si Accumulateur vaut 0
Z = 0 si Accumulateur <0
C = 1 si retenue (dans l'addition) sinon 0
- soit positionns par programme.
Exemple de programme en PM
LDA #18 ; {chargement de laccumulateur avec la valeur 18}
STA 50 ; {rangement de laccumulateur dans la mmoire n 50}
LDA #5 ; {chargement de laccumulateur avec la valeur 5}
STA 51 ; {rangement de laccumulateur dans la mmoire n51}
ADD 50 ; {addition de laccumulateur avec la mmoire n50}
STA 52 ; {rangement de laccumulateur dans la mmoire n52}
END
Le lecteur est encourag utiliser le logiciel d'assistance Pico-machine du package pdagogique qui
se trouve accessible travers l'onglet simulateur et met en uvre :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
95
4. Mmoire de masse (externe ou auxiliaire)
Les donnes peuvent tre stockes des fin de conservation ,ailleurs que dans la mmoire centrale
volatile par construction avec les constituants lectroniques actuels. Des priphriques spcialiss
sont utiliss pour ce genre de stockage longue conservation, en outre ces mmes priphriques
peuvent stocker une quantit d'information trs grande par rapport la capacit de stockage de la
mmoire centrale.
On dnomme dispositifs de stockage de masse, de tels priphriques.
Les mmoires associes ces dispositifs se dnomment mmoires de masse, mmoires externes ou
encore mmoires auxiliaires, par abus de langage la mmoire dsigne souvent le dispositif de
stockage.
Les principaux reprsentant de cette famille de mmoires sont :
- Les bandes magntiques (utiliss dans de trs faible cas)
- Les disques magntiques : les disquettes (en voie d'abandon), les disques durs (les plus
utiliss).
- Les CD (trs utiliss mais bientt supplants par les DVD)
- Les DVD
Des technologies ont vu le jour puis se sont teintes (tambour magntique, cartes magntiques,
mmoires bulles magntiques,)
A part les bandes magntiques qui sont un support ancien encore utilis fonctionnement squentiel,
les autres supports (disques, CD, DVD) sont des mmoires qui fonctionnent accs direct.
4.1 Disques magntiques - disques durs
Nous dcrivons l'architecture gnrale des disques magntiques encore appels disques durs
(terminologie amricaine hard disk, par opposition aux disquettes nommes floppy disk) trs
largement employs dans tous les types d'ordinateur comme mmoire auxiliaire.
Un micro-ordinateur du commerce dispose systmatiquement d'un ou plusieurs disques durs et au
minimum d'un lecteur-graveur combin de CD-DVD permettant ainsi l'accs aux informations
extrieures distribues sur les supports faibles cot comme les CD et les DVD qui les remplacent
progressivement.
Un disque dur est compos d'un disque mtallique sur lequel est dpos un film magntisable, sur
une seule face ou sur ses deux faces :
Ce film magntique est compos de grains d'oxyde magntisable et c'est le fait que certaines zones du
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
96
film conservent ou non un champ magntique, qui reprsente la prsence d'un bit 0 ou bien 1.
Coupe d'une tranche de disque et figuration de zones magntises interprtes comme un bit
Organisation gnrale d'un disque dur
Un disque dur est au minimum compos de pistes numrotes et de secteurs numrots, les donnes
sont stockes dans les secteurs.
Le disque tourne sur son axe vitesse d'environ 7200 tr/mn et un secteur donn peut tre atteint par
un dispositif mobile appel tte de lecture-criture, soit en lecture (analyse des zones magntiques
du secteur) ou en criture (modification du champ des zones magntiques du secteur). Opration
semblable celle qui se passe dans un magntoscope avec une bande magntique qui passe devant la
tte de lecture. Dans un magntoscope une tte, seule la bande magntise dfile, la tte reste
immobile, dans un disque dur le disque tourne sur son axe de symtrie et la tte est anime d'un
mouvement de translation permettant d'atteindre n'importe qu'elle piste du disque.
La tte "flotte" sur un coussin d'air engendr par
la rotation trs rapide du disque, ce qui la
maintient une hauteur constante de la surface du
disque adquate pour l'enregistrement du champ
magntique du film.
Afin d'augmenter la capacit d'un "disque dur" on empile plusieurs disques physique sur le mme axe
et on le muni d'un dispositif plusieurs ttes de lecture-criture permettant d'accder toutes les
faces et toutes les pistes de tous les disques physiques. La pile de disques construite est encore
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
97
appele un disque dur.
Pile de disques
ttes
disques et ttes en action
Dans une pile de disques on ajoute la notion de cylindre qui repre toutes les pistes portant le mme
numro sur chaque face de chacun des disques de la pile.
Formatage
Avant toute utilisation ou bien de temps autre pour tout effacer, les disques durs doivent tre
"formats", opration qui consiste crer des pistes magntiques et des secteurs vierges ( tous les bits
0 par exemple). Depuis 2005 les micro-ordinateurs sont livrs avec des disques durs dont la
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
98
capacit de stockage dpasse les 200 Go, ces disques sont pourvu d'un systme de mmoire cache
(semblable celui dcrit pour la cache du processeur central) afin d'acclrer les transferts de
donnes. Le temps d'accs une information sur un disque dur est de l'ordre de la milliseconde.
4.2 Disques optique compact ou CD (compact disk)
Untel disque peut tre en lecture seule (dans ce cas on parle de CD-ROM) ou bien en lecture et
criture (dans ce cas on parle de CD rinscriptible). Il est organis peu prs comme un disque
magntique, avec une diffrence notable : il n'a qu'une seule piste qui se droule sous la forme d'une
spirale.
Si sur un disque magntique les bits codant l'information sont reprsents par des grains
magntisables, dans un CD ce sont des creux provoqus par brlure d'un substrat aluminis
rflchissant qui reprsentent les bits d'information.
Gravure d'un CD-ROM
Comme pour un disque dur, le formatage appel gravure du CD cre les secteurs et les donnes en
mme temps. Plus prcisment c'est l'absence ou la prsence de brlures qui reprsente un bit 0 ou
1, le substrat aluminis est protg par une couche de plastique transparent.
Aprs gravure avec le graveur de CD, les bits sont matrialiss :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
99
Principe de lecture d'un CD :
Lorsque le substrat est lisse (non brl) un endroit matrialisant un bit, le rayon lumineux de la
diode laser du lecteur est rflchi au maximum de son intensit vers la cellule de rception.
On dira par exemple que le bit examin vaut 0 lorsque l'intensit du signal rflchi est maximale.
Lorsque le substrat est brl un endroit matrialisant un bit, la partie brle est irrgulire et le
rayon lumineux de la diode laser du lecteur est mal rflchi vers le capteur (une partie du
rayonnement est rflchi par les asprits de la brlure dans plusieurs directions). Dans cette
ventualit l'intensit du signal capt par rflexion est moindre.
On dira par exemple que le bit examin vaut 1 lorsque l'intensit du signal rflchi n'est pas
maximale.
La vitesse du disque est variable contrairement un disque dur qui tourne vitesse angulaire fixe. En
effet la lecture de la piste en spirale ncessite une augmentation au fur et mesure de l'loignement
du centre. Le temps d'accs une information sur un CD 54x est de l'ordre de 77 millisecondes.
Le temps d'accs sur un CD ou un DVD est 10 fois plus lent que celui d'un disque dur et environ 100
fois moins volumineux qu'un disque dur.
Toutefois leur cot trs faible et leur facilit de transport font que ces supports sont trs utilis de nos
jours et remplacent la disquette moins rapide et de moindre capacit.
Nous pouvons reprendre l'chelle comparative des temps d'accs des diffrents types de mmoires en
y ajoutant les mmoires de masse et en indiquant en dessous l'ordre de grandeur de leur capacit :
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
100
1.6 Systme dexploitation
Plan du chapitre:
1. Notion de systme dexploitation
1.1 Les principaux types d OS
monoprogrammation
multi-programmation
temps partag
1.2 Systmes d'exploitations actuels
2. Processus et multi-threading dans un OS
2.1 Les processus agissent grce au systme
2.2 Le multi-threading
2.3 Relation entre threads et processus
2.4 L'ordonnancement pour grer le temps du processeur
2.5 Un algorithme classique non premptif (cas batch processing)
2.6 Deux algorithmes classiques premptifs (cas interactif)
3. Gestion de la mmoire par un OS de multi-programmation
3.1 Mmoire virtuelle et segmentation
3.2 Mmoire virtuelle et pagination
4. Les OS des mico-ordinateurs
4.1 Le systme d'exploitation du monde libre : Linux
4.2 Le systme d'exploitation Windows de Microsoft
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
101
1. Notion de systme dexploitation
Un ordinateur est constitu de matriel (hardware) et de logiciel (software). Cet ensemble est la
disposition de un ou plusieurs utilisateurs. Il est donc ncessaire que quelque chose dans lordinateur
permette la communication entre lhomme et la machine. Cette entit doit assurer une grande
souplesse dans linterface et doit permettre daccder toutes les fonctionnalits de la machine. Cette
entit doue dune certaine intelligence de communication se dnomme " la machine virtuelle ". Elle
est la runion du matriel et du systme dexploitation (que nous noterons OS par la suite pour
Operating System).
Le systme dexploitation dun ordinateur est charg dassurer les fonctionnalits de communication
et dinterface avec lutilisateur. Un OS est un logiciel dont le grand domaines dintervention est la
gestion de toutes les ressources de lordinateur :
- mmoires,
- fichiers,
- priphriques,
- entre-sortie,
- interruptions, synchronisation...
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
102
Un systme dexploitation nest pas un logiciel unique mais plutt une famille de logiciels. Une
partie de ces logiciels rside en mmoire centrale (nomme rsident ou superviseur), le reste est
stock en mmoire de masse (disques durs par exemple).
Afin dassurer une bonne liaison entre les divers logiciels de cette famille, la cohrence de lOS est
gnralement organise travers des tables dinterfaces architectures en couches de programmation
(niveaux abstraits de liaison). La principale tche du superviseur est de grer le contrle des changes
dinformations entre les diverses couches de lOS.
1.1 Historique des principaux types d OS
Nous avons vu dans le tableau synoptique des diffrentes gnrations dordinateurs que les OS ont
subi une volution parallle celle des architectures matrielles. Nous observons en premire
approximation quil existe trois types dOS diffrents, si lon ignore les systmes rudimentaires de la
1
re
gnration.
MONOPROGRAMMATION : La 2
me
gnration dordinateurs est quipe dOS dits de "
monoprogrammation " dans lesquels un seul utilisateur est prsent et a accs toutes les ressources
de la machine pendant tout le temps que dure son travail. LOS ne permet le passage que d'un seul
programme la fois.
A titre dexemple, supposons que sur un tel systme 5 utilisateurs excutent chacun un programme
P
1
, P
2
, P
3
, P
4
, P
5
:
Dans lordre de la figure ci-haut, chaque P
i
attend
que le P
i+1
prcdent ait termin son excution
pour tre excut son tour.
Exemple de diagramme des temps dexcution de
chaque programme P
i
de la figure de gauche.
Laxe des abscisses du diagramme des temps d'excution, indique lordre de passage prcdent (P
5
,
puis P
4
etc...) nous voyons que les temps dattente dun utilisateur ne dpendent pratiquement pas de
la dure dexcution de son programme mais surtout de lordre du passage (les derniers sont
pnaliss surtout si en plus leur temps propre dexcution est faible comme P
1
par exemple).
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
103
Une vision abstraite et synthtique dun tel systme est de considrer que 5 tables suffisent le
dcrire. La table :
- des units logiques,
- des units physiques,
- des tats,
- de ventilation des interruptions,
- des canaux.
Relativement aux temps dattente, un systme de monoprogrammation est injuste vis vis des petits
programmes.
MULTIPROGRAMMATION : La 3
me
gnration dordinateur a vu natre avec elle les OS
de multiprogrammation. Dans un tel systme, plusieurs utilisateurs peuvent tre prsents en " mme
temps " dans la machine et se partagent les ressources de la machine pendant tout leur temps
dexcution.
En reprenant le mme exemple que prcdemment, P
1
, P
2
, P
3
, P
4
, P
5
sont excuts cycliquement par
lOS qui leur alloue les ressources ncessaires (disque, mmoire, fichier,...) pendant leur tranche de
temps dexcution. Nous exposons dans l'exemple ci-dessous uniquement des excutions ne
ncessitant jamais dinterruptions, ni de priorit, et nous posons comme hypothse que le temps fictif
allou pour lexcution est de 1 seconde :
Dans la figure ci-haut, chaque P
i
se voit allouer
une tranche de temps d'excution (1 seconde), ds
que ce temps est coul, l'OS passe l'excution
du P
i+1
suivant etc
Exemple de diagramme des temps dexcution
cyclique de chaque programme P
i
de la figure de
gauche.
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
104
Nous observons dans le diagramme des temps d'excution que le systme excute P
5
pendant 1
seconde, puis abandonne P
5
et excute P
4
pendant 1 seconde, puis abandonne P
4
..., jusqu' l'excution
de P
1
, lorsquil a fini le temps allou P
1
, il recommence parcourir cycliquement la liste (P
5
, P
4
, P
3
,
P
2
, P
1
)et ralloue 1 seconde de temps dexcution P
5
etc... jusqu' ce quun programme ait termin
son excution et quil soit sorti de la table des programmes excuter.
Une vision abstraite dduite du paragraphe prcdent et donc simplificatrice, est de dcrire un tel
systme comme compos des 5 types de tables prcdentes en y rajoutant de nouvelles tables et en y
incluant la notion de priorit dexcution hirarchise. Les programmes se voient affecter une priorit
qui permettra lOS selon les niveaux de priorit, de traiter certains programmes plus compltement
ou plus souvent que dautres.
Relativement aux temps dattente, un systme de multiprogrammation rtablit une certaine justice
entre petits et gros programmes.
TEMPS-PARTAGE : Il sagit dune amlioration de la multiprogrammation oriente vers le
transactionnel. Un tel systme organise ses tables dutilisateurs sous forme de files dattente.
Lobjectif majeur est de connecter des utilisateurs directement sur la machine et donc doptimiser les
temps dattente de lOS (un humain tant des millions de fois plus lent que la machine sur ses temps
de rponse).
La 4
me
gnration dordinateur a vu natre les rseaux dordinateurs connects entre eux et donc de
nouvelles fonctionnalits, comme linterfaage rseau, qui ont enrichi les OS dj existants. De
nouveaux OS entirement orients rseaux sont construits de nos jours.
1.2 Systmes d'exploitation actuels
De nos jours, les systmes d'exploitation sont des systmes de multi-programmation dirigs vers
certains type d'applications, nous citons les trois types d'application les plus significatifs.
Systme inter-actif
Un tel systme a vocation permettre l'utilisateur d'intervenir pratiquement toutes les
tapes du fonctionnement du systme et pendant l'excution de son programme (Windows
Xp, Linux sont de tels systmes).
Systme temps rel
Comme son nom l'indique, un systme de temps rel excute et synchronise des applications
en tenant compte du temps, par exemple un systme grant une chane de montage de pices
assembler doit tenir compte des dlais de prsentation d'une pice la machine d'assemblage,
puis celle de soudage etc
Systme embarqu
C'est un systme d'exploitation ddi des applications en nombre restreint et identifies : par
exemple un systme de gestion et de contrle des mesures l'intrieur d'une sonde autonome,
un systme pour assistant personnel de poche, systme pour tlphone portables se connectant
internet etc
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
105
Les principales caractristiques d'un systme d'exploitation de multi-programmation sont fondes sur
la gestion des processus et la gestion de la mmoire allouer ces processus.
2. Processus et multi-threading dans un OS
Contexte d'excution d'un programme
Lorsqu'un programme qui a t traduit en instructions machines s'excute, le processeur
central lui fournit toutes ses ressources (registres internes, place en mmoire centrale,
donnes, code,), nous nommerons cet ensemble de ressources mises disposition d'un
programme son contexte d'excution.
Programme et processus
Nous appelons en premire analyse, processus l'image en mmoire centrale d'un programme
s'excutant avec son contexte d'excution. Le processus est donc une abstraction synthtique
d'un programme en cours d'excution et d'une partie de l'tat du processeur et de la mmoire.
Lorsque l'on fait excuter plusieurs programmes "en mme temps", nous savons qu'en fait la
simultanit n'est pas relle. Le processeur passe cycliquement une partie de son temps (quelques
millisecondes) excuter squentiellement une tranche d'instructions de chacun des programmes
selon une logique qui lui est propre, donnant ainsi l'illusion que tous les programmes sont traits en
mme temps parce que la dure de l'excution d'une tranche d'instruction est plus rapide que notre
attention consciente.
Le SE (systme d'exploitation) gre 4 processus
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
106
2.1 Les processus agissent grce au systme
Processus
Nous donnons la dfinition prcise de processus propose par A.Tannenbaum, spcialiste
des systmes d'exploitation : c'est un programme qui s'excute et qui possde son propre
espace mmoire, ses registres, ses piles, ses variables et son propre processeur virtuel
(simul en multi-programmation par la commutation entre processus effectue par le
processeur unique).
Un processus a donc une vie propre et une existence phmre, contrairement au programme qui lui
est physiquement prsent sur le disque dur. Durant sa vie, un processus peut agir de diffrentes
manires possibles, il peut se trouver dans diffrents tats, enfin il peut travailler avec d'autres
processus prsent en mme temps que lui.
Diffrentes actions possibles d'un processus
- Un processus est cr.
- Un processus est dtruit.
- Un processus s'excute (il a le contrle du processeur central et excute les actions du
programme dont il est l'image en mmoire centrale).
- Un processus est bloqu (il est en attente d'une information).
- Un processus est passif (il n'a plus le contrle du processeur central).
On distingue trois actions particulires appeles tats du processus
- Etat actif : le processus contrle le processeur central et s'excute).
- Etat passif : le processus est temporairement suspendu et mis en attente, le processeur central
travaille alors avec un autre processus.
- Etat bloqu : le processus est suspendu toutefois le processeur central ne peut pas le ractiver
tant que l'information attendue par le processus ne lui est pas parvenue.
Que peut faire un processus ?
- Il peut crer d'autre processus
- Il travaille et communique avec d'autres processus (notion de synchronisation et de messages
entre processus)
- Il peut possder une ressource titre exclusif ou bien la partager avec d'autre processus.
C'est le rle de l'OS que d'assurer la gestion complte de la cration, de la destruction, des transitions
d'tats d'un processus. C'est toujours l'OS d'allouer un espace mmoire utile au travail de chaque
processus. C'est encore l'OS qui assure la synchronisation et la messagerie inter-processus.
Le systme d'exploitation implmente cette gestion des processus travers une table des processus
qui contient une entre par processus cr par le systme sous forme d'un bloc de contrle du
processus (PCB ou Process Control Block). Le PCB contient lui-mme toutes les informations de
contexte du processus, plus des informations sur l'tat du processus.
Lorsque la politique de gestion de l'OS prvoit que le processus P
k
est ractivable (c'est au tour de P
k
de s'excuter), l'OS va consulter le PCB de P
k
dans la table des processus et restaure ou non
l'activation de P
k
selon son tat (par exemple si P
k
est bloqu, le systme ne l'active pas).
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
107
Afin de sparer les tches d'un processus, il a t mis en place la notion de processus lger (ou
thread).
2.2 Le multithreading
Nous pouvons voir le multithreading comme un changement de facteur d'chelle dans le
fonctionnement de la multi-programmation.
En fait, chaque processus peut lui-mme fonctionner comme le systme d'exploitation en lanant des
sous-tches internes au processus et par l mme reproduire le fonctionnement de la multi-
programmation. Ces sous-tches sont nommes "flux d'excution" "processus lgers"ou Threads.
Qu'est exactement un thread
- Un processus travaille et gre, pendant le quantum de temps qui lui est allou, des
ressources et excute des actions sur et avec ces ressources. Un thread constitue la partie
excution d'un processus allie un minimum de variables qui sont propres au thread.
- Un processus peut comporter plusieurs threads.
- Les threads situs dans un mme processus partagent les mmes variables gnrales de
donnes et les autres ressources alloues au processus englobant.
- Un thread possde en propre un contexte d'excution (registres du processeur, code,
donnes)
Cette rpartition du travail entre thread et processus, permet de charger le processus de la gestion
des ressources (fichiers, priphriques, variables globales, mmoire,) et de ddier le thread
l'excution du code proprement dit sur le processeur central ( travers ses registres, sa pile lifo
etc).
Le processus applique au niveau local une multi-programmation interne qui est nomme le
multithreading. La diffrence fondamentale entre la multi-programmation et nomme le
multithreading se situe dans l'indpendance qui existe entre les processus,alors que les threads sont
lis minima par le fait qu'ils partagent les mme donnes globales (celles du processus qui les
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
108
contient).
2.3 Relations entre thread et processus
Ci-dessous nous supposons que le processus D assign l'application D, excute en mme temps les
3 Threads D1, D2 et D3 :
Soit par exemple 4 processus qui s'excutent "en mme temps" dont le processus D prcdent
possdant 3 threads :
La commutation entre les threads d'un processus fonctionne identiquement la commutation entre les
processus.
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
109
Chaque thread se voit allou cycliquement, lorsque le processus D est excut une petite tranche de
temps dans le quantum de temps allou au processus. Le partage et la rpartition du temps sont
effectus uniquement par le systme d'exploitation.
Dans l'exemple ci-dessous, nous figurons les processus A, B, C et le processus D avec ses threads
dans un graphique reprsentant un quantum de temps d'excution allou par le systme et suppos
tre la mme pour chaque processus.
Le systme ayant allou le mme temps d'excution chaque processus, lorsque par exemple le tour
vient au processus D de s'excuter dans son quantum de temps, il excutera pendant une petite sous-
tranche de temps D1, puis D2, enfin D3 et attendra le prochain cycle.
Voici sous les mmes hypothses de quantum de temps gal d'excution allou chaque processus A,
B, C et D, le comportement de l'excution sur 2 cycles conscutifs :
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
110
La majorit des systmes d'exploitation (Windows, Unix, MacOs,...) supportent le Multithreading.
Diffrences et similitudes entre threads et processus :
- La communication entre les threads est plus rapide que la communication entre les
processus.
- Les Threads possdent les mmes tats que les processus.
- Deux processus peuvent travailler sur une mme donne (un tableau par exemple) en lecture
et en criture, dans une situation de concurrence dans laquelle le rsultat final de l'excution
dpend de l'ordre dans lequel les lectures et critures ont lieu, il en est de mme pour les
threads.
Les langages de programmation rcents comme Delphi, Java et C# disposent chacun de classes
permettant d'crire et d'utiliser des threads.
Concurrence en cas de donnes partages
Un OS met en place les notions de sections critiques, de verrou, de smaphore et de mutex
afin de grer les situations de concurrence des processus et des threads dans le cadre de
donnes partages.
Mais il existe aussi une autre situation de concurrence inluctable sur une machine mono-processeur,
lorsqu'il s'agit de partager le temps d'activit du processeur central entre plusieurs processus. Une
solution cette concurrence est de grer au mieux la rpartition du quantum de temps allou aux
processus.
2.4 L'ordonnancement pour grer le temps du processeur
Dans un systme d'exploitation, c'est l'ordonnanceur (scheduler ou logiciel d'ordonnancement) qui
tablit la liste des processus prts tre excuts et qui effectue le choix du processus excuter
immdiatement selon un algorithme d'ordonnancement. Dans ce paragraphe le mot tche dsigne
aussi bien un processus qu'un thread.
Ordonnancement coopratif ou premptif
- Un algorithme d'ordonnancement est dit premptif lorsqu'une tche qui s'excute peut tre
interrompue aprs un dlai d'horloge fix appel quantum de temps, mme si la tche est
en cours d'excution.
- Un algorithme d'ordonnancement est dit coopratif lorsqu'une tche s'excute soit jusqu'au
terme de son excution, soit parce qu'elle libre de son propre chef l'activit du processeur
Remarque
Dans les deux cas premptif et coopratif, la tche peut suspendre elle-mme son excution si elle
reconnat que le temps d'attente d'une donne risque d'tre trop long comme dans le cas d'une entre-
sortie vers un priphrique ou encore l'attente d'un rsultat communiqu par une autre tche. La
diffrence importante entre ces deux modes est le fait qu'une tche peut tre suspendue aprs un dlai
maximum d'occupation du processeur central.
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
111
Dans un OS interactif comme Windows, Linux, Mac OS par exemple, la premption est
fondamentale car il y a beaucoup d'intervention de l'utilisateur pendant l'excution des tches. Une
des premires versions de Windows (Windows 3) tait cooprative et lorsqu'une tche buggait elle
pouvait bloquer tout le systme (par exemple le lecteur de CD-ROM ouvert en cours d'excution en
attente d'une lecture impliquait un gel du systme), ce n'est plus le cas depuis les versions suivantes
de Windows (98, Xp, )
2.5 Un algorithme classique non premptif dans un OS de batch processing: FCFS (First Come First
Served)
Dans un OS de traitement par lot (batch processing) qui est un systme dans lequel les utilisateurs
n'interagissent pas avec l'excution du programme (mise jour et gestion des comptes clients dans
une banque, calculs scientiques,), multi-programmation avec premption n'est pas ncessaire, la
coopration seule suffit et les performances de calcul en sont amliores.
Un algorithme d'ordonnancement important et simple purement coopratif de ce type d'OS se nomme
First Come First Served (premier arriv, premier servi). Toutes les tches ligibles (prtes tre
excutes) sont places dans une file d'attente unique, la premire tche T
1
en tte de file est excute
:
jusqu' ce qu'elle s'interrompe elle-mme (entre-sortie, rsultat,) elle est alors remise en queue de
liste et c'est la tche suivante T
2
de la liste qui est excute et ainsi de suite :
2.6 Deux algorithmes classiques premptifs dans un OS interactif
Dans un OS interactif comme Windows par exemple, ce sont les threads qui sont ordonnancs
puisque ce sont les threads qui sont chargs dans un processus, de l'excution de certaines actions du
processus qui sert alors de conteneur aux threads et aux ressources utiliser. Comme prcdemment
nous nommons tche (soit un thread, soit un processus) l'entit ordonnancer par le systme.
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
112
Algorithme de plus haute priorit
Les tches T
i
se voient attribuer un ordre de priorit P
k
et sont ranges par ordre de priorit
dcroissant dans une liste de tches toutes prtes tre excutes. Cette liste est organise comme
une file d'attente, il y a une file d'attente par niveau de priorit, dans la file de priorit P
k
toutes les
tches T
i
k
ont le mme ordre de priorit P
k
:
Dans l'exemple ci-contre P
0
reprsente la priorit la plus
haute et P
n
la priorit la plus basse.
Une tche est excute pendant au plus la dure du
quantum de temps qui lui est allou (elle peut
s'interrompre avant la fin de ce quantum de temps).
Les tches de plus haute priorit sont excutes d'abord depuis celles de priorit P
0
jusqu' la priorit
P
n
.
Les tches T
i
k
de mme priorit P
k
sont excutes selon un mcanisme de tourniquet, les unes la
suite des autres jusqu' puisement de la file, ds qu'une tche a fini d'tre excute, elle est remise en
fin de liste d'attente de sa file de priorit :
Chemin d'excution des tches
etc
Excution des tches de la file de priorit P0
( une fois excute, une tche est range la fin de la file )
Le systme peut changer les priorits d'une tche aprs l'excution du quantum de temps qui lui a t
allou.
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
113
Algorithme du tourniquet (Round Robin)
C'est le premier algorithme qui a t utilis en multi-programmation. Il ressemble l'algorithme
FCFS utilis dans le cas d'un OS de batch processing, le systme alloue un quantum de temps
identique chaque tche ou selon le cas une tranche de temps variable selon le type de tche.
Toutes les tches ligibles sont placs dans une file d'attente unique, la premire tche T
1
en tte de
file est excute, jusqu' ce que :
- Soit elle s'interrompe elle-mme (entre-sortie, rsultat,)
- Soit le quantum de temps qui lui tait allou a expir.
Dans ce cas, elle est remise en fin de file d'attente et c'est la tche suivante T
2
de la file qui est
excute selon les mmes conditions et ainsi de suite :
3. Gestion de la mmoire par un OS de multi-programmation
Puisque dans un tel OS, plusieurs tches sont prsentes en mmoire centrale, un instant donn, il
faut donc que chacune dispose d'un espace mmoire qui lui est propre et qui soit protg de toute
interaction avec une autre tche. Il est donc ncessaire de partitionner la mmoire centrale MC en
plusieurs sous-ensembles indpendants.
Plusieurs tches s'excutant en mmoire centrale utilisent gnralement plus d'espace mmoire que
n'en contient physiquement la mmoire centrale MC, il est alors indispensable de mettre en place un
mcanisme qui allouera le maximum d'espace mmoire physique utile une tche et qui librera cet
espace ds que la tche sera suspendue. Le mme mcanisme doit permettre de stocker, grer et
rallouer une autre tche l'espace ainsi libr.
Les techniques de segmentation et de pagination mmoire dans le cadre d'une gestion de mmoire
nomme mmoire virtuelle, sont une rponse ces proccupations d'allocation et de dsallocation de
mmoire physique dans la MC.
Du fait de la multi-programmation, les tches sont charges (stockes) dans des parties de la MC dont
l'emplacement physique n'est dtermin qu'au moment de leur excution. Sans entrer trs
profondment dans les deux mcanismes qui ralisent la rpartition de la mmoire alloue aux tches,
la segmentation et la pagination mmoire, nous dcrivons d'une manire gnrale ces deux mthodes
; les ouvrages spcialiss en la matire cits en bibliographie dtaillent exhaustivement ces procds.
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
114
3.1 Mmoire virtuelle et segmentation
On dsigne par mmoire virtuelle, une mthode de gestion de la mmoire physique permettant de
faire excuter une tche dans un espace mmoire plus grand que celui de la mmoire centrale MC.
Par exemple dans Windows et dans Linux, un processus fix se voit allou un espace mmoire de 4
Go, si la mmoire centrale physique possde une taille de 512 Mo, le mcanisme de mmoire
virtuelle permet de ne mettre un instant donn dans les 512 Mo de la MC, que les lments
strictement ncessaires l'excution du processus, les autres lments restant stocks sur le disque
dur, prts tre ramens en MC la demande.
Un moyen employ pour grer la topographie de cette mmoire virtuelle se nomme la segmentation,
nous figurons ci-aprs une carte mmoire segmente d'un processus.
Segment de mmoire
Un segment de mmoire est un ensemble de cellules mmoires contigus.
Le nombre de cellules d'un segment est appel la taille du segment, ce nombre n'est pas
ncessairement le mme pour chaque segment, toutefois tout segment ne doit pas dpasser
une taille maximale fixe.
La premire cellule d'un segment a pour adresse 0, la dernire cellule d'un segment adr
k
est borne par la taille maximale autorise pour un segment.
Un segment contient gnralement des informations de mme type (du code, une pile, une
liste, une table, ...) sa taille peut varier au cours de l'excution (dans la limite de la taille
maximale), par exemple une liste de donnes contenues dans un segment peut augmenter
ou diminuer au cours de l'excution.
Les cellules d'un segment ne sont pas toutes ncessairement entirement utilises.
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
115
L'adresse d'une cellule l'intrieur d'un segment s'appelle l'adresse relative (au segment)
ou dplacement. On utilise plus habituellement la notion d'adresse logique permettant
d'accder une donne dans un segment, par opposition l'adresse physique qui
reprsente une adresse effective en mmoire centrale.
C'est un ensemble de plusieurs segments que le systme de gestion de la mmoire utilise pour allouer
de la place mmoire aux divers processus qu'il gre.
Chaque processus est segment en un nombre de segments qui dpend du processus lui-mme.
Adresse logique ou virtuelle
Une adresse logique aussi nomme adresse virtuelle comporte deux parties : le numro du segment
auquel elle se rfre et l'adresse relative de la cellule mmoire l'intrieur du segment lui-mme.
Remarques
Le nombre de segments prsents en MC n'est pas fixe.
La taille effective d'un segment peut varier pendant l'excution
Pendant l'excution de plusieurs processus, la MC est divise en deux catgories de blocs : les blocs
de mmoire libre (libr par la suppression d'un segment devenu inutile) et les blocs de mmoire
occupe (par les segments actifs).
Fragmentation mmoire
Le partitionnement de la MC entre blocs libres et blocs allous se dnomme la fragmentation
mmoire, au bout d'un certain temps, la mmoire contient une multitude de blocs libres qui
deviendront statistiquement de plus en plus petits jusqu' ce que le systme ne puisse plus
allouer assez de mmoire contigu un processus.
Exemple
Soit une MC fictive de 100 Ko segmentable en segments de taille maximale 40 Ko, soit un processus
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
116
P segment par le systme en 6 segments dont nous donnons la taille dans le tableau suivant :
Numro du segment Taille du segment
1 5 Ko
2 35 Ko
3 20 Ko
4 40 Ko
5 15 Ko
6 23 Ko
Supposons qu'au dpart, les segments 1 4 sont chargs dans la MC :
Supposons que le segment n2 devenu inutile soit dsallou :
Puis chargeons en MC le segment n5 de taille 15 Ko dans l'espace libre qui passe de 35 Ko 20 Ko :
La taille du bloc d'espace libre diminue.
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
117
Continuons l'excution du processus P en supposant que ce soit maintenant le segment n1 qui
devienne inutile :
Il y a maintenant sparation de l'espace libre (fragmentation) en deux blocs, l'un de 5 Ko de mmoire
contigu, l'autre de 20 Ko de mmoire contigu, soit un total de 25 Ko de mmoire libre. Il est
toutefois impossible au systme de charger le segment n6 qui occupe 23 Ko de mmoire, car il lui
faut 23 Ko de mmoire contigu. Les systme doit alors procder une rorganisation de la mmoire
libre afin d'utiliser "au mieux" ces 25 Ko de mmoire libre.
Compactage
Dans le cas de la gestion de la MC par segmentation pure, un algorithme de compactage est lanc ds
que cela s'avre ncessaire afin de ramasser ces fragments de mmoire libre parpills et de les
regrouper dans un grand bloc de mmoire libre (on dnomme aussi cette opration de compactage
sous le vocable de ramasse miettes ou garbage collector)
La figure prcdente montre gauche, une mmoire fragmente, et droite la mme mmoire une
fois compacte.
Adresse virtuelle - adresse physique
Nous avons parl d'adresse logique d'une donne par exemple, comment le systme de gestion d'une
mmoire segmente retrouve-t-il l'adresse physique associe : l'OS dispose pour cela d'une table
dcrivant la "carte" mmoire de la MC.
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
118
Cette table est dnomme table des segments, elle contient une entre par segment actif et prsent
dans la MC.
Une entre de la table des segments comporte le numro du segment, l'adresse physique du segment
dans la MC et la taille du segment.
Liaison entre Table des segments et le segment lui-mme en MC :
Lorsque le systme de gestion mmoire rencontre une adresse virtuelle de cellule (n segment,
Dplacement), il va chercher dans la table l'entre associe au numro de segment, rcupre dans
cette entre l'adresse de dpart en MC du segment et y ajoute le dplacement de l'adresse virtuelle et
obtient ainsi l'adresse physique de la cellule.
En reprenant l'exemple de la figure prcdente, supposons que nous prsentons l'adresse virtuelle ( k
, 8 ). Il s'agit de rfrencer la cellule d'adresse 8 l'intrieur du segment numro k. Comme le
segment nk est physiquement implant en MC partir de l'adresse 1005, la cellule cherche dans le
segment se trouve donc l'adresse physique 1005+8 = 1013.
La figure ci-aprs illustre le mcanisme du passage d'une adresse virtuelle vers l' adresse physique
travers la table des segments sur l'exemple ( k , 8 ).
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
119
La segmentation mmoire n'est pas la seule mthode utilise pour grer de la mmoire virtuelle, nous
proposons une autre technique de gestion de la mmoire virtuelle trs employe : la pagination
mmoire. Les OS actuels employant un mlange de ces deux techniques, le lecteur se doit donc d'tre
au fait des mcanismes de base de chaque technique.
3.2 Mmoire virtuelle et pagination
Comme dans la segmentation mmoire, la pagination est une technique visant partitionner la
mmoire centrale en blocs (nomms ici cadres de pages) de taille fixe contrairement aux segments
de taille variable.
Lors de l'excution de plusieurs processus dcoups chacun en plusieurs pages nommes pages
virtuelles. On parle alors de mmoire virtuelle pagine. Le nombre total de mmoire utilise par les
pages virtuelles de tous les processus, excde gnralement le nombre de cadres de pages disponibles
dans la MC.
Le systme de gestion de la mmoire virtuelle pagine est charg de grer l'allocation et la
dsallocation des pages dans les cadres de pages.
La MC est divise en un nombre de cadres de pages fix par le systme (gnralement la taille d'un
cadre de page est une puissance de 2 infrieure ou gale 64 Ko).
La taille d'une page virtuelle est exactement la mme que celle d'un cadre de page.
Comme le nombre de pages virtuelles est plus grand que le nombre de cadres de pages on dit aussi
que l'espace d'adressage virtuel est plus grand que l'espace d'adressage physique. Seul un certain
nombre de pages virtuelles sont prsentes en MC un instant fix.
A l'instar de la segmentation, l'adresse virtuelle (logique) d'une donne dans une page virtuelle, est
compose par le numro d'une page virtuelle et le dplacement dans cette page. L'adresse virtuelle est
transforme en une adresse physique relle en MC, par une entit se nommant la MMU (Memory
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
120
Management Unit) assiste d'une table des pages semblable la table des segments.
La table des pages virtuelles
Nous avons vu dans le cas de la segmentation que la table des segments tait plutt une liste (ou table
dynamique) ne contenant que les segments prsent en MC, le numro du segment tant contenu dans
l'entre. La table des pages virtuelles quant elle, est un vrai tableau indic sur les numros de pages.
Le numro d'une page est l'indice dans la table des pages, d'une cellule contenant les informations
permettant d'effectuer la conversion d'une adresse virtuelle en une adresse physique.
Comme la table des pages doit rfrencer toutes les pages virtuelles et que seulement quelques unes
d'entre elles sont physiquement prsentes en MC, chaque page virtuelle se voit attribuer un drapeau
de prsence (reprsent par un bit, la valeur 0 indique que la table est actuellement absente, la valeur
1 de ce bit indique qu'elle est actuellement prsente en MC).
Schma simplifi d'une gestion de MC pagine (page d'une taille de 64Ko) illustrant le mme
exemple que pour la segmentation, soit accs une donne d'adresse 8 dans la page de rang k, le
cadre de page en MC ayant pour adresse 1005, la page tant prsente en MC :
Lorsque la mme demande d'accs une donne d'une page a lieu sur une page qui n'est pas prsente
en MC, la MMU se doit de la charger en MC pour poursuivre les oprations.
Dfaut de page
Nous dirons qu'il y a dfaut de page lorsque le processeur envoie une adresse virtuelle localise dans
une page virtuelle dont le bit de prsence indique que cette page est absente de la mmoire centrale.
Dans cette ventualit, le systme doit interrompre le processus en cours d'excution, il doit ensuite
lancer une opration d'entre-sortie dont l'objectif est de rechercher et trouver un cadre de page libre
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
121
disponible dans la MC dans lequel il pourra mettre la page virtuelle qui tait absente, enfin il mettra
jour dans la table des pages le bit de prsence de cette page et l'adresse de son cadre de page.
La figure prcdente illustre un dfaut de page d'une page P
k
qui avait t anciennement charge dans
le cadre d'adresse adr
0
, mais qui est actuellement absente. La MMU recherche cette page par exemple
sur le disque, recherche un cadre de page libre (ici le bloc d'adresse adr
2
est libre) puis charge la page
dans le cadre de page et l'on se retrouve ramen au cas d'une page prsente en MC :
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
122
En fait, lorsqu'un dfaut de page se produit tous les cadres de pages contiennent des pages qui sont
marques prsentes en MC, il faut donc en sacrifier une pour pouvoir caser la nouvelle page
demande. Il est tout fait possible de choisir alatoirement un cadre de page, de le sauvegarder sur
disque et de l'craser en MC par le contenu de la nouvelle page.
Cette attitude qui consiste faire systmatiquement avant tout chargement d'une nouvelle page une
sauvegarde de la page que l'on va craser, n'est pas optimise car si la page que l'on sauvegarde est
souvent utilise elle pnalisera plus les performances de l'OS (car il faudra que le systme recharge
souvent) qu'une page qui est trs peu utilise (qu'on ne rechargera pas souvent).
Cette recherche d'un "bon" bloc librer en MC lors d'un dfaut de page est effectue selon plusieurs
algorithmes appels algorithmes de remplacement. Nous donnons une liste des principaux noms
d'algorithmes utilisables en cas de dfaut de page. Tous ces algorithmes diffrent par la mthode
qu'ils emploient pour choisir la page de remplacement (bloc libre) selon sa frquence d'utilisation ou
bien selon le temps coul depuis sa dernire utilisation :
NRU ( Not Recently Use )
LRU ( Last Recently Use )
LFU ( Last Frequently Use )
MFU ( Most Frequently Use )
NFU ( Not Frequently Use )
FIFO ( Fist In First Out )
L'algorithme LRU semble tre le plus performant dans le maximum de cas et il est celui qui est le
plus utilis. Cet algorithme ncessite une gestion supplmentaire des pages libres en MC selon une
liste d'attente : la page la plus rcemment utilise est la premire de la liste, elle est suivie par la
deuxime page la plus rcemment utilise et ainsi de suite jusqu'au dernier lment de la liste qui est
la page la moins rcemment utilise.
Le fondement pratique de cet algorithme se trouve dans le fait qu'une page qui vient d'tre utilise a
de bonne chance d'tre rutilise par la suite trs rapidement.
Dans les OS, les concepteurs laborent des variantes personnalises de cet algorithme amliorant tel
ou tel aspect.
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
123
4. Les OS des micro-ordinateurs
Les micro-ordinateurs apparus dans le grand public ds 1978 avec le Pet de Commodore, lApple et
lIBM-PC, ont rpt en acclr les diffrentes phases dvolution des gnrations dordinateurs.
Les OS des micro-ordinateurs ont suivi la mme dmarche et sont partis de systmes de
monoprogrammation comme MS-DOS et MacOS pour voluer en systmes multi-tches (version
affaiblie de la multiprogrammation) avec OS/2 , windows et Linux.
De nos jours un OS de micro-ordinateur doit ncessairement adopter des normes de convivialit dans
la communication homme-machine sous peine dtre rejet par le grand public. L, gt notre sens,
un des seuls intrts de limpact puissant du march sur linformatique. La pression des masses de
consommateurs a fait sortir linformatique des milieux dinitis, et sil ny avait pas cette pression,
les OS seraient encore accessibles uniquement par des langages de commandes textuels dont les
initis raffolent (la comprhension dun symbolisme abstrus dnotant pour certains la marque dune
supriorit toute illusoire et assez insignifiante). Notons aussi que la rticence au changement, la
rsistance la nouveaut et la force de lhabitude sont des caractristiques humaines qui nont pas
favoris le dveloppement des interfaces de communication. La communication conviviale des
annes 90-2000 rside essentiellement dans des notions inventes dans les annes 70-80 Xerox
PARC (Palo Alto Research Center of Xerox), comme la souris, les fentres, les menus droulants, les
icnes, et que la firme Apple a commercialis la premire dans lOS du MacIntosh ds 1984.
Windows de Microsoft et OS/2 dIBM se sont dailleurs rallis cette ergonomie.
Outre le systme Mac OS (un Unix-like version OS X) du MacIntosh d'Apple qui ne reprsente
qu'une petite part du march des OS vendus sur micro-ordinateurs ( environ 3% du march), deux OS
se partagent en proportion trs ingale ce mme march Windows de Microsoft ( environ 90% du
march) et Linux OS open source du monde libre ( moins de 10% du march), Linux reprsentant
presque 50% des OS installs pour les serveurs Web. Le BeOs est un autre systme Unix-like
dvelopp pour micro-ordinateur lui aussi fond sur des logiciels GNU mais il est officiellement
payant (le prix est modeste et quivalent aux distributions de Linux).
4.1 Le systme dexploitation du monde libre Linux
A.Tannenbaum crit en 1987 pour ses tudiants, un systme d'exploitation pdagogique baptis
MINIX fond sur le systme UNIX : c'est a naissance d'un systme d'exploitation fond sur Unix
sans droit de licence. Linus Thorvalds reprend l'OS Minix et en 1994, la premire version
oprationnelle et stable d'un nouveau systme est accessible gratuitement sous le nom de LINUX.
UNIX est un OS de multi-programmation commercial fond lui-mme sur les concepts du systme
MULTICS et construit par des chercheurs du MIT et des laboratoires Bell. Il s'agissait d'une version
allge de MULTICS qui a fonctionn durant les annes 1960-1970 sur de trs gros ordinateurs. Les
centres de calculs inter-universitaires franais de cette dcennie fonctionnaient sous MULTICS. L'OS
Unix a t largement implant et distribu sur les mini-ordinateurs PDP-11 de la socit DEC et sur
les VAX successeurs des PDP-11 de la mme socit.
Unix se voulait un systme d'exploitation portable et universel, malheureusement des versions
diffrentes et incompatibles entre elles ont t dveloppes et cet tat de fait perdure encore de nos
jours. Nous trouvons actuellement des Unix drivs de BSD (de l'universit de Berkeley) le plus
connu tant FreeBSD et des Unix drivs du System V (de la socit ATT).
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
124
Points forts de Linux
Linux n'tant pas soumis aux contraintes commerciales, reste unique puisque les enrichissements
qui lui sont apports ne peuvent tre propritaires.
Linux contient tout ce qu'une version commerciale d'Unix propose, sauf la maintenance systme
qui n'est pas garantie.
Linux rassemble et intgre des fonctionnalits prsentes dans les deux Unix BSD et System V.
Vous pouvez modifier Linux et le revendre, mais vous devez obligatoirement fournir toutes les
sources l'acheteur.
Linux supporte le multithreading et la pagination mmoire.
Points faibles de Linux
Utiliser le systme Linux, mme avec une interface comme KDE ou Gnome demande une
comptence particulire l'utilisateur, car Linux reste encore orient dveloppeur plutt
qu'utilisateur final.
Plusieurs distributions de Linux coexistent. Une distribution comporte un noyau commun,
portable et standard de Linux accompagn de diverses interfaces, de programmes et d'outils
systmes complmentaires et de logiciels d'installations, nous citons quelques distributions les
plus connues : Mandrake, Red Hat, Debian, Suse, Caldera, Cette diversit donne au final un
ventail de "facilits" qui semble tre trop large parce que diffrentes entre elles et pouvant
drouter l'utilisateur non informaticien.
Linux essaie de concurrencer le systme Windows sur PC, le match est encore ingal en nombre de
logiciels installs fonctionnant sous cet OS, malgr un important battage mdiatique effectu autour
de ce systme dans la fin des annes 90 et les rumeurs rcurrentes de la disparition de Windows voir
mme de la socit Microsoft.
4.2 Le systme dexploitation Windows de Microsoft
Le premier systme d'exploitation de PC (Personnal Computer) conu par la socit Microsoft dans
le dbut des annes 1980 se nomme MS-DOS ( systme de mono-programmation) qui a volu en
vritable systme de multi-programmation (avec processus, mmoire virtuelle, multi-tches
premptifetc) partir de Windows 95, puis Windows 98, Me. La premire version de Windows
non base sur MS-DOS a pour nom de code Windows NT au dbut des annes 1990, depuis
Windows 2000 qui est une amlioration de Windows NT, les successeurs comme Windows 2003, Xp
et longhorn sont des systmes d'exploitation part entire, qui possdent les mmes fonctionnalits
fondamentales qu'Unix et donc Linux.
Une grande diffrence entre Linux et Windows se situe dans la manire de grer l'interface utilisateur
(partie essentielle pour l'utilisateur final qui n'est pas un administrateur systme). Cette remarque peut
expliquer l'cart important d'installation de ces deux systmes sur les PC. En outre les dmarches
Les bases de linformatique - programmation - ( rv. . 04.01.2005 ) page
125
intellectuelles qui ont sous-tendu la construction de chacun de ces deux systme sont inverses.
En effet, Linux est driv d'un systme d'exploitation invent pour les gros ordinateurs des annes 70,
systme auquel il a t rajout un programme utilisateur non privilgi appel interface de
communication (KDE, Motif, Gnome, ) de cette architecture dcoule le foisonnement d'interfaces
diffrents droutant l'utilisateur de base.
Windows l'inverse, est parti d'un OS primitif et spcifique un PC pour intgrer au cours du temps
les fonctionnalits d'un OS de mainframe (gros ordinateur). L'interface de communication (le
fentrage graphique) est intgr dans le cur mme du systme. Le mode console (interface en ligne
de commande genre MS-DOS ou ligne de commande Linux) est prsent mais est trs peu utilis, les
fonctionnalits de base du systme tant assures par des processus fentrs.
Les deux systmes Linux et Windows fonctionnent sur les plates-formes bases sur les principaux
micro-processeurs quipant les PC du march (Intel majoritairement et AMD) aussi bien sur
l'architecture 32 bits que sur l'architecture 64 bits toute rcente.
Etant donn la remarquable croissance de l'innovation en technologie, les systmes d'exploitation
voluent eux aussi afin d'adapter le PC aux diffrents outils invents. Enfin, il y a bien plus
d'utilisateurs non informaticiens qui achtent et utilisent des PC que d'informaticiens professionnels,
ce qui implique une transparence et une convivialit obligatoire dans les communications homme-
machine. Un OS idal pour PC grand public doit convenir aussi bien au professionnel qu'
l'utilisateur final, pour l'instant Windows l'emporte trs largement sur Linux, mais rien n'est dit, le
consommateur restera l'arbitre.
Nous avons abord ici des fonctionnalits importantes d'un systme d'exploitation, nous avons
indiqu qu'un OS assurait d'autres grandes fonctions que nous n'avons pas abordes, comme la
gestion des entres-sorties, l'interception des interruptions, la gestion des donnes sur des
priphriques comme les disques durs dvolue au module de gestion des fichier de l'OS. Ici aussi le
lecteur intress par l'approfondissement du domaine des systmes d'exploitation peut se rfrer la
bibliographie, en particulier un ouvrage de 1000 pages sur les OS par le pre de MINIX
A.Tannebaum.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
126
1.7 Rseaux
Plan du chapitre:
1. Les topologies physiques des rseaux d'ordinateurs
1.1 Les diffrentes topologies de rseaux
1.2 Rseau local
2. Liaisons entre rseaux
2.1 Topologie OSI 7 couches
2.2 Rseau commutation de paquets
3. Internet et le protocole TCP/IP
Protocole, adresse IP
Routage
Protocole IP
Protocole TCP
Petite histoire d'Internet
Intranet
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
127
Nous nous proposons dans ce chapitre, d'tudier les dfinitions thoriques ncessaires la
comprhension des notions fondamentales de rseau numrique informatique. Lobjectif principal
dun rseau dordinateurs est de relier et de permettre lexploitation distance de systmes
informatiques laide des tlcommunications dans le cadre de rseaux grande distance (les
rseaux locaux emploient une technologie de cblage interne lentreprise).
Nous classons les rseaux informatiques en deux grandes catgories :
Les rseaux locaux LAN (Local Area Network) de quelques centaines de mtres d'tendue au
maximum, labors soit avec des fils, soit sans fil.
Le grand rseau international Internet concernant toute la plante.
Les raisons principales pour la mise en place d'un rseau informatique, sont de pouvoir partager des
donnes entre plusieurs ordinateurs et si possible partager le mme traitement sur plusieurs
ordinateurs.
Dans ce chapitre, aprs avoir nonc les principes fondateurs des rseaux, nous concentrerons notre
attention sur un rseau mondial incontournable de nos jours : Internet et son architecture logicielle
fonde sur l'environnement logiciel TCP/IP mondialement utilis et prsent dans les OS Unix et
Windows.
1. Les topologies physiques des rseaux d'ordinateurs
Il existe diffrentes manires dinterconnecter des systmes informatiques distance. On les nomme
topologies physiques de rseaux.
1.1 Les diffrentes topologies physiques de rseaux
A) Le point point simple
- n liaisons pour n systmes S
i
interconnects,
- 1 seul point de connexion.
Architecture toile
B)Le point point en boucle
- n liaisons pour n systmes S
i
interconnects,
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
128
- Chaque S
i
passe linformation au S
i
suivant.
Architecture anneau
C) Le point point complet
- n(n-1)/2 liaisons pour n systmes S
i
interconnects,
- tous les S
i
sont relis entre eux.
Architecture maille
D) Le point point arborescent
- n liaisons pour n systmes S
i
interconnects un mme noeud,
- 1 liaison pour chaque noeud vers ses descendants,(topologie toile chaque noeud).
Architecture hirarchique
E) Le multipoint
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
129
- n liaisons pour n systmes S
i
interconnects un mme noeud,
- les points de connexion sont relis par une mme voie.
Architecture en bus
Il existe aussi des rseaux construits selon des combinaisons de ces topologies entre elles.
1.2 Rseau local
Cest un rseau dont les distances de liaison sont trs faibles(entreprise, tablissement scolaire, une
salle,...).
Les rseaux locaux peuvent comporter ou non des serveurs(systme informatique assurant la
rpartition et la gestion de ressources communes aux utilisateurs) et utiliser lune des cinq
architectures prcdentes.
Ils sont composs de liaisons hertziennes ou tablies par cble. Lorsquil y a plusieurs serveurs,
chaque serveur peut tre un poste de travail comme les autres ou bien tre un serveur ddi(ne
faisant office que de serveur). Signalons que la partie rseau local des micro-ordinateurs dots dun
OS comme Windows ne ncessite aucun serveur ddi mais fonctionne aussi avec une version du
systme de type serveur.
Les deux principaux standards qui se partagent lessentiel du march des rseaux locaux sont
Ethernet (topologie en bus) et token-ring (topologie en anneau). Les protocoles (loi dchange
dinformation entre les systmes informatiques) sont trs nombreux. Le plus utilis quantitativement
dans le monde est TCP/IP (Transfert Control Protocol/Internet Protocol) qui est un protocole
synchrone orient bit (les informations sont des suites de bits).
L'Ethernet comme moyen de transport et d'accs
Le cblage Ethernet est le plus utilis dans le monde, il est fond sur la mthode "dtection de
porteuse accs multiple et dtection de collisions".
Ethernet permet de raccorder entre eux au plus 2
10
= 1024 ordinateurs.
Il est support physiquement selon le dbit souhait soit par du cble coaxial, soit de la paire de
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
130
fils torsads, soit de la fibre optique; ces diffrents supports peuvent coexister dans un mme
rseau.
Quelques exemples de dbits dlivrs par un cblage Ethernet :
L'Ethernet classique (10 BaseT) transportant l'information la vitesse de 10 Mbits/s ( 10 millions
de bits par seconde ). Avec l'Ethernet classique, la distance maximale thorique d'loignement de
deux machines avec un mme cble est de 5 Km. La pose de Hub (sorte de prise multiple rgnrant
le signal entrant) est ncessaire : au maximum 2 Hub qui sont spars par une distance thorique
maximale de 500 m.
Cette contrainte ramne la distance maximale d'loignement entre deux machines connectes grce
des Hub 1,5 Km, des techniques particulires permettent malgr tout d'atteindre les 5 Km avec des
Hub en utilisant de la fibre optique.
Le Fast Ethernet (100 BaseT) est une extension du 10 BaseT, il permet de transporter de
l'information la vitesse de 100 Mbits/s ( 100 millions de bits par seconde ) avec un mme cble sur
une distance maximale de 500 m qui correspond la limitation impose par la vitesse de transmission
du signal physique dans le conducteur. Dans la pratique selon le nombre de Hub, la distance
thorique maximale d'loignement entre deux machines est rduite d'environ la moiti.
Le Gigabit Ethernet (1000 BaseT) qui permet de transporter de l'information la vitesse de 1000
Mbits/s ( 1000 millions de bits par seconde ) par cble ou fibre optique, est une volution rcente de
l'Ethernet, l'augmentation de la vitesse de transmission rduit drastiquement la distance maximale
thorique d'loignement de deux machines avec un mme cble environ 50 m et quelques mtres
si elles sont connectes par des Hub.
Les chiffres qui sont donns sur les figures prcdentes concernant les distances, ne sont pas
prendre au pied de la lettre, car ils peuvent varier selon les technologies ou les combinaisons de
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
131
techniques utilises. Ce qu'il est bon de retenir, c'est le fait que dans cette technique Ethernet, la
longueur des connexions diminue avec la vitesse du dbit.
2. Liaisons entre rseaux d'ordinateurs
Il existe diverses techniques dinterconnexion de rseaux entre eux. Nous renvoyons le lecteur des
ouvrages spcialiss sur les rseaux. Nous allons brosser un tableau simple et gnral du rseau
mondial le plus connu de nos jours au niveau du grand public, le rseau Internet. Nous verrons
ensuite comment il est adapt par les spcialistes des architectures locales sous la forme dIntranet.
En premier lieu donnons quelques explications techniques sur un mode classique de transmission de
linformation utilis par de nombreux rseaux.
Vocabulaire de base employ
Dans un rseau informatique on distingue trois niveaux de description :
La topologie physique
La topologie logique
Les protocoles de transmission
La topologie physique dcrit l'infrastructure d'interconnexion des systmes informatiques.
La topologie logique est une architecture logicielle normalisant les critres de qualit et les
modalits "d'emballage" et de transmission des informations par la topologie physique.
Un protocole est un ensemble de rgles dcrivant l'mission et la rception de donnes sur un rseau
ainsi que la liaison entre une application externe et la topologie logique du rseau.
Nous avons dj examin au paragraphe prcdent les diffrentes topologies physiques (on dit aussi
architecture physique), nous proposons maintenant, la description du modle de rfrence le plus
rpandu d'une architecture (topologie) logique, mis en place depuis les annes 1980 par l'organisation
internationale de standardisation ( ISO ). Ce modle logique est appel Open System Interconnection
( OSI ).
2.1 Topologie OSI 7 couches
Le modle OSI sert de base la thorie gnrale des rseaux, c'est un modle thorique prsentant la
circulation des donnes dans un rseau, il est dcrit en 7 couches : les plus hautes sont abstraites et
les plus basses sont concrtes.
Ce modle dcrit trs prcisment la liaison qui existe entre deux nuds successifs d'un rseau (deux
ordinateurs, par exemple) d'un manire descendante et dcompose :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
132
Modle OSI 7 couches numrotes
Chaque couche rend un service dcrit dans la documentation de l'ISO et gr par un protocole
permettant de raliser ce service lorsque la couche est abstraite. Lorsque la couche est matrielle la
documentation dcrit comment le service est rendu par le composant matriel.
Chaque couche de niveau n communique avec la couche immdiatement suprieure n+1 (lorsqu'elle
existe) et la couche immdiatement infrieure n-1 (lorsqu'elle existe).
La couche physique la plus basse est la plus concrte elle est numrote 1, la couche application la
plus haute est la plus abstraite, elle est numrote 7.
Cette organisation en couche d'abstractions descendantes va se retrouver aussi dans la notion de
programmation structure par abstractions descendantes, il s'agit donc d'un fonctionnement constant
de l'esprit des informaticiens.
Nous dcrivons brivement chacune des 7 couches du modle OSI :
Nom de la couche Description du service rendu par la couche
7 - Application Transfert des fichiers des applications s'excutant sur l'ordinateur.
6 - Prsentation Codage des donnes selon un mode appropri.
5 - Session Gestion des connexions entre les ordinateurs.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
133
4 - Transport Gestion du transfert des donnes vers le destinataire.
3 - Rseau Schma gnral d'interconnection (adressage) afin d'assurer le reprage
physique du destinataire.
2 - Liaison Rgles permettant d'effectuer le rassemblage et l'acheminement des donnes
vers le matriel physique de la couche 1.
1 - Physique Description physique du transport des donnes travers des cbles, des hubs
2.2 Rseau commutation de paquets
Dans un tel type de rseau nous avons besoin de dfinir au moins trois concepts :
- le message : linformation change entre deux systmes informatiques.
- les paquets : des petites suites de bits constituant une partie dun message, (le message est
dcoup en plusieurs paquets).
- le routage : cest laction (effectue par le routeur) qui permet la transmission, laiguillage et la
redirection des informations circulant sur le rseau un instant donn.
Un tel rseau est architectur selon une topologie plus ou moins fortement maille, entre les divers
concentrateurs. Les utilisateurs S
i
se connectent selon leur proximit gographique au concentrateur
le plus proche.
Dans le schma suivant, reprsentant une maille du rseau, nous supposons que lutilisateur
S
3
veuille envoyer un message M(image, fichier, son, etc...) S
10
. Nous allons suivre le
chemin parcouru par les paquets p
i
du message M pour aller de S
3
S
10
.
S
3
est directement connect au concentrateur [A], S
10
est directement connect au concentrateur [D].
Supposons aussi que le message M soit compos de 4 paquets : M=(p
1
,p
2
,p
3
, p
4
).
Le routage de dpart seffectue partir du concentrateur [A] et de la charge et de lencombrement
actuels du rseau. Ce sont ces deux critres qui permettent au routeur de prendre la dcision
dmission des paquets.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
134
Principe du routage :
Les paquets dans un tel rseau sont envoys dans nimporte quel ordre
et indpendamment les uns des autres vers des destinations diverses ;
chaque paquet voyage bien sr, avec ladresse du destinataire du
message.
a) Supposons que p
1
aille directement vers [D], puis que lencombrement oblige denvoyer p
2
[B]
puis p
3
, p
4
[C].
b) Puis [C] peut router directement p
3
, p
4
vers [D] (qui a dj reu p
1
).
c) Enfin [B] envoie p
2
[C] et celui-ci le redirige vers [D] (qui avait dj reu p
1
,p
3
et p
4
).
d) Lorsque p
2
arrive au concentrateur [D], le message M est complet, il peut tre reconstitu M =(p
1
,p
2
,p
3
, p
4
)et expdi son destinataire S
10
.
3. Internet et le protocole TCP/IP
Le rseau le plus connu se dnomme Internet. Chaque pays peut avoir mis en place un rseau
national, (par exemple en France, il existe un rseau national public TRANSPAC fonctionnant par
commutations de paquets sous protocole X25), le rseau Internet quant lui est international et
fonctionne par commutations de paquets sous protocole TCP/IP.
Cest actuellement le rseau mondial de transmission de donnes le plus utilis avec plusieurs
centaines de millions dutilisateurs.
- Cest un rseau commutation de paquets.
- Il est bas sur le protocole TCP/IP.
- Il permet des milliers dautres rseaux locaux ou non de se connecter entre eux distance.
Explication pratique de la transmission de donnes sur Internet
Prenons un exemple pratique, M
r
. X situ Moscou dsire envoyer le message suivant "Bonjour cher
ami comment allez-vous ?" M
r
. Y situ Ankara, via le rseau Internet.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
135
Protocole, adresse IP
La communication entre deux machines distantes implique une normalisation des changes sous
forme de rgles. Un tel ensemble de rgles est appel un protocole de communication. Un protocole
dcompose la communication en sous-problmes simples traiter dnomm couche du protocole.
Chaque couche a une fonction prcise et fait abstraction du fonctionnement des couches suprieures
et infrieures.
Le protocole de communication TCP/IP utilis par Internet, est fond sur le modle OSI, il intervient
essentiellement sur 4 couches du modle OSI : application, transport, rseau et interface
Un individu est identifiable par son numro de scurit sociale (deux personnes diffrentes n'ont pas
le mme numro de scurit sociale), de mme chaque ordinateur branch sur Internet se voit
attribuer un numro unique qui permet de l'identifier.
On dnomme adresse IP un tel identifiant. Une adresse IP se prsente sous la forme de 4 nombres
(entre 0 et 255) que l'on spare par des points pour des raisons de lisibilit , exemple : 163.85.210.8.
Donc l'ordinateur de M
r
. X situ Moscou est connect Internet possde une adresse IP (par
exemple : 195.114.12.58), celui de Mr.Y possde aussi une adresse IP (par exemple :
208.82.145.124)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
136
Le message initial de M
r
.X va tre dcoup par TCP/IP, fictivement pour les besoins de l'exemple en
quatre paquets (en fait la taille relle d'un paquet IP est d'environ 1500 octets) :
Le message initial de MrX est donc dcoup avec les en-ttes adquates :
(chaque en-tte/identifiant de paquet contient l'adresse de l'ordinateur de l'expditeur M
r
.X soit :
195.114.12.58 et celle du destinataire M
r
.Y soit : 208.82.145.124 )
Le routage
Supposons que nous avons la configuration de connexion figure ci-aprs :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
137
Le schma prcdent reprsente les points de routage fictifs du rseau Internet au voisinage de
Moscou et Ankara.
Le routage sur Internet est l'opration qui consiste trouver le chemin le plus court entre deux
points du rseau en fonction en particulier de l'encombrement et de l'tat du rseau.
Cette opration est effectue par un routeur qui peut tre soit un matriel spcifique raccord un
ordinateur, soit un ordinateur quip d'un logiciel de routage.
Chaque routeur dispose d'une table l'informant sur l'tat du rseau, sur le routeur suivant en fonction
de la destination et sur le nombre de routeurs ncessaires pour aller vers la destination.
Dans notre exemple, nous avons suppos que le routeur de Moscou soit branch avec les quatre
routeurs d'Ankara , d'Helsinki , de Berlin et de Bucarest :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
138
Informations collectes au moment de l'envoi
du 1
er
paquet partir de Moscou :
Ankara (tat : en rparation)
Helsinki (tat : disponible)
Berlin (tat : disponible)
Bucarest (tat : satur)
La table de routage aura peu prs cette allure :
Routeur Destination Nombre de routeurs Routeur suivant Etat
Moscou Ankara 5 Helsinki libre
Moscou Ankara 2 Bucarest satur
Moscou Ankara 3 Berlin libre
Moscou Ankara 1 Ankara indisponible
Il est vident que d'aprs la table prcdente seules deux destinations immdiates sont libres : le
routeur d'Helsinki ou le routeur de Berlin.
Comme le nombre de routeurs restant parcourir est moindre en direction de Berlin vers Ankara (3
routeurs : Berlin-Bucarest-Ankara) compar celui de la direction Helsinki vers Ankara (5 routeurs :
Helsinki-Oslo-Berlin-Bucarest-Ankara), c'est le trajet Berlin qui est choisi pour le premier paquet
"Bonjour".
Au bout de quelques instants, les 4 paquets obtenus partir du message de M
r
.X voyagent sur
Internet indpendamment les uns des autres vers des destinations diverses (n'oublions pas que
chaque paquet voyage avec ladresse du destinataire du message qui est situe Ankara).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
139
Carte : Le voyage des paquets
Sur cette carte :
Le paquet n1 "Bonjour" , voyage vers le routeur de Bucarest.
Le paquet n2 "cher ami" , voyage vers le routeur de Londres.
Le paquet n3 "comment" , voyage vers le routeur d'Ankara.
Le paquet n4 "allez-vous ?" , voyage vers le routeur d'Athnes.
A l'arrive Ankara, le routeur d'Ankara reoit les paquets en ordre disperss et en des temps
diffrents et les stocke en attendant que le message soit complet :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
140
Le routeur d'Ankara vrifie que les paquets sont tous bien arrivs, il redemande ventuellement les
paquets manquants, il envoi un accus de rception pour prvenir chaque routeur expditeur que les
donnes sont bien arrives.
Au final il y a rassemblage des paquets pour reconstituer le message original avant de le distribuer
au logiciel de lecture du message de M
r
.Y :
En savoir un peu plus sur : adressage IP et transport TCP
Le protocole TCP/IP est en fait un vocable pour un ensemble de protocoles de transport des donnes
sur Internet (passerelles, routage, rseau), fonds sur deux protocoles pres IP et TCP.
IP = Internet Protocol
TCP = Transmission Control Protocol
Le protocole IP :
permet des ordinateurs relis un rseau gr par IP de dialoguer grce la notion d'adresse
actuellement avec la norme IPv4 sous la forme de 4 nombres (entre 0 et 255) d'un total de 32 bits, ce
numro permet d'identifier de manire unique une machine sur le rseau, comme une adresse postale
avec un numro de rue (la nouvelle norme IPv6 tend le nombre d'adresses possibles).
Le protocole IP gnre donc des paquet nomms des datagrammes contenant une en-tte (l'adresse
IP) et des donnes :
Ces datagrammes sont remis une passerelle (opration de routage) destination d'un hte.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
141
Toutefois, si une adresse postale permet d'atteindre son destinataire prcisment c'est parce qu'elle
contient en plus du nom et du numro de la rue, le nom de la personne qui elle est adresse. Il en est
de mme pour une transmission sur Internet :
Action externe : M
r
. X situ Moscou envoie un message M
r
. Y situ Ankara.
Action informatique : L'ordinateur de M
r
. X envoie un message trs prcisment au logiciel de mail
de l'ordinateur de M
r
. Y, il est donc ncessaire que le logiciel de mail puisse tre identifi, c'est un
numro dans l'ordinateur rcepteur qui va l'identifier " le numro de port".
Ainsi il devient facile d'envoyer une mme machine identifie par son adresse IP, plusieurs donnes
destines des applications diffrentes s'excutant sur cette machine (chaque application est
identifie par son numro de port).
Le protocole TCP permet de :
Grer les ports
Vrifier l'tat du destinataire pour assurer la rception des paquets
Grer les paquets IP :
Dcoupe des paquets
Vrification de la rception de tous les paquets
Redemande des paquets manquants
Assemblage des paquets arrivs
La Donne initiale de chacun des 4 paquets ("Bonjour", cher ami" , "comment", "allez-vous ?") est
modifie par chaque couche du protocole TCP/IP par l'ajout d'une En-tte spcifique ncessaire la
ralisation de la fonction de cette couche.
Plusieurs protocoles plus gnraux sont fonds sur TCP/IP : DNS, SMTP, FTP, POP3, HTTP.
DNS (Domain Name Service) est un protocole permettant de convertir un nom de domaine Internet
en une adresse IP ( nom de domaine : www.machin.org, adresse obtenue : 203.54.145.88 )
SMTP (Simple Mail Transfert Protocol) est un protocole d'envoi de messages lectroniques (mails)
vers un destinataire hbergeant la bote aux lettres.
POP3 (Post Office Protocol version 3) est un protocole permettant de rapatrier sur votre machine
personnelle le courrier qui a t dpos dans la bote aux lettres de l'hbergeur.
FTP (File Transfert Protocol) est un protocole permettant de rapatrier sur votre machine ou
d'expdier partir de votre machine des fichiers binaires quelconques.
HTTP (Hyper Text Transfert Protocol) est un protocole permettant d'envoyer et de recevoir sur
votre machine des fichiers HTML au format ASCII.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
142
Dans le cas d'HTTP, le paquet construit contient alors une partie identifiant supplmentaire :
Ci-dessous la comparaison entre le modle thorique OSI et TCP/IP :
La petite histoire d'Internet
Le concept d'Internet n'est pas rcent. Il prend naissance en effet la fin des annes soixante dans les
rangs des services militaires amricains qui ont peur de voir leurs systmes d'information dtruits
par l'effet lectro-magntique induit par une explosion nuclaire. Il demande leurs chercheurs de
concevoir un moyen sr de transporter des informations qui ne dpendrait pas de l'tat gnral
physique du rseau, voir mme qui supportera la destruction physique partielle tout en continuant
d'acheminer les informations.
Officieusement ds les annes cinquante au USA, dans le plus grand secret est mis au point un rseau
de transmission de donnes militaires comme le rseau SAGE uniquement rserv aux militaires. Les
chercheurs du MIT vont mettre au point en 1969 la commutation de paquets dont nous venons de
parler, et concevrons l'architecture distribue qui sera choisie pour le rseau.
Officiellement, la premire installation effective sera connu sous le nom d'ARPANET aura lieu en
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
143
1970 en raccordant les 4 universits amricaines de Santa Barbara, de l'Utah, de Stanford et de Los
Angeles. Plusieurs universits amricaines s'y raccorderont et continueront les recherches jusqu'en
1974 date laquelle V.Cerf et R.Kahn proposent les protocoles de base IP et TCP. En 1980 la
direction de l'ARPA rendra public les spcifications des ces protocoles IP et TCP. Pendant vingt ans
ce rseau a servit aux militaires et aux chercheurs.
Il faut attendre 1990 pour voir s'ouvrir le premier service de fourniture d'accs au rseau par
tlphone. Au mme moment, ARPANET disparat pour laisser la place Internet. Un an plus tard,
les principes du Web sont tablis.
Le world wide web : www
C'est la partie d'Internet la plus connue par le grand public. A l'origine, le World Wide Web (WWW)
a t dvelopp en 1990 au CERN, le Centre Europen pour la Recherche Nuclaire, par R.Caillau et
T.Berners-Lee. Il autorise l'utilisation de textes, de graphiques, d'animations, de photographies, de
sons et de squences vido, avec des liens entre eux fonds sur le modle hypertextuel.
Le Web est un systme hypermdias du genre client/serveur.
C'est sur ces spcifications qu' a t labor le langage de description de document du web HTML
(Hyper Text Markup Language).
Pour lire et excuter ces hypermdias, il faut un logiciel que l'on dnomme un navigateur. Mosaic est
l'un des premiers navigateurs Web, distribu gratuitement au public. Depuis 1992, les utilisateurs de
micro-ordinateurs peuvent alors se connecter Internet partir de leur PC. Internet Explorer de
Microsoft et Netscape sont les deux principaux navigateurs les plus utiliss dans le monde.
Les points forts dInternet :
Il permet un citoyen de se connecter nimporte o en disposant de :
- Un micro-ordinateur du commerce,
- Un systme dexploitation supportant les protocoles adquats, tous les SE de micro-ordinateur
depuis 1997 disposent dun moyen simple de se connecter Internet (Windows, Linux en sont
deux exemples),
- Un modem (se branchant sur une ligne tlphonique ordinaire) 56000bps ou plus (ADSL) ou
bien le cble en attendant de nouveaux produits de transport des signaux.
- Un abonnement chez un fournisseur daccs Internet (noeud de communication concentrateur),
- Enfin un navigateur permettant de dialoguer avec les diffrents serveurs prsents sur Internet.
Le revers de mdaille dInternet :
Linorganisation totale de cette gigantesque et formidable banque de donnes quest un tel rseau
mondial qui contient le meilleur et le pire, peut engendrer des dangers pour le citoyen et mme pour
une dmocratie si lon ne reste pas vigilant.
Enfin, selon les pays, les cots dutilisation restent importants (abonnement chez le fournisseur et
dure de communication tlphonique pour la connexion), la concurrence des fournisseurs d'accs
gratuit permet une baisse du cot gnral de la connexion. La connexion illimite et gratuite reste
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
144
l'objectif atteindre.
Internet est devenu un problme de socit
Trois courants de pense s'affrontent quant l'impact d'Internet sur les socit humaines :
- Le courant du tout-Internet qui prne un nouveau monde virtuel o Internet intervient tous
les niveaux de la vie prive, publique, professionnelle, culturelle voir spirituelle.
- Le courant des Internetophobes qui rejette ce nouveau monde virtuel vu comme une
accentuation encore plus marque entre les "riches" et les "pauvres" (la richesse ne s''valuant
plus uniquement en bien matriels, mais aussi en informations).
- Le courant des "ni-ni", ceux qui considrent que tout outil mrite que l'on s'en serve avec
rflexion pour le plus grand nombre, mais qui pensent qu'un outil n'est pas une rvolution sociale
en lui-mme, seul l'homme doit rester au centre des dcisions qui le concernent.
La tendance au dbut du XXI scle est de renforcer l'aspect commercial (e-business) de ce type
de produit sous la pousse des thories ultra-librales, au dtriment de l'intrt gnral pour
une utilisation plus citoyenne au service de tous.
Intranet
Les entreprises conscientes du danger de pillage, de sabotage et despionnage industriel ont repris les
avantages de la conception dInternet en ladaptant la notion de rseau local.
Cest le nom dIntranet qui sest impos. Ce genre de rseau local dentreprise est fond sur les
mmes techniques, les mmes procds quInternet, mais fonctionne localement avec un certain
nombre d'acteurs bien identifis :
- Il peut donc tre organis selon la dmarche interne de lentreprise.
- Il nest accessible quaux personnes autorises si lentreprise le souhaite.
- Il est connectable Internet par des passerelles contrles.
- Il concerne toutes les activits logistiques, commerciales et de communication de lentreprise.
- Il permet de mettre en uvre des activits de groupware (travaux rpartis par tches
identifies sur des systmes informatiques).
Il peut tre organis en Extranet, permettant la communication entre Intranets de diffrentes et bien
sr, un Intranet peut tre connect Internet.
Le lecteur pourra se spcialiser sur tous les types de rseaux de tlcommunication autres, auprs de
l'ouvrage de rfrence de 1100 pages du spcialiste franais G.Pujolle : "Les rseaux" cits en
bibliographie.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
145
Exercices chapitre1
Questions :
On suppose que X, Y et Z sont des variables boolennes, donnez pour chaque circuit ci-dessous
l'expression de sa fonction logique S1(X,Y) ou S1(X,Y,Z), valuez la table de vrit de S1, puis
simplifiez par calcul S1.
Ex-1 : Ex-2 :
Ex-3 : Ex-4 :
Ex-5 :
Ex-6 :
Ex-7 : Lorsque l'on additionne deux entiers positifs en binaire sign dans un ordinateur, le calcul s'effectue dans l'UAL en
propageant la retenue sur tous les bits y compris le bit de signe.
Soient deux mmoires 7 bits Mx et My, contenant respectivement l'entier x et l'entier y reprsents en binaire sign avec
convention du zro positif :
1) Quel est le nombre entier positif maximal que l'on peut stocker dans Mx ou My ?
2) Quel est le nombre entier ngatif minimal que l'on peut stocker dans Mx ou My ?
3) Donnez le rsultat de l'addition de Mx+My dans une mmoire Mz du mme type que Mx et My, dans les
deux cas suivants :
3.1) Mx contient l'entier x = 12, My contient l'entier x = 25
3.2) Mx contient l'entier x = 42, My contient l'entier x = 25
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
146
Ex-8 : Soit l'entier x = 325 :
1) Donnez sa reprsentation en codage binaire pur
2) Donnez sa reprsentation en codage Ascii tendu
3) Quel est en nombre de bits le codage le plus court ?
4) D'une manire gnrale pour un entier positif x n chiffres en reprsentation dcimale donnez un majorant
du nombre de bits dans la reprsentation de x en binaire pur, vrifiez le calcul pour x = 325.
Ex-9 : Soit une mmoire centrale et un registre adresse contenant l'adresse d'une case quelconque de la mmoire centrale :
On suppose que le registre adresse soit une
mmoire 12 bits.
On suppose que la taille du mot dans la mmoire
centrale est de 16 bits.
On suppose que la case x contient en binaire en
complment deux le nombre 325.
1) Combien de mots (de cases) au maximum peut contenir cette mmoire centrale ?
2) Quel est l'entier positif le plus grand reprsentable en complment deux dans un mot de cette mmoire centrale ?
3) Indiquez si les nombres suivants peuvent tre l'adresse d'un mot dans cette mmoire centrale ;
3.1)le nombre 683
3.2)le nombre 2AB
3.3)le nombre 2AB0
3.4)le nombre -5
Rponses :
Ex-1 : S1 = x .y + y simplifie S1 = y
Ex-2 : S1= (x + y) .y simplifie S1 = y
Ex-3 : S1= x + y +y simplifie S1 = 1
Ex-4 : S1= (x +y) + (x + y) y simplifie S1 = 1
Ex-5 : S1: (x + y + y.z ) . (y.z) simplifie S1 = y.z
Ex-6 : S1= (x y). (y.x) simplifie S1 = 0
Ex-7 : 1) le nombre maximum = 2
6
-1 (soit 63)
2) le nombre minimum = -2
6
(soit -64)
3.1) Mx+My = 37 ( car: 0001100 + 0011001 = 0100101 )
3.2) Mx+My = -3 ( car: 0101010 + 0011001 = 1000011 , le bit de signe a t cras)
Ex-8 : 1) x =101000101
2) x = 00110011 . 00110010 . 00110101 (car chaque symbole est cod sur 8 bits)
3) Le codage binaire pur du nombre x occupe 9 bits alors que son codage Ascii occupe 24 bits.
4) Soit k le nombre de bits (nombre de chiffres binaires) de l'entier x, en dcimal x est compos de n chiffres
dcimaux x < 10
n
, en binaire x se compose de k chiffres binaires x < 2
k
, ds que 2
k
~ 10
n
ou encore k ~ n
log
2
10, soit donc le nombre de bits est de l'ordre de la partie entire du nombre approch n log
2
10, soit k ~ 3,32 .
n . Pour un nombre 3 chiffres k ~ 9, donc 9 bits suffiront pour coder ce nombre en binaire pur.
Ex-9 : 1) cette mmoire centrale peut contenir au maximum 2
12
= 4096 mots.
2) le plus grand entier vaut : 2
15
-1 (soit 32737).
3) 683 (oui), 2AB (oui ), 2AB (non plus de 12 bits ), -5 (non, une adresse est un nombre positif ou nul)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
147
Chapitre 2 : Programmer avec un
langage
2.1.Les langages
- Historique des langages de programmation
- Langages procduraux
- langages fonctionnels
- langages logiques
- langages objets
- langages de spcification
- langages hybrides
2.2.Relations binaires
- Rappel et conventions
- matrice d'une relation binaire
- fermeture transitive d'une relation binaire
2.3.Thorie des langages
- notations et dfinitions
- grammaire formelle
- classification de Chomsky
- applications - exemples
2.4.Les bases du langage Delphi-Pascal
- structure d'un programme
- les oprateurs
- dclarations des types
- instructions
- fonctions/procdures
- paramtres
- visibilit
- passage par adresse
- variables dynamiques
- rcursivit
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
148
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
149
2.1 : Les langages
Plan du chapitre:
1.Historique des langages
1.1 Les langages procduraux ou impratifs
1.2 Les langages fonctionnels
1.3 Les langages logiques
1.4 Les langages orients objets (L.O.O)
1.5 Les langages de spcification
1.6 Les langages hybrides
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
150
1. Historique des langages de programmation
La communication entre lhomme et la machine seffectue laide de plusieurs moyens
physiques externes. Les ordres que lon donne lordinateur pour agir sont fonds sur la
notion dinstruction comme nous lavons dj vu. Ces instructions constituent un langage de
programmation. Depuis leur cration, les langages de programmation ont volu et se sont
diversifis.
Schmatiquement il est possible de les classer en cinq catgories :
1 Les langages procduraux ou impratifs.
2 Les langages fonctionnels.
3 Les langages logiques.
4 Les langages objets.
5 Les langages de spcification.
Lun des principaux objectifs dun langage de programmation est de permettre la construction
de logiciels ayant un minimum de qualits comme la fiabilit, la convivialit, lefficacit.
Il faut connatre lhistoire des langages et se rendre compte qu ce jour, malgr les nouveaux
langages du march et leur efficacit, c'est Cobol qui est le plus utilis (numriquement 200
milliards de lignes Cobol seraient intgres des applications existantes [programmez, n63
Avril 2004] dont 5 milliards de lignes nouvelles chaque anne) dans le monde.
Linvestissement intellectuel et matriel prdomine sur la nouveaut. Cette remarque est la
clef de la comprhension de lvolution actuelle et future des langages.
Les langages ont fait leurs premiers pas directement sur des instructions machines crites en
binaire, donc rudimentaires sur le plan smantique. Les amliorations sur cette catgorie de
langages se sont limites construire des langages symboliques (langage avec mnmonique)
et des macro-assembleurs. J.Backus dIBM avec son quipe a mis au point ds 1956-1958 le
premier langage volu de lhistoire, uniquement conu pour le calcul scientifique ( lpoque
lordinateur ntait quune calculatrice gante).
Les annes 70 ont vu sloigner un rve dinformaticien : parler et communiquer en langage
naturel avec lordinateur.
Actuellement les langages volus se diversifient et augmentent en qualit dabstraction et de
convivialit.
fig : classification sur un axe dabstraction : de la machine lhomme
Les langages majoritairement les plus utiliss actuellement sont ceux qui font partie de la
catgorie des langages procduraux ou Hybrides. Les ordinateurs tant des machines de
Turing (amliores par von Neumann), la notion de mmoire machine est reprsente par la
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
151
donne abstraite quest une variable, dans un langage procdural. Dautre part, les machines
de Tring sont squentielles et les langages impratifs traitent les instructions
squentiellement. Ceci indique que les langages procduraux sont parfaitement bien adapts
larchitecture de lordinateur ; ils sont donc plus " facilement " adaptables la machine.
1.1 Les langages procduraux ou impratifs
Tous les langages procduraux ont un anctre commun : le langage FORTRAN.
Voici un arbre gnalogique (non exhaustif) de certains langages connus. Pour chaque
langage nous avons indiqu quelques lments de rfrence.
Par exemple : FORTRAN (58) [scientifique - IBM] signifie que le premier compilateur
commercial a t diffus environ en 1958, que le domaine dactivit pour lequel le langage a
t labor est le domaine du calcul scientifique, enfin quil sagit dun acte commercial
puisque cest la compagnie IBM qui la fait raliser.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
152
Dans cette courte liste, seuls Algol, Basic et Pascal sont des langages qui ont t conus par
des quipes dans des buts de recherche ou denseignement. Les autres langages sont labors
par des firmes et des compagnies dans des buts de commercialisation, de rationalisation des
cots de gestion (DOD) etc... Les langages de programmation, comme le reste des outils de la
science informatique, sont fortement soumis aux rgles du march, ce qui provoque pour cette
discipline le pire et le meilleur.
Pour donner les proprits des autres catgories de langages, nous nous servirons de la
catgorie des langages procduraux comme rfrence.
Dans un langage procdural, laffectation (transfert dune valeur dans une mmoire) est la
base des actions sur les donnes. La catgorie la plus utilise aprs les langages procduraux
est celle des langages fonctionnels.
1.2 Les langages fonctionnels
Dans un langage fonctionnel, les actions reposent sur des fonctions mathmatiques ou non qui
renvoient des rsultats.
Un langage fonctionnel est essentiellement compos dun dictionnaire de fonctions
prdfinies et dun mcanisme de construction de nouvelles fonctions par lutilisateur.
Citons quelques reprsentants des langages fonctionnels :
LISP :(LISt Processing - 1962) en fait cest essentiellement un langage de traitement de listes.
SCHEME : cest un dialecte pdagogique pur(1975) de LISP.
ML : langage fonctionnel moderne(1990) class dans la catgorie des langages fonctionnels
fortement typs (lINRIA diffuse gratuitement sur micro-ordinateur une version CAML-Light
pour lenseignement). CAML est utilis actuellement pour l'enseignement de l'informatique
dans les classes prparatoires aux grandes coles scientifiques franaises.
1.3 Les langages logiques
Citons la catgorie des langages de programmation en logique et son principal reprsentant :
PROLOG (PROgrammation en LOGique - 1982).
Driv de lintelligence artificielle, il oblige le programmeur penser ses actions en termes de
buts et en faire une description relationnelle (vision dclarative).
Le langage Prolog est fond sur un moteur dinfrence dordre 1 (logique des prdicats), et
permet lexploration exhaustive automatique de diffrents chemins amenant des solutions. Il
possde une qualit intressante : il est possible dinterprter un programme prolog dune
manire dclarative ou dune manire procdurale.
Le Groupe dIntelligence Artificielle de Marseille-Luminy fournit des prologs sur micro-
ordinateurs travers la socit PrologIA.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
153
1.4 Les langages orients objets (L.O.O)
Les langages objets : ils sont fonds sur une seule catgorie dlments : " les objets " qui
communiquent entre eux grce lenvoi de messages (grce des oprateurs appels
mthodes). Par rapport un langage impratif typ, un objet est lquivalent (mutatis
mutandis) dune variable (simple ou structure) et la classe dont il est linstance correspond
au type de la variable.
SIMULA-67 (1967) est le premier langage objet, SMALLTALK-80(1980) est un
environnement de dveloppement purement objet, Eiffel(1990) est un langage objet tourn
vers le gnie logiciel et la rutilisabilit.
1.5 Les langages de spcification
Les langages de spcification sont encore du domaine de la recherche. Leurs objectifs sont de
dcrire le plus rigoureusement possible (les modles principaux sont mathmatiques) un
logiciel afin de pouvoir le valider et le vrifier.
Nous ne mentionnerons ici que le langage LPG de D.Bert(Grenoble) pour les spcifications
de types abstraits algbriques, Z de J.R. Abrial, le langage dont la notation est fonde sur la
thorie des ensembles (puis dune amlioration de Z dnote B par Abrial) et VDMlangage
formel de spcification par pr-condition et post-condition. Ces langages ne peuvent tre
utiliss dune manire pratique que sous forme de notation, bien quils soient implants sur
des systmes informatiques. Ils ne sont pas encore la disposition du grand public comme les
langages des catgories prcdentes, bien que certains soient utiliss dans des sites industriels.
Par la suite, nous utiliserons un langage de spcification pdagogique fond sur les types
abstraits algbriques.
1.6 Les langages hybrides
Une mention spciale ici pour des concepts hybrides qui peuvent tre de bons compromis
entre des catgories diffrentes. Les concepteurs de tels langages essaient dimporter dans leur
langage les qualits inhrentes au moins deux catgories. La catgorie la plus utilise est
celle des langages impratifs.
Par exemple, la plupart des langages impratifs purs cits plus haut bnficient dune "
extension " objet, comme C++ qui est une extension oriente objet du langage C conu
lorigine pour crire le systme dexploitation Unix.
Plus rcemment est apparu un langage comme Delphi de Borland qui allie lapproche
pdagogique et type du Pascal, lapproche objet du C++ et les approches visuelles et
vnementielles de Visual Basic de Microsoft (la sortie fin 2001 de la version entirement
oriente objet de VB, dnomme VB .Net, procure Visual Basic un statut de langage
hybride).
Enfin, mentionnons l'important langage Java de Sun Microsystems qui permet le
dveloppement multi-plateforme en particulier pour lintranet et qui est grandement utilis
malgr son lger manque de rapidit d sa machine virtuelle.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
154
Un mot enfin sur le tout rcent langage C# support de dveloppement de la plateforme
Microsoft .Net, qui a t invent par le pre du langage Delphi (C# s'approprie des avantages
de Java et de Delphi, il suit de trs prs la syntaxe de Java et celle de C++)et qui est le fer de
lance de la plateforme .Net de microsoft.
Object Pascal, C++, Ada95, Java, C# sont des langages procduraux qui ont t fortement
tendus ou remanis pour se conformer aux standards objets.
Remarque de vocabulaire:
Lordinateur ne " comprenant " que le langage binaire, il lui faut donc un
"traducteur" qui lui traduise en binaire excutable, les instructions que
lhumain lui fournit en langage volu.
Cette traduction est assure par un programme appel compilateur.
Un compilateur du langage L est donc un programme charg de traduire un programme
"source" crit en L par un humain, en un programme " cible " crit en binaire
excutable par lordinateur.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 155
2.2 : Relations binaires
Plan du chapitre:
1. Rappel et convention
1. Relation binaire sur un ensemble
2. Produit de relations binaires
3. Reprsentation matricielle dune relation binaire
4. Relation binaire transpose
5. Matrice du produit de deux relations
6. Fermeture transitive dune relation binaire
7. Fermeture rflexo-transitive dune relation binaire
8. Algorithmes de calcul de matrices
9. Exemple de calcul sur une gnalogie
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 156
1. Rappels et conventions
Un peu de mathmatiques utiles, mais pas trop !
En informatique, la notion de relation est importante. Nous indiquons ici sans rentrer dans les
dtails que le lecteur trouvera dans des livres spcialiss, en particulier sur la recherche
oprationnelle, comment on implante une relation binaire travers sa matrice de
reprsentation. Ceci peut donc tre considr comme un bon exemple dapplication des
matrices boolennes en informatique.
Convention
Lorsque nous crivons " x a " ceci se lit: "x vaut la valeur de a".
1. Relation binaire sur un ensemble
Nous appelons relation binaire sur un ensemble E non vide, tout sous-ensemble R du produit
cartsien E x E.
R c E x E
Il est donc possible de dfinir lunion et lintersection de deux relations binaires.
2. Produit de relations binaires
Soient et o deux relations binaires sur un ensemble non vide E. On dfinit le produit des
deux relations t = .o ainsi :
a , a e E
b , b e E
a .o b ssi - c , c e E / (a c) et (c o b)
Nous nonons brivement quelques proprits de ce produit :
- Le produit est associatif.
- Le produit nest pas commutatif.
Notations

n
= . .... (n fois)

0
, est la relation telle que :
a , a e E on a toujours a
0
a

n+m
=
n
.
m
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 157
3. Reprsentation matricielle dune relation binaire
Cas o E est un ensemble fini, cest dailleurs le seul cas qui nous intresse en informatique
o nous ne pouvons pas traiter du non fini.
Soit E lensemble : E = { a
1
, a
2
, ..., a
n
}
- Soit une relation binaire sur E.
- Soit M une matrice carre dordre n sur {0,1}. Nous notons ((m
i,j
)) llment
gnrique de la matrice M.
Nous dirons que M est la matrice de reprsentation de la relation binaire et nous la
noterons M, ssi par dfinition :
si a
i
a
j
alors m
i,j
1 sinon m
i,j
0 fsi
Exemple :
E = { 7,8,3 } ; = { (7,8),(7,3),(3,8),(8,7) }
a
1
= 7 ; a
2
= 8 ; a
3
= 3
Voici la matrice M de la relation dfinie ci-haut :
M =
4. Relation binaire transpose
- Soit E lensemble : E = {a
1
,a
2
,...,a
n
}
- Soit une relation binaire sur E.
Nous notons
t
la relation binaire telle que :
a , a e E
b , b e E
a
t
b ssi b a
Par construction la matrice de
t
est la transpose de la matrice de .
M
t
=
t
M
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 158
5. Matrice du produit de deux relations
En munissant lensemble {0,1} dune structure dalgbre de boole avec les oprateurs . ,
v , , il nous est possible deffectuer des calculs sur les matrices de reprsentation de
relations binaires.
- Soient et o deux relations binaires sur un ensemble non vide E. Soit le produit des
deux relations , t = .o, M , Mo et Mt les matrices de , o et t.
- Soit ((a
i,j
)) llment gnrique de M.
- Soit ((b
i,j
)) llment gnrique de Mo.
La matrice Mt = M.o est trs exactement par dfinition le produit boolen en croix des
matrices M et Mo.
M x Mo = Mt = M.o = [ (a
i,k
. b
k,j
)]
6. Fermeture transitive dune relation binaire
- Soit E lensemble : E = { a
1
, a
2
, ... ,a
n
}
- Soit une relation binaire sur E.
Nous posons par dfinition sa fermeture transitive qui est la relation binaire
+
:

+
=
n
, en fait dans le cas o E est fini lunion se limite un nombre fini k de
n
distincts donc :

+
=
n
En informatique, les ensembles sont toujours finis donc nous considrons que la fermeture
transitive de s'crit :

+
=
1

2
....
k-1

k
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 159
7. Fermeture rflexo-transitive dune relationinaire
- Soit E lensemble : E = {a
1
,a
2
,...,a
n
}
- Soit une relation binaire sur E, sa fermeture transitive + .
On note par dfinition - sa fermeture rflexo-transitive :

*
=
+

0
Remarque
Soit un couple (a,b) de E x E tel que a
*
b :
a
*
b - n , n e E / a
n
b
Nous dirons dans ce cas quil existe " un chemin de longueur n, allant de a vers b ". En effet
daprs la dfinition du produit :
a
*
b
tels que : ( a c
1
) et (c
1
c
2
) ...et (c
n
b )
8. Algorithmes de calcul de matrices
Calcul de la matrice produit partir de la formule :
M x Mo = Mt = M.o = [ (a
i,k
. b
k,j
)]
Notons ((m
i,j
)) llment gnrique de la matrice produit, voici le corps d'un algorithme de
calcul de la matrice produit :
pour i 1 jusqu n faire
pour j 1 jusqu n faire
S 0 ;
pour k 1 jusqu n faire
S S v (a
i,k
. b
k,j
)
Fpour ;
m
i,j
S
Fpour
Fpour
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page 160
Algorithme de Warshall pour le calcul de la fermeture transitive :
Avec les mmes notations de l'algorithme prcdent,soit ((a
i,j
)) llment gnrique de la
matrice M, lalgorithme de Warshall calcule M
+
:
pour k 1 jusqu n faire
pour i 1 jusqu n faire
pour j 1 jusqu n faire
a
i,j
a
i,j
v (a
i,k
. a
k,j
)
Fpour ;
Fpour
Fpour
9. Exemple de calcul sur une gnalogie
E = lensemble des individus dune mme famille depuis plusieurs gnrations.
Soient r, s et t les relations binaires :
- x r y ssi x est le pre de y
- x s y ssi x est la mre de y
- x t y ssi x est un enfant de y
On peut dfinir les liens familiaux laide des oprations sur les relations binaires :
r
2
= est grand pre paternel de
s
2
= est grand mre maternelle de
r.s = est grand pre maternel de
s.r = est grand mre paternelle de (non commutativit vidente !)
r s = est parent de
r
n
= est arrire arrire...arrire grand pre paternel de
(r s)
+
= est un anctre de (on voit ici la signification pratique de la fermeture transitive
qui relie deux individus par un chemin dascendants dans son arbre gnalogique)
u.u
t
= est frre ou sur de etc ....
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
161
2.3 : Thorie des langages
Plan du chapitre:
1. Notations et dfinitions gnrales
2. Grammaire formelle ou algbrique
2.1 Monode
2.2 Grammaire formelle
2.3 Oprations sur les mots
2.4 Langage engendr par une grammaire
2.5 Grammaire dtats finis
2.6 Arbre de drivation dun mot
2.7 Diagrammes syntaxiques
3. Classification de Chomsky des grammaires
3.1 Les grammaires syntaxiques
3.2 Les grammaires sensibles au contexte
3.3 Les grammaires indpendantes du contexte
3.4 Les grammaires dtats finis ou de Kleene
4. Applications et exemples
4.1 Expressions arithmtiques : une grammaire ambigu
4.2 Expressions arithmtiques : une grammaire non ambigu
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
162
1. Notations et dfinitions gnrales
Un langage est fait pour communiquer. Les humains doivent communiquer avec les
ordinateurs : ils ont donc labor les bases dune thorie des langages. Dans ce chapitre nous
donnons les fondements formaliss dune telle thorie autour de la notion de grammaire
formelle.
Remarque et convention :
- Certains lments dun langage sappellent les symboles.
- Soit S un ensemble de symboles (S = C). Ce sont les lments indcomposables
dans ce langage (cest--dire non exprimables en autres symboles du langage).
Dfinition expression sur S
On appelle expression sur S, toute suite finie de symboles de S.
e : [ 1, n ] S , e est une expression sur S, n est un entier naturel, n > 1.
( e est alors un mtasymbole dcrivant lexpression S ).
Notation:
On dsigne e par : e = s
1
s
2
s
3
...s
n
, n > 1 o : k, 1 s k s n , s
k
e S
et par dfinition e (k) = s
k
( k e[1, n] ).
On note S+ = { e / e, e expression sur S }
S+ est l'ensemble de toutes les expressions formes sur S.
Dfinissons deux oprations sur S+ :
L'galit dexpressions
Soient e1 et e2 deux expressions sur S, on dfinit leur galit ainsi :
e1 = e2 ssi

-k , k > 1
e1 : [1, k]S
e2 : [1, k]S
i, 1 s i s k e1(i) = e2(i)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
163
la concatnation dexpressions
soient eeS+ et f e S+, on construit le "produit" des deux expressions e.f :
e : [1, n] S
f : [1, p] S
e.f: [1, n+p] S
avec :
e.f(i) = e(i) ssi i e [1, n]
e.f(i) = f(i) ssi i e [n+1, n+p]
Notation : (la concatnation de 2 expressions sur S )
Soient e et f deux expressions :
e = s
1
s
2
s
3
...s
n
f = t
1
t
2
t
3
...t
p
e.f est note : s
1
s
2
s
3
...s
n
t
1
t
2
t
3
...t
p
2. Grammaire formelle ou algbrique
Comme dans les langages naturels, les informaticiens ont, grce aux travaux de N.Chomsky,
formalis la notion de grammaire dun langage informatique.
2.1 Monode
A) Soit A un ensemble fini appel alphabet ainsi dfini :
A = { a
1
,..., a
n
} ( A = C )
Notations :
A
1
= A
A
2
= { x
1
x
2
/ (x
1
eA) et (x
2
eA) }
A
3
= { x
1
x
2
x
3
/ (x
1
eA) et (x
2
e A) et (x
3
eA) }
..........
A
n
= { x
1
x
2
....x
n
/ i, 1 s i s n , (x
i
eA) }
convention
A
0
= { c } (appel squence vide)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
164
B) On note A
*
et A
+
les ensembles suivants :
A
+
= A
*
- { c } = A
*
- A
0
On dfinit sur A
*
une loi de composition interne appele concatnation, note - :
( x, y ) x - y = xy (noms des symboles accols)
La concatnation possde les proprits suivantes :
La loi - est associative :
(x - y) - z = x - (y - z)
llment c est un lment neutre pour la loi - :
x e A* , x - c = c - x = x
Dfinition :
( A*, - ) est un monode libre
2.2 Grammaire formelle
Notations :
Un alphabet est aussi appel vocabulaire ; une chane ou un mot est un lment
dun monode ; la longueur dun mot x (ou chane) est le nombre dlments du
vocabulaire qui le compose et elle est note habituellement |x|.
Exemple : Vocabulaire V = { a , b }
x = aaabbaab , x e V
*
et |x| = 8
Remarque :
On note |x|
a
le nombre de symboles " a " du vocabulaire V composant le mot x.
x = aaabbaab |x|
a
= 5 et |x|
b
= 3
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
165
Dfinition : C-Grammaire
On appelle C-Grammaire (ou, grammaire algbrique de type 2) tout quadruplet :
G = ( V
N
, V
T
, S, R ) o :
V
N
est un vocabulaire non terminal ou auxiliaire ( V
N
= C )
V
T
est un vocabulaire terminal ( V
T
= C)
S e V
N
, un lment particulier appel axiome de G
V
N
V
T
= C
R c ( V
N
V
T
)* x ( V
N
V
T
)* , R est un sous-ensemble fini
Notations :
- R est appel lensemble des rgles de la grammaire G ;
- Une rgle r
i
eR est de la forme ( A , o ) / [ A eV
N
et o e ( V
N
V
T
)* ] ,
Elle est note : r
i
: A o
- Lorsque o e V
T
*
, la rgle r
i
: A o , est dite rgle terminale.
Nous ne considrerons par la suite que les grammaires dites de type 2 encore
appeles grammaires indpendante du contexte (Context Free),
dans lesquelles les rgles ont la forme suivante :
R c V
N
x ( V
N
V
T
)*
2.3 Oprations sur les mots
Soit G une C-Grammaire, G = (V
N
,V
T
, S, R). On dfinit sur ( V
N
V
T
)* une relation binaire
appele " drivation directe " note dfinie comme suit :
Dfinition : drivation directe
Soient a e ( V
N
V
T
)*et b e ( V
N
V
T
)*
On note a b et lon dit que b drive directement de a, ou que a
se drive directement en b, si et seulement si
1) - o e ( V
N
V
T
)*
2) - | e ( V
N
V
T
)*
3) - r
i
e R, telle que : r
i
: A
i

4) a et b s'crivent :
a = o A
i
|
b = o |
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
166
Notation :
On emploie aussi les termes de " rgle de rcriture "
ou de " rgle de drivation ".
Nous obtenons un processus de construction des mots de la grammaire G par application de la
drivation directe. Si lon ritre plusieurs fois ce processus de drivation directe, on obtient
partir dun mot, une suite de mots de G. En fait il sagit de construire la fermeture transitive
de la relation binaire . Cette nouvelle relation est appele la drivation dans G (la
drivation directe en devenant un cas particulier)
Dfinition : drivation
On dit que x se drive en y, sil existe une suite finie de drivations directes
permettant de passer de x y :
(x, x
0
, x
1
,...,x
n
et y) tant des mots de ( V
N
V
T
)*on a le chemin suivant :
x x
0
x
1
.... x
n
y
on crit : x
*
y , que l'on lit : x se drive en y.

*
est la fermeture transitive de la relation binaire
2.4 Langage engendr par une grammaire
Nous nous intressons maintenant toutes les drivations possibles construites dans G, par
application des rgles de G, en privilgiant un point de dpart unique pour chacune des
drivations.
Nous avons vu que chaque rgle de G commenait en partie gauche par un lment de V
N
.
Nous construisons alors toutes les productions ayant comme point de dpart S laxiome de G.
Lensemble L de tous les mots construits sappelle le " langage engendr par la grammaire
G " : L c V
T
*
.
Dfinition : langage engendr
Soit la C-grammaire G, G = ( V
N
, V
T
, S , R )
Lensemble L(G) = { u e V
T
*
/ S
*
u }
s'appelle le langage engendr par G.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
167
Exemple grammaire G
0
:
G
0
: V
N
= { S } ,V
T
= {a,b}
Axiome : S
Rgles
1 : S aSb
2 : S ab
Le langage engendr par G
0
est :
L(G
0
) = { a
n
b
n
/ n > 1 }
2.5 Grammaire dtats finis
Ce sont des C-Grammaires dans lesquelles les parties droites de rgles ont une forme
particulirement simple (on classifie dailleurs les grammaires algbriques en gnral en 4
types en fonction de la forme de leurs rgles.
Les C-grammaires sont dites de type-2 et les K-grammaires ou grammaires de Kleene sont
dites de type-3).
Pour une grammaire de type-3 ou K-grammaire les rgles sont de 2 formes :
A a ( a e V
T
)
ou bien
A aB ( B eV
N
et B pouvant tre gal A )
Exemple :
G
1
: V
N
= { S,A}
V
T
= {a,b}
Axiome : S
Rgles
1 : S a S
2: S aA
3: A bA
4: A b
Le langage engendr par G
1
est :
L(G
1
) = { a
n
b
p
/ (n > 1) et (p > 1) }
2.6 Arbre de drivation dun mot
On appelle arbre A toute structure sur un ensemble E qui est :
- soit une structure vide note A,
- soit une lment noeud r associ un nombre fini darbres disjoints
vides ou non : A
1
, A
2
,, ... , A
n
.
- notation : A = < r, A
1
, A
2
, ..., A
n
>
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
168
Reprsentation graphique dun arbre :
Un arbre est dit " tiquet " si lon nomme (attribution dun symbole de nom) sa racine et ses
noeuds.
Dfinition : arbre de drivation
Soit la C-grammaire G, G = ( V
N
, V
T
, S, R ).
Un arbre tiquet est un " arbre de drivation " dans G ssi :
- Lalphabet des tiquettes est inclus dans V
N
V
T
.
- Les noeuds sont tiquets par des lments de V
N
.
- Les feuilles sont tiquetes par des lments de V
T
.
- Ltiquette de tout noeud est un lment de V
N
.
Pour tout noeud < A, f
1
, f
2
, ..., f
n
> on associe une rgle R
de la forme : A f
1
f
2
...f
n
(rgle de drivation dans G).
Exemples :
mot a
2
b
2
dans G
0
Rgles de G
0
appliques :
S
1
aSb
2
aabb
mot a
2
b
2
dans G
1
Rgles de G
1
appliques :
S
1
aS
2
aaA
3
aabA
4
aabb
Dfinition : grammaire ambigu
Une grammaire est dite ambigu si une chane a au moins deux arbres de drivation
diffrents dans G.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
169
Exemple de grammaire ambigu :
G2 : V
N
= {S}
V
T
= {( , )}
Axiome : S
Rgles
1 : S (SS)S
2 : S c
Le langage engendr par G
2
L(G
2
) se
dnomme langage des parenthses bien
formes.
L(G
2
) = { ( ) , (( )(( ))( )), ( )( ), .. }
Soit le mot (( )) de G
2
, voici 2 arbres de drivation de (( )) dans G
2
:
Arbre 1 : Arbre 2 :
Arbre 1 correspond dans G
2
la suite des drivations suivantes :
(afin dy voir plus clair entre les S choisis nous soulignons les symboles S drivs)
on part de laxiome S et lon applique la rgle 1:
S
1
( SS ) S
on applique la rgle 1 au premier Sde gauche :
S
1
( SS ) S
Ce qui donne :
S
1
( SS ) S
1
( ( S S ) S S ) S
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
170
puis on drive tous les symboles S partir de la rgle 2 :
Rgle 2
S c
applique 5 fois :
( ( S S ) S S ) S
S ...
2
(( c c )c c ) c
Le symbole c est un lment neutre (x = x = x) , nous avons donc comme production
finale de cette suite de drivation le mot : (( c c ) c c ) c = (( )) .
En conclusion, le mot (( )) drive de l'axiome S :
S
*
(( ))
Arbre1 : est un arbre de drivation de mot dans la grammaire G
2
.
Arbre 2 correspond dans G
2
la suite des drivations suivante :
S
1
( S S )
1
(S ( S S ) S) S
2
...
2
(c (c c) c) c = (( )).
Le mot (( )) drive de l'axiome S une seconde fois avec un autre arbre de drivation distinct
du prcdent, donc la grammaire G
2
est effectivement ambigu.
2.7 Diagrammes syntaxiques
Il est possible de reprsenter graphiquement les rgles de drivation dune grammaire
formelle par des diagrammes dnots " diagrammes syntaxiques ". Cette reprsentation
graphique a pour effet de condenser lcriture des rgles et dautoriser une meilleure lisibilit.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
171
REGLES DIAGRAMMES
A e V
N
a e V
T
B c
B A1
B A2 ou encore :
..... B A1|...|An
B An
B AB | c
ou :
B {A}
*
B AB | A
ou:
B {A}
+
3. Classification de Chomsky des grammaires
Traditionnellement les grammaires algbriques sont classables en quatre catgories qui se
diffrentient par la forme de leurs rgles.
Elles sont notes par leur type (type 0, type 1, type 2, type 3). Il existe une relation dinclusion
provenant de leurs dfinitions :
type 3 c type 2 c type 1 c type 0
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
172
3.1 Les grammaires syntaxiques - type 0
Les rgles ont la forme gnrale suivante : o |
pour une rgle o |, les symboles (o, |) doivent tre de la
forme :
o e ( V
N
V
T
)
+
| e ( V
N
V
T
)
*
3.2 Les grammaires sensibles au contexte - type 1
Les rgles ont la forme suivante : oA| o|
pour une rgle oA| o|, les symboles(o, |, , A) doivent tre de
la forme :
A e V
N
o e ( V
N
V
T
)
*
| e ( V
N
V
T
)
*
e ( V
N
V
T
)
+
3.3 Les grammaires indpendantes du contexte - type 2
Les rgles ont la forme suivante : A o
Pour une rgle A o, les symboles(o,A) doivent tre de la forme :
o e ( V
N
V
T
)
*
A e V
N
3.4 Les grammaires dtats finis ou de Kleene - type 3
Les rgles nont que deux formes possibles :
A a ou bien A aB
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
173
Pour ces rgles, les symboles (a, A, B) doivent tre de la forme :
A e V
N
B e V
N
a e V
T
4. Applications et exemples
4.1 Expressions arithmtiques : une grammaire ambigu
Soit la grammaire G
exp
= (V
N
,V
T
,Axiome,Rgles)
V
T
= { 0, ..., 9, +,-, /, *, ), ( }
V
N
= {< Expr >, < Nbr > , < Cte > , < Oper > }
Axiome : < Expr >
Rgles :
1 : < Expr > < Nbr > | (< Expr >) | < Expr >< Oper >< Expr >
2 : < Nbr > < Cte > | < Cte >< Nbr >
3 : < Cte > 0 | 1 |...| 9
4 : < Oper > + | - | * | /
Les mots de L(G
exp
) sont des expressions de la forme (x+y-z)*x etc... o x, y, z sont des
entiers.
Exemple : 327 - 8 est un mot de L(G
exp
)
Ce mot na quun seul arbre de drivation dans G
exp
, dessinons son arbre de drivation :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
174
Nous pouvons faire ressortir les liens abstraits qui relient les trois lments terminaux 327, -
et 8 :
Larbre obtenu en gris partir de larbre de drivation sappelle larbre abstrait du mot "
327-8 ".
Cet arbre abstrait permet de manipuler la structure gnrale du mot facilement tout en
rsumant la structure gnrale de larbre de drivation.
Soient trois autres mots de L(G
exp
) 2+5+4, 2-5+4 et 2+5*4, ils ont chacun deux arbres de
drivation. Nous donnons ci-aprs deux arbres abstraits de chaque mot.
Arbre-1 : 2+5+4 Arbre-2 : 2+5+4
Arbre-3 : 2-5+4
Arbre-4 : 2-5+4
Arbre-5 : 2+5*4 Arbre-6 : 2+5*4
Nous remarquons donc que G
exp
est une grammaire ambigu puisquil existe un mot
possdant au moins deux arbres de drivation.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
175
Pour linstant les mots 2+5+4, 2-5+4 et 2+5*4 ne sont que des concatnations de symboles
sans aucun sens particulier
Si nous voulions aller plus loin en donnant un sens (de la smantique) ces mots de telle
faon quils reprsentent des calculs sur les entiers avec les proprits classiques des
oprations sur les entiers, nous pourrions nous trouver un " bon choix " parmi les arbres
abstraits prcdents.
Nous appellerons ces choix " interprter " lexpression.
Examen de la situation pour le mot 2+5+4 :
- Arbre-1 sinterprte : (2+5)+4
- Arbre-2 sinterprte : 2+(5+4)
Loprateur " + " est associatif donc pour notre interprtation les deux arbres 1 et 2 peuvent
convenir.
Examen de la situation pour le mot 2-5+4 :
- Arbre-3 sinterprte : (2-5)+4
- Arbre-4 sinterprte : 2-(5+4)
Les oprateurs + et - sont de mme priorit et nous obtenons deux expressions diffrentes
selon le choix de larbre.
Traditionnellement lorsque deux oprateurs ont la mme priorit, lvaluation se fait partir
de la gauche de lexpression. Donc larbre 3 conviendrait.
Nous pourrions penser lever lambigut en choisissant systmatiquement larbre abstrait
dvaluation gauche correspondant un parenthsage implicite gauche(comme arbre-1 et
arbre-3) :
Nous allons voir ci-dessous que ce nest pas possible.
Examen de la situation pour le mot 2+5*4 :
- Arbre-5 sinterprte :(2+5)*4
- Arbre-6 sinterprte : 2+(5*4)
Les oprateurs + et * nont pas la mme priorit. Nous obtenons deux expressions diffrentes
selon le choix de larbre. Mais ici cest le choix de larbre 6 qui simpose cause de la priorit
du * sur le +.
Nous avons fait ressortir le fait quil tait impossible de privilgier systmatiquement pour "
linterprtation " des expressions une catgorie darbre plutt quune autre, il faut donc
changer de grammaire et viter lambigut.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
176
4.2 Expressions arithmtiques : une grammaire non ambigu
Nous donnons ci-dessous une grammaire non ambigu base sur la prcdente et tenant
compte de la prcdence (priorit doprateur). Nous sparons les oprateurs en deux
catgories ; les oprateurs de priorit zro (Oper_0) et ceux de priorit un (Oper_1).
V
T
= { 0, ..., 9, +,-, /, *, ), ( }
V
N
= {< Expr >, < Nbr > , < Cte > , < Oper_0 > , < Oper_1 >, < facteur >, < terme > }
Axiome : < Expr >
Rgles :
facteur
expr
terme
Nbr Oper_0 Oper_1
Cte
En pratique ce ne sera pas une telle de grammaire qui sera retenue pour le calcul des
expressions arithmtiques car elle contient une rgle rcursive gauche, ce qui la rend
difficilement analysable par des procds simples.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
177
2.4 : Une grammaire du Pascal
Plan du chapitre:
1. Rappel de la structure dun programme Pascal
2. Les oprateurs en pascal
2.1 Les oprateurs multiplicatifs
2.2 Les oprateurs additifs
2.3 Les oprateurs relationnels
2.4 Dclarations des constantes
3. Dclarations des types en Pascal
3.1 Dclarations des types simples
3.2 Dclarations des types structurs
4. Instructions en Pascal
4.1 Instruction d'affectation
4.2 Instruction de condition
4.3 Instruction d'itration whiledo
4.4 Instruction d'itration repeatuntil
4.5 Instruction d'itration forto
4.6 Instruction caseof
5. Fonctions et procdures en Pascal
6. Paramtres en Pascal
6.1 Lecture seulement : passage par valeur
6.2 Accs direct : passage par adresse ou par rfrence
7. Fonction ou procdure ?
8. Visibilit des variables
9. Variables dynamiques, rfrences ou pointeurs
10. Rcursivit en programmation
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
178
1. Rappel de la structure dun programme Pascal
Il ne s'agit pas d'apprendre le langage pascal, mais plutt d'un rsum visant se remmorer les principes de
base du langage, et ainsi de se familiariser avec les principes utiles et pratiques du langage relativement la
programmation. La socit Borland-Inprise met sur son site web, gratuitement par tlchargement, des
compilateurs pascal anciens mais efficaces pour le dbutant (http://www.borland.fr).
Nous utilisons une description dun Pascal-Delphi rduit laide des diagrammes
syntaxiques.
Un programme Pascal est compos de la faon suivante :
- Soit donc d'une partie en-tte ( nom , paramtres ) :
- d'une partie corps (ou Bloc) :
- et se termine par un point :
Exemples d'en-tte :
1) programexemple_01 ( input, output ) ;
2) programexemple_02 ;
Le langage Pascal tant structur, un bloc est compos de sections ou paragraphes bien
spares :
Bloc :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
179
En pratique un bloc Pascal contient deux parties : des dclarations et des instructions
Exemple de programme avec Bloc :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
180
2. Les oprateurs en pascal
Ce sont les rgles de composition qui prcisent la priorit retenue entre les diffrents
oprateurs du langage. Ces priorits sont rparties en 4 niveaux :
- plus haut niveau de priorit 4 : oprateur unaire not
- niveau de priorit 3 : oprateurs multiplicatifs (*, /, div, mod, and )
- niveau de priorit 2 : oprateurs additifs ( + , - , or )
- plus bas niveau de priorit 1 : oprateurs relationnels (< , >, etc)
2.1 Liste de tous les oprateurs selon le type de donnes en Pascal.
oprateurs sur les entiers
oprateurs sur les rels
oprateurs sur les boolens
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
181
oprateurs sur les ensembles : set of
oprateurs de comparaison sur un type T
2.4 Dclarations des constantes
Sert associer un identificateur une valeur de constante, sa valeur est non modifiable dans le
reste du programme. Il existe 3 identificateurs de constantes prdfinis : True , False , et Nil .
Exemple :
programexemple_03 ;
const
x = 12; <------------ x est une constante de type integer.
a2 = true; <------------ a2 est une constante de type boolean.
Y = 'h'; <------------ Y est une constante de type char.
r2 = 25.36; <------------ r2 est une constante de type real.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
182
3. Dclarations des types en pascal
Les types sont utiliss pour crer de nouveaux domaines de dfinition de variables. Une
dclaration d'un nouveau type de donnes sert associer un identificateur un type de
donnes construit par l'utilisateur.
Cette construction est labore l'aide de constructeurs de type et dtermine l'ensemble des
valeurs possibles des variables du nouveau type.
On classe les types en 3 catgories :
< dclaration de type >
3.1 Dclarations des types simples
Cette dclaration est compose des :
- type scalaire
- type intervalle
- identificateur d'un type dj dclar
< Type simple >
< Les types scalaires > ( ils sont de 2 sortes ) :
Les types prdfinis :
- integer
- real
- char
- boolean
- string
Les types numrs :
identif0 = ( identif1,identif2,....,identifk )
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
183
3.2 Dclarations des types numrs
Type identif0 = ( identif1,identif2,....,identifk ) ;
Il s'agit ici d'une dfinition en extension des lments du type. Les identifn sont des constantes
symboliques de base du type et doivent tre tous diffrents dans la mme numration, et ne
peuvent se retrouver ni dans une autre numration, ni redfinis ailleurs.
Ce type est dot d'une fonction spcifique : ord qui dnote le numro d'ordre d'un
lment dans l'ensemble des valeurs du type (attention l'ordre est construit de gauche
droite et la numrotation dbute la valeur 0).
Exemple : crons un type jour de la semaine
Type
jour = ( lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche ) ;
Le type numr jour voit ses constantes de base automatiquement numrotes de 0 6
comme l'indique le tableau ci-aprs:
lundi mardi mercredi jeudi vendredi samedi dimanche
0 1 2 3 4 5 6
Ainsi le rang est accd par la fonction ord:
ord(jeudi) = 3
ord( lundi) = 0
Remarque :
Les types scalaires sauf le type real bnficient de 2 fonctions succ et pred
succ : T T / succ (a
i
) = a
i+1
(successeur dans T , lorsqu'il existe)
pred : T T / pred (a
i
) = a
i-1
(prdcesseur dans T, lorsqu'il existe )
3.3 Dclarations des types intervalles
Il peut tre dfini comme un intervalle ferm born d'un autre type scalaire, sauf real. Les
constantes reprsentent les bornes de l'intervalles (la constante de gauche reprsente la borne
infrieure, la constante de droite reprsente la borne suprieure)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
184
Exemples :
Type
jour = (lundi , mardi , mercredi , jeudi , vendredi , samedi , dimanche ) ;
mois = 1..12 ; // intervalle sur les entiers compris entre 1 et 12
week_end = vendredi..dimanche ; // intervalle sur les jour : vendredi , samedi , dimanche
lettre_min = 'a'..'z' ; // intervalle sur les caractres de type lettres minuscules
lettre_maj = 'A'..'Z' ; // intervalle sur les caractres de type lettres majuscules
Il est bien entendu possible de dclarer ensuite des variables sur ces types :
Var
x : mois ;
y : week_end
z : lettre_maj
3.5 Dclarations des types structurs
Il est donc possible en Pascal de construire et d'utiliser des variables de type simple comme
integer, real, boolean, string, char, numrs et intervalles. Mais il est aussi possible de
travailler avec des familles de variables de mme type ayant une structuration spcifique ou
bien avec des structures contenant des variables ayant des types diffrents. Ces familles sont
appeles des types structurs.
Elles sont au nombre de 4 en pascal :
Une dfinition de type structur, prcise par l'intermdiaire du constructeur de type, la
mthode de structuration et le type des donnes le composant.
3.6 Dclarations de type tableau
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
185
Le type tableau est dfini par le constructeur de type array[ ] of.
C'est une structure homogne, forme d'un nombre fixe de composants qui sont tous du mme
type de base. Tous les composants d'un tableau sont dsigns par des indices, qui sont des
expressions appartenant au type indice du tableau.
Un tableau est en fait une structure de donne accs alatoire , c'est dire
que tous ses composants peuvent tre slectionns et atteints de manire
gale. Ils sont rangs dans l'ordre des indices.
Un tableau n dimensions (un vecteur est reprsent par un tableau une dimension, une
matrice par un tableau deux dimensions...) est dfini par n types d'indices spars par des
virgules.
Un type indice est un type simple sauf real et integer.
Exemple :
Type
jour = ( lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche ) ;
mois = 1..12 ;
week_end = vendredi..dimanche ;
lettre_min = 'a'..'z' ;
lettre_maj = 'A'..'Z' ;
tableau_01 = array[jour] of mois;
tableau_02 = array[jour] of array[1..30] of mois;
tableau_03 = array[jour,1..30] of mois;
tableau_04 = array[lettr_min,0..5,jour,boolean] of char;
var
T1 : tableau_01;
T2 : tableau_02;
T3 : tableau_03;
T4 : tableau_04;
etc.....
ATTENTION :
Notons ici que malgr la similitude de construction des deux types tableau_02 et
tableau_03 (ce sont des types de matrices o l'indice ligne varie dans le type jour, et
l'indice colonne varie dans le type 1..30), ce ne sont pas des types identiques, car ils sont
dclars sparment.
Donc dans l'exemple prcdent, T2 et T3 ne sont pas des tableaux du mme type.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
186
Accs aux variables d'un type tableau
Il faut, afin de pouvoir accder un composant d'un tableau, utiliser des indices
obligatoirement de mme type et en mme nombre qu'indiqus dans la dclaration.
Exemple : (en reprenant les dclarations prcdentes)
var
T1 : tableau_01;
T2 : tableau_02;
T3 : tableau_03;
T4 : tableau_04;
m : mois;
j : jour;
k : 1..30;
L,b: boolean;
n : integer;
c : lettre_min;
Les critures suivantes sont licites :
j:= jeudi; k:= 20; c:='f'; L:=false; b:=true; n:=2;
T1[mardi]:= 8; T1[j]:= 10;
T2[mardi,5]:= 8; T2[mardi] [5]:= 8; T2[j,k-3]:= 8; T2[j] [k-3]:= 8;
T3[mardi,5]:= 8; T3[mardi] [5]:= 8; T3[j,k]:= 8; T3[j] [k]:= 8;
T4['t',3,samedi,true]:= 'h'; T4['t'][3][samedi][true]:= 'h';
T4[c,n+2,j,L or b]:= '+'; ...... etc
3.7 Dclarations de type ensemble
Un type ensemble est dfini d'un manire extensive par le constructeur set of, le domaine des
valeurs de ses lments par son type de base.
le type ensemble est un type simple sauf real et integer.
C'est un ensemble fini et l'on peut construire tous ses sous-ensembles :
Exemple :
Type
couleur = (noir,blanc);
ens_couleur = set of couleur;
var
x,y,z,t : ens_couleur;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
187
begin
x := [ ] ; <--- ensemble vide (0 lment)
y := [noir]; <--- ensemble (1 lment)
z := [blanc]; <--- ensemble (1 lment)
t := [noir,blanc]; <--- ensemble (2 lments : maximum possible de l'exemple)
etc.....
On peut dire en fait que le type ens_couleur est l'ensemble P(couleur) (ensemble des parties)
et que toute variable du type ens_couleur est un sous-ensemble de P(couleur).
3.7 Dclarations de type enregistrement
Le type enregistrement est une collection de composants appels champs de l'enregistrement.
Ils peuvent tre d'un type quelconque sauf le type fichier. C'est une structure htrogne.
Tous les identificateurs de champs d'une mme structure enregistrement doivent tre
diffrents l'intrieur de l'enregistrement. Ils permettent d'accder directement aux
lments de l'enregistrement.
Enregistrement/partie fixe :
Exemple:
Type
enregis = record
jour : (lundi,mardi,dimanche);
x,y : integer;
mois : 1..12;
T_paie : array[boolean,1..30] of real;
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
188
Enregistrement/accs aux champs :
L'accs aux champs l'intrieur d'un enregistrement s'effectue l'aide de
l'identificateur de l'enregistrement (identif de record), puis de celui du champs
(identif de champs) auquel on dsire accder, dans cet ordre, comme en dsignant
un chemin accdant aux lments en crivant de gauche droite.
Exemple :
Type
Tenregis = record
jour : (lundi,mardi,dimanche);
x,y : integer;
mois : 1..12;
T_paie : array[boolean,1..31] of real;
end;
var
A : Tenregis;
begin
A.jour:=;mardi;
A.mois:=8;
A.y:=125;
A.x:=0;
A.T_paie[false,A.mois] := -2.37
etc.....
4. Instructions en pascal
Ce sont les traductions des instructions algorithmiques de notre langage de description
formelle d'algorithme que nous avons dnomm LDFA.
LDFA Pascal
O (instruction vide)
pas de traduction
debut i1 ; i2; i3; ...... ; ik fin
begin i1 ; i2; i3; ...... ; ik end
x a
x := a
;
(ordre d'excution) ;
Si P alors E1 sinon E2 Fsi
if P then E1 else E2
( attention dfaut, pas de fermeture !)
Tantque P faire E Ftant
while P do E
( attention, pas de fermeture)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
189
rpeter E jusqu P
repeat E until P
lire (x1,x2,x3......,xn )
read(fichier,x1,x2,x3......,xn )
readln(x1,x2,x3......,xn )
Get(fichier)
ecrire (x1,x2,x3......,xn )
write(fichier,x1,x2,x3......,xn )
writeln(x1,x2,x3......,xn )
Put(fichier)
pour x a jusqu b faire E Fpour
for x:=a to b do E (croissant)
for x:=a downto b do E (dcroissant)
( attention, pas de fermeture)
SortirSi P
if P then Break
4.1 I nstruction d'affectation
L'affectation est applicable tous les genres de variables du pascal sauf au type file of.
Smantique:
- Evaluation de la partie droite (l'expression)
- Transfert de la valeur calcule dans la partie gauche (la variable)
Exemple :
programAffectation ;
type
Temperature = -20 .. 40 ;
LettreMin = ' a ' .. ' z ' ;
Jour = ( lundi , mardi , mercredi , jeudi ) ;
var
a : integer ; b : char ;
c : string ;
Temp : Temperature ; Lmin : LettreMin ;
Day : Jour ;
begin
Temp := 18 ;
a := (2+Temp)*4 ;
b := 'F' ;
c := 'bon'+'jour' ;
Lmin := 'f' ;
Day := mercredi ;
end.
Aprs affectations :
Temp vaut 18
a vaut 80
b vaut 'F'
c vaut 'bonjour'
Lmin vaut 'f'
Day vaut mercredi
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
190
4.2 I nstruction de condition
Dans l'instruction if, l'expression est un prdicat ( expression contenant des variables, prenant
la valeur vrai ou faux), les blocs <instruction> reprsentent soit une instruction simple, soit
une instruction compose (begin ..... end).
Smantique:
cas du if...then
- Si l'expression est vraie, le bloc d'instruction situ aprs le then est excut et le
if...thens'arrte
- Si l'expression est fausse le if...thens'arrte.
cas du if...then...else
- Si l'expression est vraie, le bloc d'instruction situ aprs le then est excut et le
if...then...elses'arrte.
- Si l'expression est fausse, le bloc d'instruction situ aprs le else est excut et le
if...then...elses'arrte.
Exemple :
programCondition ;
var
x, y ,z : integer ;
begin
x := 10 ;
y := x*4 ;
if y>100 then z := y
else z := 0;
if z = 0 then
y := 0
x := 0 ;
end.
Excution pas pas :
x vaut 10
y vaut 40
y>100 est false
donc z vaut 0
z=100 est true
donc y vaut 0
x vaut 0
( la fin : x=0, y=0, z=0)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
191
4.3 I nstruction d'itration whiledo
Dans l'instruction whiledo, l'expression est un prdicat ( expression contenant des
variables, prenant la valeur vrai ou faux), le blocs <instruction> reprsente soit une
instruction simple, soit une instruction compose (begin ..... end).
Smantique:
C'est une instruction de boucle.
- Tant que l'expression reste vraie, le bloc d'instruction est rexcut.
- Ds que l'expression est fausse le whiledo s'arrte.
C'est une boucle non finie (c--dire que l'on ne peut pas connatre dans les cas de figure si une
boucle quelconque de ce type s'arrtera aprs un nombre fini d'excution).
Exemple :
programWhileDo ;
var
x, y : integer ;
begin
x := 1 ;
y := 0 ;
while x<4 do
begin
x := x+1 ;
y := y +x
end;
writeln ('x=', x , 'y=', y)
end.
Le programme crit :
x=4 y=9
Excution pas pas :
x vaut 1
y vaut 0
x<4 est true
donc x vaut x+1 soit 2
et y vaut y+x soit 2
x<4 est true
donc x vaut x+1 soit 3
et y vaut y+x soit 5
x<4 est true
donc x vaut x+1 soit 4
et y vaut y+x soit 9
x<4 est false donc arrt
( la fin : x=4, y=9)
4.4 I nstruction d'itration repeatuntil
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
192
Dans l'instruction repeatuntil, l'expression est un prdicat ( expression contenant des
variables, prenant la valeur vrai ou faux), le blocs <instruction> reprsente soit une suite
d'instructions simples.
Smantique:
C'est une instruction de boucle.
- Tant que l'expression reste fausse, le bloc d'instruction est rexcut.
- Ds que l'expression est vraie le repeatuntil s'arrte.
C'est une boucle non finie (c--dire que l'on ne peut pas connatre dans les cas de figure si une
boucle quelconque de ce type s'arrtera aprs un nombre fini d'excution).
La diffrence avec le while .. do rside dans le fait que le repeat ... until excute toujours au
moins une fois le bloc d'instructions avant d'valuer l'expression boolenne alors que le while
... do value immdiatement son expression boolenne avant d'excuter le bloc d'instructions.
Exemple :
programRepeatUntil ;
var
x, y : integer ;
begin
x := 1 ;
y := 0 ;
repeat
x := x+1 ;
y := y +x
until x>=4;
writeln ('x=', x , 'y=', y)
end.
Le programme crit :
x=4 y=9
Excution pas pas :
x vaut 1
y vaut 0
on entre dans le repeat
donc x vaut x+1 soit 2
et y vaut y+x soit 2
x>=4 est false
donc x vaut x+1 soit 3
et y vaut y+x soit 5
x>=4 est false
donc x vaut x+1 soit 4
et y vaut y+x soit 9
x>=4 est true donc arrt
( la fin : x=4, y=9)
Ce programme fournit le mme rsultat que celui de la boucle whiledo, car il y a une
correspondance smantique entre ces deux boucles :
repeat <instruction> until <expr> <instruction> ;
while not<expr> do <instruction>
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
193
4.5 Instruction d'itration fordo
C'est une instruction de boucle, il y a deux genres d'instructions for (for...to et for...downto) :
Version for <identificateur> := <Expr1>to <Expr2> do <I nstruction> :
- identificateur est une variable qui se dnomme indice de boucle.
- <Expr1> et <Expr2> sont obligatoirement des expressions du mme type que la
variable d'indice de boucle identificateur.
- < I nstruction> est un bloc d'instruction simple ou compose (begin ..... end).
Version for <identificateur> := <Expr1> downto <Expr2> do <I nstruction> :
- mme signification des constituants que pour la version prcdente, seul le sens de
parcours diffre (par valeurs croissantes pour un for...to, par valeurs dcroissantes
pour un for...downto).
Smantique:
L'indice de boucle prend toutes les valeurs (par ordre croissant ou dcroissant selon le genre
de for) comprises entre <Expr1> et <Expr2> bornes inclues.
Tant que la valeur de l'indice de boucle ne dpasse pas
- par valeur suprieure dans le cas du for...to,
- ou par valeur infrieure dans le cas du for...downto
la valeur de <Expr2>, le bloc d'instruction est rexcut.
C'est une boucle finie (c--dire que l'on connat l'avance le nombre de tours de boucle).
Exemple :
programForDo ;
var x, y : integer ;
begin
y :=0 ;
for x := 1 to 3 do
y := y +x
end.
Excution de chaque tour de boucle :
y vaut 0
x vaut 1 => y vaut 0+1=1
x vaut 2 => y vaut 1+2=3
x vaut 3 => y vaut 3+3=6
x vaut 4 => arrt
( la fin : x=4, y=6)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
194
4.6 Instruction caseof
C'est une instruction de choix
<expression> doit tre de l'un des types : integer, char, boolean, numr, intervalle .
<constante> doit obligatoirement tre du mme type que <expression>
<I nstruction> est un bloc d'instruction simple ou compose (begin ..... end).
Smantique:
C'est une instruction structure quivalente une srie de if...then...else imbriqus. Cette
instruction lorsque cela est possible, doit tre prfre un embotement de if...then...else
dont la lisibilit n'est en fait pas optimale.
if...then...else imbriqus case ... of quivalent
if x = 3 then E1 else
if x = 4 then E2 else
if x = 5 then E2 else
if x = 6 then E2 else
if x = -5 then E3 else Ef
case x of
3 : E1 ;
4..6 : E2 ;
-5 : E3 ;
else Ef
end
Exemple :
programCaseOf ;
var x, y : integer ;
begin
y :=1 ;
for x := 0 to 4 do
case x+1 of
0..3 : y :=y*2 ;
4 : y := y+100
else y:=0 ;
end
end.
y vaut 1
Excution du case dans la boucle :
x vaut 0 => x+1 vaut 1 (dans 0..3) => y vaut 1*2=2
x vaut 1 => x+1 vaut 2 (dans 0..3) => y vaut 2*2=4
x vaut 2 => x+1 vaut 3 (dans 0..3) => y vaut 4*2=8
x vaut 3 => x+1 vaut 4 => y vaut 8+100=108
x vaut 4 => x+1 vaut 5 (else) => y vaut 0
x vaut 5 => arrt
( la fin : x=4, y=0 )
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
195
5. Fonctions et procdures en pascal
Le langage Pascal a t conu l'origine comme un langage pdagogique d'implantation de la
programmation de type algorithmique; grce son extension objet Delphi il est utilis comme
outil de dveloppement professionnel en entreprise.
La programmation algorithmique est une programmation hirarchise descendante.
Cette dcomposition descendante hirarchique est construite l'aide de blocs de programme
nots aussi des sous-programmes.
Un bloc comporte donc des donnes locales, du code (instructions ou corps du bloc), des
donnes d'entre et/ou des donnes de sortie (permettant les changes d'informations entre les
diffrents blocs de la hirarchie) :
L'exemple ci-aprs reprsente trois blocs B1, B2 et B3 changeant des informations (en fait
chacun calcule la somme des deux entiers qu'il reoit en entre et renvoie leur somme :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
196
Le bloc B1 reoit en entre 12 et 15 et renvoie la somme 12+15 = 27 vers le bloc B2, la valeur
27 devient une donne d'entre pour le bloc B2 qui reoit comme autre entre la valeur 10. Le
bloc B2 renvoie vers le bloc B3 le rsultat 27+10 = 37 etc...
Nous remarquons que chaque bloc est indpendant des autres blocs. La seule liaison qui
intervienne ici se situe dans le passage des donnes d'un bloc vers un autre bloc. Le code et
les donnes locales d'un bloc fix sont inaccessibles aux autres blocs.
En pascal les blocs sont implments soit par des fonctions :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
197
En pascal les blocs sont implments aussi par des procdures :
Voici la syntaxe de dclaration des procdures en Pascal :
Voici la syntaxe de dclaration des fonctions en Pascal :
- <identificateur> est le nom de la procdure ou de la fonction (choisi par vous)
- <liste de paramtres> est soit vide, soit elles contient entre parenthses et spars
par des point-virgules la liste des paramtres formels.
- <bloc> est une instruction compose (begin ..... end).
- <identificateur de type>, dans le cas d'une fonction reprsente le type du rsultat
renvoy par la fonction.
Exemples de dclarations avec et sans paramtres formels :
procedure Somme (x,y :integer; var z :integer) ;
begin
z := x +y
end ;
function Somme (x,y :integer): integer ;
begin
result := x +y
end ;
procedure Somme ;
var x, y : integer ;
begin
y :=1 ; x := 2;
writeln( x+y)
end ;
function Somme : integer ;
var x, y : integer ;
begin
y :=1 ; x := 2;
result := x +y
end ;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
198
6. Paramtres en pascal
On sintresse dans ce paragraphe aux rapports quil y a entre un programme appelant et un
sous-programme appel uniquement en Pascal.
Soit par exemple une procdure B ayant 3 paramtres formels et renvoyant dans le troisime
paramtre la somme des deux premiers :
Les paramtres formels d'une procdure jouent le rle de variables muettes et servent dcrire
le fonctionnement d'une procdure. Ils ont la mme utilisation qu'une variable dans un
polynme mathmatique. Les deux critures P(x) = 3x
2
- 4x + 5 et P(t) = 3t
2
- 4t + 5
reprsentent mathmatiquement le mme polynme, il en est de mme pour une procdure.
on peut changer tous les paramtres formels d'une procdure sans en changer son
fonctionnement
Les deux dclarations ci-dessous sont identiques :
procedure B (x , y :integer; var t :integer) ;
begin
t := x +y
end ;
procedure B (a , b integer; var c :integer) ;
begin
c := a +b
end ;
L'intrt pratique d'une procdure et en gnral d'un sous-programme est essentiellement de
pouvoir excuter toujours la mme action mais avec des valeurs diffrentes.
Par exemple une procdure P qui utilise un autre procdure B qui fait la somme, de deux
entiers. La procdure B fonctionne comme une sorte de bote noire qui reoit deux valeurs en
entre et qui retourne leur somme comme dans le pseudo-code ci-dessous :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
199
Lignes fictives de code de la procdure P utilisant la bote noire (procdure B)
La bote "faire la somme" est utilise une premire fois pour sommer 5 et 8, puis plus loin elle
est utilise une deuxime fois pour sommer -2 et 105.
Le mcanisme qui permet d'utiliser la procdure B dans le code de la procdure P se
dnomme l'appel de procdure. P se dnomme la procdure appelante.
Reprenons l'exemple du polynme critures P(x) = 3x
2
- 4x + 5 , nous savons qu'en donnant
une valeur effective la variable x (par exemple x = 2) on obtient un rsultat not P(2) qui
vaut: P(x) = 3.2
2
- 4.2 + 5 = 9.
L'appel de procdure est un procd trs semblable au calcul du polynme sur une valeur. La
procdure a besoin qu'on lui fournisse des variables contenant effectivement des valeurs. De
telles variables se dnomment les paramtres effectifs de la procdure.
Prcisons un peu plus l'utilisation d'une procdure S avec des variables. Supposons que S
serve calculer la somme de deux valeurs 5 et 8 contenues respectivement dans deux
variables locales a et b d'une autre procdure nomme P dont le seul paramtre x renvoie le
rsultat 13 du calcul obtenu par appel de la procdure B dans le code de la procdure P :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
200
L'appel S(a,b,x) s'effectue sur des paramtres effectifs qui sont ncessairement des variables
existantes, soit dclares dans un paragraphe var dans la zone des donnes locales, soit
dclares en tant que paramtres de la procdure appelante.
L'appel se fait avec un nombre de paramtres effectifs gal celui des paramtres formels en
respectant l'ordre et la cohrence des types. On peut imaginer que lors d'un appel la
procdure S par le code de la procdure S, le code de la procdure S vient s'imbriquer
fictivement dans le code de P l'endroit de l'appel avec comme variables les paramtres
effectifs :
Comment a lieu cet appel, cette inclusion fictive du code ?
On dnomme l'action qui consiste appeler sur des paramtres effectifs, le passage des
paramtres effectifs ou encore la transmission des paramtres effectifs.
Il faut savoir quun paramtre effectif transmis au sous-programme appel est un moyen
dutiliser ou daccder une information appartenant au bloc appelant (le bloc appel
peut tre le mme que le bloc appelant, il sagit alors de rcursivit).
Pascal ne dispose que de 2 modes de passage sur les 5 modes gnraux :
- Le passage par valeur,
- le passage par rfrence ou adresse.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
201
6.1 Lecture seulement : passage par valeur
Dans un passage par valeur, le paramtre formel est considr comme une variable locale
dans le corps du sous-programme. Sa valeur est initialise au dbut de chaque excution du
sous-programme avec la valeur du paramtre effectif correspondant.
Il y a recopie de la valeur du paramtre effectif dans une zone spcifique locale la
procdure. Toutes les oprations qui sont effectues sur le paramtre formel naffectent que
cette valeur locale.
Ecriture en Pascal procedure sp(... x: real ....)
passage par valeur
6.2 Accs direct : passage par adresse ou par rfrence
Dans un passage par adresse le paramtre formel est trait comme une variable dont ladresse
qui est transmise au moment de chaque appel, est celle du paramtre effectif correspondant.
Ladresse de la variable effective autorise toutes les modifications immdiatement sur cette
variable quelle que soit sa localisation.
Ecriture en Pascal procedure sp (....var x : real .....)
passage par rfrence
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
202
Comparaison des avantages et des inconvnients des 2 modes
Passage par valeur :
- Avantage : scurit et protection des informations.
- Inconvnient : lenteur due la recopie des donnes et doublement de la
place mmoire occupe (mais convient bien pour des variables simples !).
Passage par rfrence :
- Avantage : rapidit daccs aux donnes, moindre occupation mmoire
puisquil ne sagit que dune adresse.
- Inconvnient : ce mode est dangereux cause de la non protection des
donnes et de la ncessit quil y a de connatre la faon dont sont implantes
physiquement les donnes sur la machine.
Ces deux modes de passage des paramtres sont prsents dans des langages comme C++,
java, Ada, Visual-Basic .net, Delphi et C#. Il suffit donc pour le dbutant, de bien
comprendre le processus avec le pascal et par analogie il pourra l'utiliser avec les autres
langages.
Exemple :
procedure B1 (x : integer; var y : integer) ;
begin
y := 10*x
end ;
procedure B2 (x : integer; y :integer) ;
begin
y := 10*x
end ;
procedure P ;
var a , b: integer ;
begin
a := 100 ; b := 0 ;
B1 ( a , b ) ;
a := 100 ; b := 0 ;
B2 ( a , b ) ;
end ;
Dans la procdure B1
x est pass par valeur
y est pass par rfrence
Dans la procdure B2
x est pass par valeur
y est pass par valeur
Dans la procdure P
Appel de B1
B1( valeur a , ref b)
Rsultat aprs appel :
b = 1000
Appel de B2
B2( valeur a , valeur b)
Rsultat aprs appel :
b = 0
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
203
7. Fonction ou procdure ?
Une fonction est un bloc de programme qui ralise des traitements et renvoie une valeur
unique, c'est une procdure ne possdant qu'un seul lment de sortie (appel paramtre).
Tout ce qui a t nonc sur les procdures s'applique in extenso aux fonctions.
La ligne : "procedure B ( x , y : integer ; var t : integer) ; "
se dnomme l'en-tte de la procdure.
La ligne : "function B ( x , y : integer ) : integer ; "
se dnomme l'en-tte de la fonction
En pascal les blocs peuvent tre implments aussi par des fonctions mais uniquement
lorsqu'il n'y a qu'une donne de sortie (un seul rsultat).
Exemple1 :
function B1 (x : integer ) : integer ;
begin
result := 10*x
end ;
procedure P ;
var
a , b: integer ;
begin
a := 100 ;
b := B1 ( a )
end ;
Dans la function B1
x est pass par valeur
B1 renvoie un rsultat de type integer
Dans la procdure P
Appel de la fonction B1
b := B1( valeur a )
Rsultat aprs appel :
b = 1000
Exemple2 :
function TTC (PHT,Tva : real ) : real ;
begin
result := PHT*Tva
end ;
procedure CalculPrix ;
var PrixHT , PrixTTC : real ;
begin
PrixHT:= 100 ;
PrixTTC := TTC ( PrixHT , 1.186 )
end ;
Dans la function TTC
PHT et Tva sont passs par valeur
TTC renvoie un rsultat de type real qui est
Le paramtre prix hors taxe multipli
par le paramtre taux de TVA.
Dans la procdure CalculPrix
PrixHT = 100
Appel de la fonction TTC
PrixTTC := TTC ( valeur a , 1.186 )
Rsultat aprs appel :
PrixTTC = 118,6
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
204
Les dclarations de fonctions et de procdures suivent le schma grammatical de la
dclaration gnrale du programme principal :
< Dclaration de procdure >
procedure <identif de proc> <liste de paramtres formels> ;
;
Exemple :
procedure Calcul (x : integer; var y :integer) ;
<identif de proc> <liste de paramtres formels>
var a, b : integer ; <dclarations>
begin
x := a*x ; <instruction>
y := x - b ; <instruction>
end ;
< Dclaration de fonction >
function <identif de fonc> <liste de paramtres formels> : <type du rsultat> ;
;
Exemple :
function Calcul (x : integer) : integer ;
<identif de fonc> <liste de paramtres formels> <type du rsultat>
var a : integer ; <dclarations>
begin
result := a*x ; <instruction>
end ;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
205
8. Visibilit des variables
Le langage pascal suivant mthode de la programmation structure descendante, les
dclarations de fonctions/procdures peuvent tre imbriques :
< Dclarations >:
Exemple de dclarations imbriques dans la mme procdure P0 :
procedure P0 (x,y,z : char) ;
var a , b: integer ;
procedure P1 ( var u : integer) ;
var a , b: integer ;
procedure P11 ( var u,v,w : integer) ;
var a , b: integer ;
begin
..
end ;
procedure P12 ( t : integer; h :char) ;
var a , b: integer ;
begin
..
end ;
begin { P1 }
..
end ; { P1 }
procedure P2 ( f, g, h : real) ;
var a , b: integer ;
procedure P21 ( n, m, p : integer) ;
var a , b: integer ;
begin
..
end ;
begin { P2 }
..
end ; { P2 }
begin { P0 }
..
end ; { P0 }
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
206
Ecritures que l'on peut reprsenter schmatiquement par les imbrications de blocs qui suivent
(les parties grises d'un bloc correspondent la partie dclaration du bloc) :
Supposons dans l'exemple prcdent que la partie dclaration de chaque bloc contienne outre
l'ventuelle dclaration d'un autre bloc, des dclarations de variables (a dans le bloc P0, b
dans le bloc P1, c dans le bloc P11, d dans le bloc P12, e dans le bloc P2, f dans le bloc P21 ) :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
207
Code pascal du schma prcdent :
procedure P0 (x,y,z : char) ;
var a : integer ;
procedure P1 ( var s : integer) ;
var b : integer ;
procedure P11 ( var u,v,w : integer) ;
var c : integer ;
begin
.. ?.
end ;
procedure P12 ( t : integer; h :char) ;
var d : integer ;
begin
.. ?.
end ;
begin { P1 }
.. ?.
end ; { P1 }
procedure P2 ( f, g, h : real) ;
var e : integer ;
procedure P21 ( n, m, p : integer) ;
var f : integer ;
begin
.. ?.
end ;
begin { P2 }
.. ?.
end ; { P2 }
begin { P0 }
.. ?.
end ; { P0 }
Etant donn les possibilits offertes par cette disposition des blocs en Pascal, il vient
immdiatement une question sur les accs autoriss ou non aux donnes situes dans les
parties dclarations des blocs P0, P1, etc...
En d'autres termes, dans la partie code de chaque bloc quelles variables peut-on utiliser ? Par
exemple dans le corps (la partie code) de la procdure P12 peut-on utiliser toutes les variables
a, b, c, d, e, f ou bien seulement certaines et selon quelles rgles ?
procedure P12 ( t : integer; h :char) ;
var d : integer ;
begin
.. ?.
end ;
Ces autorisations d'accs aux donnes situes dans des blocs imbriques sont contenues dans
la notion de rgle de visibilit dans les langages structure de bloc (Pascal en est un cas
particulier, ces rgles s'appliqueront aussi d'autres langages)
Rgle de visibilit:
Toute donne X dclare localement dans un bloc P
k
est n'est
visible que :
- dans le bloc o elle est dclare,
- et dans tous les blocs P
k+n
imbriqus dans P
k
.
- Un paramtre formel est considr comme une variable
locale au bloc.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
208
fig - visibilit d'une donne X dclare dans P
k
Remarque : masquage
Lorsqu'une donne dclare sous le nom X dans un bloc P
k
est redclare sous le mme nom
X dans un bloc P
k+n
imbriqu dans P
k
, la donne X de P
k+n
masque les informations contenues
dans la donne X de P
k
dans le bloc P
k+n
et dans ceux qu'ils contient.
fig - visibilit d'une donne X dclare dans P
k-1
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
209
Etudions la visibilit des variables a, b, c, d, e, f dans les blocs P0, P1, P11, P12, P2, P21
figures ci-dessous :
procedure P0 () ;
var a : integer ;
procedure P1 ( .) ;
var b : integer ;
procedure P11 ( ) ;
var c : integer ;
begin
.. ?.
end ;
procedure P12 ( ) ;
var d : integer ;
begin
.. ?.
end ;
begin { P1 }
.. ?.
end ; { P1 }
procedure P2 ( . ) ;
var e : integer ;
procedure P21 ( .. ) ;
var f : integer ;
begin
.. ?.
end ;
begin { P2 }
.. ?.
end ; { P2 }
begin { P0 }
.. ?.
end ; { P0 }
Etablissons partir de la rgle de visibilit nonce plus haut, deux tableaux rcapitulatifs
croiss de la visibilit des variables a, b, c, d, e, f :
variable Bloc o cette variable est
visible
Bloc variables visibles dans ce
bloc
a P0, P1, P11, P12, P2, P21 P0 a
b P1, P11, P12 P1 a, b
c P11 P11 a, b, c
d P12 P12 a, b, d
e P2, P21 P2 a, e
f P21 P21 a, b, f
Nous pouvons donc rpondre maintenant aisment la question pose plus haut : quelles
variables peut utiliser dans la procdure P12 ?
La procdure P12 accde aux variables a, b et d, ( avec en plus comme variables locales ses
paramtres formels t et h ) :
procedure P12 ( t : integer; h :char) ;
var d : integer ;
begin
// accs aux variables a, b, d, t et h,
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
210
9. Variables dynamiques, rfrences ou pointeurs
Dfinition
Beaucoup de langages disposent de la notion de pointeur C++ en particulier. Cest une notion
proche de la machine qui a t utilise ds le dbut pour reprsenter dans un programme
lallocation dynamique de mmoire. Dans une structure allocation dynamique de mmoire
le compilateur ne connat pas lavance la taille de la structure, la gestion de la mmoire est
alors confie au programmeur. Cest lors de lexcution et au fur et mesure des mises jours
que la taille de la structure varie, comme par exemple dans la gestion dune liste dont la taille
varie en fonction des ajouts ou des suppressions. A loppos, une structure statique est une
entit dont le compilateur connat trs exactement la taille avant lexcution du programme,
comme par exemple la structure de donnes de type tableau peut tre considre comme une
structure statique puisque la taille du tableau (nombre de cellules) est connue lors de la
dclaration.
En fait, les langages rcents ne disposent plus de cette notion de pointeurs ou variables
dynamiques parce qu lusage elle sest rvle dangereuse car trop proche de la machine
laissant le programmeur se dbrouiller seul avec la gestion de la mmoire, elle est utilement
remplace par la notion de rfrence dobjet comme dans Java, le langage C# demandant une
autorisation pour traiter du code non sr (unsafe code). Delphi quant lui, combine les deux
outils : pointeurs et rfrences dobjet,la version Delphi 8.Net adoptant la mme dmarche
que C# (unsafe code).
La notion de pointeur trs prsente, voir mme essentielle dans un langage comme le C, est
utilisable en pascal.
Prenons par exemple une variable numrique N entire dadresse en mmoire centrale 19432
et contenant le nombre entier 235, nous appelons x un pointeur vers cette variable N, une
variable dynamique contenant ladresse de la variable N :
Nous dirons aussi que x pointe vers la variable N et que le contenu de x est 235.
En pascal (utiliser Delphi en mode console), une variable dynamique se dclare comme une
variable classique mais le type est prcd du symbole ^ , elle est type (le type de la
donne vers laquelle elle pointe), mais sa gestion est entirement la charge du programmeur
travers les procdures dallocation et de dsallocation mmoire respectivement appeles
new et dispose.
Utilisation pratique des variables dynamiques
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
211
Contenu dune variable dynamique x dj alloue : il est not x^
Dans lexemple prcdent :
x^ vaut 235 (contenu de la variable dynamique)
x vaut 19432 (adresse de la variable dynamique)
Dtaillons pas pas un programme dutilisation de pointeur
Soit lexemple prcdent :
Le programme de droite crit sur lcran le contenu
de la variable x (contenu de la cellule pointe par x) soit :
x vaut : 235.
Voici le programme analyser :
program VarDyn;
var
x : ^integer;
begin
new(x);
x^:= 235;
writeln(x vaut: ,x^);
dispose(x);
end.
Dclaration dune variable dynamique x de type entier :
Soit linstruction :
var x : ^integer ;
Rsultat produit :
x est cre (mais x ne pointe vers rien encore)
x vaut nil
Allocation dune variable dynamique x dj dclare :
Soit linstruction :
new ( x ) ;
Rsultat produit :
une cellule mmoire de type integer est cre,
x pointe vers la cellule cre.
(x vaut la valeur de ladresse de la cellule)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
212
Affectation du contenu dune variable dynamique x dj dclare :
Soit linstruction :
x^ := 235 ;
Rsultat produit :
La cellule mmoire pointe par x contient 235.
Dsallocation dune variable dynamique x dj alloue :
Soit linstruction :
dispose ( x ) ;
Rsultat produit :
La cellule mmoire qui contenait 235 nexiste plus, elle est
rendue au systme (ont dit dsalloue)
Attention
Ne pas confondre leffacement de ladresse dune variable dynamique et sa
dsallocation.
Effacement de ladresse dune variable dynamique : mot clef nil
Dsallocation dune variable dynamique : procdure dispose()
Rsultat produit par x := nil :
- x^ nexiste plus (x ne pointe vers plus rien)
- x vaut nil
- La cellule mmoire qui contient 235 existe toujours,
mais nest plus accessible !
Soit lexemple prcdent :
Rsultat produit par dispose ( x ) :
- x^ nexiste plus (x ne pointe vers plus rien)
- x vaut nil
- La cellule mmoire qui contenait 235 nexiste plus !
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
213
Cest en particulier cette dernire remarque qui pose le plus de soucis de maintenance aux
dveloppeurs utilisant les pointeurs (par ex : problme de la rfrence folle).
Affectation de variables dynamiques entre elles :
On suppose que deux variables dynamiques x et y de type ^integer ont t dclares et
cres par la procdure new, nous figurons ci-aprs lincidence de laffectation x := y sur ces
variables :
Soient les instructions :
x^ := 235 ;
y^ := 1098 ;
Soient laffectation :
x := y ;
x et y pointent vers la mme cellule
mmoire
Rsultat produit :
Rsultat produit :
Une structure de donnes rcursive avec pointeurs
Prenons une structure de donnes organise sous forme de liste compose de cellules qui sont
elles mmes chacune un enregistrement (un record) contenant deux champs numet suite :
Le champ numest de type entier, et le champ suite est une variable dynamique de type
cellule (lorsquil est allou, il pointe donc vers une nouvelle cellule) :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
214
Soit un programme dexemple de structure rcursive (Delphi en mode console) utilisant les
variables dynamiques pour reprsenter cette structure.
program pointeur;
type
cell = ^struct;
struct = record
num : integer;
suite : cell
end;
var
x , y, z , t , u : cell;
begin
new(x) ; x^.num := 10;
new(y) ; y^.num := 20;
new(z) ; z^.num := 30;
new(t) ; t^.num := 40;
new(u) ; u^.num := 50;
end.
Ce programme cre 5 cellules :
Les instructions suivantes :
t^.suite := x;
x^.suite := y;
z^.suite := u;
u^.suite := y; reprsentent les liens ci-contre:
Linstruction suivante Reprsente laccs au lien Et crit sur la console
writeln ( t ^. suite^. num);
10
(le contenu du champ num de x)
writeln ( u^. suite^. num);
20
(le contenu du champ num de y)
writeln ( t ^.suite^.suite^.num);
20
(le contenu du champ num de y)
writeln ( z ^.suite^.suite^.num);
20
(le contenu du champ num de y)
La notion de rfrence est aborde au chapitre sur la programmation objet, cest en fait un
pointeur entirement encapsul sur lequel il nest possible de faire quune seule opration :
laffectation de rfrence.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
215
10. Rcursivit en programmation
Dfinition
Une famille d'objet est dite rcursive, si dans sa dfinition il est fait rfrence la famille elle-
mme.
Pour un langage de programmation, nous dirons qu'il autorise la rcursivit si un sous-
programme peut s'appeler lui-mme directement ou indirectement travers un autre sous-
programme.
Le langage de programmation Algol 60 a t le prcurseur sur le sujet de la rcursivit. D'une
manire gnrale un langage de programmation rcursif doit donc tre capable dans son
implmentation, de conserver les contextes successifs provenant de chaque appel rcursif du
sous-programme.
Pour les langages structure de bloc le problme de la conservation des contextes successifs
est rsolu grce la pile d'excution dynamique : les variables locales et les paramtres sont
empils chaque appel rcursif du sous-programme.
Rcursivit directe et indirecte en Pascal-Delphi :
Rcursivit directe Rcursivit indirecte ou croise
Procedure A ;
Begin
.. C ;
End;
Procedure B ;
Begin
.. A ;
End;
Procedure P ;
Begin
.. P ;
End;
Procedure C ;
Begin
.. B ;
End;
Notons que dans le cas de la rcursivit croise, il existe un problme syntaxique de
dclaration d'une procdure avant l'autre :
Procedure A ;
Begin
.. B ;
End;
Procedure B ;
Begin
.. A ;
End;
La directive forward sert rsoudre ce problme. Lors de la dclaration, cette directive sert
dclarer syntaxiquement l'en-tte d'une procdure qui sera dclare en totalit plus loin.
Cette directive permet d'utiliser la rcursivit croise en particulier :
Procedure B ; forward ;
Procedure A ;
Begin
.. B ;
End;
Procedure B ;
Begin
.. A ;
End;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
216
Exemples en Pascal-Delphi de base
Le traitement de problme relatifs des suites rcurrentes ou de dfinition rcurrentes (du
genre U
n
= f(U
n-1
)) peut s'effectuer l'aide de la rcursivit.
1) Dfinition rcursive de la fonction puissance entire x
n
:
x
n
= x
n-1
* x , n e N
*
x
0
= 1
Implantation en Pascal-Delphi :
function puissance ( n : integer; x : real) : real ;
begin
if n = 0 then result := 1
else result := x*puissance (n-1,x)
end;
2) Dfinition rcursive de la fonction factorielle du nombre entier n :
n ! = (n-1)!* n , n e N
*
0 ! = 1
Implantation en Pascal-Delphi :
function fact ( n : integer ) : integer;
begin
if n = 0 then result := 1
else result := x* fact (n-1)
end;
3) Dfinition rcursive du pgcd de 2 entiers a et b par la mthode d'Euclide :
a, a e N
*
, b, b e N
*
pgcd ( a et b ) = pgcd ( b et reste (a par b) )
Implantation en Pascal-Delphi :
( l'oprateur moddu pascal permet de calculer le reste de la division de a par b , on note : "a modb" )
function pgcd1 ( a,b : integer ) : integer;
begin
if b = 0 then result := a
else result := pgcd1 (b, a mod b)
end;
4) Dfinition rcursive du pgcd de 2 entiers a et b par la mthode Egyptienne :
a, a e N
*
, b, b e N
*
pgcd ( a et b ) = pgcd ( b , a-b ), si a > b
pgcd ( a et b ) = pgcd ( a , b-a ), si b > a
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
217
Implantation en Pascal-Delphi :
function pgcd2 ( a , b : integer ) : integer;
begin
if a = b then result := a
else begin
if a < b then result := pgcd2( a , b-a )
else result := pgcd2( b , a-b )
end
end;
5) Programmation rcursive de l'inversion d'une chane de caractres :
Soit construire une fonction qui reoit une chane de type string et qui renvoie cette
chane inverse.
Implantation en Pascal-Delphi :
function InvCh ( ch : string ) : string;
begin
if length(ch) < 2 then result := ch // si chest vide ou si chn'a qu'un seul caractre
else result := InvCh ( Copy(ch , 2 , length(ch)-1 ) + ch[1]
end;
6) Procdure rcursive de recherche dichotomique dans un tableau tri :
Soit construire une procdure permettant de rechercher un lment x dans un tableau
table et de renvoyer son rang ou -1 si l'lment n'est pas prsent.
Implantation en Pascal-Delphi :
type
Elmt = integer ;
tableau = array[1..max] of Elmt ;
procedure dichoRecur(x : Elmt; table:tableau; g,d:integer; var rang:integer) ;
{ recherche dichotomique rcursive dans table
rang =-1 si pas trouv. g, d : 0..max+1}
var
milieu:1..max;
begin
if g <= d then
begin
milieu := (g+d) div 2;
if x=table[milieu] then rang:=milieu
else
if x < table[milieu] then dichoRecur(x, table, g, milieu-1, rang)
else dichoRecur(x, table, milieu+1, d, rang)
end
else rang:=-1
end; {dichoRecur}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
218
Pile d'excution du contexte du premier appel rcursif de dichoRecur(x, table, g, milieu-1, rang)
Empilement des contextes de trois appels rcursifs de la procdure dichoRecur :
dichoRecur(x, table, g, milieu-1, rang)
dichoRecur(x, table, g, milieu-1, rang)
dichoRecur(x, table, d, milieu+1, rang)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
219
Exercices chapitre 2
Ex-1 : Au sujet des parenthses bien formes dont on rappelle une C-grammaire :
G : V
N
= {S}
V
T
= { ( , ) }
Axiome : S
Rgles 1 : S (SS)S
2 : S c
1) Proposez 3 autres C-grammaires engendrant le mme langage de parenthses.
2) Construisez dans chacune delle larbre de drivation du mot ((( )( )))(( )).
Ex-2 : Soit G la C-grammaire suivante et L(G) le langage engendr par G :
G : V
N
= { S, A ,B }
V
T
= { ( , ) , o }
Axiome : A
Rgles :
1 : A ( A
2 : A ( S
3 : S o S
4 : S ) B
5 : B ) B
6 : B )
1) Donnez le mot le plus petit appartenant au langage L(G) (celui de longueur minimale).
2) Donnez trs prcisment la forme gnrale des mots du langage L(G) (avec contraintes sur les indices lorsqu'il
y en a).
3) construisez l'arbre de drivation dans G de la chane : (
3
o
2
)
4
Ex-3 : Problme classique du dfaut de fermeture en Algol, en Pascal en Java, en C# et autre... :
A - Soit G
0
une grammaire ambigu de linstruction if ...then...else en Pascal
V
N
= {<Expr.> , S}
V
T
= { if , then , else , P , a }
Axiome : S
Rgles 1 : S if < Expr.> then S
2 : S if < Expr.> then S else S
3 : S a
4 : < Expr.> P
Donnez 2 arbres de drivation dans G
0
, de la chane :
if P then if P then a else a
B - On propose une autre grammaire ambigu G
1
du mme langage :
V
N
= {<Expr.> , S , S}
V
T
= { if , then , else , P , a }
Axiome : S
Rgles 1 : S if < Expr.> then S S
2 : S a
3 : S else S
4 : S c
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
220
5 : < Expr.> P
a) Refaire les 2 arbres de drivation du mot if P then if P then a else a dans G
1
.
b) Quelle amlioration est apporte par G
1
par rapport G
0
?
C - On construit une grammaire non ambigu du langage :
a) Dans la grammaire G
0
, proposez une solution syntaxique permettant de lever lambigut en rajoutant un
symbole supplmentaire dans V
T
(grammaire G
2
).
b) Montrer que le nouveau mot if P then if P then .... ne peut avoir quun seul arbre de drivation dans G
2
.
Ex-4 : ci dessous les diagrammes syntaxiques d'un identificateur dans un langage de programmation :
Ecrivez une grammaire en BNF traduisant ces diagrammes.
Ex-5 : Soit le programme Pascal suivant :
Programessai;
Const
n = 50
Type
tableau = array[1..n] of integer;
Var
table : tableau ;
Procedure Lire( T : tableau );
begin
for i:=1 to n do
Readln( T[i] );
End;
begin
Lire ( table);
for i:=1 to n do
write( T[i] ,' ' );
end.
Que fait et qu'affiche trs prcisment ce programme ?
Ex-6 : Ecrire un programme Delphi console calculant la somme des 10 premiers termes de la srie
S
n
= E 1/(2i+1),soit:S=1+1/3+1/5+1/7+...+1/19.Le programme affichera la somme S.
Ex-7 : Delphi possde une fonction LowerCase permettant de transformer tous les caractres d'une string en
minuscule. Ecrivez votre propre fonction "Lowerstring (nom:string)" qui renvoie la string nom en minuscule sans
utiliser la fonction LowerCase.
Ex-8 : Delphi possde les oprateurs boolens or, and et Xor. Ecrire un programme console affichant la table de
vrit de chacun de ces trois oprateurs.
Ex-9 : Ecrivez les fonctions boolennes : "implique(p , q: boolean)" qui renvoie le rsultat de p => q et
"equivalent(p , q: boolean)" qui renvoie le rsultat de p q.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
221
Rponses partielles:
Ex-1 : Rgles
1 : S S(SS)
2 : S c
1 : S (S)S
2 : S c
1 : S S(S)S
2 : S c
Etc..
Ex-2 : 1) mot minimal : ( ) )
2) L(G) = { (
n
o
p
)
q
, n > 1, p > 0, q > 1 }
Ex-3 :
A) premier arbre dans G
0
: A) second arbre dans G
0
:
B) premier arbre dans G
1
: B) second arbre dans G
1
:
Sous-arbre commun dans G
0
:
La grammaire G
0
permet une analyse moins profonde
que G
1
avant que l'ambigut se rvle.
Sous-arbre commun dans G
1
:
Soit G
2
V
N
= {<Expr.> , S}
V
T
= { if , then , else , P , a , endif }
Axiome : S
Rgles 1 : S if < Expr.> then S endif
2 : S if < Expr.> then S else S endif
3 : S a
4 : < Expr.> P
On ne peut qu'crire dans G
2
l'une ou l'autre des deux seules phrases distinctes suivantes :
if P then if P then a else a endif endif
if P then if P then a endif else a endif
Ex-4 : Soit une grammaire G
2
rpondant la question
V
N
= {<identif.> , <lettre.> , <chiffre.> , <suite> } , V
T
= { a, b , , z , 0 , , 9 }
Axiome : <identif.>
Rgles 1 : <identif.> <lettre.> <suite>
2 : <suite> <lettre.> <suite> | < chiffre.> <suite> | c
3 : <lettre.> a | b | | z
4 : < chiffre.> 0 | 1 | | 9
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
222
Ex-5 : Appel de la procdure Lire avec le paramtre table : Lire ( table). La Procedure Lire( T : tableau ) reoit un
paramtre pass par valeur, donc elle travaille sur une copie du tableau table en saisissant au clavier les donnes,
mais lors de la fin de l'appel le tableau local est dtruit et l'original n'a pas t modifi donc le tableau table est
rest vide !
Ex-6 : Somme 1+1/3+1/5+1/7+...+1/19
Boucle for croissante Boucle for dcroissante
programfor_do;
const max=20;
var
som : real;
i : integer;
begin
som:= 0;
for i := 0 to 9 do
som := som + 1 / (2*i+1);
writeln('somme = ', som);
end.
programfor_do;
const max=20;
var
som : real;
i : integer;
begin
som:= 0;
for i := 9 downto 0 do
som := som + 1 / (2*i+1);
writeln('somme = ', som);
end.
Ex-7 : chaine en minuscule
function Lowerstring (ch : string) : string;
var
i: integer;
sortie: string;
begin
sortie := '';
for i := 1 to length(ch) do
if ch[i] in ['A'..'Z'] then
sortie := concat (sortie, chr(ord(ch[i]) + ord('a') - ord('A')))
else
sortie := concat(sortie, ch[i] );
result := sortie
end;
Ex-8 : Tables de vrits
programTableVerite;
var
a, b, c:boolean;
begin
writeln(' table du Et :');
writeln(' a b Et');
writeln('-------------------------');
for a := false to true do
for b := false to true do
writeln( a:7, b:7, a And b:7);
writeln('*************************');
writeln(' table du Ou :');
writeln(' a b Ou');
writeln('-------------------------');
for a := false to true do
for b := false to true do
writeln( a:7, b:7, a or b:7);
writeln('*************************');
writeln(' table du Xor :');
writeln(' a b Xor');
writeln('-------------------------');
for a := false to true do
for b := false to true do
writeln( a:7, b:7, a Xor b:7);
end.
Ex-9 : implication et quivalence
P => Q = non P ou Q P Q = ( P => Q ) et ( Q => P )
function implique (p , q : boolean) : boolean;
begin
result := not p or q
end;
function equivalent (p , q : boolean) : boolean;
begin
result := implique (p,q)and implique(q,p)
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
223
Chapitre 3 : Dvelopper du logiciel
avec mthode
3.1 Dveloppement mthodique du logiciel
- la production du logiciel
- conception structure descendante et machines abstraites
- notion d'algorithme
- un langage de description d'algorithmes le LDFA
- le dossier de programmation
- trace formelle d'un algorithme
- traducteur LDFA - Pascal
- facteurs de qualit du logiciel
Machines abstraites : exemple de traitement sur les chanes
- cas o la version du pascal contient un type chane
- cas o la version du pascal ne contient pas de type chane
- programme pascal obtenu
- autres versions d'implantation en pascal
3.2.Modularit
- dfinition : B.Meyer
- la modularit en pascal avec les Unit
3.3. Complexit, tri, recherche
- Notions de complexit temporelle et spatiale
- Mesure de la complexit temporelle d'un algorithme
- Notation de Landau O(n)
-
Trier des tableaux en mmoire centrale
- Le Tri bulles
- Le Tri par slection
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
224
- Le ri par insertion
- Le Tri rapide QuickSort
- Le Tri par tas HeapSort
Rechercher dans un tableau
- Dans un tableau non tri
- Dans un tableau tri
Exercices: algorithmes et leur traduction
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
225
3.1 : dveloppement mthodique
du Logiciel
Plan du chapitre:
1.Historique des langages
Introduction
1. Production du logiciel
1.1 Gnie logiciel
1. 2 Cycle de vie du l ogi ci el
1.3 Maintenance dun logiciel
1.4 Production industrielle du logiciel
2. Conception structure descendante
2.1 Critre simple dautomatisation
2.2 Analyse mthodique descendante
2.3 Analyse ascendante
2.4 Programmation descendante avec retour sur un niveau
2.5 Machines abstraites et niveaux logiques
3. Notion dALGORITHME
3.1 Langage algorithmique
3.2 Objets de base d'un langage algorithmique
3.3 Oprations sur les objets de base d'un langage algorithmique
4. Un langage de description dalgorithme : LDFA
4.1 Atomes du LDFA
4.2 Information en LDFA
4.3 Vocabulaire terminal du LDFA
4.4 Instructions simples du LDFA
5. Le Dossier de dveloppement
5.1 Enonc et spcification
5.2 Mthodologie
5.3 Environnement
5.4 Algorithme en LDFA
5.5 Programme en langage Pascal
6. Trace formelle dun algorithme
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
226
6.1 Espace dexcution dune instruction compose
6.2 Exemple avec trace formelle
7. Traducteur lmentaire LDFA - Pascal
7.1 Traducteur
7.2 Exemple
7.3 Scurit et ergonomie
8. Facteurs de qualit du logiciel
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
227
Le bon sens est la chose du monde la mieux partage...la diversit de nos opinions ne vient pas de ce que les uns
sont plus raisonnables que les autres, mais seulement de ce que nous conduisons nos penses par diverses voies,
et ne considrons pas les mmes choses. Car ce n'est pas assez d'avoir l'esprit bon, mais le principal est de
l'appliquer bien.
R Descartes Discours de la mthode, premire partie, 1637.
Le dveloppement mthodique dun logiciel passe actuellement par une dmarche de "
descente concrte " de la connaissance que lhumain a sur la problmatique du sujet, vers
laction lmentaire excute par un ordinateur. Le travail du programmeur tant alors ramen
une traduction permanente des actions humaines en actions machines (dcrites avec des
outils diffrents).
Nous pouvons en premire approximation diffrentier cette " descente concrte " en un
classement selon quatre niveaux dabstraction :
fig - schma de descente concrte
Introduction
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
228
Nous voyons que toute activit de programmation consiste transformer un problme selon
une descente graduelle de lhumain vers la machine. Ici nous avons rsum cette
dcomposition en 4 niveaux. La notion de programmation structure est une rponse ce type
de dcomposition graduelle dun problme. Lalgorithmique est la faon de dcrire cette
mthode de travail.
1. Production du logiciel
1.1 Gnie logiciel
A une certaine poque, ses dbuts, lactivit dcriture du logiciel ne reposait que sur
lefficacit personnelle du programmeur laiss pratiquement seul devant la programmation
dun problme.
De nos jours, le programmeur dispose doutils et de mthodes lui permettant de concevoir et
dcrire des logiciels. Le terme logiciel, ne dsigne pas seulement les programmes associs
telle application ou tel produit : il dsigne en plus la documentation ncessaire l'installation,
l'utilisation, au dveloppement et la maintenance de ce logiciel. Pour de gros systmes, le
temps de ralisation peut tre aussi long que le temps du dveloppement des programmes eux-
mmes.
Le gnie logiciel concerne l'ensemble des mthodes et rgles relatives la production
rationnelle des logiciels.
L'activit de dveloppement du logiciel, vu les cots qu'elle implique, est devenue une activit
conomique et doit donc tre planifie et soumise des normes sinon des attitudes
quivalentes celles que l'on a dans l'industrie pour n'importe quel produit.
C'est pourquoi dans ce cours, le mot-clef est le mot "composant logiciel" qui tient la fois
de l'activit cratrice de l'humain et du composant industriel incluant une activit discipline
et ordonne base pour certaines tches sur des outils formaliss.
D'autre part le gnie logiciel intervient lorsque le logiciel est trop grand pour que son
dveloppement puisse tre confi un seul individu ; ce qui n'est pas le cas pour des
dbutants, qui il n'est pas confi l'laboration de gros logiciels. Toutefois, il est possible de
sensibiliser le lecteur dbutant lhabitude dlaborer un logiciel dune manire systmatique
et rationnelle laide doutils simples.
1.2 Cycle de vie du logiciel
Comme il faut un temps trs important pour dvelopper un grand systme logiciel, et que
dautre part ce logiciel est prvu pour tre utilis pendant longtemps, on spare fictivement
des tapes distinctes dans ces priodes de dveloppement et dutilisation.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
229
Le modle dit de la cascade de Royce (1970) accept par tout le monde informatique est un
bon outil pour le dbutant. Sil est utilis pour de gros projets industriels, en supprimant les
recettes et les validations en fin de chaque phase, nous disposons en initiation dun cadre
mthodologique. Il se prsente alors sous forme de 8 diagrammes ou phases :
1.3 Maintenance dun logiciel
Dans beaucoup de cas le cot du logiciel correspond la majeure partie du cot total d'une
application informatique. Dans ce cot du logiciel, la maintenance a elle-mme une part
prpondrante puisqu'elle est estime de nos jours au minimum 75% du cot total du
logiciel.
La maintenance est de trois sortes :
- adaptative (sadapter un nouvel environnement...)
- corrective (corrections derreurs...)
- perfective (amliorations demandes par le client...)
1.4 Production industrielle du logiciel
La production du logiciel tant devenue une activit industrielle et donc conomique, elle
nchappe pas aux donnes conomiques classiques. On rpertorie un ensemble de
caractristiques associes un projet de dveloppement, chaque caractristique se voyant
attribuer un ratio de productivit.
Le ratio de productivit dune caractristique
Cest le rapport entre la productivit (exprime en nombre dInstructions Sources Livres, par
homme et par mois) dun projet exploitant au mieux cette caractristique, et la productivit
dun projet nexploitant pas du tout cette caractristique.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
230
Le tableau suivant est tir dune tude de B.Boehm (Revue TSI 1982 : les facteurs de cot du
logiciel):
Tableau comparatif des divers ratios de productivit (B.Boehm)
Vous aurez remarqu en observant le graphique prcdent que le facteur le plus important
n'est pas l'exprience d'un langage (erreur commise par les nophytes). Ce qui explique entre
autres arguments que l'enseignement de la programmation ne soit pas l'enseignement d'un
langage.
Il apparat que le facteur le plus coteux reste un facteur sur lequel la technologie n'a aucune
prise : l'aptitude qu'ont des individus communiquer entre eux !
Pour llaboration dun logiciel, nous allons utiliser deux dmarches classiques : la mthode
structure ou algorithmique et plus tard une extension oriente objet de cette dmarche.
2. Conception structure descendante
2.1 Critre simple dautomatisation
Un problme est automatisable (traitable par informatique) si :
- l'on peut parfaitement dfinir les donnes et les rsultats,
- l'on peut dcomposer le passage de ces donnes vers ces rsultats en une suite
d'oprations lmentaires dont chacune peut tre excute par une machine.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
231
Dans le cadre dune initiation la programmation, dans le cycle de vie dj prsent plus
haut, nous ne considrerons que les phases 2 6, en supposant que la faisabilit est acquise, et
quenfin les phases de mise en uvre et de maintenance sont mises part.
Dans cette perspective, le schma de la programmation dun problme se rduit 4 phases :
- La phase 1 de spcification utilisera les types abstraits de donnes (TAD),
- la phase 2 (correspondant aux phases 3 et 4 du cycle de vie) utilisera la mthode de
programmation algorithmique,
- la phase 3 (correspondant la phases 5 du cycle de vie) utilisera un traducteur manuel
pascal,
- la phase 4 (correspondant la phases 6 du cycle de vie) correspondra au passage sur la
machine avec vrification et jeux de tests.
Nous utiliserons un " langage algorithmique " pour la description dun algorithme rsolvant
un problme. Il sagit dun outil textuel permettant de passer de la conception humaine la
conception machine dune manire souple pour le programmeur.
Nous pouvons rsumer dans le tableau ci-dessous les tapes de travail et les outils conceptuels
utiliser lors dune telle dmarche.
ETAPES
PRATIQUES
Matriel et moyens techniques disposition
Analyse Papier, Crayon, Intelligence, Habitude.
Mise en forme de
lalgorithme
Cest laboutissement de lanalyse, esprit logique et rationnel.
Description Utilisation pratique des outils dune mthode de programmation, ici la
programmation structure.
Traduction Transfert des critures algorithmiques en langage de programmation.
Tests et mise au
point
Mise au point du programme sur des valeurs tests ou partir de
programmes spcialiss.
Excution Phase finale : le programme sexcute sans erreur.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
232
2.2 Analyse mthodique descendante
Le second [prcept], de diviser chacune des difficults que j'examinerais, en autant de parcelles qu'il se pourrait
et qu'il serait requis pour les mieux rsoudre.
R Descartes Discours de la mthode, seconde partie, 1637.
Dfinir le problme rsoudre:
expliciter les donnes
prciser: leur nature
leur domaine de variation
leurs proprits
expliciter les rsultats
prciser: leur structure
leur relations avec les donnes
fin dfinir;
Dcomposer le problme en sous-problmes;
Pour chaque sous-problmes identifi faire
si solution vidente alors crire le morceau de programme
sinon appliquer la mthode au sous-problme
fsi
fpour.
dmarche propose par J.Arsac
Cette dmarche mthodique a l'avantage de permettre d'isoler les erreurs lorsqu'on en
commet, et elles devraient tre plus rares qu'en programmation empirique (anciens
organigrammes).
Il apparat donc plusieurs niveaux de dcomposition du problme (niveaux d'abstraction
descendants). Ces niveaux permettent d'avoir une description de plus en plus dtaille du
problme et donc de se rapprocher par raffinements successifs d'une description prte la
traduction en instructions de l'ordinateur.
Afin de pouvoir dcrire la dcomposition d'un problme chaque niveau, nous avons utilis
un langage algorithmique (et non pas un langage de programmation) qui emprunte beaucoup
au langage naturel (le franais pour nous).
2.3 Analyse ascendante
Le troisime [prcept], de conduire par ordre mes penses, en commenant par les objets les plus simples et les
plus aiss connatre, pour monter peu peu, comme par degrs, jusqu' la connaissance des plus composs; et
supposant mme de l'ordre entre ceux qui ne se prcdent point naturellement les uns les autres.
R Descartes Discours de la mthode, seconde partie, 1637.
Nous essaierons de partir de lexistant (les fichiers sources dj crits sur le mme sujet) et de
reconstruire par tapes la solution. Le problme dans cette mthode est dassurer une bonne
cohrence lorsque lon rassemble les morceaux.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
233
Les mthodes objets que nous aborderons plus loin, sont un bon exemple de cette dmarche.
Nous n'en dirons pas plus dans ce paragraphe en renvoyant le lecteur intress au chapitre de
la programmation oriente objet de cours.
2.4 Programmation descendante avec retour sur un niveau
Comme partout ailleurs, une attitude appuye sur les deux dmarches est le gage dune
certaine souplesse dans le travail. Nous adopterons une dmarche danalyse essentiellement
descendante, avec la possibilit de remonter en arrire ds que le dveloppement parat trop
complexe.
Nous adopterons dans tout le reste du chapitre une telle mthode descendante (avec quelques
retours ascendants). Nous la dnommerons " programmation algorithmique ".
Nous utilisons les concepts de B.Meyer pour dcomposer un problme en niveaux logiques
puis en raffinant successivement les diffrentes tapes.
2.5 Machines abstraites et niveaux logiques
Principe :
On dcompose chacune des tapes du travail en niveaux dabstractions logiques. On suppose
en outre qu chaque niveau logique fix, il existe une machine abstraite virtuelle capable de
comprendre et dexcuter la description du problme sous la forme algorithmique en cours.
Ainsi, en descendant de labstraction vers le concret, on passe graduellement dun nonc de
problme au niveau humain un nonc du mme problme un niveau o la machine
devient capable de lexcuter.
Niveau logique Machine abstraite Enonc du problme en
0 M
0
= lhumain A
0
= langage naturel
1 M
1
= mach. Abstraite A
1
= lang.algorithmique
. . . . . . . . .
n M
n
= machine+OS A
n
= langage volu
n+1 M
n+1
= machine physique A
n+1
= langage binaire
A partir de cette dcomposition on construit un " arbre " de programmation reprsentant
graphiquement les hirarchies des machines abstraites.
Voici un exemple dutilisation de cette dmarche dans le cas de la rsolution gnrale de
lquation du second degr dans R.
Le problme se dcompose en deux sous-problmes " :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
234
- le premier concerne la rsolution dune quation du premier degr strict
- le second est relatif la " rsolution dune quation du second degr strict " .
figure de la branche darbre 1er degr
figure de la branche darbre 2me degr
Nous avons utilis comme langage de description des tapes intermdiaires un langage
algorithmique bas sur des mots du franais. Nous le dtaillerons plus tard.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
235
3. Notion dALGORITHME
(D.E. Knuth)
Un algorithme est un ensemble de rgles qui dcrivent une squence
doprations en vue de rsoudre un problme donn bien spcifi. Un
algorithme doit rpondre aux 5 caractristiques suivantes :
- La finitude
- La prcision
- Le domaine des entres
- Le domaine des sorties
- Lexcutabilit
Notons quun algorithme exprime donc un procd squentiel (or dans la vie courante tout
nest pas ncessairement squentiel comme par exemple couter un enseignement et penser
aux prochaines vacances), et ne travaille que sur des problmes dj transforms de la phase 1
la phase 2 (la spcification). I
Il nest pas demand aux dbutants de travailler sur cette tape du processus. Cest pourquoi
la plupart des exercices de dbutant sont dj spcifis dans lnonc, ou bien leur
spcification est triviale.
Indiquons les lments de dfinition des cinq autres caractristiques demandes un
algorithme :
- Finitude : Le nombre dtapes dun algorithme doit tre fini. Le temps dexcution
pourra tre valu.
- Prcision : Chaque tape doit tre parfaitement dfinie. Toutes les actions
lmentaires doivent tre connues.
- Domaine des entres : Le champ des donnes dentre doit tre spcifi.
- Domaine des sorties : Un algorithme ayant un rsultat, il faut donner les champs
correspondants aux rsultats de sortie, ou du moins les relations entre les donnes
dentre et les donnes de sortie.
- Excutabilit : Un algorithme doit dboucher sur un programme excutable en un
temps fini et raisonnable.
On appelle environnement dun algorithme lensemble des entits utiliss par le processeur
pendant le droulement de lalgorithme.
Environnement
Dfinition
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
236
Nous allons dfinir un langage de description des algorithmes qui nous permettra de dcrire
les arbres de programmation et le fonctionnement des machines abstraites de la
programmation structure.
Voici classiquement ce que tous les auteurs utilisent comme systme de description dun
algorithme lorsquils le font avec un langage. Les deux sous-paragraphes qui suivent,
fournissent les dfinitions des lments fondamentaux dun tel langage algorithmique, le
paragraphe d'aprs construit un langage algorithmique fond sur ces lments fondamentaux.
Nous verrons que lalgorithmique est par nature plus proche de ltudiant que la machine. En
effet dans la suite du cours, ltudiant sapercevra par exemple, que les nombres rationnels ne
sont pas reprsentables simplement en machine, encore moins les nombres rels. Les langages
dimplmentations impratifs comme Pascal, Java, C# etc tant relativement pauvres cet
gard.
Ltudiant ne doit pas croire que linformatique sest rsigne ne travailler que sur les
entiers et les dcimaux, mais plutt se rendre compte quil existe une palette importante de
certains produits informatiques qui traitent plus ou moins efficacement les insuffisances des
langages classiques par exemple vis vis des rationnels (les systmes de calcul formel comme
MAPLE (tudi en Taupe),MATHEMATICA,... sont une rponse ce genre dinsuffisance).
Nous ne nous proccupons absolument pas, dans un premier temps en algorithmique, ni de la
vrification, ni du contrle, ni des restrictions dimplantation des donnes. Notre
proccupation premire est dcrire des algorithmes justes qui fonctionnent sur des donnes
justes.
3.1 Objets de base d'un langage algorithmique
Contenant
Nous appelons contenant toute cellule mmoire dune machine abstraite dun niveau fix.
Contenu
Nous appelons contenu linformation reprsente par ltat du contenant.
Atomes
Pour un contenant fix on note A lensemble de tous ses tats possibles, on dit aussi
ensemble des atomes du niveau n (niveau du contenant).
Remarques :
a) un atome de niveau n est donc un tat possible dun contenant,
b) pour un niveau logique fix, il y a un nombre datomes fini,
c) lorsque lon est au niveau machine :
- le contenant est p positions binaires( p est le nombre de bits du mot, p>1).
- A ={0,1}x....x {0,1} , p fois
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
237
Adresse fictive
Toute machine abstraite de niveau fix dispose dautant de cellules mmoires que
ncessaire. Elles sont repres par une adresse fictive ( laquelle nous navons pas accs).
Nom
Par dfinition, toute adresse nous faisons correspondre bijectivement par lopration nom,
un identificateur unique dfinissant pour lutilisateur la cellule mmoire repre par cette
adresse :
Nous dfinissons aussi un certain nombre de fonctions :
Etat : Adresse Atome (donne ltat associ une adresse)
valeur: identificateur Atome (donne ltat associ un identificateur, on dit la valeur)
contenu: Atome information (donne le contenu informationnel de latome)
signification: identificateur information (smantique de lidentificateur)
Ces 4 fonctions sont lies par le schma suivant :
3.2 Oprations sur les objets de base d'un langage algorithmique
Les parenthses dnonc en LDFA seront algol-like : nous disposerons dun marqueur du
genre debut et dun second du genre fin .
Excutant ou processeur algorithmique
Nous appelons excutant ou processeur, la partie de la machine abstraite capable de lire,
raliser, excuter des oprations sur les atomes de cette machine, ceci travers un langage
appropri.
Remarque: loprateur formel excutant dpend du temps.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
238
Instruction simple
Cest une instruction excutable en un temps fini par un processeur et elle nest pas
dcomposable en sous-tches excutables ou en autres instructions simples. Ceci est valable
un niveau fix.
Instruction compose
Cest une instruction simple, ou bien elle est dcomposable en une suite dinstructions entre
parenthses.
Composition squentielle
Si i,j,...,t reprsentent des instructions simples ou composes, nous crirons la composition
squentielle avec des " ; ". La suite dinstructions " i ; j; ...... ; t " est appele une suite
dinstructions squentielles.
Schma fonctionnel
Cest :
- soit un identificateur,
- soit un atome,
- soit une application f n variables (o n>0):
f : (identificateur)
n
identificateur
Espace dexcution
Lespace dexcution dune instruction, cest le n-uplet des n identificateurs ayant au moins
une occurrence dans linstruction (ceci un niveau fix).
Soit une instruction i
k
, lensemble E
k
des variables, ayant au moins une occurrence dans
linstruction i
k
est not : E
k
= {x
1
, x
2
, ....., x
p
} (espace d'excution de l'instruction i
k
)
Environnement
Cest lensemble des objets et des structures ncessaires lexcution dun travail donn
pour un processeur fix (niveau information).
Action
Cest lopration ou le traitement dclench par un vnement qui modifie lenvironnement
(ou bien toute modification de lenvironnement);
Action primitive
Pour un processeur donn(dune machine abstraite dun niveau fix)une action est dite
primitive, si lnonc de cette action est lui seul suffisant pour que le processeur puisse
lexcuter sans autre lments supplmentaires. Une action primitive est dcrite par une
instruction simple du processeur.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
239
Action complexe
Pour un processeur donn(dune machine abstraite dun niveau fix)une action complexe est
une action non-primitive, qui est dcomposable en actions primitives ( la fin de la phase
de conception elle pourra tre exprime soit par un module de traitement, soit par une
instruction compose).
Remarques :
- Ce qui est action primitive pour une machine abstraite de niveau n, peut devenir une
action complexe pour une machine abstraite de niveau n+1, qui est lexpression de la
prcdente un plus bas niveau (dabstraction).
- Les instructions du langage doivent tre les mmes pour tous les niveaux de machine
abstraite, sinon la programmation devient trop lourde grer.
- Tout langage de description de machine abstraite nest pas implantable sur ordinateur
(au plus partiellement sinon ce serait tout simplement un langage de programmation).
Il ne peut servir qu dcrire en partie la spcification et la conception. De plus il doit
utiliser les ides de la programmation structure descendante modulaire.
4. Un langage de description dalgorithme : LDFA
L'apprentissage d'un langage de programmation ne sert qu'aux phases 3 et 4 (traduction et excution) et ne doit
pas tre confondu avec l'utilisation d'un langage algorithmique qui prpare le travail et n'est utilis que comme
plan de travail pour la phase de traduction. En utilisant la construction d'une maison comme analogie, il suffit
de bien comprendre qu'avant de construire la maison, le chef de chantier a besoin du plan d'architecte de cette
maison pour passer la phase d'assemblage des matriaux ; il en est de mme en programmation.
Enonons un langage simple, extensible, qui est utilis dans tout le reste du document et qui
va servir dcrire les algorithmes. Nous le dnotons dans la suite du document comme LDFA
pour Langage de Description Formel dAlgorithme (terminologie non standard utilise par
l'auteur pour dnommer rapidement un langage algorithmique prcis).
4.1 Atomes du LDFA
- Les ensembles de nombres comme N,Z,Q,R (les vrais ensembles classiques des
mathmatiques et leurs structures connues).
- La grammaire mathmatique et celle du franais.
- {V,F} comme lments logiques (({V,F}, , . , v ) tant une algbre de Boole)
- Les prdicats.
- Les caractres du franais et les chanes de caractres C des machines.
Avertissement
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
240
4.2 I nformation en LDFA
On rappelle quune information en LDFA est obtenue par le contenu dun atome et se
construit laide de :
- la grammaire du franais et le sens commun des mots,
- les thormes et les rsultats obtenus des thories mathmatiques(le sens tant le
sens habituel donn tous les symboles),
- toutes les manipulations gnrales (algorithmes en particulier) sur les structures de
donnes.
4.3 Vocabulaire terminal du LDFA
V
T
= { < , O , lire( ) , ecrire( ) , si , tantque , alors , ftant , faire , fsi , sinon ,
sortirSi, pour , repeter , fpour , jusque , ; , entre , sortie , Algorithme , local , global ,
principal , modules , specifications , types-abstraits , debut , fin , ( , ) , [ , ] , * , + , - , / ,
, . , v }
4.4 I nstructions simples du LDFA :
syntaxe : O
smantique : ne rien faire pendant un temps de base du processeur.
syntaxe : a < o
o : ae identif, et o est un schma fonctionnel.
smantique :
1) si o =identificateur alors val(a)=val(o)
2) si o est un atome alors val(a)=o
3) si o est une application / o : (id
1
,.....,id
p
) o(id
1
,.....,id
p
)
alors val(a)= o(val(id
1
),.....,val(id
p
))
o o est linterprtation de o sur lensemble des valeurs des val(id
k
)
syntaxe : lire(a) (o a e identif)
smantique : le contexte de la phrase prcise o lon lit pour "remplir" a,
sinon on indique lire(a) dans .....
Elle permet dattribuer une valeur un objet en allant lire sur un priphrique dentre et elle range cette valeur
dans lobjet.
Instruction vide
Affectation
Lecture
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
241
syntaxe : ecrire(a) (o a e identif)
smantique : le contexte de la phrase prcise o lon crit pour "voir" a,
sinon on indiqueecrire(a) dans .....
Ordonne au processeur dcrire sur un priphrique (Ecran, Imprimante, Port, Fichier etc...)
syntaxe : si P alors E1 sinon E2 fsi
o P est un prdicat ou proposition fonctionnelle,
E1 et E2 sont deux instructions composes.
smantique : classique de linstruction conditionnelle,si le processeur
nest pas li au temps on peut crire :
si P alors E1 sinon O fsi = si P alors E1 fsi
Nous notons = la relation dquivalence entre instructions. Il sagit
dune quivalence smantique, ce qui signifie que les deux
instructions donnent les mmes rsultats sur le mme environnement.
syntaxe : tantque P faire E ftant
o P est un prdicat et E une instruction compose)
smantique :
tantque P faire E ftant = siP alors (E ; tantque P faire E ftant) fsi
Remarques :
Au sujet de la relation "=" qui est la notation pour lquivalence smantique en LDFA, on
considre un "programme" LDFA non pas comme une suite dinstructions, mais comme un
environnement donn avec un tat initial E0 , puis on value la modification de cet
environnement que chaque action provoque sur lui:
{E
0
} {E
1
} {E
2
} ........... {E
k
} {E
k+1
}
o action n+1 : {E
n
} {E
n+1
}.
On obtient ainsi une suite dinformations sur lenvironnement :(E
0
, E
1
, ...., E
k+1
)
Nous dirons alors que deux instructions (simples ou composes) sont smantiquement
quivalentes (notation = )si leurs actions associes sur le mme environnement de dpart
provoquent la mme modification.
A chaque instruction est associe une action sur lenvironnement, cest le rsultat qui est le
mme (mme tat de lenvironnement avant et aprs) :
Soient : Instr1 action1 (action associe Instr1),
Instr2 action2 (action associe Instr2),
Ecriture
Condition
Boucle tantque
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
242
Soient E et E deux tats de lenvironnement,
si nous avons : {E} action1 {E} et {E} action2 {E} ,alors Instr1 et Instr2 sont
smantiquement quivalentes, nous le noterons :
Instr1 = Instr2
syntaxe : repeter E jusqua P
(o P est un prdicat et E une instruction compose)
smantique :
repeter E jusqua P = E ; tantque not P faire E ftant
Exemple dquivalence entre itrations:
tantque P faire E ftant = si P alors (repeter E jusqua not P) fsi
repeter E jusqua P = E ; tantque not P faire E ftant (par dfinition)
syntaxe : pour x < a jusqua b faire E fpour
(o E est une instruction compose, x une variable, a et b des expressions
dans un ensemble fini F totalement ordonn, la relation dordre tant
note s , le successeur dun lment x dans lensemble est not Succ(x)
et son prdcesseur pred(x))
smantiques :
Cette boucle fonctionne la fois en suivant automatiquement lordre
croissant dans lensemble fini F ou en suivant automatiquement lordre
dcroissant, cela dpendra de la position respective de dpart de la borne
a et de la borne b. La variable x est appele un indice de boucle.
smantique dans le cas ordre croissant partir du tantque :
x < a ;
tantque x s succ(b)faire
E ;
x < succ(x) ;
ftant
smantique dans le cas ordre dcroissant partir du tantque :
x < a ;
tantque x > pred(b) faire
E ;
x < pred(x) ;
ftant
Boucle rpter
Boucle pour
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
243
Exemple simple :
- E = N (entiers naturels) et la relation dordre : s = infrieur ou gal dans N
- pour i < x jusqu y faire R FinPour
(ici i prendra toutes les valeurs successives dans N comprises entre x et y soient,
x+y-1 valeurs et sincrmentera de 1 chaque fois)
syntaxe : SortirSi P (o P est un prdicat ou une instruction vide)ne peut
tre utilise qu lintrieur dune itration (tantque, rpter, pour).
smantique : termine par anticipation et immdiatement lexcution de la
boucle dans laquelle linstruction SortirSi se trouve.
Exemple rcapitulatif complet
Reprenons lexemple prcdent de lquation du second degr en dcrivant dans larbre de
programmation laction de la machine abstraite de chaque niveau laide dinstructions du
langage algorithmique LDFA :
figure de la branche darbre 2me degr
Sortie de boucle
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
244
figure de la branche darbre 1
er
degr
Ecriture de l'algorithme
En relisant cet arbre selon un parcours en prordre ( il sagit de parcourir larbre en partant
de la racine et descendant toujours par le fils le plus gauche, puis ensuite de passer au fils
droit suivant etc), l'on obtient aprs avoir complt lalgorithme une criture linaire
comme suit :
Algorithme Equation
Entre: A,B,C e R3
Sortie: X1 ,X2 e R2
Local: A e R
dbut
lire(A,B,C);
Si A=0 alors { A=0 }
Si B = 0 alors
Si C = 0 alors
crire(R est solution)
Sinon { C }
crire(pas de solution)
Fsi
Sinon { B 0 }
X1 -C/B;
crire (X1)
Fsi
Sinon { A 0 }
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
245
Sinon { A 0 }
A B
2
- 4*A*C ;
Si A < 0 alors
crire(pas de solution)
Sinon { 0 }
Si A = 0 alors
X1 -B / (2*A);
crire(X1)
Sinon { 0 }
X1 (-B+sqrt(A)) / (2*A);
X2 (-B-sqrt(A)) / (2*A);
crire( X1 , X2 )
Fsi
Fsi
Fsi
FinEquation
Nous regroupons toutes les informations de conception dans un document que nous appelons
le dossier de dveloppement.
5. Le Dossier de dveloppement
Cest un document dans lequel se trouvent consigns tous les lments relatifs la construction et lcriture de
lalgorithme et du programme rsolvant le problme cherch. Nous le divisons en 5 parties.
5.1 Enonc et spcification
Enonc du problme rsolu par ce logiciel.
- Spcifications oprationnelles des abstractions de plus haut niveau du logiciel, en
exprimant celles-ci l'aide de types abstraits et de spcifications de plus bas niveau.
- Spcifications des types abstraits de donnes utiliss.
- Spcifications d'interface pour les abstractions de plus bas niveau.
On utilisera ces trois techniques de spcification de manire descendante, quitte remonter
corriger des spcifications de niveau plus haut lorsque des erreurs seront apparues dans une
spcification de plus bas niveau. Ces spcifications sont destines au niveau " concepteur de
logiciel ", plutt qu' l'utilisateur. Cette partie rassemble les dfinitions abstraites des
composants. Un utilisateur de base n'ayant priori pas consulter ce paragraphe, les termes
employs seront les plus rigoureux possibles relativement un formalisme ventuel.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
246
Analyse des besoins :
son utilit principale est de fournir l'utilisateur la description des services que lui rendra ce
logiciel. Les termes utiliss doivent tre compris par l'utilisateur.
5.2 Mthodologie
Dans ce paragraphe se situent tous les documents et les explications qui ont pu mener la
dcision de rsoudre le problme pos par la mthode que l'on a choisie. Le programmeur
dispose ici de toute latitude pour s'exprimer l'aide de texte en langue naturelle, de
reprsentation graphique, d'outils ou de supports permettant au lecteur de se faire une ide
prcise du pourquoi des choix effectus.
5.3 Environnement
Ltudiant pourra prsenter sous forme dun tableau les principales informations concernant
les donnes de son algorithme.
Exemple :
Nom genre localisation utilisation
PHT reel Entre prix hors taxe
TVA reel local TVA en %
PTTC reel sortie Prix TTC
5.4 Algorithme en LDFA
Ici se situe la description de l'algorithme propos pour rsoudre le problme propos. Il est
obtenu entre autre partir de larbre de programmation construit pendant lanalyse et la
conception. Ci-dessous le modle gnral d'un algorithme :
Algorithme XYZT;
global :
local :
entre :
sortie :
modules utiliss :
Spcifications : (TAD)
Types Abstraits de Donnes utiliss
dbut
( corps d'algorithme en LDFA)
fin XYZT.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
247
Nous verrons ailleurs ce que reprsentent les notions de TAD et
de module.
5.5 Programme en langage de programmation(Pascal par exemple)
Dans ce paragraphe nous ferons figurer la " traduction " en langage de programmation de
lalgorithme du paragraphe prcdent.
6. Trace formelle dun algorithme
Et le dernier [prcept], de faire partout des dnombrements si entiers, et des revues si gnrales, que je fusse
assur de ne rien omettre.
R Descartes Discours de la mthode, seconde partie, 1637.
Nous proposons au dbutant de vrifier l'exactitude de certaines parties de son algorithme en
utilisant un petit outil permettant l'excution formelle (c'est dire sur des valeurs algbriques
ou symboliques plutt que numriques) de son algorithme. La trace numrique et les
vrifications associes seront effectues lors de l'excution par la machine.
6.1 Espace dexcution dune instruction compose
On appelle espace dexcution dune squence ou dun bloc dinstructions i
1
...i
n
lensemble o E
k
est lespace dexcution de linstruction i
k
.
Rappelons que lon peut considrer un " programme " LDFA sous un autre point de vue : non
pas comme une suite dinstructions, mais comme un environnement donn avec un tat initial
E
0
, puis on value la modification de cet environnement que chaque instruction provoque sur
lui.
On considre les instructions i
k
comme des transformateurs denvironnement E
n
:
{E
0
} {E
1
} {E
2
} ........... {E
k
} {E
k+1
}
L'instruction i
n+1
fait alors passer l'environnement de l'tat E
n
l'tat E
n+1
.
Nous crirons ainsi : i
n+1
: {E
n
} {E
n+1
}
Ces actions dterminent alors une suite dtats de lenvironnement (E
0
,E
1
,....E
k+1
) que lon
peut observer.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
248
Cest ce point de vue qui permet dexcuter un suivi dexcution symbolique dun algorithme.
Nous le nommerons " trace formelle ".
On adoptera pour une trace formelle une disposition en tableau de lespace dexcution
comme suit :
Etats V
1
V
2
..... V
n
E
1
-- -- y
E
2
x -- y+1
La colonne Etats reprsente donc les tats successifs de lenvironnement (ou espace
dexcution) figur ici par les variables V
1
,V
2
,...,V
n
. Les contenus des cellules du tableau sont
les valeurs symboliques des variables au cours du droulement de lexcution. On peut
considrer l'image mentale suivante de la trace formelle comme tant une succession de
"photographies instantanes" de l'environnement prises aprs chaque instruction.
6.2 Exemple complet avec trace formelle
Nous traitons un exemple complet avec son dossier de dveloppement et une trace formelle.
Enonc
Calculer S= sans utiliser de formule (car l'on sait que S=(n+1)n/2 )
Spcification : flux dinformation
En Entre
Un nombre n e N
*
En Sortie
Ecrire la somme voulue S.
Mthodologie
S est la somme des termes d'une suite rcurrente :
s
i
s
0
= 0
s
i
= s
i-1
+ i
Environnement
Nom genre localisation utilisation
N Entier Entre Nombre dlments saisir
S Entier Sortie Variable de cumul pour la somme
I Entier local Gestion des boucles : compteur
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
249
Algorithme
Algorithme Somentier
N e N
*
S , I e N
2
Dbut {Somentier}
(E
0
)
Lire (N) ;
(E
1
)
S 0;
(E
2
)
I 1;
(E
3
)
TantQue I s ? ? ? faire
(E
4
)
S S+I;
(E
5
)
I I+1;
(E
6
)
FinTant;
(E
7
)
Ecrire(S);
Fin Somentier
Ceci est un algorithme incomplet dans lequel on a dj intercal les tats (E
n
) entre les
instructions. On ne sait pas exactement quel sera le test darrt de la boucle (remplac par ? ?
?), on sait seulement que cest la valeur de la variable de compteur I qui le fournira.
Utilisation de la trace formelle
Nous allons montrer laide de la trace formelle que cet algorithme fournit bien la somme des
n premiers entiers dans la variable S, relativement aux prconditions { S = 0 et i = 1}.
Nous allons donc faire de la dmonstration de programme :
Prcondition Action Postcondition
{S= 0 et i= 1} Algorithme
{ S = }
Nous pouvons avoir une hsitation quant la borne du test "TantQue I s ??? ", faut-il
s'arrter N, N-1 ou N+1 ?
Posons comme hypothse que le test s'arrte la valeur N, soit : "TantQue I s N
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
250
Excutons manuellement et pas pas lalgorithme prcdent en supposant que le test d'arrt
nest pas franchi, cest dire que lon a I > N.
Voici le dbut des rsultats de sa trace formelle dans le tableau ci-dessous :
Etats I N S
E
0
- - --
E
1
- n --
E
2
- n 0
E
3
1 n 0
E
4
=E
3
1 n 0
E
5
1 n 1
E
6
2 n 1
E
4
=E
6
2 n 1
E
5
2 n 3
E
6
3 n 3
E
4
= E
6
etc.. 3 n 3
isolons les deux premiers " tours " de boucle :
E
4
= E
6
2 n 1
E
4
= E
6
3 n 3
Nous voyons que juste avant la sortie de boucle (tat E
6
) au premier tour I=2 et S=1, au
deuxime tour I=3 et S=3 .
Nous posons lhypothse de rcurrence quau kme tour i=k+1 et S= (somme des k
premiers entiers). Nous allons utiliser lexcution formelle pas pas dun tour de boucle afin
de voir si aprs un tour de plus cette hypothse se vrifie au rang k+1 :
Etats I N S
..... ... ... ...
E
4
= E
6
k+1 n
S=
E
5
k+1 n
S= + k+1
E
6
k+2 n
S= + k+1
Or S= +k+1 = (la somme des k+1 premiers entiers).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
251
Nous venons donc de montrer qu ltat E6 cet algorithme donne :
Etats I N S
E
6
k+1 n
S=
En particulier, lorsque k = n nous avons dans S la somme des n premiers entiers :
Etats I N S
E
6
n+1 n
S=
Nous pouvons dj crire que : n, n > 0, S =
En plus ce dernier tableau nous permet immdiatement de trouver la valeur exacte de la
variable de contrle de la boucle (ici la variable I qui vaut n+1) et donc dcrire un test
darrt de boucle juste.
On peut alors choisir comme test I<>n+1 ou bien I< n+1 etc... ou tout autre prdicat
quivalent.
Il tait possible de programmer directement cet algorithme avec les deux autres boucles
(pour... et rpeter...). Ceci est propos en exercice au lecteur.
7. Traducteur lmentaire LDFA - Java / Pascal
Nous venons de voir quun algorithme devait se traduire en langage de programmation (dit
volu). Nous fournirons ici un tableau qui sera utile ltudiant pour la traduction des
instructions algorithmiques en langage de programmation.
7.1 Traducteur
Afin de bien montrer que l'criture algorithmique est plus abstraite qu'un langage de
programmation nous donnons un tableau de traduction LDFA dans deux langages : en Pascal
de base et en Java2 restreint aux instructions seulement: ( dans le tableau, P est un prdicat et E une
instruction compose )
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
252
LDFA Java Pascal
O (instruction vide)
pas de traduction pas de traduction
debut i1 ; i2; i3; ...... ; ik fin
{ i1 ; i2; i3; ...... ; ik }
begin i1 ; i2; i3; ...... ; ik end
x a
x = a ; x := a
;
pas de traduction (ordre d'excution) ;
Si P alors E1 sinon E2 Fsi
if ( P ) E1 ; else E2 ;
( attention, pas de fermeture !)
if P then E1 else E2
( attention, pas de fermeture !)
Tantque P faire E Ftant
while ( P ) E ;
( attention, pas de fermeture)
while P do E
( attention, pas de fermeture)
rpeter E jusqu P
do E ; while ( ! P ) ; repeat E until P
lire (x1,x2,x3......,xn )
System.in.read( ) ;
System.in.readln( ) ;
read(fichier,x1,x2,x3......,xn )
readln(x1,x2,x3......,xn )
Get(fichier)
ecrire (x1,x2,x3......,xn )
System.in.print( ) ;
System.in. println( ) ;
write(fichier,x1,x2,x3......,xn )
writeln(x1,x2,x3......,xn )
Put(fichier)
pour x a jusqu b faire
E
Fpour
for (int x= a; x <= b; x++)
E ;
for x:=a to b do E (croissant)
for x:=a downto b do E (dcroissant)
( attention, pas de fermeture)
SortirSi P
if ( P ) break ; if P then Break
Ce tableau de traduction permet dj dcrire trs rapidement des programmes Pascal et Java
simples partir dalgorithmes tudis et crits.
7.2 Exemple
En appliquant le traducteur lalgorithme de lquation du second degr nous obtenons le
programme Pascal suivant :
programequation;
var
A,B,C:real;
X1,X2:real;
Delta:real;
begin
readln(A,B,C);
if A = 0 then {A=0}
if B = 0 then
if C = 0 then
writeln('R est solution')
else
writeln('pas de solution')
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
253
else
begin
X1 := - C/B;
writeln('x=',X1)
end
else
begin
Delta := B*B-4*A*C;
if Delta < 0 then
writeln('pas de solution')
else
if Delta=0 then
begin
X1 := -B/(2*A);
writeln('x=',X1)
end
else
begin
X1 := (-B + Sqrt(Delta)) / (2*A);
X2 := (-B - Sqrt(Delta)) / (2*A);
writeln('x1=',X1,'x2=',X2)
end
end
end.
En appliquant le traducteur Java2 ce mme algorithme de lquation du second degr, nous
obtenons le squelette de programme Java2 suivant :
if (a ==0)
if (b ==0)
if (c ==0)
System.out.println("tout reel est solution") ;
else
System.out.println("il n'y a pas de solution") ;
else {
x = -c/b ;
System.out.println("la solution est " + x) ;
}
else {
delta = b*b -4*a*c ;
if (delta <0)
System.out.println("il n'y a pas de solution dans les reels") ;
else
if (delta == 0) {
x1 = -b / (2*a) ;
System.out.println("il y a une solution double : "+x1) ;
}
else {
x1 = (-b + Math.sqrt(delta)) / (2*a) ;
x2 = (-b - Math.sqrt(delta)) / (2*a) ;
System.out.println("il y deux solutions gales a "+x1+" et " + x2) ;
}
} etc
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
254
7.3 Scurit et ergonomie
Lutilisation du traducteur manuel LDFA > Pascal fournit une version prliminaire de
programme pascal fonctionnant sur des donnes correctes sans aucune prsentation.
Il appartient au programmeur de complter dans un deuxime temps la partie scurit associe
aux contraintes du domaine de dfinition des variables et aux contraintes matrielles
dimplantation. Enfin, dans un troisime temps, lergonomie (forme de lchange
dinformation entre le programme et le futur utilisateur) sera envisage et programme.
Voyons sur lexemple de la somme des n premiers entiers dj cit plus haut, comment ces
trois tapes sarticulent .
Etape de traduction-somme des n premiers entiers
Texte final de lalgorithme de dpart : Texte de sa traduction en pascal :
Algorithme Somentier
N e N
*
S , I e N
2
Dbut {Somentier}
Lire (N) ;
S 0;
I 1;
TantQue I < N+1 faire
S S+I;
I I+1;
FinTant;
Ecrire(S);
Fin Somentier
programSomentier ;
var N : integer ;
S,I : integer ;
begin
readln(N) ;
S :=0 ;
I :=1 ;
while I < N+1 do
begin
S := S +I;
I := I+1;
end;
writeln(S)
end.
Etape de scurisation-somme des n premiers entiers
Scurit due aux domaines de dfinition des donnes
La traduction ne permet pas dcrire les domaines de dfinition des variables : en loccurrence
ici la variable N eN
*
est traduite par " var N : integer ", or le type prdfini integer est un
sous-ensemble des entiers relatifs Z, il est donc ncessaire dliminer les entiers ngatifs ou
nuls comme choix possible.
Ds que lutilisateur aura entr son nombre, le programme devra tester lappartenance au bon
intervalle afin de protger la partie de code, par exemple avec une instruction de condition :
if N > 0 then begin
// code protg
end
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
255
Protection programme dans les pointills en dessous dans le cadre de droite :
programSomentier ; programSomentier ;
var N : integer ;
S,I : integer ;
var N : integer ;
S,I : integer ;
begin
readln(N) ;
begin
readln(N) ;
if N > 0 thenbegin
S :=0 ;
I :=1 ;
S :=0 ;
I :=1 ;
while I < N+1 dobegin
S := S + I;
while I < N+1 do begin
S := S + I;
I := I+1;
end;
writeln(S)
I := I+1;
end;
writeln(S)
end
end. end.
Scurit due aux contraintes dimplantation
Si nous excutons ce programme pour la valeur N=500, la valeur fournie en sortie est " -5822
" sur un pascal 16 bits comme TP-pascal, le rsultat n'est pas correct. Nous sommes
confronts au problme de la reprsentation des entiers machines dj cit. Ici le type integer
est restreint lintervalle [-32768,+32767] ; il y a manifestement dpassement de capacit
(overflow) et le systme a allgrement continu les calculs malgr ce dpassement. En effet,
la somme vaut 500*501/2 soit 125250, cette valeur nappartient pas lintervalle des integer.
Le programmeur doit donc remdier ce problme par un effort personnel de scurisation de
son programme en nautorisant les calculs que pour des valeurs valides offrant un maximum
de scurit.
Ici la variable S contient la somme , nous savons que = k(k+1)/2, donc il suffira de
rsoudre dans N linquation k(k+1)/2 s 32767 o n est linconnue. Lunique solution
positive a pour partie entire 255, qui est la valeur maximale avant dpassement de capacit.
Donc il suffit de protger le code par un test supplmentaire sur la variable N :
if (N > 0) and (N < 256) then begin
S :=0 ;
I :=1 ;
while I< N+1 do begin
S := S +I;
I := I+1;
end;
writeln(S)
end
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
256
En vrifiant sur lexcution, nous trouvons que S = 32640 pour N = 255. Ce qui nous donne la
version suivante du programme :
program Somentier ;
var N : integer ;
S , I : integer ;
begin
readln(N) ;
if (N > 0) and(N < 256) thenbegin
S :=0 ;
I :=1 ;
while I< N+1 do begin
S := S +I;
I := I+1;
end;
writeln(S)
end
end.
Etape dergonomie-somme des n premiers entiers
Dans cet exemple, linformation changer avec lutilisateur est trs simple et ne ncessite
pas une interface spciale. Il sagira de lui prciser les contraintes dentre et de lui prsenter
dune manire claire le rsultat.
program Somentier ;
var N : integer ;
S , I : integer ;
begin
Write(Entrez un entier entre 0 et 255) ;
readln(N) ;
if (N > 0) and (N < 256) then begin
S :=0 ;
I :=1 ;
while I< N+1 do begin
S := S +I;
I := I+1;
end;
writeln(la somme des ,N, premiers entiers vaut ,S)
end
else
writeln(Calcul impossible ! !)
end.
Vous remarquerez que les adjonctions supplmentaires de code (en italique) dans le
programme final se montent environ 50% du total du code crit, car un logiciel nest pas
uniquement un algorithme traduit.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
257
En continuant dappliquer le principe de la programmation structure, il est bon de bien
sparer lors du dveloppement la partie algorithmique des parties scurit et ergonomie. Le
programmeur dbutant y gagnera en clart dans sa mthode de travail.
8. Facteurs de qualit du logiciel
B.Meyer et G.Booch
Un utilisateur, lorsquil achte un produit comme un appareil lectro- mnager ou une
voiture, attend de son acquisition quelle possde un certain nombre de qualits (fiabilit,
durabilit, efficacit, ...). Il en est de mme avec un logiciel.
Voici une liste minimale de critres de qualit du logiciel (propose B.Meyer, G.Booch):
Correction Robustesse Extensibilit
Rutilisabilit Compatibilit Efficacit
Portabilit Vrificabilit Intgrit
Facilit utilisation Modularit Lisibilit
Abstraction
Reprenons les dfinitions communment admises par ces deux auteurs sur ces facteurs de
qualit.
La correction est la qualit qu'un logiciel a de respecter les
spcifications qui ont t poses.
La robustesse est la qualit qu'un logiciel a de fonctionner en
se protgeant des conditions de dysfonctionnement.
L'extensibilit est la qualit qu'un logiciel a daccepter des
modifications dans les spcifications et des adjonctions
nouvelles.
La rutilisabilit est la qualit qu'un logiciel a de pouvoir tre
intgr totalement ou partiellement sans rcriture dans un
nouveau code.
La compatibilit est la qualit qu'un logiciel a de pouvoir tre
utilis avec d'autres logiciels sans autre effort de conversion
des donnes par exemple.
Constat
Correction
Robustesse
Extensibilit
Rutilisabilit
Compatibilit
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
258
L'efficacit est la qualit qu'un logiciel a de bien utiliser les
ressources.
La portabilit est la qualit qu'un logiciel a d'tre facilement
transfr sur de nombreux matriels, et insrable dans des
environnements logiciels diffrents.
La vrificabilit est la qualit qu'un logiciel a de se plier la
dtection des fautes, au traage pendant les phases de validation
et de test.
L'intgrit est la qualit qu'un logiciel a de protger son code et
ses donnes contre des accs non prvus.
La facilit d'utilisation est la qualit qu'un logiciel a de pouvoir
tre appris, utilis, interfac, de voir ses rsultats rapidement
compris, de pouvoir rcuprer des erreurs courantes.
La lisibilit est la qualit qu'un logiciel a d'tre lu par un tre
humain.
La modularit est la qualit qu'un logiciel a d'tre
dcomposable en lments indpendants les uns des autres et
rpondants un certain nombre de critres et de principes.
L'abstraction est la qualit qu'un logiciel a de sattacher
dcrire les oprations sur les donnes et ne manipuler ces
donnes qu travers ces oprations.
La production de logiciels de qualit nest pas une spcificit des professionnels de la
programmation ; cest un tat desprit induit par les mthodes du gnie logiciel. Le dbutant
peut, et nous le verrons par la suite, construire des logiciels ayant des " qualits " sans avoir
fournir defforts supplmentaires.
Bien au contraire la ralit a montr que les tudiants " bricoleurs " passaient finalement plus
de temps " bidouiller " un programme que lorsquils dcidaient duser de mthode de
travail. Une amlioration de la qualit gnrale du logiciel en est toujours le rsultat.
Efficacit
Portabilit
Vrificabilit
Intgrit
Facilit
Lisibilit
Modularit
Abstraction
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
259
Machines abstraites : exemple
Traitement descendant modulaire d'un exemple complet
Objectif : dvelopper un exemple simple de construction d'une machine abstraite par
dcomposition descendante sur 4 niveaux.
ENONCE
On donne une liste de n noms (composs de lettres uniquement). Extrayez ceux qui sont le
premier et le dernier par ordre alphabtique. Ecrire un programme Pascal effectuant cette
opration.
SPECI FI CATI ONS :(il s'agit d'claircir certaines dcisions)
Plan:
Objets utiliss,
machine abstraite,
spcification de donnes.
Identification Signification
( Liste , << ) Liste est un ensemble fini de noms o << est une relation
d'ordre total
Noms Ensemble de tous les noms possibles (chacun est
constitu de lettres)
lment Fonction fournissant le kime lment de la liste :
lment : N* x Liste Liste
Grand Un lment de l'ensemble Noms:
Grand e Noms
Petit Un lment de l'ensemble Noms:
Petit e Noms
Long Fonction fournissant le nombre dlments de la liste :
Long : Liste N*
Objets utiliss au niveau 1
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
260
(description de haut niveau d'abstraction de l'algorithme choisi)
Grand lment ( 1 , Liste) ;
Petit lment ( 1 , Liste) ;
Pour indice 2 jusqu Long (Liste) faire
Si Grand << lment (indice, Liste) alors
Grand lment (indice, Liste)
fsi ;
Si lment (indice ,Liste) << Petit alors
Petit lment (indice, Liste)
fsi
Fpour ;
{Grand = le dernier et Petit = le premier }
Identification Signification
Noms Un ensemble de caractres
( Liste , << ) Liste est un ensemble fini muni d'une relation d'ordre
total <<
lment Fonction lment : N* x Liste Liste
(k, Liste) lment (k, Liste) e Liste
Long Fonction fournissant le nombre dlments de la liste :
Long : Liste N*
Liste Long (Liste) = n
Nous avons ici une spcification abstraite de haut niveau. Il est impratif de prendre des
dcisions sur les structures de donnes qui vont tre utilises. Nous allons envisager le cas le
plus simple : celui o la structure choisie pour reprsenter la liste est un tableau.
Reprise des objets abstraits en les exprimant de la faon suivante :
Cas A o la version pascal contient dj les outils de chanes
- Liste = Tableau
- lment (i, Liste) = Liste[i]
- Long(Liste) = n , taille du tableau
- Noms: Type string
- << : s (relation de comparaison lexicographique sur les chanes)
Machine abstraite de niveau 1
Les donnes au niveau 1
Les donnes au niveau 2
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
261
Nous continuons descendre dans les niveaux dabstraction. Nous devons prendre des
dcisions sur le langage-cible. Il est dit dans l'nonc que ce doit tre Pascal, mais lequel ?
Nous avons choisi dans ce premier cas, une version simple en prenant par exemple comme
dialecte deux descendants de l'UCSD-Pascal, savoir Think Pascal (Mac) ou Borland Pascal-
Delphi (Windows-Linux) qui contiennent en prdfini le type de chane de caractres.
Ces spcifications de donnes tant tablies, la machine prcdente devient :
cas A
Algorithme EXTRAIT0
Global : n e N* , Long_mot e N*
Local : indice e N*, ( Grand , Petit ) e Noms
2
Spcification:
Noms = Type string prdfini par une version dimplmentation du pascal.
Liste = Tableau de Nom, de Taille n e N* fixe.
Dbut
Grand Liste[1] ;
Petit Liste[1] ;
Pour indice 2 jusqu n faire
Si Grand < Liste[indice] alors Grand Liste[indice] fsi ;
Si Liste[indice] < Petit alors Petit Liste[indice] fsi
Fpour ;
Fin_EXTRAIT0
Cet algorithme se traduit immdiatement en pascal. Nous voyons donc quil nous a t possible dcrire ce
petit programme en descendant uniquement sur 2 niveaux de spcifications.
Quen est-il lorsque lon travaille avec un autre langage cible (nous allons juste utiliser une
version diffrente du mme langage cible) ? Nous allons voir que nous devrons descendre
alors plus loin dans les spcifications et dvelopper plus de code c'est l'objectif de la suite de
ce document.
Cas B o la version pascal ne contient pas les outils de chanes
Reprenons partiellement la mme spcification de donnes par un tableau de taille n pour la
Liste, mais supposons que le langage-cible soit du Pascal ISO, dans lequel le type string
nexiste pas.
Machine abstraite de niveau 2
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
262
cas B
Cas B o la version pascal ne contient pas d'outils de chanes
- Noms: Nous choisissons, afin de ne pas nous perdre en complexits inutiles, de spcifier
la l'ensemble des caractres par un tableau de caractres : notons le Tchar
- Liste = Tableau de Tchar
- lment (i, Liste) = Liste[i]
- Long(Liste) = n , taille du tableau .
- << : CMP (oprateur de relation de comparaison sur les Tchar)
cas B
Ces choix de spcification induisent un choix de dveloppement d'une machine abstraite
spcifique la relation d'ordre << , qui n'est pas un oprateur simple du langage : nous avons
dnot la machine par le nom CMP.
Noms= Tchar
Taille de Tchar = n
ch1 e Tchar , ch2 e Tchar
Spcification de loprateur CMP de comparaison de chanes :
CMP : Tchar x Tchar { Vrai , Faux }
CMP (ch1,ch2) = Vrai ssi (ch1 < ch2) ou (ch1 = ch2)
CMP (ch1,ch2) = Faux ssi ch2 < ch1
ch1 e Noms,
ch2 e Noms
Descendons dans les spcifications plus concrtes de la machine abstraite de comparaison,
spcifions d'une manire plus dtaille, les donnes Noms et Liste de la machine abstraite
CMP, en rpondant aux deux questions ci-dessous :
Noms = Tableau de caractres not Tchar , comment est-il reprsent ?
Liste = Tableau de Tchar , comment est-il reprsent ?
Les donnes au niveau 2
Machine abstraite CMP
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
263
cas B
Un nom Noms :
1 2 Long_mot
Noms = Tableau de caractres
Noms [i] = le caractre de rang i-1
Attributs :
- Taille = Long_mot
- caractre spcial = #
Une liste de noms Liste :
Liste = Tableau de noms
Liste[i] = le Noms de rang i
Attribut :
Taille = n
On dispose d'une relation d'ordre sur les caractres (ordre ASCII) note s .
cas B
Dcrivons une premire version de CMP en tenant compte des spcifications de donnes
prcdentes.
Tantque (les caractres lus de ch1 et de ch2 sont les mmes)
et (ch1 non entirement explor) et (ch2 non entirement explor) faire
passer au caractre lu suivant dans ch1 ;
passer au caractre lu suivant dans ch2 ;
Ftant ;
Si (ch1 et ch2 finis en mme temps) alors ch1=ch2 fsi ;
Si (ch1 fini avant ch2) ou (car_Lu de ch1 < car_Lu de ch2) alors ch1 < ch2 fsi ;
Si (ch2 fini avant ch1) ou (car_Lu de ch2 < car_Lu de ch1) alors ch2 < ch1 fsi ;
Descendons plus bas dans les niveaux dabstraction.
Les donnes au niveau 3
Machine CMP de niveau 3
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
264
cas B
Notre travail va consister expliciter, l'aide des structures de donnes choisies les phrases
de haut niveau d'abstraction de la spcification de niveau 3 de CMP (en italique le niveau 3,
en gras le niveau 4):
spcification de niveau 3 de CMP spcification de niveau 4 de CMP
car_Lu de ch1 ch1[i] (ime caractre de ch1)
car_Lu de ch2 ch2[k] (kme caractre de ch2)
ch1 fini ou entirement explor ch1[i] = #
Ch2 fini ou entirement explor ch2[k] = #
les caractres lus de ch1 et de ch2 sont les mmes ch1[i] = ch2[i]
caractre suivant de ch1 , ch2 Si caractre actuel = ch1[k] alors
caractre suivant = ch1[k+1] ,
idem pour ch2
La spcification oprationnelle de niveau 4 de CMP devient alors :
Tantque (ch1[k] = ch2[k] ) et ( ch1[k] = # ) et ( ch2[k] = # ) faire
k k+1
Ftant ;
Si ( ch1[k] = # ) et ( ch2[k] = # ) alors CMP Vrai fsi ;
Si ( ch1[k] = # ) ou (ch1[k] < ch2[k] ) alors CMP Vrai fsi ;
Si ( ch2[k] = # ) ou (ch2[k] < ch1[k] ) alors CMP Faux fsi ;
Il faut prvoir d'initialiser le processus au premier caractre k=1 d'o maintenant une
spcification de l'algorithme :
Algorithme CMP
Local : k e N*
entre : ( ch1 , ch2 ) e Noms
2
sortie : CMP e { Vrai, Faux }
Spcification:
Noms = Tableau de Taille Long_mot fixe disposant d'un caractre de fin (#)
Dbut
k 1 ;
Tantque(ch1[k] = ch2[k]) et (ch1[k] = # ) et (ch2[k] = # ) faire
k k+1
Ftant ;
Si( ch1[k] = '#' ) et ( ch2[k] = '#' ) alors CMP Vrai fsi ;
Si ( ch1[k] = '#' ) ou (ch1[k] < ch2[k] ) alors CMP Vrai fsi ;
Si ( ch2[k] = '#' ) ou (ch2[k] < ch1[k] ) alors CMP Faux fsi ;
Fin_CMP.
Machine CMP de niveau 4
CMP
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
265
Puis en intgrant la machine abstraite CMP de niveau 4 avec les spcifications de TAD
dcrites prcdemment, le tout dans la spcification de niveau 3 de l'algorithme choisi, nous
obtenons l'algorithme final suivant :
cas B
Algorithme EXTRAIT1
Global : n e N* , Long_mot e N*
Local : indice e N*, ( Grand , Petit ) e Noms
2
module utilis :
Spcification:
Noms= Tableau de caractres, de Taille Long_mot fixe disposant d'un attribut marqueur
de fin, qui est le caractre spcial # .
Liste = Tableau de Noms, de Taille n e N* fixe.
TAD utiliss:
- Tableau de caractre de dimension 1.
- Tableau de Nomsde dimension 1.
Dbut
Grand Liste[1] ;
Petit Liste[1] ;
Pour indice 2 jusqu n faire
Si CMP(Grand , Liste[indice] ) alors Grand Liste[indice] fsi ;
Si CMP(Liste[indice] , Petit ) alors Petit Liste[indice] fsi
Fpour ;
Fin_EXTRAIT1.
Voici une traduction possible en Pascal de cet algorithme.
Program EXTRAIT1;
Const
Taille = 5;
Long_mot = 20;
Type
Nom = array[1..Taille] of Char;
List_noms = array[1..Long_mot ] of Nom;
Var
Liste : List_noms;
indice : integer;
Grand,Petit : Nom;
Algorithme EXTRAIT1 niveau 4
CMP
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
266
function CMP (ch1,ch2:Nom):Boolean;
var
k : integer;
begin
k:=1
While (ch1[k]=ch2[k])and(ch1[k]<'#')and(ch2[k]<'#') do k:=k+1;
if (ch1[k]='#')and(ch2[k]='#') then result :=True;
if (ch1[k]='#')or(ch1[k]<ch2[k]) then result :=True;
if (ch2[k]='#')or(ch2[k]<ch1[k]) then result :=False;
end;{CMP}
procedure INIT_Liste;
begin
{initialise la liste des noms termins par des #}
end;
procedure ECRIRE_Nom (name:Nom);
begin
{crit sur une mme ligne les caractres qui composent la variable name, sans le #}
end;{ECRIRE_Nom}
Begin{EXTRAIT}
INIT_Liste;
Grand:=Liste[1];
Petit:=Liste[1];
for indice:=2 to taille do
begin
if CMP(Liste[indice],Petit) then Petit := Liste[indice];
if CMP(Grand,Liste[indice]) then Grand := Liste[indice];
end;
write('Le premier est : ');
ECRIRE_Nom(Petit);
write('Le dernier est : ');
ECRIRE_Nom(Grand);
End.{ EXTRAIT }
Le lecteur comprendra partir de cet exemple que les langages de programmation sont trs nombreux et
que le choix dun langage pour dvelopper la solution dun problme est un lment important.
Autres versions possibles partir de CMP
La version dimplantation de CMP du niveau 4 a t conue sur une structure de donnes
tableau termine par une sentinelle (le caractre #). Elle a t implante par une fonction en
pascal.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
267
Il est possible de rcrire dautres version dimplantation de cette mme machine CMP avec
des structures de donnes diffrentes comme un tableau avec un attribut de longueur ou bien
une structure liste dynamique :
Fig - schma des trois reprsentations des donnes (a
1
, , a
n
)
Nous engageons le lecteur crire chaque fois lalgorithme associ et le traduire en un
programme pascal.
Nous donnons ci-aprs, au lecteur les trois versions dimplantation en pascal de la fonction
CMP associe (sentinelle, pointeur, attribut).
CMP
programme avec sentinelle
function CMP(ch1,ch2:Nom):Boolean;
var
k : integer;
begin
k:=1
While (ch1[k]=ch2[k])
and(ch1[k]<'#')
and(ch2[k]<'#') do
k:=k+1;
if (ch1[k]='#')and(ch2[k]='#') then
result :=True;
if (ch1[k]='#')or(ch1[k]<ch2[k]) then
result :=True;
if (ch2[k]='#')or(ch2[k]<ch1[k]) then
result :=False;
end;{CMP}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
268
CMP
programme avec pointeur
type pchaine=^chaine;
chaine=record
car:char;
suiv:pchaine;
end;
function CMP(ch1,ch2:Nom):Boolean;
begin
while ((ch1^.car=ch2^.car)
and (ch1^.suiv<nil)
and (ch2^.suiv<nil)) do
begin
ch1:=ch1^.suiv;
ch2:=ch2^.suiv;
end;
if ((ch1^.suiv=nil) and (ch2^.suiv=nil)) then
CMP:=true;
if (((ch1^.suiv=nil) and (ch2^.suiv<nil))
or (ch1^.car<ch2^.car)) then result:=true;
if (((ch2^.suiv=nil) and (ch1^.suiv<nil))
or (ch1^.carch2^.car)) then result:=false;
end;{CMP}
CMP
programme avec attribut
const MaxCar=1000;
type inter=0..MaxCar;
chaine=record
long:integer;
car:array[1..MaxCar] of char;
end;
function CMP(ch1,ch2:Nom):Boolean;
var n:integer;
begin
n:=1;
while (ch1.car[n]=ch2.car[n])
and ((n<n1)
and (n<n2)) do
n:=n+1;
if ((n=ch1.long) and (n=ch2.long)) then
result :=true;
if (((n=ch1.long) and (n<ch2.long))
or (ch1.car[n]<ch2.car[n])) then
result:=true;
if((n=ch2.long) and (n<ch1.long))
or (ch1.car[n]ch2.car[n]) then
result:=false;
end;{CMP}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
269
3.2 : Modularit
Plan du chapitre:
1. La modularit
1.1 Notion de module
1.2 Critres principaux de modularit
La dcomposabilit modulaire
La composition modulaire
La continuit modulaire
La comprhension modulaire
La protection modulaire
1.3 Prceptes minimaux de construction modulaire
Interface de donnes minimale
Couplage minimal
Interfaces explicites
Information publique et prive
2. La modularit par les unit en pascal UCSD
2.1 Partie " public " dune UNIT : " Interface "
2.2 Partie " prive " dune UNIT : " Implementation "
2.3 Partie initialisation dune UNIT
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
270
1. Modularit (selon B.Meyer)
1.1 Notion de module
Le mot MODULE est un des mots les plus employs en programmation moderne. Nous
allons expliquer ici ce que l'on demande, une mthode de construction modulaire de
logiciels, de possder comme proprits, puis nous verrons comment dans certaines
extensions de Pascal sur micro-ordinateur (Pascal, Delphi), cette notion de module se
trouve implante.
B.Meyer est lun des principaux auteurs avec G.Booch qui ont le plus travaill sur cette
notion. Le premier a implant ses ides dans le langage orient objet " Eiffel ", le second a
utilis la modularit du langage Ada pour introduire le concept dobjet qui a t la base de
mthodes de conception orientes objet : OOD, HOOD,UML...
Nous nous appuyons ici sur les concepts noncs par B.Meyer fonds sur 5 critres et 6
principes relativement une mthodologie danalyse de type modulaire. Une dmarche (et
donc le logiciel construit qui en dcoule) est dite modulaire si elle respecte au moins les
concepts ci-aprs.
1.2 Critres principaux de modularit
Les 5 principes retenus :
- La dcomposabilit modulaire
- La composition modulaire
- La continuit modulaire
- La comprhension modulaire
- La protection modulaire
Dfinitions et ralisations en Pascal de ces cinq principes
La dcomposabilit modulaire :
capacit de dcomposer un problme en sous-problmes, semblable la mthode structure
descendante.
Ralisation de ce critre en Pascal :
La hirarchie descendante des procdures et des fonctions.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
271
Illustration de la dcomposabilit en Pascal :
La composition modulaire :
capacit de recombinaison et de ragencement de modules crits, semblable la partie
ascendante de la programmation structure.
Ralisation de ce critre en Pascal :
N'existe pas en Pascal standard, toutefois la notion d'UNIT en Pascal UCSD (dont le
Delphi est un descendant) et de Library en sont deux implantations partielles.
Illustration de la composition en Pascal :
La continuit modulaire :
capacit rduire limpact de changements dans les spcifications un minimum de
modules lis entre eux, et mieux un seul module.
Ralisation de ce critre en Pascal :
Partiellement ; le cas particulier des constantes symboliques en Pascal standard, au
paragraphe const, montre lintrt de ce critre.
Exemple : const n=10 ;
....
for i :=1 to n do ....
...
if T1 < n then ....
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
272
Il suffit de changer la ligne const n=10 pour modifier automatiquement les instructions o
intervient la constante n, sans avoir les rcrire toutes. Cette pratique en Pascal est trs utile
en particulier lorsquil sagit de compenser le dfaut dans la continuit modulaire, apport par
la notion de tableau statique dont les bornes doivent tre connues lavance.
La comprhension modulaire :
capacit linterprtation par un programmeur du fonctionnement dun module ou dun
ensemble de modules lis, sans avoir connatre tout le logiciel.
Ralisation de ce critre en Pascal :
Partiellement la charge du programmeur en crivant des procdures et des fonctions qui
sappellent le moins possible. Chaque procdure ou fonction doit tre ddie une tche
autonome.
Plus efficace dans Delphi grce la notion dUNIT.
La protection modulaire :
capacit limiter les effets produits par des incidents lors de lexcution un nombre
minimal de modules lis entre eux, mieux un seul module.
Ralisation de ce critre en Pascal :
Correcte en Pascal grce au contrle des types et des bornes des paramtres d'entres ou de
sorties d'une procdure ou d'une fonction. Les variables locales permettent de restreindre la
porte dun incident.
Les pointeurs en Pascal
Le type pointeur met fortement en dfaut ce critre, car sa gestion mmoire est de bas
niveau et donc confie au programmeur ; les pointeurs ne respectent mme pas la notion
de variable locale!
En gnral le passage par adresse met en dfaut le principe de protection modulaire.
1.3 Prceptes minimaux de construction modulaire
Etant dbutants, nous utiliserons quatre des six prceptes noncs par B.Meyer. Ils sont
essentiels et sont adopts par tous ceux qui pratiquent des mthodes de programmation
modulaire :
- Interface de donnes minimale
- Couplage minimal
- Interfaces explicites
- Information publique et prive
Attention
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
273
Prcepte 1 : Interface de donnes minimale
Un module fix doit ne communiquer quavec un nombre " minimum " dautres modules du
logiciel. Lobjectif est de minimiser le nombred'interconnexions entre les modules. Le
graphe tablissant les liaisons entre les modules est not " graphe de dpendance ". Il doit
tre le moins maill possible. La situation est semblable celle que nous avons rencontr
lors de la description des diffrentes topologies des rseaux dordinateurs : les liaisons les
plus simples sont les liaisons en toile, les plus complexes (donc ici dconseilles) sont les
liaisons totalement mailles.
L'intrt de ce prcepte est de garantir un meilleur respect des critres de continuit et de
protection modulaire. Les effets d'une modification du code source ou d'une erreur durant
l'excution dans un module peuvent se propager un nombre plus ou moins important de
modules en suivant le graphe de liaison. Un dbutant optera pour une architecture de liaison
simple, ce qui induira une construction contraignante du logiciel. Loptimum est dfini par le
programmeur avec lhabitude de la programmation.
Ralisation de ce prcept en Pascal :
Le graphe de dpendance des procdures et des fonctions sera arborescent ou en toile.
Prcepte 2 : Couplage minimal
Lorsque deux modules communiquent entre eux, lchange dinformation doit tre
minimal. Ce prcepte ne fait pas double emploi avec le prcdent. Il s'agit de minimiser
la taille des interconnexions entre modules et non leur nombre comme dans le prcepte
prcdent.
Ralisation de ce prcept en Pascal :
En gnral, nous avons aussi un couplage fort lorsqu'on introduit toutes les variables
comme globales (donc viter, ce qui se produit au stade du dbutant). D'autre part la
notion de visibilit dans les blocs imbriqus et la porte des variables Pascal donne accs
des donnes qui ne sont pas toutes utiles au niveau le plus bas.
Prcepte 3 : Interfaces explicites
Lorsque deux modules M1 et M2 communiquent, lchange dinformation doit tre
lisible explicitement dans lun des deux ou dans les deux modules.
Ralisation de ce prcept en Pascal :
Lutilisation des donnes globales ou de la notion de visibilit nuit aussi ce principe. Le
risque de battre en brche le prcepte des interfaces explicites est alors de conduire des
accs de donnes injustifis (problme classique des effets de bord, o lon utilise
implicitement dans un bloc une donne visible mais non dclare dans ce bloc).
Prcepte 4 : Information publique et prive
Toute information dans un module doit tre rpartie en deux catgories : linformation
prive et linformation publique.
Ce prcepte permet de modifier la partie prive sans que les clients (modules utilisant ce
module) aient supporter un quelconque problme cause de modifications ou de
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
274
changements. Plus la partie publique est petite, plus on a de chances que des changements
n'aient que peu d'effet sur les clients du module.
- La partie publique doit tre la description des oprations ou du fonctionnement du
module.
- La partie prive contient limplantation des oprateurs et tout ce qui s'y rattache.
Ralisation de ce prcept en Pascal :
Le Pascal standard ne permet absolument pas de respecter ce principe dans le cadre gnral.
Delphi, avec la notion d'UNIT cotient une approche partielle mais utile de ce principe. Les
prmisses de cette approche existent malgr tout dans les notions de variables et de
procdures locales une procdure. La notion de classe en Delphi implante compltement
ce principe.
Enfin et pour mmoire nous citerons lexistence du prcepte douverture-fermeture et du prcepte dunits
linguistiques.
2. La modularit par les Unit avec Delphi
La notion de UNIT a t introduite en Pascal UCSD anctre de Delphi
Rappelons que Delphi et les versions de compilateurs libres gratuit comme FreePascal
compiler, Obron etc... prsentes sur Internet fonctionnant sur les micro-ordinateurs type PC,
ainsi que le Think Pascal de Symantec fonctionnant sur les MacIntosh dApple, sont tous une
extension du Pascal UCSD. Il est donc possible sur du matriel courant dutiliser la notion
dUNIT simulant le premier niveau du concept de module.
Cet lment reprsente une unit compilable sparment de tout programme et stockable en
bibliothque. Une Unit comporte une partie " public " et une partie " priv ". Elle implante
donc lide de module et tend la notion de bloc (procdure ou fonction) en Pascal.
Syntaxe :
Exemple :
Unit Truc;
<partie public>
<partie prive>
<initialisation>
end.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
275
2.1 Partie " public " dune UNIT : " Interface "
Correspond exactement la partie publique du module reprsent par la UNIT. Cette partie
dcrit les en-ttes des procdures et des fonctions publiques utilisables par les clients. Les
clients peuvent tre soit dautres procdures Pascal, des programmes Delphi ou dautres Unit.
La clause Uses XXX dans un programme Delphi, permet dindiquer la rfrence la Unit
XXX et autorise laccs aux procdures et fonctions publiques de linterface dans tout le
programme.
Syntaxe :
Exemple :
Unit Truc ;
interface
Uses Machin, Chose;
const
a=10;
x='a';
Type
amoi=12..36;
var
x, y : integer;
z : amoi;
implementation
end.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
276
2.2 Partie " prive " dune UNIT : " Implementation "
Correspond la partie prive du module reprsent par la UNIT. Cette partie intimement lie
linterface, contient le code interne du module. Elle contient deux sortes dlments : les
dclarations compltes des procdures et des fonctions prives ainsi que les structures de
donnes prives. Elle contient aussi les dclarations compltes des fonctions et procdures
publiques dont les en-ttes sont prsentes dans linterface.
Syntaxe :
Exemple :
Unit Truc ;
interface
Uses Machin, Chose;
const
a=10;
x='a';
Type
amoi = 12..36;
var
x, y : integer;
z : amoi;
procedure P1(x:real;var u:integer);
procedure P2(u,v:char;var x,y,t:amoi);
function F(x:real):boolean;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
277
implementation
procedure P1(x:real;var u:integer);
begin
< corps de procdure>
end;
procedure P2(u,v:char;var x,y,t:amoi);
begin
< corps de procdure>
end;
function F(x:real):boolean;
begin
< corps de fonction>
end;
end.
2.3 Partie initialisation dune UNIT
Il est possible d'initialiser des variables et d'excuter des instructions au lancement de l'UNIT.
Elles correspondent des instructions classiques Pascal sur des donnes publiques ou prives
de la Unit (initialisation de tableaux, mise zro de divers indicateurs, chargement de fichiers
etc...):
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
278
3.3 : Complexit, tri, recherche
Plan du chapitre:
1. Complexit d'un algorithme
1.1 Notions de complexit temporelle et spatiale
1.2 Mesure de la complexit temporelle d'un algorithme
1.3 Notation de Landau O(n)
2. Trier des tableaux en mmoire centrale
2.1 Tri interne, tri externe
2.2 Des algorithmes classiques de tri interne
- Le Tri bulles
- Le Tri par slection
- Le ri par insertion
- Le Tri rapide QuickSort
- Le Tri par tas HeapSort
3. Rechercher dans un tableau
3.1 Recherche dans un tableau non tri
3.2 Recherche dans un tableau tri
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
279
1. Complexit d'un algorithme et performance
Nous faisons la distinction entre les mthodes (algorithmes) de tri d'un grand nombre
d'lments (plusieurs milliers ou plus), et le tri de quelques lments (quelques dizaines, voir
quelques centaines ). Pour de trs petits nombres d'lments, la mthode importe peu. Il est
intressant de pouvoir comparer diffrents algorithmes de tris afin de savoir quand les utiliser.
Ce que nous nonons dans ce paragraphe s'applique en gnral tous les algorithmes et en
particulier aux algorithmes de tris qui en sont une excellente illustration.
1.1 Notions de complexit temporelle et spatiale
L'efficacit d'un algorithme est directement lie au programme implmenter sur un
ordinateur. Le programme va s'excuter en un temps fini et va mobiliser des ressources
mmoires pendant son excution; ces deux paramtres se dnomment complexit temporelle
et complexit spatiale.
Ds le dbut de l'informatique les deux paramtres "temps d'excution" et "place mmoire"
ont eu une importance peu prs gale pour comparer l'efficacit relative des algorithmes. Il
est clair que depuis que l'on peut, cot trs rduit avoir des mmoires centrales d'environ 1
Giga octets dans une machine personnelle, les soucis de place en mmoire centrale qui
s'taient fait jour lorsque l'on travaillait avec des mmoires centrales de 128 Kilo octets (pour
des gros matriels de recherche des annes 70) sont repousss psychologiquement plus loin
pour un utilisateur normal. Comme c'est le systme d'exploitation qui gre la mmoire
disponible ( RAM, cache, virtuelle etc...), les analyses de performances de gestion de la
mmoire peuvent varier pour le mme programme.
Le facteur temps d'excution reste l'lment qualitatif le plus perceptible par l'utilisateur d'un
programme ne serait ce que parce qu'il attend derrire son cran le rsultat d'un travail qui
reprsente l'excution d'un algorithme.
L'informatique reste une science de l'ingnieur ce qui signifie ici, que malgr toutes les tudes
ou les critres thoriques permettant de comparer l'efficacit de deux algorithmes dans
l'absolu, dans la pratique nous ne pourrons pas dire qu'il y a un meilleur algorithme pour
rsoudre tel type de problme. Une mthode pouvant tre lente pour certaines configurations
de donnes et dans une autre application qui travaille systmatiquement sur une configuration
de donnes favorables la mthode peut s'avrer tre la "meilleure".
La recherche de la performance tout prix est aussi inefficace que l'attitude contraire.
Prenons notre compte les recommandations de R.Sedgewick :
Quel que soit le problme mettez d'abord en uvre l'algorithme le plus simple, solution du problme, car le
temps ncessaire l'implantation et la mise au point d'un algorithme "optimis" peut tre bien plus
important que le temps requis pour simplement faire fonctionner un programme lgrement moins rapide.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
280
Il nous faut donc un outil permettant de comparer l'efficacit ou complexit d'un algorithme
celle d'un autre algorithme rsolvant le mme problme.
1.2 Mesure de la complexit temporelle d'un algorithme
- 1.2.1 La complexit temporelle
- 1.2.2 Complexit d'une squence d'instructions
- 1.2.3 Complexit d'une instruction conditionnelle
- 1.2.4 Complexit d'une itration finie borne
Nous prenons le parti de nous intresser uniquement au temps thorique d'excution d'un
algorithme. Pourquoi thorique et non pratique ? Parce que le temps pratique d'excution d'un
programme, comme nous l'avons signal plus haut dpend :
- de la machine (par exemple processeur travaillant avec des jeux d'instructions
optimises ou non),
- du systme d'exploitation (par exemple dans la gestion multi-tche des
processus),
- du compilateur du langage dans lequel l'algorithme sera traduit (compilateur
natif pour un processeur donn ou non),
- des donnes utilises par le programme (nature et/ou taille),
- d'un facteur intrinsque l'algorithme.
Nous souhaitons donc pouvoir utiliser un instrument mathmatique de mesure qui rende
compte de l'efficacit spcifique d'un algorithme indpendamment de son implantation en
langage volu sur une machine. Tout en sachant bien que certains algorithmes ne pourront
pas tre analyss ainsi soit parce que mathmatiquement cela est impossible, soit parce que les
configurations de donnes ne sont pas spcifies d'un manire prcise, soit parce que le temps
mis analyser correctement l'algorithme dpasserait le temps de loisir et de travail disponible
du dveloppeur !
Notre instrument, la complexit temporelle, est fond sur des outils abstraits (qui ont leur
correspondance concrte dans un langage de programmation). L'outil le plus connu est
l'opration lmentaire (quantit abstraite dfinie intuitivement ou d'une manire vidente par
le dveloppeur).
Notion d'opration lmentaire
Une opration lmentaire est une opration fondamentale d'un algorithme si le temps
d'excution est directement li (par une formule mathmatique ou empirique) au nombre de
ces oprations lmentaires. Il peut y avoir plusieurs oprations lmentaires dans un mme
algorithme.
Nous pourrons ainsi comparer deux algorithmes rsolvant le mme problme en comparant ce
nombre d'oprations lmentaires effectues par chacun des deux algorithmes.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
281
1.2.1 La complexit temporelle : notation
C'est le dcompte du nombre d'oprations lmentaires effectues par un algorithme donn.
Il n'existe pas de mthodologie systmatique (art de l'ingnieur) permettant pour un
algorithme quelconque de compter les oprations lmentaires. Toutefois des rgles usuelles
sont communment admises par la communaut des informaticiens qui les utilisent pour
valuer la complexit temporelle.
Soient i
1
, i
2
, ... , i
k
des instructions algorithmiques (affectation, itration, condition,...)
Soit une opration lmentaire dnote OpElem, supposons qu'elle apparaisse n
1
fois dans
l'instruction i
1
, n
2
fois dans l'instruction i
2
, ... n
k
fois dans l'instruction i
k
. Nous noterons
Nb(i
1
) le nombre n
1
, Nb(i
2
) le nombre n
2
etc.
Nous dfinissons ainsi la fonction Nb (i
k
) indiquant le nombre d'oprations lmentaires
dnot OpElemcontenu dans l'instruction algorithmique i
k
:
Nb( ) : Instruction Entier .
1.2.2 Complexit temporelle d'une squence d'instructions
Soit S la squence d'excution des instructions i
1
; i
2
; ... ; i
k
, soit n
k
=Nb (i
k
) le nombre
d'oprations lmentaires de l'instruction i
k
.
Le nombre d'oprations lmentaires OpElemde S, Nb(S) est gal par dfinition la somme
des nombres: n
1
+ n
2
+ ... + n
k
:
S =
dbut
i
1
;
i
2
;
... ;
i
k
fin
Nb( S ) = Nb(i
p
) = n
1
+ n
2
+ ... + n
k
1.2.3 Complexit temporelle d'une instruction conditionnelle
Dans les instructions conditionnelles tant donn qu'il n'est pas possible d'une manire
gnrale de dterminer systmatiquement quelle partie de l'instruction est excute (le alors
ou le sinon), on prend donc un majorant :
Cond =
si Expr alors E1
sinon E2
fsi
Nb( Cond ) < Nb( Expr) + max ( Nb( E1 ) , Nb( E2 ) )
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
282
1.2.4 Complexit temporelle d'une itration finie borne
Dans le cas d'une boucle finie borne (comme pour...fpour) contrle par une variable d'indice
"i", l'on connat le nombre exact d'itrations not Nbr_d'itrationsde l'ensemble des
instructions composant le corps de la boucle dnotes S (o S est une squence
d'instructions), l'arrt tant assur par la condition de sortie Expr(i) dpendant de la variable
d'indice de boucle i.
La complexit est gale au produit du nombre d'itrations par la somme de la complexit de la
squence d'instructions du corps et de celle de l'valuation de la condition d'arrt Expr(i).
Iter =
Itration Expr(i)
S
finItr
Nb( Iter ) = [ Nb( S) + Nb(Expr(i)) ] x Nbr_d'itrations
Exemple dans le cas d'une boucle pour...fpour :
Iter =
pour i<-- a jusqu b faire
i
1
;
i
2
;
... ;
i
k
fpour
La complexit de la condition d'arrt est par dfinition de 1 (<= le temps d'excution de
l'opration effectue en l'occurence un test, ne dpend ni de la taille des donnes ni de leurs
valeurs), en notant |b-a| le nombre exact d'itrations excutes (lorsque les bornes sont des
entiers |b-a| vaut exactement la valeur absolue de la diffrence des bornes) nous avons :
Nb( Iter ) = ( Nb(i
p
) + 1 ) . |b-a|
Lorsque le nombre d'itrations n'est pas connu mais seulement major ( nombre not
Majorant_Nbr_d'itrations), alors on obtient un majorant de la complexit de la boucle (le
majorant correspond la complexit dans le pire des cas).
Complexit temporelle au pire :
Majorant_Nb( Iter ) = [ Nb( S) + Nb(Expr(i)) ] x Majorant_Nbr_d'itrations
1.3 Notation de Landau O(n)
Nous avons admis l'hypothse qu'en rgle gnrale la complexit en temps dpend de la
taille n des donnes (plus le nombre de donnes est grand plus le temps d'excution est long).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
283
Cette remarque est d'autant plus proche de la ralit que nous tudierons essentiellement des
algorithmes de tri dans lesquels les n donnes sont reprsentes par une liste n lments.
Afin que notre instrument de mesure et de comparaison d'algorithmes ne dpende pas de la
machine physique, nous n'exprimons pas le temps d'excution en units de temps
(millisecondes etc..) mais en unit de taille des donnes.
Nous ne souhaitons pas ici rentrer dans le dtail mathmatique des notations O(f(n)) de
Landau sur les infiniment grands quivalents, nous donnons seulement une utilisation pratique
de cette notation.
Pour une fonction f (n) dpendant de la variable n, on crit :
f est O(g(n)) g(n) o g est elle-mme une fonction de la variable entire n, et l'on lit f est de
l'ordre de grandeur de g(n) ou plus succinctement f est d'ordre g(n), lorsque :
f est d'ordre g(n) :
Pour tout valeur entire de n, il existe deux constantes a et b positives
telles que : a.g(n) < f(n) < b.g(n)
Ce qui signifie que lorsque n tend vers l'infini (n devient trs grand en informatique) le
rapport f(n)/g(n) reste born.
f est d'ordre g(n) :
a < f(n)/g(n) < b quand n
Lorsque n tend vers l'infini, le rapport f(n)/g(n) reste born.
Exemple :
Supposons que f et g soient les polynmes suivants :
f(n) = 3n
2
- 7n +4
g(n) = n
2
;
Lorsque n tend vers l'infini le rapport f(n)/g(n) tend vers 3:
f(n)/g(n) 3 quand n
ce rapport est donc born.
donc f est d'ordre n
2
ou encore f est O(n
2
)
C'est cette notation que nous utiliserons pour mesurer la complexit temporelle C en nombre
d'oprations lmentaires d'un algorithme fix. Il suffit pour pouvoir comparer des
complexits temporelles diffrentes, d'utiliser les mmes fonctions g(n) de base.
Les informaticiens ont rpertori des situations courantes et ont calcul l'ordre de complexit
associ ce genre de situation.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
284
Les fonctions g(n) classiquement et pratiquement les plus utilises sont les suivantes :
g(n) = 1
g(n) = log
k
(n)
g(n) = n
g(n) = n.log
k
(n)
g(n) = n
2
Ordre de complexit C Cas d'utilisation courant
g(n) = 1 C est O(1) Algorithme ne dpendant pas des donnes
g(n) = log
k
(n) C est O(log
k
(n))
Algorithme divisant le problme par une quantit
constante (base k du logarithme)
g(n) = n C est O(n)
Algorithme travaillant directement sur chacune des
n donnes
g(n) = n.log
k
(n) C est O(n.log
k
(n))
Algorithme divisant le problme en nombre de
sous-problmes constants (base k du logarithme),
dont les rsultats sont rutiliss par recombinaison
g(n) = n
2
C est O(n
2
)
Algorithme traitant gnralement des couples de
donnes (dans deux boucles imbriques).
2. Trier des tableaux en mmoire centrale
Un tri est une opration de classement d'lments d'une liste selon un ordre total dfini. Sur
le plan pratique, on considre gnralement deux domaines d'application des tris: les tris
internes et les tris externes.
Que se passe-t-il dans un tri? On suppose qu'on se donne une suite de nombres entiers (ex: 5,
8, -3 ,6 ,42, 2,101, -8, 42, 6) et l'on souhaite les classer par ordre croissant (relation d'ordre au
sens large). La suite prcdente devient alors aprs le tri (classement) : (-8, -3, 2, 5, 6, 6, 8, 42,
42, 101). Il s'agit en fait d'une nouvelle suite obtenue par une permutation des lments de la
premire liste de telle faon que les lments rsultants soient classs par ordre croissant au
sens large selon la relation d'ordre totale " s " : (-8 s -3 s 2 s 5 s 6 s 6 s 8 s 42 s 42 s
101).
Cette opration se retrouve trs souvent en informatique dans beaucoup de structures de
donnes. Par exemple, il faut tablir le classement de certains lves, mettre en ordre un
dictionnaire, trier l'index d'un livre, etc...
2.1 Tri interne, tri externe
Un tri interne s'effectue sur des donnes stockes dans une table en mmoire centrale, un tri
externe est relatif une structure de donnes non contenue entirement dans la mmoire
centrale (comme un fichier sur disque par exemple).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
285
Dans certains cas les donnes peuvent tre stockes sur disque (mmoire secondaire) mais
structures de telle faon que chacune d'entre elles soit reprsente en mmoire centrale par
une clef associe un pointeur. Le pointeur li la clef permet alors d'atteindre l'lment sur
le disque (n d'enregistrement...). Dans ce cas seules les clefs sont tries (en table ou en arbre)
en mmoire centrale et il s'agit l d'un tri interne. Nous rservons le vocable tri externe
uniquement aux manipulations de tris directement sur les donnes stockes en mmoire
secondaire.
2.2 Des algorithmes classiques de tri interne
Dans les algorithmes rfrencs ci-dessous, nous notons (a
1
, a
2
, ... , a
n
) la liste trier. Etant
donn le mode d'accs en mmoire centrale (accs direct aux donnes) une telle liste est
gnralement implante selon un tableau une dimension de n lments (cas le plus courant).
Nous attachons dans les algorithmes prsents, expliciter des tris majoritairement sur des
tables, certains algorithmes utiliserons des structures d'arbres en mmoire centrale pour
reprsenter notre liste trier (a
1
, a
2
, ... , a
n
).
Les oprations lmentaires principales les plus courantes permettant les calculs de
complexit sur les tris, sont les suivantes :
Deux oprations lmentaires
La comparaison de deux lments de la liste a
i
et a
k
, (si a
i
> a
k
, si ai < ak,....) .
L'change des places de deux lments de la liste a
i
et a
k
, (place (a
i
) place (a
k
) ).
Ces deux oprations seront utilises afin de fournir une mesure de comparaison des tris entre
eux. Nous proposons dans les pages suivantes cinq tris classiques, quatre concerne le tri de
donnes dans un tableau, le cinquime est un tri de donnes situes dans un arbre binaire, ce
dernier pourra en premire lecture tre ignor, si le lecteur n'est pas familiaris avec la notion
d'arbre binaire
Tris sur des tables :
- Tri itratif bulles
- Tri itratif par slection
- Tri itratif par insertion
- Tri rcursif rapide QuickSort
Tris sur un arbre binaire :
- Le Tri par tas / HeapSort
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
286
Le tri bulle
- A) Spcification abstraite
- B) Spcification concrte
- C) Algorithme
- D) Complexit
- E) Programme Delphi - Java
- F) Assistant visuel
C'est le moins performant de la catgorie des tris par change ou slection, mais comme c'est
un algorithme simple, il est intressant utiliser pdagogiquement.
A) Spcification abstraite
Nous supposons que les donnes a
1
, a
2
, ... , a
n
sont mises sous forme d'une liste (a
1
, a
2
, ... ,
a
n
), le principe du tri bulle est de parcourir la liste (a
1
, a
2
, ... , a
n
) en intervertissant toute
paire d'lments conscutifs (a
i-1
, a
i
) non ordonns.
Ainsi aprs le premier parcours, l'lment maximum se retrouve en a
n
. On suppose que
l'ordre s'crit de gauche droite ( gauche le plus petit lment, droite le plus grand
lment).
On recommence l'opration avec la nouvelle sous-suite (a
1
, a
2
, ... , a
n-1
), et ainsi de suite
jusqu' puisement de toutes les sous-suites (la dernire est un couple).
Le nom de tri bulle vient donc de ce qu' la fin de chaque itration interne, les plus grands
nombres de chaque sous-suite se dplacent vers la droite successivement comme des bulles de
la gauche vers la droite.
B) Spcification concrte
La suite (a
1
, a
2
, ... , a
n
) est range dans un tableau une dimension T[...] en mmoire centrale.
Le tableau contient une partie trie (en fonc droite) et une partie non trie (en blanc
gauche).
On effectue plusieurs fois le parcours du tableau trier.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
287
Le principe de base est de r-ordonner les couples (a
i-1
, a
i
) non classs (en inversion de rang
soit a
i-1
> a
i
) dans la partie non trie du tableau, puis dplacer la frontire (le maximum de la
sous-suite (a
1
, a
2
, ... , a
n-1
) ) d'une position :
Tant que la partie non trie n'est pas vide, on permute les couples non ordonns ( (a
i-1
, a
i
) tels
que a
i-1
> a
i
) ) pour obtenir le maximum de celle-ci llment frontire. C'est dire qu'au
premier passage c'est l'extremum global qui est bien class, au second passage le second
extremum etc...
C) Algorithme :
Algorithme Tri_a_Bulles
local: i , j , n, temp e Entiers naturels
Entre : Tab e Tableau d'Entiers naturels de 1 n lments
Sortie : Tab e Tableau d'Entiers naturels de 1 n lments
dbut
pour i de n jusqu 1 faire // recommence une sous-suite (a
1
, a
2
, ... , a
i
)
pour j de 2 jusqu i faire // change des couples non classs de la sous-suite
si Tab[ j-1 ] > Tab[ j ] alors // a
j-1
et a
j
non ordonns
temp Tab[ j-1 ] ;
Tab[ j-1 ] Tab[ j ] ;
Tab[ j ] temp //on change les positions de a
j-1
et a
j
Fsi
fpour
fpour
Fin Tri_a_Bulles
Exemple : soit la liste ( 5 , 4 , 2 , 3 , 7 , 1 ), appliquons le tri bulles sur cette liste d'entiers.
Visualisons les diffrents tats de la liste pour chaque itration externe contle par l'indice i :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
288
i = 6 / pour j de 2 jusqu 6 faire
i = 5 / pour j de 2 jusqu 5 faire
i = 4 / pour j de 2 jusqu 4 faire
i = 3 / pour j de 2 jusqu 3 faire
i = 2 / pour j de 2 jusqu 2 faire
i = 1 / pour j de 2 jusqu 1 faire (boucle vide)
D) Complexit :
Choisissons comme opration lmentaire la comparaison de deux cellules du tableau.
Le nombre de comparaisons "si Tab[ j-1 ] > Tab[ j ] alors" est une valeur qui ne dpend que
de la longueur n de la liste (n est le nombre d'lments du tableau), ce nombre est gal au
nombre de fois que les itrations s'excutent, le comptage montre que la boucle "pour i de n
jusqu 1 faire" s'excute n fois (donc une somme de n termes) et qu' chaque fois la boucle
"pour j de 2 jusqu i faire" excute (i-2)+1 fois la comparaison "si Tab[ j-1 ] > Tab[ j ]
alors".
Choix opration
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
289
La complexit en nombre de comparaison est gale la somme des n termes suivants (i = n, i
= n-1,.... i = 1)
C = (n-2)+1 + ([n-1]-2)+1 +.....+1+0 = (n-1)+(n-2)+...+1 = n(n-1)/2 (c'est la somme des n-1
premiers entiers).
La complexit du tri bulle en nombre de comparaison est de de l'ordre de n
2
, que l'on
crit O(n
2
).
Choisissons comme opration lmentaire l'change de deux cellules du tableau.
Calculons par dnombrement le nombre d'changes dans le pire des cas (complexit au pire =
majorant du nombre d'changes). Le cas le plus mauvais est celui o le tableau est dj class
mais dans l'ordre inverse et donc chaque cellule doit tre change, dans cette ventualit il y
a donc autant d'changes que de tests.
La complexit du tri bulle au pire en nombre d'changes est de l'ordre de n
2
, que l'on
crit O(n
2
).
E) Programme Delphi (tableau d'entiers):
program TriParBulle;
const N = 10; { Limite suprieure de tableau }
type TTab = array [1..N] of integer; { TTab : Type Tableau }
var Tab : TTab ;
procedure TriBulle (var Tab:TTab) ;
{ Implantation Pascal de l'algorithme }
var i, j, t : integer;
begin
for i := N downto 1 do
for j := 2 to i do
if Tab[j-1] > Tab[j] then
begin
t := Tab[j-1];
Tab[j-1] := Tab[j];
Tab[j] := t;
end;
end;
procedure Initialisation(var Tab:TTab) ;
{ Tirage alatoire de N nombres de 1 100 }
Choix opration
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
290
var i : integer; { i : Indice de tableau de N colonnes }
begin
randomize;
for i := 1 to N do
Tab[i] := random(100);
end;
procedure Impression(Tab:TTab) ;
{ Affichage des N nombres dans les colonnes }
var i : integer;
begin
writeln('------------------------');
for i:= 1 to N do write(Tab[i] : 3, ' | ');
writeln;
end;
begin
Initialisation(Tab);
writeln('TRI PAR BULLE');
writeln;
Impression(Tab);
TriBulle(Tab);
Impression(Tab);
writeln('----------------------');
end.
Rsultat de l'excution du programme prcdent :
E) Programme Java (tableau d'entiers) :
class ApplicationTriBulle {
static int[] table = new int[10] ; // le tableau trier en attribut
static void TriBulle ( ) {
int n = table.length-1;
for ( int i = n; i>=1; i--)
for ( int j = 2; j<=i; j++)
if (table[j-1] > table[j])
{
int temp = table[j-1];
table[j-1] = table[j];
table[j] = temp;
}
}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
291
static void Impression ( ) {
// Affichage du tableau
int n = table.length-1;
for ( int i = 1; i<=n; i++)
System.out.print(table[i]+" , ");
System.out.println();
}
static void Initialisation ( ) {
// remplissage alatoire du tableau
int n = table.length-1;
for ( int i = 1; i<=n; i++)
table[i] = (int)(Math.random()*100);
}
public static void main(String[ ] args) {
Initialisation ( );
System.out.println("Tableau initial :");
Impression ( );
TriBulle ( );
System.out.println("Tableau une fois tri :");
Impression ( );
}
}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
292
Le tri par slection
- A) Spcification abstraite
- B) Spcification concrte
- C) Algorithme
- D) Complexit
- E) Programme Delphi - Java
C'est une version de base de la catgorie des tris par slection.
A) Spcification abstraite
Nous supposons que les donnes a
1
, a
2
, ... , a
n
sont mises sous forme d'une liste (a
1
, a
2
, ... ,
a
n
), la liste (a
1
, a
2
, ... , a
n
) est dcompose en deux parties : une partie liste (a
1
, a
2
, ... , a
k
) et
une partie non-trie (a
k+1
, a
k+2
, ... , a
n
); l'lment a
k+1
est appel lment frontire (c'est le
premier lment non tri).
Le principe est de parcourir la partie non-trie de la liste (ak+1, ak+2, ... , an) en cherchant
l'lment minimum, puis en l'changeant avec l'lment frontire ak+1, puis dplacer la
frontire d'une position. Il s'agit d'une rcurrence sur les minima successifs. On suppose que
l'ordre s'crit de gauche droite ( gauche le plus petit lment, droite le plus grand
lment).
On recommence l'opration avec la nouvelle sous-suite (ak+2, ... , an) , et ainsi de suite
jusqu' ce que la dernire soit vide.
B) Spcification concrte
La suite (a
1
, a
2
, ... , a
n
) est range dans un tableau une dimensionT[...] en mmoire centrale.
Le tableau contient une partie trie (en fonc gauche) et une partie non trie (en blanc
droite).
On cherche le minimum de la partie non-trie du tableau et on le recopie dans la cellule
frontire (le premier lment de la partie non trie).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
293
Donc pour tout a
p
de la partie non trie on effectue l'action suivante :
si a
k+1
> a
p
alors a
k+1
a
p
Fsi
et l'on obtient ainsi la fin de l'examen de la sous-liste (a
k+1
,
ak+2
, ... , a
n
) la valeur min (a
k+1
,
a
k+2
, ... , a
n
) stocke dans la cellule a
k+1
.
La sous-suite (a
1
, a
2
, ... , a
k
, a
k+1
) est maintenant trie :
Et l'on recommence la boucle de recherche du minimum sur la nouvelle sous-liste (a
k+2
, a
k+3
,
... , a
n
) etc...
Tant que la partie non trie n'est pas vide, on range le minimum de la partie non-trie dans
llment frontire.
C) Algorithme :
Une version maladroite de l'algorithme mais exacte a t fournie par un groupe d'tudiants
elle est dnomme / Version maladroite 1/.
Elle change physiquement et systmatiquement l'lment frontire Tab[ i ] avec un lment
Tab[ j ] dont la valeur est plus petite (la suite (a
1
, a
2
, ... , a
i
) est trie) :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
294
Algorithme Tri_Selection /Version maladroite 1/
local: m, i , j , n, temp e Entiers naturels
Entre : Tab e Tableau d'Entiers naturels de 1 n lments
Sortie : Tab e Tableau d'Entiers naturels de 1 n lments
dbut
pour i de 1 jusqu n-1faire // recommence une sous-suite
m i ; // i est l'indice de l'lment frontire Tab[ i ]
pour j de i+1 jusqu n faire// liste non-trie : (a
i+1
, a
i+2
, ... , a
n
)
si Tab[ j ] < Tab[ m ] alors // a
j
est le nouveau minimum partiel
m j ;
temp Tab[ m ] ;
Tab[ m ] Tab[ i ] ;
Tab[ i ] temp //on change les positions de a
i
et de a
j
m i ;
Fsi
fpour
fpour
Fin Tri_Selection
Voici une version correcte et amliore du prcdent (nous allons voir avec la notion de complexit
comment appuyer cette intuition d'amlioration), dans laquelle l'on sort l'change a
i
et a
j
de la boucle
interne "pour j de i+1 jusqu n faire" pour le dporter la fin de cette boucle.
Au lieu de travailler sur les contenus des cellules de la table, nous travaillons sur les
indices, ainsi lorsque aj est plus petit que ai nous mmorisons l'indice "j" du minimum dans
une variable " m j ; " plutt que le minimum lui-mme.
Version maladroite Version amliore
pour j de i+1 jusqu n faire
si Tab[ j ] < Tab[ m ] alors
m j ;
temp Tab[ m ] ;
Tab[ m ] Tab[ i ] ;
Tab[ i ] temp
m i ;
Fsi
fpour
pour j de i+1 jusqu n faire
si Tab[ j ] < Tab[ m ] alors
m j ;
Fsi
fpour;
temp Tab[ m ] ;
Tab[ m ] Tab[ i ] ;
Tab[ i ] temp
Maladroit
Amlioration
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
295
A la fin de la boucle interne "pour j de i+1 jusqu n faire" la variable m contient l'indice de
min(ai+1, ak+2, ... , an) et l'on permute l'lment concern (d'indice m) avec l'lment
frontire ai :
Algorithme Tri_Selection /Version 2 amliore/
local: m, i , j , n, temp e Entiers naturels
Entre : Tab e Tableau d'Entiers naturels de 1 n lments
Sortie : Tab e Tableau d'Entiers naturels de 1 n lments
dbut
pour i de 1 jusqu n-1 faire // recommence une sous-suite
m i ; // i est l'indice de l'lment frontire ai = Tab[ i ]
pour j de i+1 jusqu n faire// (a
i+1
, a
i+2
, ... , a
n
)
si Tab[ j ] < Tab[ m ] alors // aj est le nouveau minimum partiel
m j ; // indice mmoris
Fsi
fpour;
temp Tab[ m ] ;
Tab[ m ] Tab[ i ] ;
Tab[ i ] temp //on change les positions de a
i
et de a
j
fpour
Fin Tri_Selection
D) Complexit :
Choisissons comme opration lmentaire la comparaison de deux cellules du tableau.
Pour les deux versions 1 et 2 :
Le nombre de comparaisons "si Tab[ j ] < Tab[ m ] alors" est une valeur qui ne dpend que
de la longueur n de la liste (n est le nombre d'lments du tableau), ce nombre est gal au
nombre de fois que les itrations s'excutent, le comptage montre que la boucle "pour i de 1
jusqu n-1 faire" s'excute n-1 fois (donc une somme de n-1 termes) et qu' chaque fois la
boucle "pour j de i+1 jusqu n faire" excute (n-(i+1)+1 fois la comparaison "si Tab[ j ] <
Tab[ m ] alors".
La complexit en nombre de comparaison est gale la somme des n-1 termes suivants (i = 1,
...i = n-1)
C = (n-2)+1 + (n-3)+1 +.....+1+0 = (n-1)+(n-2)+...+1 = n.(n-1)/2 (c'est la somme des n-1
premiers entiers).
La complexit du tri par slection en nombre de comparaison est de de l'ordre de n
2
,
que l'on crit O(n
2
).
Choix opration
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
296
Choisissons comme opration lmentaire l'change de deux cellules du tableau.
Calculons par dnombrement le nombre d'changes dans le pire des cas (complexit au pire =
majorant du nombre d'changes). Le cas le plus mauvais est celui o le tableau est dj class
mais dans l'ordre inverse.
Pour la version 1
Au pire chaque cellule doit tre change, dans cette ventualit il y a donc
autant d'changes que de tests.
La complexit au pire en nombre d'changes de la version 1 est de
l'ordre de n
2
, que l'on crit O(n
2
).
Pour la version 2
L'change a lieu systmatiquement dans la boucle principale "pour i de 1
jusqu n-1 faire" qui s'excute n-1 fois :
La complexit en nombre d'changes de cellules de la version 2 est
de l'ordre de n, que l'on crit O(n).
Un change valant 3 transferts (affectation) la complexit en
transfert est O(3n) = O(n)
Toutefois cette complexit en nombre d'changes de cellules n'apparat pas comme
significative du tri, outre le nombre de comparaison, c'est le nombre d'affectations d'indice qui
reprsente une opration fondamentale et l les deux versions ont exactement la mme
complexit O(n
2
).
Exemple : soit la liste 6 lments ( 5 , 4 , 2 , 3 , 7 ,1 ), appliquons la version 2 du tri par
slection sur cette liste d'entiers. Visualisons les diffrents tats de la liste pour la premire
itration externe contrle par i (i = 1) et pour les itrations internes contrles par l'indice j
(de j = 2 ... ... j = 6) :
comme 5>4 on mmorise dans m
comme 4>2 on mmorise dans m comme 2<3 on ne mmorise pas
comme 2<7 on ne mmorise pas comme 2>1 on mmorise dans m
on change T[1] et T[6]
Choix opration
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
297
L'algorithme ayant termin l'change de T[1] et de T[6], il passe l'itration externe suivante
(dans pour i de 1 jusqu n-1 faire , il passe i = 2) :
etc....
E) Programme Delphi (tableau d'entiers) :
program TriParSelection;
const N = 10; { Limite suprieure de tableau }
type TTab = array [1..N] of integer; { TTab : Type Tableau }
var Tab : TTab ;
procedure TriSelection (var Tab:TTab) ;
{ Implantation Pascal de l'algorithme }
var i, j, t, m : integer;
begin
for i := 1 to N-1 do
begin
m := i;
for j := i+1 to N do
if Tab[ j ] < Tab[ m ] then m := j;
t := Tab[m];
Tab[m] := Tab[i];
Tab[i] := t;
end;
end;
procedure Initialisation(var Tab:TTab) ;
{ Tirage alatoire de N nombres de 1 100 }
var i : integer; { i : Indice de tableau de N colonnes }
begin
randomize;
for i := 1 to N do
Tab[i] := random(100);
end;
procedure Impression(Tab:TTab) ;
{ Affichage des N nombres dans les colonnes }
var i : integer;
begin
writeln('------------------------');
for i:= 1 to N do write(Tab[i] : 3, ' | ');
writeln;
end;
begin
Initialisation(Tab);
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
298
writeln('TRI PAR SELECTION');
writeln;
Impression(Tab);
TriSelection(Tab);
Impression(Tab);
writeln('----------------------');
end.
Rsultat de l'excution du programme prcdent :
E) Programme Java (tableau d'entiers) :
class ApplicationTriSelect
{
static int[] table = new int[20] ; // le tableau trier en attribut
static void Impression ( ) {
// Affichage du tableau
int n = table.length-1;
for ( int i = 1; i<=n; i++)
System.out.print(table[i]+" , ");
System.out.println();
}
static void Initialisation ( ) {
// remplissage alatoire du tableau
int n = table.length-1;
for ( int i = 1; i<=n; i++)
table[i] = (int)(Math.random()*100);
}
static void TriSelect ( ) {
int n = table.length-1;
for ( int i = 1; i <= n-1; i++)
{ // recommence une sous-suite
int m = i; // lment frontire ai = table[ i ]
for ( int j = i+1; j <= n; j++) // (ai+1, a2, ... , an)
if (table[ j ] < table[ m ]) // aj = nouveau minimum partiel
m = j ; // indice mmoris
int temp = table[ m ];
table[ m ] = table[ i ];
table[ i ]= temp;
}
}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
299
public static void main(String[ ] args)
{
Initialisation ( );
System.out.println("Tableau initial :");
Impression ( );
TriSelect ( );
System.out.println("Tableau une fois tri :");
Impression ( );
}
}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
300
Le tri par insertion
- A) Spcification abstraite
- B) Spcification concrte
- C) Algorithme
- D) Complexit
- E) Programme Delphi - Java
C'est un tri en gnral un peu plus coteux en particulier en nombre de transfert
effectuer qu'un tri par slection (cf. complexit).
A) Spcification abstraite
Nous supposons que les donnes a
1
, a
2
, ... , a
n
sont mises sous forme d'une liste (a
1
, a
2
, ... ,
a
n
), le principe du tri par insertion est de parcourir la liste non trie liste (a
1
, a
2
, ... , a
n
) en la
dcomposant en deux parties : une partie dj trie et une partie non trie.
La mthode est identique celle que l'on utilise pour ranger des cartes que l'on tient dans sa
main : on insre dans le paquet de cartes dj ranges une nouvelle carte au bon endroit.
L'opration de base consiste prendre l'lment frontire dans la partie non trie, puis
l'insrer sa place dans la partie trie (place que l'on recherchera squentiellement), puis
dplacer la frontire d'une position vers la droite. Ces insertions s'effectuent tant qu'il reste un
lment ranger dans la partie non trie.. L'insertion de l'lment frontire est effectue par
dcalages successifs d'une cellule.
La liste (a
1
, a
2
, ... , a
n
) est dcompose en deux parties : une partie trie (a
1
, a
2
, ... , a
k
) et une
partie non-trie (a
k+1
, a
k+2
, ... , a
n
); l'lment a
k+1
est appel lment frontire (c'est le premier
lment non tri).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
301
B) Spcification concrte itrative
La suite (a
1
, a
2
, ... , a
n
) est range dans un tableau une dimension T[...] en mmoire centrale.
Le tableau contient une partie trie ( (a
1
, a
2
, ... , a
k
) en fonc gauche) et une partie non trie (
(a
k+1
, a
k+2
, ... , a
n
); en blanc droite) :
On insre l'lment frontire a
k+1
en faisant varier j de k jusqu' 2 , afin de balayer toute la
partie (a1, a2, ... , ak) dj range, on dcale alors d'une place les lments plus grands que
l'lment frontire :
tantque a
j-1
> a
k+1
faire
dcaler a
j-1
en a
j
;
passer au j prcdent
ftant
La boucle s'arrte lorsque a
j-1
< a
k+1
,ce qui veut dire que l'on vient de trouver au rang j-1 un
lment a
j-1
plus petit que l'lment frontire a
k+1
, donc a
k+1
doit tre plac au rang j.
C) Algorithme :
Algorithme Tri_Insertion
local: i , j , n, v e Entiers naturels
Entre : Tab e Tableau d'Entiers naturels de 0 n lments
Sortie : Tab e Tableau d'Entiers naturels de 0 n lments
{ dans la cellule de rang 0 se trouve une sentinelle charge d'viter de tester dans la
boucle tantque .. faire si l'indice j n'est pas infrieur 1, elle aura une valeur
infrieure toute valeur possible de la liste
}
dbut
pour i de2 jusqu n faire// la partie non encore trie (a
i
, a
i+1
, ... , a
n
)
v Tab[ i ] ; // l'lment frontire : a
i
j i ; // le rang de l'lment frontire
Tantque Tab[ j-1 ] > v faire // on travaille sur la partie dj trie (a
1
, a
2
, ... , a
i
)
Tab[ j ] Tab[ j-1 ]; // on dcale l'lment
j j-1; // on passe au rang prcdent
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
302
FinTant ;
Tab[ j ] v //on recopie a
i
dans la place libre
fpour
Fin Tri_Insertion
Sans la sentinelle en T[0] nous aurions une comparaison sur j l'intrieur de la boucle :
Tantque Tab[ j-1 ] > v faire//on travaille sur la partie dj trie(a
1
, a
2
, ... , a
i
)
Tab[ j ] Tab[ j-1 ]; // on dcale l'lment
j j-1; // on passe au rang prcdent
si j = 0 alors Sortir de la boucle fsi
FinTant ;
Exercice
Un tudiant a propos d'intgrer la comparaison dans le test de la boucle en
crivant ceci :
Tantque ( Tab[j-1] > v ) et ( j >0 ) faire
Tab[ j ] Tab[ j-1 ];
j j-1;
FinTant ;
Il a eu des problmes de dpassement d'indice de tableau lors de
l'implmentation de son programme.
Essayez d'analyser l'origine du problme en notant que la prsence d'une
sentinelle limine le problme.
D) Complexit :
Choisissons comme opration lmentaire la comparaison de deux cellules du tableau.
Dans le pire des cas le nombre de comparaisons "Tantque Tab[ j-1 ] > v faire" est une valeur
qui ne dpend que de la longueur i de la partie (a1, a2, ... , ai) dj range. Il y a donc au pire i
comparaisons pour chaque i variant de 2 n :
La complexit au pire en nombre de comparaison est donc gale la somme des n termes
suivants (i = 2, i = 3,.... i = n)
C = 2 + 3 + 4 +...+ n = n(n+1)/2 -1 comparaisons au maximum. (c'est la somme des n
premiers entiers moins 1).
La complexit au pire en nombre de comparaison est de l'ordre de n
2
, que l'on crit
O(n
2
).
Choix opration
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
303
Choisissons maintenant comme opration lmentaire le transfert d'une cellule du tableau.
Calculons par dnombrement du nombre de transferts dans le pire des cas .
Il y a autant de transferts dans la boucle "Tantque Tab[ j-1 ] > v faire" qu'il y a de
comparaisons il faut ajouter 2 transferts par boucle "pour i de 2 jusqu n faire", soit au total
dans le pire des cas :
C = n(n+1)/2 + 2(n-1) = (n + 5n - 4)/2
La complexit du tri par insertion au pire en nombre de transferts est de l'ordre de n
2
,
que l'on crit O(n
2
).
E) Programme Delphi (tableau d'entiers) :
program TriParInsertion;
const N = 10; { Limite suprieure de tableau }
type TTab = array [0..N]of integer; { TTab : Type Tableau }
var Tab : TTab ;
procedure TriInsertion (var Tab:TTab) ;
{ Implantation Pascal de l'algorithme }
var i, j, v : integer;
begin
for i := 2 to N do
begin
v := Tab[ i ];
j := i ;
while Tab[ j-1 ] > v do
begin
Tab[ j ] := Tab[ j-1 ] ;
j := j - 1 ;
end;
Tab[ j ] := v ;
end
end;
procedure Initialisation(var Tab:TTab) ;
{ Tirage alatoire de N nombres de 1 100 }
var i : integer; { i : Indice de tableau de N colonnes }
begin
randomize;
for i := 1 to N do
Tab[i] := random(100);
Tab[0]:= -Maxint ; // la sentinelle est l'entier le plus petit du type
integer sur la machine
end;
Choix opration
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
304
procedure Impression(Tab:TTab) ;
{ Affichage des N nombres dans les colonnes }
var i : integer;
begin
writeln('------------------------');
for i:= 1 to N do write(Tab[i] : 3, ' | ');
writeln;
end;
begin
Initialisation(Tab);
writeln('TRI PAR INSERTION');
writeln;
Impression(Tab);
TriInsertion(Tab);
Impression(Tab);
writeln('----------------------');
end.
Rsultat de l'excution du programme prcdent :
E) Programme Java (tableau d'entiers) :
class ApplicationTriInsert
{
// le tableau trier:
static int[] table = new int[10] ;
/*---------------------------------------------------------------------
Dans la cellule de rang 0 se trouve une sentinelle charge d'viter de tester dans la boucle tantque .. faire si
l'indice j n'est pas infrieur 1, elle aura une valeur infrieure toute valeur possible de la liste
--------------------------------------------------------------------*/
static void Impression ( ) {
// Affichage du tableau
int n = table.length-1;
for ( int i = 0; i<=n; i++)
System.out.print(table[i]+" , ");
System.out.println();
}
static void Initialisation ( ) {
// remplissage alatoire du tableau
int n = table.length-1;
for ( int i = 1; i<=n; i++)
table[i] = (int)(Math.random()*100);
//sentinelle l'indice 0 :
table[0] = -Integer.MAX_VALUE;
}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
305
public static void main(String[ ] args) {
Initialisation ( );
System.out.println("Tableau initial :");
Impression ( );
TriInsert ( );
System.out.println("Tableau une fois tri :");
Impression ( );
}
static void TriInsert ( ) {
// sous-programme de Tri par insertion :
int n = table.length-1;
for ( int i = 2; i <= n; i++)
{
int v = table[i];
int j = i;
while (table[ j-1 ] > v)
{// travail sur la partie dj trie (a1, a2, ... , ai)
table[ j ] = table[ j-1 ]; // on dcale l'lment
j--; // on passe au rang prcdent
}
table[ j ] = v ; //on recopie ai dans la place libre
}
}
}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
306
Le tri rapide
mthode Sedgewick
- A) Spcification abstraite
- B) Spcification concrte
- C) Algorithme
- D) Complexit
- E) Programme Delphi - Java
C'est le plus performant des tris en table qui est certainement celui qui est le plus
employ dans les programmes. Ce tri a t trouv par C.A.Hoare, nous nous rfrons
Robert Sedgewick qui a travaill dans les annes 70 sur ce tri et l'a amlior et nous
renvoyons son ouvrage pour une tude complte de ce tri. Nous donnons les principes
de ce tri et sa complexit en moyenne et au pire.
A) Spcification abstraite
Nous supposons que les donnes a
1
, a
2
, ... , a
n
sont mises sous forme d'une liste (a
1
, a
2
, ... ,
a
n
), le principe du tri par insertion est de parcourir la liste L = liste (a
1
, a
2
, ... , a
n
) en la
divisant systmatiquement en deux sous-listes L1 et L2. L'une de ces deux sous-listes est telle
que tous ses lments sont infrieurs tous ceux de l'autre liste , la division en sous-liste a
lieu en travaillant sparment sur chacune des deux sous-listes en appliquant nouveau la
mme division chaque sous-liste jusqu' obtenir uniquement des sous-listes un seul
lment.
C'est un algorithme dichotomique qui divise donc le problme en deux sous-problmes dont
les rsultats sont rutiliss par recombinaison, il est donc de complexit O(n.log(n)).
Pour partitionner une liste L en deux sous-listes L1 et L2 :
- on choisit une valeur quelconque dans la liste L (la dernire par exemple) que l'on
dnomme pivot,
- puis on construit la sous-liste L1 comme comprenant tous les lments de L dont la
valeur est infrieure ou gale au pivot,
- et l'on construit la sous-liste L2 comme constitue de tous les lments dont la valeur
est suprieure au pivot.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
307
Soit sur un exemple de liste L :
L = [ 4, 23, 3, 42, 2, 14, 45, 18, 38, 16 ]
prenons comme pivot la dernire valeur pivot = 16
Nous obtenons deux sous-listes L1 et L2 :
L1 = [4, 14, 3, 2]
L2 = [23, 45, 18, 38, 42]
A cette tape voici l'arrangement de L :
L = L1 + pivot + L2 = [4, 14, 3, 2, 16, 23, 45, 18, 38, 42]
En effet, en travaillant sur la table elle-mme par rarrangement des valeurs, le pivot 16 est
plac au bon endroit directement :
[4<16, 14<16, 3<16, 2<16, 16, 23>16, 45>16, 18>16, 38>16, 42>16]
En appliquant la mme dmarche au deux sous-listes : L1 (pivot=2) et L2 (pivot=42)
[4, 14, 3, 2, 16, 23, 45, 18, 38, 42] nous obtenons :
L11=[ ] liste vide
L12=[3, 4, 14]
L1=L11 + pivot + L12 = (2,3, 4, 14)
L21=[23, 38, 18]
L22=[45]
L2=L21 + pivot + L22 = (23, 38, 18, 42, 45)
A cette tape voici le nouvel arrangement de L :
L = [(2,3, 4, 14), 16, (23, 38, 18, 42, 45)]
etc...
Ainsi
de proche en proche en subdivisant le problme en deux sous-problmes, chaque tape nous
obtenons un pivot bien plac.
B) Spcification concrte
La suite (a
1
, a
2
, ... , a
n
) est range dans un tableau de dimension unT[...] en mmoire centrale.
Le processus de partionnement dcrit ci-haut (appel aussi segmentation) est le point central
du tri rapide, nous construisons une fonction Partition ralisant cette action .
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
308
Comme l'on appliquant la mme action sur les deux sous-listes obtenues aprs partition, la
mthode est donc rcursive, le tri rapide est alors une procdure rcursive.
B-1 ) Voici une spcification gnrale de la procdure de tri rapide :
Tri Rapide sur [a..b]
Partition [a..b] renvoie pivot & [a..b] = [x .. pivot']+[pivot]+[pivot'' .. y]
Tri Rapide sur [pivot'' .. y]
Tri Rapide sur [x .. pivot']
B-2) Voici une spcification gnrale de la fonction de partionnement :
La fonction de partionnement d'une liste [a..b] doit rpondre aux deux conditions
suivantes :
- renvoyer la valeur de l'indice not i d'un lment appel pivot qui est
bien plac dfinitivement : pivot = T[i],
- tablir un rarrangement de la liste [a..b] autour du pivot tel que :
[a..b] = [x .. pivot']+[pivot]+[pivot'' .. y]
[x .. pivot'] = T[G] , .. , T[i-1]
( o : x = T[G] et pivot' = T[i-1] ) tels que les T[G] , .. , T[i-1] sont tous infrieurs T[i] ,
[pivot'' .. y] = T[i+1] , .. , T[D]
( o : y = T[D] et pivot'' = T[i+1] ) tels que les T[i+1] , .. , T[D] sont tous suprieurs T[i] ,
Il est propos de choisir arbitrairement le pivot que l'on cherche placer, puis ensuite de
balayer la liste rarranger dans les deux sens (par la gauche et par la droite) en construisant
une sous-liste gauche dont les lments ont une valeur infrieure celle du pivot et une
sous-liste droite dont les lments ont une valeur suprieure celle du pivot .
1) Dans le balayage par la gauche, on ne touche pas un lment si sa valeur est infrieure
au pivot (les lments sont considrs comme tant alors dans la bonne sous-liste) on
arrte ce balayage ds que l'on trouve un lment dont la valeur est plus grande que celle
du pivot. Dans ce dernier cas cet lment n'est pas sa place dans cette sous-liste mais
plutt dans l'autre sous-liste.
2) Dans le balayage par la droite, on ne touche pas un lment si sa valeur est suprieure au
pivot (les lments sont considrs comme tant alors dans la bonne sous-liste) on arrte ce
balayage ds que l'on trouve un lment dont la valeur est plus petite que celle du pivot. Dans
ce dernier cas cet lment n'est pas sa place dans cette sous-liste mais plutt dans l'autre
sous-liste.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
309
3) on procde l'change des deux lments mal placs dans chacune des sous-listes :
4) On continue le balayage par la gauche et le balayage par la droite tant que les lments sont
bien placs (valeur infrieure par la gauche et valeur suprieure par la droite), en changeant
chaque fois les lments mal placs.
5) La construction des deux sous-listes est termine ds que l'on atteint (ou dpasse) le pivot.
Appliquons cette dmarche l'exemple prcdent : L = [ 4, 23, 3, 42, 2, 14, 45, 18, 38, 16 ]
- Choix arbitraire du pivot : l'lment le plus droite ici 16
- Balayage gauche :
4 < 16 => il est dans la bonne sous-liste, on continue
liste en cours de construction : [ 4, 16 ]
23 > 16 => il est mal plac il n'est pas dans la bonne sous-liste, on arrte le balayage gauche,
liste en cours de construction :[ 4, 23, 16 ]
- Balayage droite :
38 > 16 => il est dans la bonne sous-liste, on continue
liste en cours de construction : [ 4, 23, 16, 38 ]
18 > 16 => il est dans la bonne sous-liste, on continue
liste en cours de construction : [ 4, 23, 16, 18, 38 ]
45 > 16 => il est dans la bonne sous-liste, on continue
liste en cours de construction : [ 4, 23, 16, 45, 18, 38 ]
14 < 16 => il est mal plac il n'est pas dans la bonne sous-liste, on arrte le balayage droit,
liste en cours de construction : [ 4, 23, 16, 14, 45, 18, 38 ]
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
310
- Echange des deux lments mal placs :
[ 4, 23 , 16, 14 , 45, 18, 38 ] ----> [ 4, 14 , 16, 23, 45, 18, 38 ]
- On reprend le balayage gauche l'endroit o l'on s'tait arrt :
----------+----------------------------
[ 4, 14, 3 , 42, 2, 23, 45, 18, 38, 16 ]
3 < 16 => il est dans la bonne sous-liste, on continue
liste en cours de construction : [ 4, 14, 3 , 16 , 23, 45, 18, 38 ]
42 > 16 => il est mal plac il n'est pas dans la bonne sous-liste, on arrte de nouveau le
balayage gauche,
liste en cours de construction : [ 4, 14, 3, 42 , 16, 23, 45, 18, 38 ]
- On reprend le balayage droit l'endroit o l'on s'tait arrt :
-----------------+---------------------
[ 4, 14, 3, 42, 2 , 23, 45, 18, 38, 16 ]
2 < 16 => il est mal plac il n'est pas dans la bonne sous-liste, on arrte le balayage droit,
liste en cours de construction : [ 4, 14, 3, 42 , 16, 2, 23, 45, 18, 38 ]
- On procde l'change des deux lments mal placs :
[ 4, 14, 3, 42 , 16, 2 , 23, 45, 18, 38 ] ----> [ 4, 14, 3, 2 , 16, 42, 23, 45, 18, 38 ]
et l'on arrte la construction puisque nous sommes arrivs au pivot la fonction partition a
termin son travail elle a valu :
- le pivot : 16
- la sous-liste de gauche : L1 = [4, 14, 3, 2]
- la sous-liste de droite : L2 = [23, 45, 18, 38, 42]
- la liste rarrange : [ 4, 14, 3, 2, 16, 42, 23, 45, 18, 38 ]
Il reste recommencer les mmes oprations sur les parties L1 et L2 jusqu' ce que les
partitions ne contiennent plus qu'un seul lment.
C) Algorithme :
Global :Tab[min..max] tableau d'entier
fonction Partition( G , D : entier ) rsultat : entier
Local : i , j , piv , temp : entier
dbut
piv Tab[D];
i G-1;
j D;
repeter
repeter i i+1 jusqu Tab[i] >= piv;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
311
repeter j j-1 jusqu Tab[j] <= piv;
temp Tab[i];
Tab[i] Tab[j];
Tab[j] temp
jusqu j <= i;
Tab[j] Tab[i];
Tab[i] Tab[d];
Tab[d] temp;
rsultat i
FinPartition
Algorithme TriRapide( G , D : entier );
Local : i : entier
dbut
si D > G alors
i Partition( G , D );
TriRapide( G , i-1 );
TriRapide( i+1 , D );
Fsi
FinTRiRapide
Nous supposons avoir mis une sentinelle dans le tableau, dans la premire cellule la plus
gauche, avec une valeur plus petite que n'importe qu'elle autre valeur du tableau.
Cette sentinelle est utile lorsque le pivot choisi alatoirement se trouve tre le plus petit
lment de la table /pivot = min (a1, a2, ... , an)/ :
Comme nous avons:
j , Tab[j] > piv , alors la boucle :
"repeter j j-1 jusqu Tab[j] <= piv ;"
pourrait ne pas s'arrter ou bien s'arrter sur un message d'erreur.
La sentinelle tant plus petite que tous les lments y compris le pivot arrtera la boucle et encore une fois vite
de programmer le cas particulier du pivot = min (a1, a2, ... , an).
D) Complexit :
Nous donnons les rsultats classiques et connus mathmatiquement (pour les dmonstrations
nous renvoyons aux ouvrages de R.Sedgewick & Aho-Ullman cits dans la bibliographie).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
312
L'opration lmentaire choisie est la comparaison de deux cellules du tableau.
Comme tous les algorithmes qui divisent et traitent le problme en deux sous-problmes le
nombre moyen de comparaisons est en O(n.log(n)) que l'on nomme complexit moyenne. La
notation log (x) est utilise pour le logarithme base 2, log
2
(x).
L'exprience pratique montre que cette complexit moyenne en O(n.log(n)) n'est atteinte que
lorsque les pivots successifs divisent la liste en deux sous-listes de taille peu prs
quivalente.
Dans le pire des cas (par exemple le pivot choisi est systmatiquement chaque fois la plus
grande valeur) on montre que la complexit est en O(n
2
).
Comme la littrature a montr que ce tri tait le meilleur connu en complexit, il a t propos
beaucoup d'amliorations permettant de choisir un pivot le meilleur possible, des
combinaisons avec d'autres tris par insertion gnralement, si le tableau trier est trop petit.
Ce tri est pour nous un excellent exemple en n.log(n).illustrant la rcursivit.
E) Programme Delphi (tableau d'entiers) :
program TriQuickSort;
const N = 10; { Limite suprieure de tableau }
type TTab = array [0..N] of integer; { TTab : Type Tableau }
var Tab : TTab ;
function Partition ( G , D : integer) : integer;
var i , j : Integer;
piv, temp : integer;
begin
i := G-1;
j := D;
piv := Tab[D];
repeat
repeat i := i+1 until Tab[i] >= piv;
repeat j := j-1 until Tab[j] <= piv;
temp :=Tab[i];
Tab[i] :=Tab[j];
Tab[j] :=temp;
until j <= i;
Tab[j] := Tab[i];
Tab[i] := Tab[d];
Tab[d] := temp;
result := i;
end;{Partition}
Choix opration
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
313
procedure TriRapide( G, D : integer);
var i: Integer;
begin
if D>G then
begin
i := Partition( G , D );
TriRapide( G , i-1 );
TriRapide( i+1 , D );
end
end;{TriRapide}
procedure Initialisation(var Tab:TTab) ;
{ Tirage alatoire de N nombres de 1 100 }
var i : integer; { i : Indice de tableau de N colonnes }
begin
randomize;
for i := 1 to N do
Tab[i] := random(100);
Tab[0] := -Maxint ; // la sentinelle
end;
procedure Impression(Tab:TTab) ;
{ Affichage des N nombres dans les colonnes }
var i : integer;
begin
writeln('------------------------');
for i:= 1 to N do write(Tab[i] : 3, ' | ');
writeln;
end;
begin
Initialisation(Tab);
writeln('TRI RAPIDE');
writeln;
Impression(Tab);
TriRapide( 1 , N );
Impression(Tab);
writeln('----------------------');
end.
Rsultat de l'excution du programme prcdent :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
314
E) Programme Java (tableau d'entiers) :
class ApplicationTriQSort
{
static int[] table = new int[21] ; // le tableau trier en attribut
/* Les cellules [0] et [20] contiennent
des sentinelles,
Les cellules utiles vont de 1 19.
(de 1 table.length-2)
*/
static void impression ( )
{
// Affichage sans les sentinelles
int n = table.length-2;
for ( int i = 1; i<=n; i++)
System.out.print(table[i]+" , ");
System.out.println();
}
static void initialisation ( )
{
// remplissage alatoire du tableau
int n = table.length-2;
for(int i = 1; i<=n; i++)
table[i] = (int)(Math.random()*100);
// Les sentinelles:
table[0] = -Integer.MAX_VALUE;
table[n+1] = Integer.MAX_VALUE;
}
// ----> Tri rapide :
static int partition (int G, int D )
{ // partition / Sedgewick /
int i, j, piv, temp;
piv = table[D];
i = G-1;
j = D;
do
{
do
i++;
while (table[i]<piv);
do
j--;
while (table[j]>piv);
temp = table[i];
table[i] = table[j];
table[j] = temp;
}
while(j>i);
table[j] = table[i];
table[i] = table[D];
table[D] = temp;
return i;
}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
315
static void QSort (int G, int D )
{ // tri rapide, sous-programme rcursif
int i;
if(D>G)
{
i = partition(G,D);
QSort(G,i-1);
QSort(i+1,D);
}
}
public static void main(string[ ] args)
{
Initialisation ( );
int n = table.length-2;
System.out.println("Tableau initial :");
Impression ( );
QSort(1,n);
System.out.println("Tableau une fois tri :");
Impression ( );
}
}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
316
Le tri par arbre
- Dfinitions prliminaires
- A) Spcification abstraite
- B) Spcification concrte
- C) Algorithme
- D) Complexit
- E) Programme Delphi
C'est un tri galement appel tri par tas (heapsort, en anglais). Il utilise une structure de donnes
temporaire dnomme "tas" comme mmoire de travail.
Dfinition - 1 / Arbre parfait :
c'est un arbre binaire dont tous les noeuds de chaque niveau sont prsents sauf ventuellement
au dernier niveau o il peut manquer des noeuds (noeuds terminaux = feuilles), dans ce cas
l'arbre parfait est un arbre binaire incomplet et les feuilles du dernier niveau doivent tre
regroupes partir de la gauche de l'arbre
.
un arbre parfait complet
Amputons l'arbre parfait prcdent de ses trois feuilles situes sur le bord droit, les cinq
premires feuilles de gauche ne changeant pas, on obtient toujours un arbre parfait mais il est
incomplet :
Dfinitions prliminaires
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
317
un autre arbre parfait incomplet
exemple d'arbre non parfait
Dfinition - 2 / Arbre partiellement ordonn :
C'est un arbre tiquet dont les noeuds appartiennent un ensemble muni d'une relation
d'ordre total (les nombres entiers, rels etc... en sont des exemples) tel que pour un noeud
donn tous ses fils ont une valeur suprieure ou gale celle de leur pre.
Exemple d'un arbre partiellement ordonn sur l'ensemble {20, 27,29, 30, 32, 38, 45, 45, 50,
51, 67 ,85 } d'entiers naturels :
Nous remarquons que la racine d'un tel arbre est toujours l'lment de l'ensemble
possdant la valeur minimum(le plus petit lment de l'ensemble), car la valeur de ce noeud
par construction est infrieure celle de ses fils et par transitivit de la relation d'ordre celles
de ses descendants c'est le minimum.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
318
Si donc nous arrivons ranger une liste d'lments dans un tel arbre le minimum de cette liste
est atteignable immdiatement comme racine de l'arbre.
Exemple d'un autre arbre partiellement ordonn sur le mme ensemble {20, 27,29, 30, 32, 38,
45, 45, 50, 51, 67 ,85 } d'entiers naturels (il n'y a pas unicit) :
Dfinition - 3 / Le tas :
On appelle tas un tableau reprsentant un arbre parfait partiellement ordonn.
C'est une variante de mthode de tri par slection o l'on parcourt le tableau des lments en
slectionnant et conservant les minimas successifs (plus petits lments partiels) dans un arbre parfait
partiellement ordonn.
A) Spcification abstraite
Nous supposons que les donnes a
1
, a
2
, ... , a
n
sont mises sous forme d'une liste (a
1
, a
2
, ... ,
a
n
), le principe du tri par tas est de parcourir la liste (a
1
, a
2
, ... , a
n
) en ajoutant chaque lment
ak dans un arbre parfait partiellement ordonn.
- L'insertion d'un nouvel lment a
k
dans l'arbre a lieu dans la dernire feuille vide de
l'arbre partir de la gauche (ou bien si le niveau est complet en recommenant un
nouveau niveau par sa feuille la plus gauche) et, en effectuant des changes tant que
la valeur de a
k
est infrieur celle de son pre.
- Lorsque tous les lments de la liste seront placs dans l'arbre, l'lment minimum "a
i
"
de la liste (a
1
, a
2
, ... , a
n
) se retrouve la racine de l'arbre qui est alors partiellement
ordonn.
Principe du tri par tas
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
319
- On recommence le travail sur la nouvelle liste (a
1
, a
2
, ... , a
n
) -{a
i
}(c'est la liste prcdente
prive de son minimum),
pour cela on supprime l'lment minimum ai de l'arbre pour le mettre dans la
liste trie puis,
on prend l'lment de la dernire feuille du dernier niveau et on le place
la racine.
On effectue ensuite des changes de contenu avec le fils dont le contenu est
infrieur, en partant de la racine, et en descendant vers le fils avec lequel on a
fait un change, ceci tant qu'il n'a pas un contenu infrieur ceux de ses deux
fils (ou de son seul fils) ou tant qu'il n'est pas une feuille.
- On recommence l'opration de suppression et d'changes ventuels jusqu' ce que
l'arbre ne contienne plus aucun lment.
B) Spcification concrte
La suite (a
1
, a
2
, ... , a
n
) est range dans un tableau une dimension T[...] correspondant au
tableau d'initialisation. Puis les lments de ce tableau sont ajouts et traits un par un dans un
arbre avant d'tre ajouts dans un tableau tri en ordre dcroissant ou croissant, selon le choix
de l'utilisateur.
Signalons qu'un arbre binaire parfait se reprsente classiquement par un tableau :
Si t est ce tableau, on a les rgles suivantes :
- t[1] est la racine :
- t[i div 2] est le pre de t[i] pour i > 1 :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
320
- t[2 * i] et t[2 * i + 1] sont les deux fils, s'ils existent,
de t[i] :
- si p est le nombre de noeuds de l'arbre et si 2 * i = p,
t[i] n'a qu'un fils, t[p].
si i est suprieur p div 2, t[i] est une feuille.
Figures illustrant le placement des lments de la liste dans l'arbre
Exemple d'initialisation sur un tableau 15 lments :
Insertion du premier lment (le nombre 7) la racine de l'arbre :
Insertion du second lment (le nombre 27, 27 > 7 donc c'est un fils du noeud 7) :
Insertion du troisime lment (le nombre 41, 41 > 7 c'est un fils du noeud 7) :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
321
Insertion du quatrime lment (le nombre 30, comme le niveau des fils du noeud 7 est
complet, 30 est plac automatiquement sur une nouvelle feuille d'un nouveau niveau, puis il
est compar son pre 27, 30 > 27 c'est donc un fils du noeud 27 il n'y a pas d'change ) :
Insertion du cinquime lment (le nombre 10) : L'insertion du nouvel lment 10 dans l'arbre
a lieu automatiquement dans la dernire feuille vide de l'arbre partir de la gauche, ici le fils
droit de 27 :
Puis 10 est compar son pre 27, cette fois 10 est plus petit que 27, il y a donc change des
places entre 27 et 10, ce qui donne un nouvel arbre :
Puis 10 est compar son nouveau pre 7, cette fois il n'y a pas d'change car 10 est plus
grand que 7.
Le processus continue avec l'lment suivant de la liste le nombre 31:
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
322
31 est automatiquement rang sur la premire feuille disponible gauche soit le fils gauche
de 41:
Puis 31 est compar son pre, comme 31 < 41 il y a change des valeurs, puis 31 est
compar son nouveau pre 7 comme 31 > 7 il n'y a plus d'change :
etc....
Supposons que l'arbre ait t construit sur les dix premiers lments du tableau et
observons maintenant comment l'lment minimum de la liste qui est le onzime
lment, soit le nombre 3, est rang dans l'arbre.
Voici l'tat de l'arbre avant introduction du nombre 3 (quatre niveaux de nuds) :
Le nombre 3 est introduit sur la premire feuille libre du niveau quatre :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
323
Il est compar son pre le noeud 17, comme 3 < 17, il y a alors change :
Il est ensuite compar son nouveau pre le noeud 10, comme 3 < 10, il y a alors change :
Il est enfin compar son dernier pre (la racine de l'arbre), comme 3 < 7, il y a alors change
:
C'est l'lment 3 qui est maintenant la racine de l'arbre, comme les 4 lments suivants sont
plus grand que 3, ils seront rangs plus bas dans l'arbre (cf. figure ci-dessous) :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
324
Conclusion sur le premier passage :
La liste initiale :
est finalement stocke ainsi :
Figures illustrant la suppression de la racine
Le nombre 3 est le plus petit lment, on le supprime de l'arbre et l'on prend l'lment de la
dernire feuille du dernier niveau (ici le nombre 25) et on le place la racine ( la place
qu'occupait le nombre 3)
ce qui donne comme nouvelle disposition :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
325
et l'on recommence les changes ventuels en comparant la racine avec ses descendants :
le fils gauche 23 est infrieur 25 => change
Arrt du processus (33 > 25 et 30 > 25)
On obtient le deuxime plus petit lment la racine de l'arbre, ici le nombre 7.
Puis l' on continue "vider" ainsi l'arbre et dplaant les feuilles vers la racine et en
changeant les noeuds mal placs.
A la fin, lorsque l'arbre a t entirement vid, nous avons extrait chaque tape le plus petit
lment de chaque sous liste restante et nous obtenons les lments de la liste classs par
ordre croissant ou dcroissant selon notre choix (dans notre exemple si nous stockons les
minima successifs de gauche droite dans une liste nous obtiendrons une liste classe par
ordre croissant de gauche droite).
En rsum notre version de tri par tas comporte les tapes suivantes :
- initialisation : ajouter successivement chacun des n lments dans le tas t[1..p]; p
augmente de 1 aprs chaque adjonction . A la fin on a un tas de taille p = n.
- tant que p est plus grand que 1, supprimer le minimum du tas (p dcrot de 1), rorganiser
le tas, ranger le minimum obtenue la (p + 1)
ime
place.
On en dduit l'algorithme ci-dessous compos de 2 sous algorithmes Ajouter pour la
premire tape, et Supprimer pour la seconde.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
326
C) Algorithme :
Algorithme Ajouter
Entre P : entier ; x : entier // P nombre d'lments dans le tas, x lment ajouter
Tas[1..max] : tableau d'entiers // le tas
Sortie P : entier
Tas[1..max] // le tas
Local j, temp : entiers
dbut
P P + 1 ; // incrmentation du nombre d'lments du tas
j P ; // initialisation de j la longueur du tas (position de la dernire feuille)
Tas[P] x ; // ajout l'lment x la dernire feuille dans le tas
Tantque (j > 1) et (Tas[j] < Tas[j div 2]) faire ; // tant que l'on est pas arriv la racine et
que le "fils" est infrieur son "pre", on permute les 2 valeurs
temp Tas[j] ;
Tas[j] Tas[j div 2] ;
Tas[j div 2] temp ;
j j div 2 ;
finTant
FinAjouter
Algorithme Supprimer
Entre : P : entier // P nombre d'lments contenu dans l'arbre
Tas[1..max] : tableau d'entiers // le tas
Sortie : P : entier // P nombre d'lments contenu dans l'arbre
Tas[1..max] : tableau d'entiers // le tas
Lemini : entier // le plus petit de tous les lments du tas
Local i, j, temp : entiers ;
dbut
Lemini Tas[1] ; // retourne la racine (minimum actuel) pour stockage ventuel
Tas[1] Tas[P] ; // la racine prend la valeur de la dernire feuille de l'arbre
P P - 1 ;
j 1 ;
Tantque j <= (P div 2) faire
// recherche de l'indice i du plus petit des descendants de Tas[j]
si (2 * j = P ) ou (Tas[2 * j] < Tas[2 * j + 1])
alors i 2 * j ;
sinon i 2 * j +1 ;
Fsi;
// Echange ventuel entre Tas[j] et son fils Tas[i]
si Tlab[j] > Tlab[i] alors
temp Tlab[j] ;
Tlab[j] Tlab[i] ;
Tlab[i] temp ;
j i ;
sinon Sortir ;
Fsi;
finTant
FinSupprimer
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
327
Algorithme Tri_par_arbre
Entre Tas[1..max] // le tas
TabInit[1..max] // les donnes initiales
Sortie TabTrie[1..max]: tableaux d'entiers // tableau une fois tri
Local P : Entier // P le nombre d'lments trier
Lemin : entier // le plus petit de tous les lments du tas
dbut
P 0;
Tantque P < max faire
Ajouter(P,Tas,TabInit[P+1]); // appel de l'algorithme Ajouter
finTant;
Tantque P >= 1 faire
Supprimer(P,Tas,Lemin) ; // appel de l'algorithme Supprimer
TabTrie[max-P] Lemin ; // stockage du minimum dans le nouveau tableau
finTant;
Fin Tri_par_arbre
D) Complexit :
Cette version de l'algorithme construit le tas par n appels de la procdure Ajouter et effectue
les slections par n - 1 appels de la procdure supprimer.
Le cot et de l'ordre de comparaisons, au pire.
La complexit au pire en nombre de comparaisons est en O(n log n).
Le nombre d'changes dans le tas est major par le nombre de comparaisons et il est du mme
ordre de grandeur.
La complexit au pire en nombre de transferts du tri par tas est donc en O(n log n).
E) Programme Delphi (tableau d'entiers) :
program TriParArbre;
const Max =10; // nombre maximal d'lments du tableau
type TTab=array [1..Max] of integer; // TTab : Type Tableau
var Tas, TabInit, TabTrie : TTab; // Tas, tableau initial puis tableau
triTableau
P, Lemin : integer;
procedure Ajouter (var Tas : TTab; var P, x : integer);
var j, temp : integer ;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
328
begin
P := P + 1 ;
J := P ;
Tas[P] := x ;
if j>1 then
While Tas[j] < Tas[j div 2] do
begin
temp := Tas[j] ;
Tas[j] := Tas[j div 2] ;
Tas[j div 2] := temp ;
j := j div 2 ;
if j<=1 then break;
end
end; // Ajouter
procedure Supprimer (var Tas:TTab; var P, Lemin : integer);
var i, j, temp : integer ;
begin
Lemin := Tas[1] ;
Tas[1] := Tas[P] ;
P := P - 1 ;
j := 1 ;
While j <= (P div 2) do
begin
if (2 * j = P ) or (Tas[2 * j] < Tas[2 * j + 1])
then i := 2 * j
else i := 2 * j +1 ;
if Tas[j] > Tas[i] then
begin
temp := Tas[j] ;
Tas[j] := Tas[i] ;
Tas[i] := temp ;
j := i ;
end
else break ;
end
end; // Supprimer
procedure Initialisation(var Tab:TTab) ;
// Tirage alatoire de Max nombres de 1 100
var i : integer; // i : Indice de tableau
begin
randomize;
for i := 1 to Max do
Tab[i] := random(100);
end;
procedure Impression(Tab:TTab) ;
// Affichage des Max nombres
var i : integer;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
329
begin
writeln('---------------------');
for i:= 1 to Max do write(Tab[i] : 3, ' | ');
writeln;
end;
begin // TriParArbre
Initialisation(TabInit);
writeln('TRI PAR ARBRE');
writeln;
Impression(TabInit);
P:=0;
while p < Max do
Ajouter ( Tas, p, TabInit[p+1] );
while p >= 1 do
begin
Supprimer ( Tas, P, Lemin ) ;
TabTrie[Max-P]:=Lemin
end;
Impression(TabTrie);
writeln('----------------------');
readln
end. // TriParArbre
REMARQUE IMPORTANTE
Notons que dans la procdure nous avons traduit la condition de la boucle :
Tantque (j > 1) et (Tas[j] < Tas[j div 2]) faire
temp Tas[j] ;
Tas[j] Tas[j div 2] ;
Tas[j div 2] temp ;
j j div 2 ;
finTant
par les lignes de programmes suivantes :
if j>1 then
While Tas[j] < Tas[j div 2] do
begin
temp := Tas[j] ;
Tas[j] := Tas[j div 2] ;
Tas[j div 2] := temp ;
j := j div 2 ;
if j<=1 then break
end
ceci afin d'viter un incident d un effet de bord. Lorsque l'indice "j" prend par exemple la
valeur 1, l'indice "j div 2" vaut alors 0 et cette valeur n'est pas valide puisque l'indice de
tableau varie entre 1..Max.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
330
On peut pallier aussi d'une autre manire cet inconvnient en ajoutant une sentinelle "
gauche dans le tableau" en tendant la borne infrieure la valeur 0, les indices pouvant alors
varier entre 0..Max. On obtient une autre criture de la procdure "Ajouter" qui suit malgr
tout l'algorithme de prs :
type TTab=array [0..Max] of integer; // 0 est l'indice sentinelle
procedure Ajouter (var Tas : TTab; var P, x : integer);
var j, temp : integer ;
begin
P := P + 1 ;
J := P ;
Tas[P] := x ;
While (j > 1) et (Tas[j] < Tas[j div 2]) do
begin
temp := Tas[j] ;
Tas[j] := Tas[j div 2] ;
Tas[j div 2] := temp ;
j := j div 2 ;
end
end; // Ajouter
Rsultat de l'excution du programme prcdent :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
331
3. Rechercher dans un tableau
Les tableaux sont des structures statiques contigus, il est facile de rechercher un lment fix
dans cette structure. Nous exposons ci-aprs des algorithmes lmentaires de recherche
utilisables dans des applications pratiques par le lecteur.
Essentiellement nous envisagerons la recherche squentielle qui convient lorsqu'il y a peu
d'lments consulter (quelques centaines), et la recherche dichotomique dans le cas o la
liste est trie.
3.1 Recherche dans un tableau non tri
Algorithme de recherche squentielle :
- Soit t un tableau d'entiers de 1..n lments non rangs.
- On recherche le rang (la place) de l'lment Elt dans ce tableau. L'algorithme
renvoie le rang (la valeur -1 est renvoye lorsque l'lment Elt n'est pas
prsent dans le tableau t)
- Complexit en O(n)
Nous proposons au lecteur 4 versions d'un mme algorithme de recherche squentielle. Le
lecteur adoptera une de ces versions en fonction des possibilits du langage avec lequel il
compte programmer sa recherche.
Version Tantque avec "et alors" (si le langage
dispose d'un oprateur et optimis)
Version Tantque avec "et" (oprateur et non
optimis)
i 1 ;
Tantque (i s n) et alors (t[i] = Elt) faire
i i+1
finTant;
si i s n alors rang i
sinon rang -1
Fsi
i 1 ;
Tantque (i < n) et (t[i] = Elt) faire
i i+1
finTant;
si t[i] = Elt alors rang i
sinon rang -1
Fsi
Version Tantque avec sentinelle en fin de tableau (rajout d'une cellule supplmentaire en fin
de tableau contenant systmatiquement l'lment rechercher)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
332
Version Tantque avec sentinelle avec "et
alors"
Version Pour avec instruction de sortie
(conseille si le langage dispose d'un oprateur
Sortirsi )
t[n+1] Elt ; // sentinelle rajoute
i 1 ;
Tantque (i s n) et alors (t[i] = Elt) faire
i i+1
finTant;
si i s n alors rang i
sinon rang -1
Fsi
pour i 1 jusqu n faire
Sortirsi t[i] = Elt
fpour;
si i s n alors rang i
sinon rang -1
Fsi
3.2 Recherche dans un tableau tri
Spcifications d'un algorithme squentiel
- Soit t un tableau d'entiers de 1..n lments rangs par ordre croissant par exemple.
- On recherche le rang (la place) de l'lment Elt dans ce tableau. L'algorithme renvoie le
rang (la valeur -1 est renvoye lorsque l'lment Elt n'est pas prsent dans le tableau t)
On peut reprendre sans changement les versions de l'algorithme de recherche
squentielle prcdent travaillant sur un tableau non tri.
- Complexit moyenne en O(n)
On peut aussi utiliser le fait que le dernier lment du tableau est le plus grand lment et
s'en servir comme une sorte de sentinelle. Ci-dessous deux versions utilisant cette dernire
remarque.
Version Tantque Version pour
si t[n] < Elt alors rang -1
sinon
i 1 ;
Tantque t[i] < Elt faire
i i+1;
finTant;
si t[i] = Elt alors rang i
sinon rang -1 Fsi
Fsi
si t[n] < Elt alors rang -1
sinon
pour i 1 jusqu n-1 faire
Sortirsi t[i] > Elt // sortie de la boucle
fpour;
si t[i] = Elt alors rang i
sinon rang -1 Fsi
Fsi
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
333
Spcifications dun algorithme dichotomique
- Soit t un tableau d'entiers de 1..n lments rangs par ordre croissant par exemple.
- On recherche le rang (la place) de l'lment Elt dans ce tableau. L'algorithme renvoie le
rang (la valeur -1 est renvoye lorsque l'lment Elt n'est pas prsent dans le tableau t).
Au lieu de rechercher squentiellement du premier jusqu'au dernier, on compare
l'lment Elt chercher au contenu du milieu du tableau. Si c'est le mme, on
retourne le rang du milieu, sinon l'on recommence sur la premire moiti (ou la
deuxime) si l'lment recherch est plus petit (ou plus grand) que le contenu du
milieu du tableau.
- Complexit moyenne en O(log(n))
Soit un tableau au dpart contenant les lments (x
1
, x
2
, ... , x
n
)
On recherche la prsence de l'lment x dans ce tableau. On divise le tableau en 2 parties
gales :
Soit x est infrieur l' lment milieu et s'il est prsent il ne peut tre que dans la partie
gauche, soit x est suprieur l' lment milieu et s'il est prsent il ne peut tre que dans la
partie droite. Supposons que x < milieu nous abandonnons la partie droite et nous
recommenons la mme division sur la partie gauche :
On divise nouveau la partie gauche en deux parties gales avec un nouveau milieu :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
334
Si x < milieu c'est la partie gauche qui est conserve sinon c'est la partie droite etc ...
Le principe de la division dichotomique aboutit la fin une dernire cellule dans laquelle
soit x = milieu et x est prsent dans la table, soit x = milieu et x n'est pas prsent dans la
table.
Version itrative du corps de cet algorithme :
bas, milieu, haut, rang : entiers
bas 1;
haut N;
Rang -1;
repter
milieu (bas + haut) div 2;
si x = t[milieu] alors
Rang milieu
sinon si t[milieu] < x alors
bas milieu + 1
sinon
haut milieu-1
fsi
fsi
jusqu ( x = t[milieu] ) ou ( bas haut )
Voici en Delphi une procdure traduisant la version itrative de cet algorithme :
procedure dichoIter(x:Elmt; table:tableau; var rang:integer);
{recherche dichotomique par itration dans table rang =-1 si pas trouv}
var
milieu:1..max;
g,d:0..max+1;
begin
g := 1;
d := max;
rang := -1;
while g <= d do
begin
milieu := (g+d) div 2;
if x = table[milieu] then
begin
rang := milieu;
exit
end
else
if x < table[milieu] then d := milieu-1
else g := milieu+1
end;
end;{dichoIter}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
335
Dans le cas de langage de programmation acceptant la rcursivit (comme Delphi ), il est
possible d'crire une version rcursive de cet algorithme dichotomique.
Voici en Delphi une procdure traduisant la version rcursive de cet algorithme :
procedure dichoRecur(x:Elmt;table: tableau; g,d:integer; var rang:integer);
{ recherche dichotomique rcursive dans table
rang =-1 si pas trouv.
g , d: 0..max+1 }
var
milieu:1..max;
begin
if g<= d then
begin
milieu := (g+d) div 2;
if x = table[milieu] then rang := milieu
else
if x < table[milieu] then // la partie gauche est conserve
dichoRecur( x, table, g, milieu-1, rang )
else // la partie droite est conserve
dichoRecur( x, table, milieu+1, d, rang )
end
else rang := -1
end;{dichoRecur}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
336
Exercices chapitre 3
Des exercices traits avec leur solution dtaille
Algorithmes et leur traduction en langage de programmation
Somme de 2 vecteurs
Fonctions boolennes
Variantes sur la factorielle
PGCD , PPCM de deux entiers
Nombres premiers
Nombres parfaits
Suite : racine carre - Newton
Inversion dun tableau
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
337
Des algorithmes
Somme de 2 vecteurs
Enonc :
Programme simple dutilisation des tableaux, on reprsente un vecteur de Z
n
dans un tableau un indice variant
de 1 n. Ecrire un programme LDFA additionnant 2 vecteurs de Z
n
dont les composantes sont lues au clavier.
Solution faisant apparatre les niveaux de dcomposition et l'algorithme associ
Niveau 1:
Algorithme Somme Vecteur
Entre: U,V deux vecteurs de Z
n
Sortie: W un vecteur de Z
n
Local: i e N
dbut
lire(U,V);
W U+V ;
ecrire (W)
FinSommeVecteur
Un vecteur de Z
n
est dfini par ses coordonnes : U(U
1
, U
2
, , U
n
) ; V(V
1
, V
2
, , V
n
) etc
Action < W = U+V > :
i , 1 s i s n / W
i
= U
i
+ V
i
Action < Lire ( U,V ) > :
i , 1 s i s n / lire U
i
et V
i
Action < Ecrire(W) > :
i , 1 s i s n / ecrire W
i
Description :
Pour i 1 jusqu n Faire
W
i
U
i
+ V
i
Fpour;
Description :
Pour i 1 jusqu n Faire
lire(U
i
, V
i
)
Fpour;
Description :
Pour i 1 jusqu n Faire
ecrire(W
i
)
Fpour;
Niveau 2 :
dbut
< lire(u,v) >
Pour i 1 jusqu n Faire
W
i
U
i
+ V
i
Fpour;
< ecrire(w) >
FinSommeVecteur
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
338
dbut
Pour i 1 jusqu n Faire
lire(U
i
, V
i
)
Fpour;
W = U+V
Pour i 1 jusqu n Faire
ecrire(W
i
)
Fpour;
FinSommeVecteur
programsomme_vecteur;
const n =3;
type
intervalle=1..n;
vecteur = array[intervalle] of integer;
var
U,V,W:vecteur;
i:intervalle;
begin
for i:=1 to n do readln (U[i],V[i]);
for i:=1 to n do W[i]:=U[i]+V[i];
for i:=1 to n do writeln(W[i]);
end.
Algorithme Somme Vecteur
Entre: U,V deux vecteurs de Z
n
Sortie: W un vecteur de Z
n
Local: i e N
dbut
pour i 1 jusqu n faire
lire(Ui , Vi )
Fpour;
pour i 1 jusqu n faire
Wi Ui + Vi
Fpour;
pour i 1 jusqu n faire
ecrire(Wi)
Fpour;
fin //sommevecteur
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
339
Fonctions boolennes
Enonc :
Programme simple d'criture de deux fonctions de calcul des deux connecteurs logiques, le et boolen et le ou
boolen par application des proprits suivantes :
X et Faux = Faux
X et Vrai = X
X ou Vrai = Vrai
X ou Faux = X
Solution en Ldfa avec les traductions de chaque fonction en Delphi-Pascal et en Java
LDFA LDFA
Algorithme LeEt
// un Et logique
Entre: x , y e Boolens
Sortie: resultat e Boolens
debut
si x = Faux alors
resultat Faux
sinon
resultat y
fsi
fin // LeEt
Algorithme LeOu
// un Ou logique
Entre: x , y e Boolens
Sortie: resultat e Boolens
debut
si x =Vrai alors
resultat Vrai
sinon
resultat y
fsi
fin // LeOu
DELPHI-Pascal DELPHI-Pascal
function Et(x,y : Boolean):Boolean;
begin
if x=faux then
result := false
else
result := y
end;
function Ou(x,y : Boolean):Boolean;
begin
if x=true then
result := true
else
result := y
end;
Java Java
boolean Et ( boolean x , boolean y )
{
if ( x == false )
return false ;
else
return y ;
}
boolean Ou ( boolean x , boolean y )
{
if ( x == true )
return true ;
else
return y ;
}
On pourra utiliser les raccourcis d'criture suivants pour un algorithme-fonction :
Algorithme LeEt
Entre: x , y e Boolens
Sortie: resultat e Boolens
Algorithme LeOu
Entre: x , y e Boolens
Sortie: resultat e Boolens
Fonction LeEt (x , y: Boolens) : resultat Boolens Fonction LeOu (x , y: Boolens) : resultat Boolens
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
340
Variantes sur la factorielle
Enonc : Algorithme de calcul de la factorielle d'un entier n! =n.(n-1)! en utilisant diffrentes instructions de
boucles.
Solution en Ldfa
par boucle tantque..ftant par boucle pourjusqu
Algorithme Factor
Entre: n e Entier*
Sortie: fact e Entier*
Local: i e N
dbut
lire(n) ;
fact 1;
i 2 ;
Tantque i <= n Faire
fact fact * i ;
i i + 1 ;
Ftant;
Ecrire (n ,! = , fact );
Fin // Factor
Algorithme Factor
Entre: n e Entier*
Sortie: fact e Entier*
Local: i e N
dbut
lire(n) ;
fact 1;
Pour i 2 jusqu n Faire
fact fact*i ;
Fpour;
Ecrire (n ,! = , fact );
Fin // Factor
par boucle repeter.... jusqua par rcursivit partir de la formule : n! =n.(n-1)!
Algorithme Factor
Entre: n e Entier*
Sortie: fact e Entier*
Local: i e Entier
dbut
lire(n) ;
fact 1;
i 2 ;
Repeter
fact fact * i ;
i i + 1 ;
jusqu i > n ;
ecrire(n ,! = , fact );
fin // Factor
Algorithme fact_recur
utilise Fonction fact
debut
ecrire ('5! =',fact(5))
fin // fact_recur
Fonction fact (n:entier) : resultat entier
debut
si n = 0 alors resultat 1
sinon resultat fact (n - 1) * n
fsi
fin // fact
program Factor;
var n , fact , i :integer ;
begin
readln(n);
fact:=1;
i:=2;
repeat
fact:=fact*i;
i:=i+1
until i > n ;
writeln(n ,'! = ', fact)
end.
program Factor;
var n:integer;
function fact (n : integer ) : integer ;
begin
if n=0 then result:=1
else result:=fact(n-1)*n
end;// fact
begin
readln(n);
writeln(n ,'! = ', fact(n));
end.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
341
PGCD , PPCM de deux entiers
Enonc : Ecrire des programmes LDFA donnant le pgcd et le ppcm de 2 entiers naturels.
Le pgcd de 2 entiers non nuls est le plus grand diviseur commun ces deux entiers.
Exemple : 35 et 21 ont pour pgcd 7, car 35 = 7*5 et 21 = 7*3,
Le ppcm de 2 entiers non nuls est le plus petit commun multiple ces deux entiers.
Exemple : 35 et 21 ont pour ppcm 105, car 105 =3*35 et 105=5*21.
Solution du pgcd faisant apparatre les niveaux de dcomposition et l'algorithme associ
La mthode employe pour valuer le pgcd de 2 entiers, se dnomme l'algorithme d'Euclide ou encore la
division par les restes successifs. Soit le calcul du pgcd de 35 et 21 : on divise 35 par 21, puis 21 par le reste 14,
puis 14 par le nouveau reste 7etcLe processus s'arrte lorsque le dernier reste est nul, le pgcd est alors le
prcdent reste non nul
Le dernier reste non nul tant 7, le pgcd de 35 et 21 est donc 7. D'une manire gnrale, pour calculer le pgcd de
deux entiers a et b nous divisons le plus grand par le plus petit, chacun de ces deux entiers est reprsent par une
variable a e N et b e N, nous classons systmatiquement les contenus de ces variables en mettant dans a le
plus grand des deux entiers et dans b le plus petit des deux.
Deux actions sont utilises pour calculer le pgcd de 2 entiers.
Niveau 1:
Algorithme CalculPgcd
Entre: a , b e N*
2
Sortie: pgcd e N
Local: r , t e N
2
dbut
< min(a,b) dans b, max dans a >;
< divisions par restes successifs >
FinCalculPgcd
Action < min(a,b) dans b, max dans a >: Action < divisions par restes successifs >:
Description :
Si b>a Alors
< change a et b >
Fsi;
Description :
Rpter
< r = reste (a par b) , division >
jusqu r=0;
pgcd a;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
342
Niveau 2 :
Algorithme CalculPgcd
Entre: a , b e N*
2
Sortie: pgcd e N
Local: r , t e N
2
dbut
Si b>a Alors
< change a et b >
Fsi;
Rpter
< r = reste (a par b) , division >
jusqu r=0;
FinCalculPgcd
Action < change a et b > Action < r = reste (a par b) , division >
Description :
t a ;
a b ;
b t
Description :
r a mod b ;
a b ;
b r
Niveau 3 :
Algorithme CalculPgcd
Entre: a , b e N*
2
Sortie: pgcd e N
Local: r , t e N
2
dbut
Si b>a Alors
t a ;
a b ;
b t
Fsi;
< divisions par restes >
FinCalculPgcd
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
343
Ce qui donne finalement en dveloppant les branches de l'arbre jusqu'au niveau 3 :
Algorithme CalculPgcd
Entre: a ,b e N*
2
Sortie: pgcd e N
Local: r , t e N
2
dbut
lire(a,b);
Si b>a Alors
t a ;
a b ;
b t
Fsi;
Rpter
r a mod b ;
a b ;
b r
jusqu r=0;
pgcd a;
ecrire(pgcd)
FinCalculPgcd
programcalcul_Pgcd;
var
a , b : integer;
pgcd, r, t : integer;
begin
readln(a,b);
if b>a then
begin
t := a ;
a := b ;
b := t
end;
repeat
r := a mod b ;
a := b ;
b := r
until r=0;
pgcd:= a;
writeln(pgcd)
end.
Solution du calcul du ppcm de deux entiers sous forme d'un algorithme-fonction
La mthode employe pour valuer le ppcm de 2 entiers a et b ( b <a )est simple :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
344
Nous valuons tous les multiples de b par ordre croissant (2b, 3b, ) et nous arrtons le calcul ds qu'un
multiple est divisible par a (si a et b sont premiers entre eux le ppcm est gal leur produit) :
Fonction ppcm (a,b:entier) rsultat entier;
local : n , p eentier
debut
p b;
n 1;
tantque (n <= a) et (p Mod a<>0) faire
p b * n;
n n + 1;
ftant
rsultat p
Fin // ppcm
program calcul_ppcm;
var
a, b, p:integer;
function ppcm (a,b:integer):integer;
var
k,p:integer;
begin
p:=b;
k:=1;
while (k<= a)and(p mod a<>0) do
begin
p:= b * k;
k:= k + 1;
end;
result:=p
end;
begin
a:= 125;
b:= 45;
p:= ppcm(a, b);
writeln('Calcul du ppcm :');
writeln('a=', a,' b=', b,' => ppcm=', p)
end.
class ApplicationPpcm {
public static void main(String[ ] args ) {
int a,b,p;
a=125;
b=45;
p=ppcm(a,b);
System.out.println("Calcul du ppcm :");
System.out.println("a="+a+" b="+b+" => ppcm="+p);
}
static int ppcm (int a , int b)
{
int n=1 , p=b;
while((n <= a)&(p %a !=0))
{
p= b * n;
n ++;
}
return p ;
}
/* Autre version avec un for sans aucun corps. Le code est
plus compact, mais il est moins lisible !
*/
static int ppcm (int a , int b)
{
int p=b;
for(int n=1; (n<=a)&(p%a!=0); n++,p=b*n);
return p ;
}
}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
345
Nombres premiers
Enonc : Un nombre entier est premier sil nest divisible que par 1 et par lui-mme.
Exemple : 17 , 19, 31 sont des nombres premiers.
Ecrire un programme LDFA donnant les n premiers nombres premiers.
Solution faisant apparatre les niveaux de dcomposition et l'algorithme associ
Deux actions sont utilises pour calculer les nombres premiers,
elles correspondent chacune une branche de l'arbre.
Niveau 1:
Algorithme Premier
Entre: n e N
Sortie: x e N
Local: Est_premier e {Vrai , Faux}
Divis , compt e N
2
dbut
lire(n);
Tantque(compt < n) Faire
< recherche primalit de x >;
< comptage si x est premier >
Ftant
FinPremier
Action < recherche primalit de x > Action < comptage si x est premier >
Description :
Rpter
< x est-il divisible ?>
jusqu < non premier, ou plus de diviseurs>
Description :
Si Est_premier =Vrai Alors
<on ecrit x et on le compte>
Fsi;
<on passe au x suivant>
Etude de la branche gauche de l'arbre au niveau 2 :
Niveau 2 :
dbut
lire(n);
Tantque (compt < n) Faire
Rpter
< x est-il divisible ?>
jusqu < plus de diviseurs>
< comptage si x est premier >
Ftant
FinPremier
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
346
Etude de la branche gauche de l'arbre au niveau 3 :
Action < x est-il divisible ?> Action < non premier, ou plus de diviseurs>
Description :
Si x mod divis=0 Alors
Est_premier Faux
Sinon
divis divis+1
Fsi
Description :
(divis > n-1)
ou
(Est_premier=Faux)
Etude de la branche droite de l'arbre au niveau 2 :
Niveau 2 :
dbut
lire(n);
Tantque (compt < n) Faire
< recherche primalit de x >;
Si Est_premier =Vrai Alors
< Afficher x >
Fsi;
<on passe au x suivant>
Ftant
FinPremier
Etude de la branche droite de l'arbre au niveau 3 :
Rpter
Si x mod divis=0 Alors
Est_premier Faux
Sinon
divis divis+1
Fsi
jusqu (divis > x-1)ou (Est_premier=Faux);
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
347
Action < Afficher x > Action <on passe au x suivant>
Description :
ecrire(x);
compt compt+1
Description :
x x+1
Niveau 3 :
Algorithme Premier
Entre: n e N
Sortie: x e N
Local: Est_premier e {Vrai , Faux}
Divis , compt e N
2
dbut
lire(n);
Tantque (compt < n) Faire
< recherche primalit de x >;
Si Est_premier =Vrai Alors
ecrire(x);
compt compt+1
Fsi;
x x+1
Ftant
FinPremier
Version finale complte de l'algorithme sa traduction en Delphi
Algorithme Premier
Entre: n e N
Sortie: x e N
Local: Est_premier e {Vrai , Faux}
Divis , compt e N
2
dbut
lire(n);
compt 1;
ecrire(2);
x 3;
Tantque(compt < n) Faire
divis 2;
Est_premier Vrai;
Rpter
Si x mod divis=0 Alors Est_premier Faux
Sinon divis divis+1
Fsi
jusqu (divis > x-1)ou (Est_premier=Faux);
Si Est_premier =Vrai Alors
ecrire(x);
compt compt+1
Fsi;
x x+1
Ftant
FinPremier
programPremier;
var
n,nbr,divis,compt:integer;
Est_premier:boolean;
begin
write('Combien de nombres premiers : ');
readln(n);
compt:=1;
writeln(2);
nbr:= 3;
while (compt < n) do
begin
divis:= 2;
Est_premier:= true;
repeat
if nbr mod divis=0 then Est_premier:= false
else divis:= divis+1
until (divis > nbr div 2)or (est_premier=false);
if Est_premier=true then
begin
writeln(nbr);
compt:= compt+1
end;
nbr:= nbr+1
end
end.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
348
Nombres parfaits
Enonc : Un nombre est dit parfait sil est gal la somme de ses diviseurs 1 compris.
Exemple : 6 = 1+2+3 , est parfait
Ecrire un programme LDFA donnant les n premiers nombres parfaits.
Solution faisant apparatre les niveaux de dcomposition et l'algorithme associ
Deux actions sont utilises pour calculer les nombres parfaits,
elles correspondent chacune une branche de l'arbre.
Niveau 1:
Algorithme Parfait
Entre: n e N
Sortie: nbr e N
Local: som, k, compt e N
3
dbut
Tantque (compt < n) Faire
< somme des diviseurs de nbr >;
< nbr est parfait >
Ftant
FinParfait
Action < somme des diviseurs de nbr > Action < nbr est parfait >
Description :
calcul de la somme des diviseurs du
nombre : nbr
Pour k 2 jusqu nbr-1 Faire
< cumul, si k divise nbr >
Fpour
Description :
lorsque le nombre nbr est reconnu comme parfait,
il doit tre compt, puis affich lcran
< nbr est parfait si nbr = som >
< comptage >
Etude de la branche gauche de l'arbre au niveau 2 :
Niveau 2 :
Dbut
Tantque (compt < n) Faire
pour k 2 jusqu nbr-1 Faire
< cumul des diviseurs >
Fpour;
< nbr est parfait si nbr=som >
< comptage >
Ftant
FinParfait
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
349
Etude de la branche gauche
de l'arbre au niveau 3 :
Etude de la branche droite de l'arbre au niveau 2 :
Niveau 2 :
dbut
Tantque (compt < n) Faire
< somme des diviseurs de nbr >;
< test nbr parfait ? >
< comptage >
Ftant
FinPremier
Action < test nbr parfait ? > Action < comptage >
Description :
le nombre nbr est parfait sil est gal la
somme calcule :
Si som=nbr Alors
ecrire(nbr) ;
compt compt+1;
Fsi;
Description :
Puis lon passe au nombre suivant
nbr nbr+1
Tantque (compt < n) Faire
pour k 2 jusqu nbr-1 Faire
Si nbr mod k = 0 Alors
som som + k
Fsi
Fpour
< nbr est parfait si nbr=som >
< comptage >
Ftant
Action < cumul des diviseurs, (si k divise nbr) >
__________________________________________________________________________
on cumule kdans la variable som(somme des diviseurs) du
nombre nbr lorsque kdivise effectivement nbr.
Si nbr mod k = 0 Alors
som som + k
Fsi
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
350
Etude de la branche droite de l'arbre au niveau 3 :
Version finale complte de l'algorithme sa traduction en Delphi
Algorithme Parfait
Entre: n e N
Sortie: nbr e N
Local: som, k, compt e N
3
dbut
lire(n);
compt 0;
nbr 2;
Tantque (compt < n) Faire
som 1;
Pour k 2 jusqu nbr-1 Faire
Si nbr mod k = 0 Alors
som som + k
Fsi
Fpour ;
Si som=nbr Alors
ecrire(nbr) ;
compt compt+1;
Fsi;
nbr nbr+1
Ftant
FinParfait
programParfait;
var
n, nbr : integer;
som, k, compt : integer;
begin
readln(n);
compt := 0;
nbr := 2;
while (compt < n) do
begin
som:= 1;
for k:= 2 to nbr-1 do
if nbr mod k=0 then
som := som + k ;
if som=nbr then
begin
writeln(nbr);
compt:= compt+1;
end ;
nbr:= nbr+1
end
end.
Si som=nbr Alors
ecrire(nbr) ;
compt compt+1;
Fsi;
nbr nbr+1
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
351
Suite : racine carre - Newton
Enonc : Etude dune suite convergente de la forme U
n
= f(U
n-1
)
Ecrire un programme LDFA proposant une tude simple de la suite U
n
suivante (mthode de Newton) :
U
n
= 1/2(U
n-1
+ X/ U
n-1
) X>0
La suite U
n
converge vers le nombre \X (la racine carr de X), le programme doit effectuer :
1 le calcul du terme de rang n donn par lutilisateur,
2 le calcul jusqu' une prcision relative Epsilon fixe
Solution faisant apparatre les niveaux de dcomposition et l'algorithme associ
Deux actions sont utilises pour effectuer les calculs demands,
elles correspondent chacune une branche de l'arbre.
Niveau 1:
Algorithme Newton
Entre: n e N*
x e R*
c e R (c e [0,1] )
Sortie: u e R
Local: v e R
i e N
dbut
<calcul du terme de rang n>;
<calcul de la limite la prcision c >
FinNewton
Action <calcul du terme de rang n> Action <calcul de la limite la prcision c >
Description :
Pour i 1 jusqu n Faire
< u(n+1) [u(n)+x/u(n)]/2 >
Fpour;
Description :
Rpter
<* u(n+1)=[u(n)+x/u(n)]/2 , prcision *>
jusqu <* prcison < c *>
Etude de la branche gauche de l'arbre au niveau 2 :
Niveau 2:
dbut
Eps 10
-4
;
n 10;
lire(x);
Pour i 1 jusqu n Faire
< u(n+1) [u(n)+x/u(n)]/2 >
Fpour;
ecrire(u);
<calcul de la limite la prcision c >
FinNewton
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
352
Etude de la branche gauche de l'arbre au niveau 3 :
Dveloppement de la branche droite de l'arbre jusqu'au niveau 3 :
Niveau 3:
dbut
Eps 10
-4
;
n 10;
lire(x);
Pour i 1 jusqu n Faire
v u;
u (u + x/u)/2 ;
Fpour;
ecrire(u);
Rpter
v u;
u (u + x/u)/2 ;
jusqu | (u-v)/v | < Eps;
ecrire(u)
FinNewton
Version finale complte de l'algorithme sa traduction en Delphi
Algorithme Newton
Entre:
n eN* , x e R* , c e R (c e [0,1] )
Sortie: u e R
Local: v e R , i e N
dbut
Eps 10
-4
;
n 10;
lire(x);
// calcul du terme de rang n donn:
u (1 + x)/2 ;
Pour i 1 jusqu n Faire
u (u + x/u)/2 ;
Fpour;
ecrire(u);
programNewton;
const
Eps=1E-4;
n=10;
var
u,v,x : real ;
i : integer ;
begin
readln(x);
// calcul du terme de rang n donn:
u:=(1+x)/2;
for i:= 1 to n do
u:= (u + x/u)/2 ;
writeln(u);
Action < u(n+1) [u(n)+x/u(n) ]/2 >
______________________________________________________
v u;
u (u + x/u)/2 ;
Niveau 3:
dbut
Eps 10
-4
;
n 10;
lire(x);
Pour i 1 jusqu n Faire
v u;
u (u + x/u)/2 ;
Fpour;
ecrire(u);
<calcul de la limite la prcision c >
FinNewton
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
353
suite
//calcul jusqu' une prcision Epsilon fixe
u (1 + x)/2 ; { rinitialisation }
Rpter
v u;
u (u + x/u)/2 ;
jusqu | (u-v)/v | < Eps;
ecrire(u)
FinNewton
//calcul jusqu' une prcision Epsilon fixe
u:=(1+x)/2;
repeat
v:= u;
u:= (u+x/u)/2
until abs((u-v)/v ) < eps;
writeln(u)
end.
import Readln;
class Newton
{
public static void main (String [ ] arg) {
final double Eps=1E-4;
int n=10;
double u,v,x;
x = Readln.undouble();
// calcul du terme de rang n donn:
u = (1+x)/2;
for(int i=1;i<=n;i++)
u = (u + x/u)/2 ;
System.out.println("1) aprs "+n+" termes: "+u);
//calcul jusqu' une prcision Epsilon fixe:
u=(1+x)/2;
do
{
v = u;
u = (u+x/u)/2;
}
while(Math.abs((u-v)/v ) >= Eps);
System.out.println("2) la prcision "+Eps+": "+u);
}
}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page
354
Inversion dun tableau
Enonc : Autre programme simple dutilisation des tableaux, crire un programme LDFA inversant le contenu
dun tableau n lments entiers dj rempli, on crira le contenu du tableau avant inversion, puis son contenu
aprs inversion.
Solution en Ldfa avec les traductions de chaque fonction en Delphi-Pascal et en Java
Algorithme InverseTable
Global: Table; vecteur de N
n
Local: temp e N, i e N
( i e [1 , Max] )
dbut
{remplissage alatoire du tableau}
Pour i 1 jusqu Max Faire
ecrire (Table
i
)
Fpour;
Pour i 1 jusqu Ent[Max/2] Faire
Temp Table
i ;
Table
i
Table
Max - i + 1
;
Table
Max - i + 1
Temp
Fpour;
Pour i 1 jusqu Max Faire
ecrire (Table
i
)
Fpour;
FinInverseTable
Ent[p] reprsente la partie entire de p
programinverse_tableau;
const
Max=10;
type
intervalle=1..Max;
Tableau=array[intervalle] of integer;
var
Table:Tableau;
i:intervalle;
Temp:integer;
begin
{remplissage alatoire du tableau}
for i:=1 to Max do
Table[i]:=random(1000);
{voir le contenu du tableau avant opration : }
for i:=1 to Max do
writeln('i=',i:2,':',Table[i]:4);
for i:=1 to Max div 2 do
begin
Temp:=Table[i];
Table[i]:=Table[Max-i+1];
Table[Max-i+1]:=Temp
end;
writeln('-----------------');
{voir le contenu du tableau aprs opration : }
for i:=1 to Max do
writeln('i=',i:2,':',Table[i]:4);
end.
class InvTab{
public static void main (String [ ] arg) {
final int Max=6;
long[ ]table= new long[Max+1];
//remplissage alatoire du tableau
for(int i=0;i<=Max;i++)
table[i] = Math.round(Math.random( )*100);
//voir le contenu du tableau avant opration
for(int i=0;i<=Max;i++)
System.out.println("table["+i+"] = "+
table[i]);
for(int i=0;i<=Max/2;i++) {
long Temp=table[i];
table[i]=table[Max-i];
table[Max-i]=Temp;
}
}
}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
355
Chapitre 4 : Structures de donnes
4.1.Spcification abstraite de donnes
- Le Type Abstrait Algbrique (TAA)
- Disposition pratique d'un TAA
- Le Type Abstrait de Donne (TAD)
- Classification hirarchique
- le TAD liste linaire
- le TAD pile LIFO
- le TAD file FIFO
- Exercices d'implantation de TAD
4.2. Implantation de TAD avec Unit en Delphi
- Types abstraits de donnes et Units en Delphi
Traduction gnrale TAD Unit pascal
Exemples de Traduction TAD Unit pascal
Variations sur les spcifications dimplantation
Exemples dimplantation de la liste linaire
Exemples dimplantation de la pile LIFO
Exemples dimplantation de la file FIFO
4.3. Structures d'arbres binaires
- Vocabulaire employ sur les arbres :
- Etiquette Racine, noeud, branche, feuille
- Hauteur, profondeur ou niveau d'un noeud
- Chemin d'un noeud , Noeuds frres, parents, enfants, anctres
- Degr d'un noeud
- Hauteur ou profondeur d'un arbre
- Degr d'un arbre
- Taille d'un arbre
- Exemples et implmentation d'arbre
- Arbre de drivation
- Arbre abstrait
- Arbre lexicographique
- Arbre d'hritage
- Arbre de recherche
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
356
- Arbres binaires
- TAD d'arbre binaire
- Exemples et implmentation d'arbre
- tableau statique
- variable dynamique
- classe
- Arbres binaires de recherche
- Arbres binaires partiellement ordonns (tas)
- Parcours en largeur et profondeur d'un arbre binaire
- Parcours d'un arbre
- Parcours en largeur
- Parcours prfix
- Parcours postfix
- Parcours infix
- Illustration d'un parcours en profondeur complet
- Exercices deux TAD implants en Unit et en classes avec Delphi
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
357
4.1 : Spcification abstraite de
donne
Plan du chapitre:
Introduction
Notion dabstraction
spcification abstraite
spcification oprationnelle
1. La notion de TAD (type abstrait de donnes)
1.1 Le Type Abstrait Algbrique (TAA)
1.2 Disposition pratique d'un TAA
1.3 Le Type Abstrait de Donne (TAD)
1.4 Classification hirarchique
1.5 Le TAD liste linaire (spcifications abstraite et concrte)
1.6 Le TAD pile LIFO (spcification abstraite et concrte)
1.7 Le TAD file FIFO (spcification abstraite seule)
Exercices d'implantation de TAD
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
358
Introduction
Le mcanisme de l'abstraction est lun des plus important avec celui de la mthode structure
fonctionnelle en vue de la ralisation des programmes.
Notion dabstraction en informatique
Labstraction consiste penser un objet en termes dactions que lon peut effectuer sur lui,
et non pas en termes de reprsentation et dimplantation de cet objet.
Cest cette attitude qui a conduit notre socit aux grandes ralisations modernes. Cest un art
de lingnieur et linformatique est une science de lingnieur.
Ds le dbut de la programmation nous avons vu apparatre dans les langages de
programmation les notions de subroutine puis de procdure et de fonction qui sont une
abstraction dencapsulation pour les familles dinstructions structures:
- Les paramtres formels sont une abstraction fonctionnelle (comme des variables
muettes en mathmatiques),
- Les paramtres effectifs au moment de l'appel sont des instanciations de ces
paramtres formels (une implantation particulire).
L'ide de considrer les types de donnes comme une abstraction date des annes 80. On s'est
en effet aperu qu'il tait ncessaire de s'abstraire de la reprsentation ainsi que pour
l'abstraction fonctionnelle. On a vu apparatre depuis une vingtaine danne un domaine de
recherche : celui des spcifications algbriques. Cette recherche a donn naissance au
concept de Type Abstrait Algbrique (TAA).
Selon ce point de vue une structure de donne devient:
Une collection dinformations structures et relies entre elles selon un graphe relationnel
tabli grce aux oprations effectues sur ces donnes.
Nous spcifions dune faon simple ces structures de donnes selon deux niveaux
dabstraction, du plus abstrait au plus concret.
Une spcification abstraite :
Description des proprits gnrales et des oprations qui dcrivent la structure de donnes.
Une spcification oprationnelle :
Description dune forme dimplantation informatique choisie pour reprsenter et dcrire la
structure de donne. Nous la divisons en deux tapes : la spcification oprationnelle
concrte (choix dune structure informatique classique) et la spcification oprationnelle
dimplantation (choix de la description dans le langage de programmation).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
359
Remarque :
Pour une spcification abstraite fixe nous pouvons dfinir plusieurs spcifications
oprationnelles diffrentes.
1. La notion de TAD (Type Abstrait de Donnes)
Bien que nous situant au niveau dbutant il nous est possible dutiliser sans effort thorique et
mental compliqu, une mthode de spcification semi-formalise des donnes. Le " type
abstrait de donne " bas sur le type abstrait algbrique est une telle mthode.
Le lecteur ne souhaitant pas aborder le formalisme mathmatique peut sans encombre pour la
suite, sauter le paragraphe qui suit et ne retenir que le point de vue pratique de la syntaxe dun
TAA.
1.1 Le Type Abstrait Algbrique (TAA)
Dans ce paragraphe nous donnons quelques indications thoriques sur le support formel
algbrique de la notion de TAA. (notations de F.H.Raymond cf.Biblio)
Notion dalgbre formelle informatique
Soit (Fn) n e N , une famille densembles tels que :
(-i
0
e N (1 s i
0
s n) / Fi
0
= C ) . (i,j, i = j F
i
F
j
= C )
posons : I = { n e N / F
n
= C }
Vocabulaire :
Les symboles ou lments de F
0
sont appels symboles de constantes ou symboles
fonctionnels 0-aire.
Les symboles de F
n
(o n > 1 et n e I) sont appels symboles fonctionnels n-aires.
Notation :
F = Fn = Fn
n e N n e I
soit F* lensemble des expressions sur F, le couple (F
*
,F) est appel une algbre abstraite.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
360
On dfinit pour tout symbole fonctionnel n-aire , une application de F*
n
dans F* note " "
de la faon suivante :
e, ( e F
n
)
et { : F
*n
F
*
telle que (a
1
,..., a
n
) (a1,...,an) = (a1,...,an) }
On dnote :
F
n
= { / e Fn }et = Fn
n e I
le couple (F
*
, ) est appel une algbre formelle informatique (AFI).
Les expressions de F
*
construites partir des fonctions sur des symboles fonctionnels n-
aires sappellent des schmas fonctionnels.
Par dfinition, les schmas fonctionnels de F
0
sont appels les constantes.
Exemple :
F0 = {a,b,c} // les constantes
F1 = {h,k} // les symboles unaires
F2 = {g} // les symboles binaires
F3 = {f} // les symboles ternaires
Soit le schma fonctionnel : fghafakbcchkgab
(chemin aborescent abstrait non parenths)
Ce schma peut aussi scrire avec un
parenthsage :
ou encore avec une reprsentation
arborescente:
f [g(h(a),f(a,k(b),c)), c, h(k(g(a,b))) ]
Interprtation dune algbre formelle informatique
Soit une algbre formelle informatique (AFI) : ( F
*
, )
on se donne un ensemble X tel que X = C ,
X est muni dun ensemble doprations sur X not O,
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
361
Lon construit une fonction telle que :
: ( F
*
, ) X ayant les proprits dun homomorphisme
est appele fonction dinterprtation de lAFI.
X est appele lunivers de lAFI.
Une AFI est alors un modle abstrait pour toute une famille d'lments fonctionnels, il suffit
de changer le modle d'interprtation pour implanter une structure de donnes spcifique.
Exemple :
F
0
= {x, y} une AFI
F
2
= {f, g }
F = F
0
F
2
lUnivers : X = R (les nombres rels)
les oprateurs O = {+,*} (addition et multiplication)
linterprtation y : (F
*
, ) (R , O )
dfinie comme suit :
(f) : R
2
R
(f) : (a,b) ( f ) [a,b] = a+b
(g) : R
2
R
(g) : (a,b) ( g ) [a,b] = a*b
(x) = a
0
(avec a
0
e R fix interprtant la constante x)
(y) = a
1
(avec a
1
e R fix interprtant la constante y)
Soit le schma fonctionnel fxgyx, son interprtation dans ce cas est la suivante :
(fxgyx) = (f (x,g(y,x))) = (f) ((x),(g)[(y),(x)] )
= (x) + (g)[(y),(x)] :proprit de (f)
= (x) + (y)*(x) : proprit de (g)
Ce qui donne comme rsultat : ( fxgyx ) = a
0
+ a
1
* a
0
A partir de la mme AFI, il est possible de dfinir une autre fonction dinterprtation et un
autre Univers X.
par exemple :
lUnivers : X = N (les entiers naturels)
les oprateurs : O = { reste , > } (le reste de la division euclidienne et la relation dordre)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
362
La fonction est dfinie comme suit :
(g) : N
2
N
(g) : (a,b) (g)[a,b] = reste(a,b)
(f) : N
2
N
(f) : (a,b) (f)[a,b] = a > b (x) = n
0
(avec n
0
e N fix)
(y) = n
1
(avec n
1
e N fix )
On interprte alors le mme schma fonctionnel dans ce nouveau cas fxgyx :
( fxgyx ) = n
0
> reste(n
1
, n
0
)
Ceci nest quune interprtation. cette interprtation reste encore une abstraction de plus bas
niveau, le sens (smantique dexcution), sil y en a un, sera donn lors de limplantation de
ces lments. Nous allons dfinir un outil informatique se servant de ces notions d'AFI et
d'interprtation, il s'agit du type abstrait algbrique.
Un TAA (type abstrait algbrique) est alors la donne du triplet :
- une AFI
- un univers X et O
- une fonction dinterprtation
la syntaxe du TAA est dfinie par lAFI et lensemble X
la smantique du TAA est dfinie par et lensemble O
Notre objectif tant de rester pratique, nous arrterons ici la description thorique des
TAA (complments cits dans la bibliographie pour le lecteur intress).
1.2 Disposition pratique d'un TAA
on crira (exemple fictif):
Sorte : A, B, C ..... les noms de types dfinis par le TAA, ce sont les types au sens des
langages de programmation.
Oprations :
f : A x B B
g : A C
x : B (notation pour les symboles de constantes de F0)
y : B (notation pour les symboles de constantes de F0)
Cette partie qui dcrit la syntaxe du TAA sappelle aussi la signature du TAA .
La smantique est donne par , O sous la forme daxiomes et de prconditions.
Le domaine dune opration dfinie partiellement est dfini par une prcondition.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
363
Un TAA rutilise des TAA dj dfinis, sous forme de hirarchie. Dans ce cas, la
signature totale est la runion des signatures de tous les TAA.
Si des oprateurs utilisent le mme symbole, le problme de surcharge peut tre rsolu
sans difficult, parce que les oprateurs sont dfinis par leur ensembles de dfinitions.
SYNTAXE DE LECRITURE DUN TYPE ABSTRAIT ALGEBRIQUE :
sorte : ...............
utilise : ...........
oprations :
prconditions :
........ def_ssi .......
axiomes :
FinTAA
Exemple dcriture dun TAA (les boolens) :
sorte : Boolens
oprations :
V : Boolens
F : Boolens
: Boolens Boolens
. : Boolens x Boolens Boolens
v : Boolens x Boolens Boolens
axiomes :
(V) = F ; (F) = V
a . V = a ; a . F = F
a v V = V ; a v F = a
FinBoolens
1.3 Le Type Abstrait de Donne (TAD)
Dans la suite du document les TAA ne seront pas utiliss entirement, la partie axiomes tant
occulte. Seules les parties oprations et prconditions sont tudies en vue de leur
implantation.
Cest cette restriction dun TAA que nous appellerons un type abstrait de donnes (TAD).
Nous allons fournir dans les paragraphes suivants quelques Types Abstrait de Donnes
diffrents.
Nous crirons ainsi par la suite un TAD selon la syntaxe suivante :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
364
TAD Truc
utilise : ...........
Champs : ...........
oprations : ...........
prconditions : ...........
FinTAD Truc
Le TAD Boolens scrit partir du TAA Boolens :
TAD Boolens
oprations :
V : Boolens
F : Boolens
: Boolens Boolens
. : Boolens x Boolens Boolens
v : Boolens x Boolens Boolens
FinTAD Boolen
Nous remarquons que cet outil permet de spcifier des structures de donnes dune manire
gnrale sans avoir la ncessit den connatre limplantation, ce qui est une caractristique de
la notion dabstraction.
1.4 Classification hirarchique
Nous situons, dans notre approche pdagogique de la notion dabstraction, les TAD au
sommet de la hirarchie informationnelle :
HIERARCHIE INFORMATIONNELLE
- 1 TYPES ABSTRAITS (les TAA,...)
- 2 CLASSES / OBJETS
- 3 MODULES
- 4 FAMILLES de PROCEDURES et FONCTIONS
- 5 ROUTINES (procdures ou fonctions)
- 6 INSTRUCTIONS STRUCTUREES ou COMPOSEES
- 7 INSTRUCTIONS SIMPLES (langage volu)
- 8 MACRO-ASSEMBLEUR
- 9 ASSEMBLEUR (langage symbolique)
- 10 INSTRUCTIONS MACHINE (binaire)
Nous allons tudier dans la suite 3 exemples complets de TAD classiques : la liste linaire, la
pile LIFO1, la file FIFO2. Pour chacun de ces exemples, il sera fourni une spcification
oprationnelle en pascal, puis plus loin en Delphi.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
365
Exemples de types abstraits de
donnes
1.5 Le TAD liste linaire (spcifications abstraite et concrte)
Spcification abstraite
Rpertorions les fonctionnalits dune liste en soulignant les verbes d'actions et les noms,
partir dune description semi-formalise:
- Il est possible dans une telle structure dajouter ou de retirer des lments en
nimporte quel point de la liste.
- Lordre des lments est primordial. Cet ordre est construit, non sur la valeur des
lments de la liste, mais sur les places (rangs)de ces lments dans la liste.
- Le modle mathmatique choisi est la suite finie dlments de type T
0
:
(a
i
)
ieI
o I est fini, totalement ordonn, a
i
e T
0
- Chaque place a un contenu de type T
0
.
- Le nombre dlments dune liste est appel longueur de la liste. Si la liste est vide
nous dirons que sa longueur est nulle (longueur = 0 ).
- On doit pouvoir effectuer au minimum (non exhaustif) les actions suivantes sur les
lments dune liste : accder un lment de place fixe, supprimer un lment
de place fixe, insrer un nouvel lment une place fixe, etc ....
- Cest une structure de donne squentielle dans laquelle les donnes peuvent tre
traites les unes la suite des autres :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
366
De cette description nous extrayons une spcification sous forme de TAD.
Ecriture syntaxique du TAD liste linaire
TAD Liste
utilise : N, T
0
, Place
Champs : (a
1
,.....,a
n
) suite finie dans T
0
oprations :
liste_vide : Liste
acces : Liste x N Place
contenu : Place T
0
kme : Liste x N T
0
long : Liste N
supprimer : Liste x N Liste
inserer : Liste x N x Liste
succ : Place Place
prconditions :
acces(L,k) def_ssi 1 s k s long(L)
supprimer(L,k) def_ssi 1 s k s long(L)
inserer(L,k,e) def_ssi 1 s k s long(L) +1
kme(L,k) def_ssi 1 s k s long(L)
Fin-Liste
signification des oprations : (spcification abstraite)
acces(L,k) : opration gnrale daccs la position dun lment de rang k de la liste L.
supprimer(L,k) : suppression de llment de rang k de la liste L.
inserer(L,k,e) : insrer llment e de T
0
, la place de llment de rang k dans la liste L.
kime(L,k) : fournit llment de rang k de la liste.
spcification oprationnelle concrte
- La liste est reprsente en mmoire par un tableauet un attribut de longueur.
- Le kme lment de la liste est le kme lment du tableau.
- Le tableau est plus grand que la liste (il y a donc dans cette interprtation une
contrainte sur la longueur. Notons Longmax cette valeur maximale de longueur de
liste).
Il faut donc, afin de conserver la cohrence, ajouter deux prconditions au TAD Liste :
long(L) def_ssi long(L) s Longmax
inserer(L,k,e) def_ssi (1 s k s long(L) +1) . long(L) s Longmax)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
367
Dautre part la structure de tableau choisie permet un traitement itratif de lopration kme (
une autre spcification rcursive de cet oprateur est possible dans une autre spcification
oprationnelle de type dynamique).
kme(L,k) = contenu(acces(L,k) )
1.6 Le TAD pile LI FO (spcification abstraite et concrte)
Spcification abstraite
Rpertorions les fonctionnalits dune pile LIFO (Last In First Out) en soulignant les verbes
d'actions et les noms, partir dune description semi-formalise:
- Cest un modle pour toute structure de donnes o lon accumule des informations
les unes aprs les autres, mais o lon choisit de neffectuer un traitement que sur le
dernier lment entr. Exemples : pile de dossiers sur un bureau, pile dassiettes, etc...
- Il est possible dans une telle structure dajouter ou de retirer des lments
uniquement au dbut de la pile.
- Lordre des lments est impos par la pile. Cet ordre est construit non sur la valeur
des lments de la liste, mais sur les places (rangs)de ces lments dans la liste. Cet
ordre nest pas accessible lutilisateur, cest un lment priv.
- Le modle mathmatique choisi est la suite finie dlments de type T
0
:
(a
i
)
ieI
o I est fini, totalement ordonn, a
i
e T
0
- La pile possde une place spciale dnomme sommet qui identifie son premier
lment et contient toujours le dernier lment entr.
- Le nombre dlments dune pile LIFO P est appel profondeur de la pile. Si la pile
est vide nous dirons que sa profondeur est nulle (profondeur = 0 ).
- On doit pouvoir effectuer sur une pile LIFO au minimum (non exhaustif) les actions
suivantes : voir si la pile est vide, dpiler un lment, empiler un lment, observer le
premier lment sans le prendre, etc...
PILE LIFO
- Cest une structure de donnes squentielle dans laquelle les donnes peuvent tre
traites les unes la suite des autres partir du sommet
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
368
Ecriture syntaxique du TAD Pile LIFO
TAD PILIFO
utilise : T
0
, Boolens
Champs : (a
1
,.....,a
n
) suite finie dans T
0
oprations :
sommet : PILIFO
Est_vide : PILIFO Boolens
empiler : PILIFO x T
0
x sommet PILIFO x sommet
dpiler : PILIFO x sommet PILIFO x sommet x T
0
premier : PILIFO T
0
prconditions :
dpiler(P) def_ssi est_vide(P) = Faux
premier(P) def_ssi est_vide(P) = Faux
FinTAD-PILIFO
spcification oprationnelle concrte
- La Pile est reprsente en mmoire dans un tableau.
- Le sommet (not top) de la pile est un pointeur sur la case du tableau contenant le
dbut de pile. Les variations du contenu k de top se font au gr des empilements et
dpilements.
- Le tableau est plus grand que la pile (il y a donc dans cette interprtation une
contrainte sur la longueur, notons Longmax cette valeur maximale de profondeur de la
pile).
- Loprateur empiler : rajoute dans le tableau dans la case pointe par top un lment et
top augmente dune unit.
- Loprateur depiler : renvoie llment point par top et diminue top dune unit.
- Loprateur premier fournit une copie du sommet point par top (la pile reste intacte).
- Loprateur Est_vide teste si la pile est vide (vrai si elle est vide, faux sinon).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
369
1.7 Le TAD file FIFO (spcification abstraite seule)
Spcification abstraite
Rpertorions les fonctionnalits dune file FIFO (First In First Out) en soulignant les verbes
d'actions et les noms, partir dune description semi-formalise:
- Cest un modle pour toute structure de donnes o lon accumule des informations
les unes aprs les autres, mais o lon choisit deffectuer un traitement selon lordre
darrive des lments, comme dans une file dattente.
- Exemples :toutes les files dattente, supermarchs, cantines , distributeurs de pices,
etc...
- Il est possible dans une telle structure dajouter des lments la fin de la file, ou de
retirer des lments uniquement au dbut de la file.
- Lordre des lments est impos par la file. Cet ordre est construit non sur la valeur
des lments de la liste, mais sur les places (rangs)de ces lments dans la liste. Cet
ordre nest pas accessible lutilisateur, cest un lment priv.
- Le modle mathmatique choisi est la suite finie dlments de type T
0
:
(a
i
)
ieI
o I est fini, totalement ordonn, a
i
e T
0
- La file possde deux places spciales dnommes tte et fin qui identifient lune son
premier lment, lautre le dernier lment entr.
- Le nombre dlments dune file FIFO " F " est appel longueur de la file ; si la file
est vide nous dirons que sa longueur est nulle (longueur = 0 ).
- On doit pouvoir effectuer sur une file FIFO au minimum (non exhaustif) les actions
suivantes : voir si la file est vide, ajouter un lment, retirer un lment, observer le
premier lment sans le prendre, etc...
Ecriture syntaxique du TAD file FIFO
TAD FIFO
utilise : T
0
, Boolens
Champs : (a
1
,.....,a
n
) suite finie dans T
0
oprations :
tte : FIFO
fin : FIFO
Est_vide : FIFO Boolens
ajouter : FIFO x T
0
x fin PILIFO x fin
retirer : FIFO x tte FIFO x tte x T
0
premier : FIFO T
0
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
370
prconditions :
retirer(F) def_ssi est_vide(F) = Faux
premier(F) def_ssi est_vide(F) = Faux
FinTAD-FIFO
Spcification oprationnelle concrte
- La file est reprsente en mmoire dans un tableau.
- La tte de la file est un pointeur sur la case du tableau contenant le dbut de la file.
Les variations de la valeur de la tte se font au gr des ajouts et des retraits.
- La fin ne bouge pas , cest le point dentre de la file.
- Le tableau est plus grand que la file (il y a donc dans cette interprtation une
contrainte sur la longueur ; notons max cette valeur maximale de longueur de la
file).
- Loprateur ajouter : ajoute dans le tableau dans la case pointe par fin un lment
et tte augmente dune unit.
- Loprateur retirer : renvoie llment point par tte et diminue tte dune unit.
- Loprateur premier fournit une copie de llment point par tte (la file reste
intacte).
- Loprateur Est_vide teste si la file est vide (vrai si elle est vide, faux sinon).
On peut ajouter aprs la dernire cellule pointe par l'lment fin comme le montre la figure ci-dessous :
dans ce cas retirer un lment en tte impliquera un dcalage des donnes vers la gauche.
On peut aussi choisir d'ajouter partir de la premire cellule comme le montre la figure ci-dessous :
dans ce cas ajouter un lment en fin impliquera un dcalage des donnes vers la droite.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
371
4.2 : Types abstraits de donnes
Implantation avec Unit en Delphi
Plan du chapitre:
1. Types abstraits de donnes et Units en Delphi
1.1 Traduction gnrale TAD Unit pascal
1.2 Exemples de Traduction TAD Unit pascal
1.3 Variations sur les spcifications dimplantation
1.4 Exemples dimplantation de la liste linaire
1.5 Exemples dimplantation de la pile LIFO
1.6 Exemples dimplantation de la file FIFO
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
372
1. Types abstraits de donnes et Units en Delphi
Dans cette partie nous adoptons un point de vue pratique dirig par l'implmentation dans un
langage accessible un dbutant des notions de type abstrait de donne.
Nous allons proposer une criture des TAD avec des units Delphi (pascal version avec Unit)
puis aprs avec des classes Delphi. Le langage Delphi en effet pour implanter des TAD,
possde deux notions situes deux niveaux d'abstraction diffrents :
- La notion dunit (Unit) se situe au niveau 4 de la hirarchie informationnelle cite
auparavant : elle nous a dj servi implanter la notion de module. Une unit est donc une
approximation relativement bonne pour le dbutant de la notion de TAD.
- La notion classique de classe, contenue dans tout langage orient objet, se situe au niveau
2 de cette hirarchie constitue une meilleure approche de la notion de TAD.
En fait un TAD sera bien dcrit par la partie interface dune unit et se traduit presque
immdiatement ; le travail de traduction des prconditions est la charge du programmeur et
se trouvera dans la partie prive de la unit (implementation)
1.1Traduction gnrale TAD Unit pascal
Nous proposons un tableau de correspondance pratique entre la signature d'un TAD et la
partie interface d'une Unit :
syntaxe du TAD squelette de la unit associe
TAD Truc Unit Truc ;
utilise
TAD
1
, TAD
2
,...,TAD
n
interface
uses TAD
1
,...,TAD
n
;
champs
........
const ....
type ....
var ....
oprations
Op1 : E x F G
Op2 : E x F x G H x S
............
procedure Op1(x :E ;y :F ;var z :G) ;
procedure Op2(x :E ;y :F ; z :G ; var t :H ; var u :S) ;
............
FinTAD-Truc end.
Reste la charge du programmeur l'criture, dans la partie implementation de la unit, des
blocs de code associs chacune des procdures dcrites dans la partie interface :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
373
Unit Truc ;
interface
uses TAD
1
,...,TAD
n
;
const ....
type ....
var ....
procedure Op1(x :E ;y :F ;var z :G) ;
procedure Op2(x :E ;y :F ; z :G ; var t :H ; var u :S) ;
............
implementation
procedure Op1(x :E ;y :F ;var z :G) ;
begin
............ code
end ;
procedure Op2(x :E ;y :F ; z :G ; var t :H ;var u :S) ;
begin
............ code
end ;
etc...
end.
1.2 Exemples de Traduction TAD Unit pascal
Le TAD Boolens implant sous deux spcifications concrtes en pascal avec deux types
scalaires diffrents.
Spcification oprationnelle concrte n1
Les constantes du type Vrai, Faux sont reprsentes par deux constantes pascal dans un type
intervalle sur les entiers.
Const vrai=1 ; faux=0
type Booleens=faux..vrai ;
Voici linterface de la unit traduite et le TAD :
TAD : Boolens
Champs :
Oprations :
Vrai : Boolens
Faux : Boolens
Et : Boolens x Boolens Boolens
Ou : Boolens x Boolens Boolens
Non : Boolens Boolens
FINTAD-Boolens
Unit Bool ;
interface
Const
vrai=1 ; faux=0
type
Booleens = faux..vrai ;
function Et (x,y :Booleens) :Booleens ;
function Ou (x,y :Booleens) :Booleens ;
function Non(x :Booleens) :Booleens ;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
374
Spcification oprationnelle concrte n2
Les constantes du type Vrai, Faux sont reprsentes par deux identificateurs pascal dans un
type numr.
type Booleens=(faux,vrai) ;
Voici linterface de la unit traduite et le TAD :
TAD : Boolens
Champs :
Oprations :
Vrai : Boolens
Faux : Boolens
Et : Boolens x Boolens Boolens
Ou : Boolens x Boolens Boolens
Non : Boolens Boolens
FINTAD-Boolens
Unit Bool ;
interface
type
Booleens=(faux,vrai) ;
function Et (x,y :Booleens) :Booleens ;
function Ou (x,y :Booleens) :Booleens ;
function Non(x :Booleens) :Booleens ;
Nous remarquons la similarit des deux spcifications concrtes :
Implantation avec des entiers Implantation avec des numrs
Unit Bool ;
interface
Const vrai=1 ; faux=0
type
Booleens = faux..vrai ;
function Et (x,y :Booleens) :Booleens ;
function Ou (x,y :Booleens) :Booleens ;
function Non(x :Booleens) :Booleens ;
Unit Bool ;
interface
type
Booleens = (faux,vrai) ;
function Et (x,y :Booleens) :Booleens ;
function Ou (x,y :Booleens) :Booleens ;
function Non(x :Booleens) :Booleens ;
1.3 Variations sur les spcifications dimplantation
Cet exercice ayant t propos un groupe dtudiants, nous avons eu plusieurs genres
dimplantation des oprations : et, ou, non. Nous exposons au lecteur ceux qui nous ont parus
tre les plus significatifs :
Implantation daprs spcification concrte n1
Fonction Et Fonction Et
function Et (x,y :Booleens) :Booleens ;
begin
Et := x * y
end ;
function Et (x,y :Booleens) :Booleens ;
begin
if x=Faux then Et :=Faux
else Et := Vrai
end ;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
375
Fonction Ou Fonction Ou
function Ou (x,y :Booleens) :Booleens ;
begin
Ou :=x+y - x*y
end ;
function Ou (x,y :Booleens) :Booleens ;
begin
if x=Vrai then Ou := Vrai
else Ou := Faux
end ;
Fonction Non Fonction Non
function Non(x :Booleens) :Booleens ;
begin
Non := 1-x
end ;
function Ou (x,y :Booleens) :Booleens ;
begin
if x=Vrai then Ou := Vrai
else Ou := Faux
end ;
Dans la colonne de gauche de chaque tableau, lanalyse des tudiants a t dirige par le choix de la spcification
concrte sur les entiers et sur un modle semblable aux fonctions indicatrices des ensembles. Ils ont alors
cherch des combinaisons simples doprateurs sur les entiers fournissant les valeurs adquates.
Dans la colonne de droite de chaque tableau, lanalyse des tudiants a t dirige dans ce cas par des
considrations axiomatiques sur une algbre de Boole. Ils se sont servis des proprits dabsorbtion des lments
neutres de la loi " ou " et de la loi " et ". Il sagit l dune structure algbrique abstraite.
Influence de labstraction sur la rutilisation
A cette tape du travail nous avons demand aux tudiants quel tait, sil y en avait un, le
meilleur choix dimplantation quant sa rutilisation pour limplantation daprs la
spcification concrte n2.
Les tudiants ont compris que la version dirige par les axiomes lemportait sur la prcdente,
car sa qualit dabstraction due lutilisation de laxiomatique a permis de la rutiliser sans
aucun changement dans la partie implementation de la unit associe spcification concrte
n2 (en fait toute utilisation des axiomes dalgbre de Boole produit la mme efficacit).
Conclusion :
labstraction a permis ici une rutilisation totale et donc un gain de temps de
programmation dans le cas o lon souhaite changer quelle quen soit la raison,
la spcification concrte.
Dans les exemples qui suivent, la notation ~ indique la traduction en un squelette en langage
pascal.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
376
1.4 Exemples dimplantation de la liste linaire
spcification propose en pseudo-Pascal :
Liste ~
type Liste=record
t : array[1.. Longmax] of T
0
;
long : 0.. Longmax
end;
liste_vide ~ var L : Liste (avec L.long :=0)
acces ~
var k : integer;
L : liste (adresse(L.t[k]))
contenu ~
var k : integer;
L : liste (val(adresse(L.t[k])))
kme ~
var k : integer;
L : liste (kme(L,k) ~ L.t[k] )
long ~ var L : liste ( long ~ L.long )
succ ~ adresse(L.t[k])+1 c--dire ( L.t[k+1] )
supprimer ~
procedure supprimer(var L : Liste ; k : 1.. Longmax);
begin
..........
end; {supprimer}
inserer ~
procedure inserer(var L : Liste ; k : 1.. Longmax; x : T
0
);
begin
..........
end; {inserer}
La prcondition de loprateur supprimer peut tre ici implante par le test :
if k<=long(L) then ....
La prcondition de loprateur insrer peut tre ici implante par le test :
if (long(L) < Longmax) and (k<=Long(L)+1) then .....
Les deux objets acces et contenu ne seront pas utiliss en pratique, car le tableau les implante
automatiquement dune manire transparente pour le programmeur.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
377
Le reste du programme est laiss au soin du lecteur qui pourra ainsi se construire sur sa
machine , une base de types en Pascal-Delphi de base.
Nous pouvons " enrichir " le TAD Liste en lui adjoignant deux oprateurs test et rechercher
(rechercher un lment dans une liste). Ces adjonctions ne posent aucun problme. Il suffit
pour cela de rajouter au TAD les lignes correspondantes :
oprations
Test : Liste x T
0
Boolen
rechercher : Liste x T
0
Place
prcondition
rechercher(L,e) def_ssi Test(L,e) = V
Le lecteur construira titre dexercice limplantation Pascal-Delphi de ces deux nouveaux
oprateurs en tendant le programme dj construit. Il pourra par exemple se baser sur le
schma de reprsentation Pascal suivant :
function Test(L : liste; e : T
0
):Boolean;
begin
{il sagit de tester la prsence ou non de e dans la liste L}
end;
procedure rechercher(L : liste ; x : T
0
; var rang : integer);
begin
if Test(L,x) then
{il sagit de fournir le rang de x dans la liste L}
else
rang:=0
end;
1.5 Exemples dimplantation de la pile LIFO
Nous allons utiliser un tableau avec une case supplmentaire permettant dindiquer que le
fond de pile est atteint (la case 0 par exemple, qui ne contiendra jamais dlment).
spcification propose en pseudo-Pascal :
Pilifo ~
type Pilifo=record
t : array[ 0.. Longmax ] of T
0
;
sommet: 0.. Longmax
end;
depiler ~ procedure depiler (var Elt : T
0
;var P : Pilifo) ;
empiler ~ procedure empiler( Elt : T
0
;var P : Pilifo) ;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
378
premier ~
procedure premier(var Elt : T
0
; P : Pilifo) ;
(on pourra utiliser une function renvoyant un T
0
, si le type T
0
sy prte !)
Est_vide ~ function Est_vide(P : Pilifo) : boolean ;
Le contenu des procdures et des fonctions est laiss au lecteur titre dexercice.
Remarque :
Il est aussi possible de construire une spcification oprationnelle laide du
TAD Liste en remplaant dans ltude prcdente le mot " tableau " par le mot "
liste ". Il est vivement conseill au lecteur dcrire cet exercice en Delphi pour
bien se convaincre de la diffrence entre les niveaux dabstractions.
1.6 Exemples dimplantation de la file FIFO
Nous allons utiliser ici aussi un tableau avec une case supplmentaire permettant dindiquer
que la file est vide (la case 0 par exemple, qui ne contiendra jamais dlment).
spcification propose en pseudo-Pascal :
Fifo ~
type Fifo=record
t : array[ 0.. Longmax ] of T
0
;
sommet: 0.. Longmax
end;
retirer ~ procedure retirer(var Elt : T
0
;var F : Fifo) ;
ajouter ~ procedure ajouter( Elt : T
0
;var F : Fifo) ;
premier ~
procedure premier(var Elt : T
0
; P : Fifo) ;
(on pourra utiliser une function renvoyant un T
0
, si le type T
0
sy prte !)
Est_vide ~ function Est_vide(P : Fifo) : boolean ;
Le contenu des procdures et des fonctions est laiss au lecteur titre dexercice.
Remarque :
Comme pour le TAD Pilifo, il est aussi possible de construire une spcification
oprationnelle du TAD FIFO laide du TAD Liste en remplaant dans ltude
prcdente le mot " tableau " par le mot " liste ".
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
379
Une solution d'implantation de
la liste linaire en Unit Delphi
Unit UListchn;
interface
const
max_elt = 100;
type
T0 = integer;
liste =
record
suite: array[1..max_elt] of T0;
long: 0..max_elt;
init_ok:char;
end;
function longueur (L: liste): integer;
procedure supprimer (var L: liste; k: integer);
procedure inserer (var L: liste; k: integer; x: T0);
function kieme (L: liste; n: integer): T0;
function Test (L: liste; x: T0): boolean;
procedure Rechercher (L: liste; x: T0; var place: integer);
implementation
procedure init_liste(var L:liste);
{initialisation obligatoire}
begin
with L do
begin
long:=0;
init_ok:='#'
end
end;
function Est_vide(L:liste):boolean;
begin
if L.init_ok<>'#' then
begin
writeln('>>> Gestionnaire de Liste: Liste non
initialise !! (erreur fatale)');
halt
end
else
if L.long=0 then
begin
Est_vide:=true;
writeln('>>> Gestionnaire de Liste: Liste vide')
end
else
est_vide:=false
end;
function longueur (L: liste): integer;
begin
longueur := L.long
end;
procedure supprimer (var L: liste; k: integer);
var
n: 0..max_elt;
i: 1..max_elt;
begin
if not Est_vide(L) then
if k>1 then
begin
n := longueur(L);
if (1<=k)and(k <= n) then
begin
for i := k to n - 1 do
L.suite[i] := L.suite[i + 1];
L.long := n - 1
end
end
else
l.long :=0;
end;{supprimer}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
380
procedure inserer (var L: liste; k: integer; x: T0);
var
n: 0..max_elt;
i: 1..max_elt;
begin
if not Est_vide(L) then
begin
n := longueur(L);
if (n < max_elt) and (k <= n + 1) then
begin
for i := n downto k do
L.suite[i + 1] := L.suite[i];
L.suite[k] := x
end;
L.long := L.long + 1
end
else
begin
L.suite[1]:=x;
L.long :=1
end
end;
function kieme (L: liste; n: integer): T0;
begin
if not Est_vide(L) then
begin
kieme := L.suite[n]
end
end;
procedure Test_Recherche(L:liste;x:T0;var
trouve:boolean;var rang:integer);
var
fini,present:boolean;
i,n:integer;
begin
if not Est_vide(L) then
begin
fini := false;
i := 1;
n:=L.long;
present := false;
while not fini and not present do
begin
if i <= n then
if L.suite[i] <> x then
i := i + 1
else
present := true
else
fini := true
end;
if present then
begin
{valeur x trouve a l'indice:i}
trouve:=true;
rang:=i
end
else
begin
{cette valeur x n'est pas dans le tableau}
trouve:=false;
{on n'affecte aucune valeur a rang !! }
end
end
end;
function Test (L: liste; x: T0): boolean;
{teste la presence ou non de x dans la liste L}
var
present:boolean;
rang:integer;
begin
if not Est_vide(L) then
begin
Test_Recherche(L,x,present,rang);
Test:=present
end
end;
procedure Rechercher (L: liste; x: T0; var place:
integer);
var
present:boolean;
begin
if not Est_vide(L) then
begin
Test_Recherche(L,x,present,place);
if not present then
place:=0
end
end;
end. { fin de la Unit UListchn }
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
381
Une solution d'implantation de
la pile Lifo en Unit Delphi
Unit Upilifo;
interface
const
max_elt = 100;
fond = 0;
type
T0 = integer;
pile =
record
suite: array[0..max_elt] of T0;
sommet: 0..max_elt;
end;
function Est_Vide(P:pile):boolean;
procedure Empiler(elt:T0;var P:pile);
procedure Depiler(var elt:T0;var P:pile);
function premier (P: pile): T0;
implementation
function Est_Vide(P:pile):boolean;
begin
if P.sommet = fond then
Est_Vide := true
else
Est_Vide := false
end;
procedure Empiler(elt:T0;var P:pile);
begin
P.sommet := P.sommet + 1;
P.suite[P.sommet] := elt
end;
procedure Depiler(var elt:T0;var P:pile);
begin
if not Est_Vide(P) then
begin
elt := P.suite[P.sommet];
P.sommet := P.sommet - 1
end
{la precondition est implantee ici par
le test if not est_vide(p) then ... }
end;
function premier (P: pile): T0;
begin
if not Est_Vide(P) then
premier := P.suite[P.sommet]
{ la precondition est implantee ici par
le test if not est_vide(p) then ... }
end;
end. { fin de la Unit Upilifo }
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
382
4.3 : Structures d'arbres binaires
Plan du chapitre:
1. Notions gnrales sur les arbres
1.1 Vocabulaire employ sur les arbres :
- Etiquette Racine, noeud, branche, feuille
- Hauteur, profondeur ou niveau d'un noeud
- Chemin d'un noeud , Noeuds frres, parents, enfants, anctres
- Degr d'un noeud
- Hauteur ou profondeur d'un arbre
- Degr d'un arbre
- Taille d'un arbre
1.2 Exemples et implmentation d'arbre
- Arbre de drivation
- Arbre abstrait
- Arbre lexicographique
- Arbre d'hritage
- Arbre de recherche
2. Arbres binaires
2.1 TAD d'arbre binaire
2.2 Exemples et implmentation d'arbre
- tableau statique
- variable dynamique
- classe
2.3 Arbres binaires de recherche
2.4 Arbres binaires partiellement ordonns (tas)
2.5 Parcours en largeur et profondeur d'un arbre binaire
- Parcours d'un arbre
- Parcours en largeur
- Parcours prfix
- Parcours postfix
- Parcours infix
- Illustration d'un parcours en profondeur complet
- Exercice
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
383
1. Notions gnrales sur les structures d'arbres
La structure d'arbre est trs utilise en informatique. Sur le fond on peut considrer un arbre
comme une gnralisation d'une liste car les listes peuvent tre reprsentes par des arbres. La
complexit des algorithmes d'insertion de suppression ou de recherche est gnralement plus
faible que dans le cas des listes ( cas particulier des arbres quilibrs). Les mathmaticiens
voient les arbres eux-mme comme des cas particuliers de graphes non orients connexes et
acycliques, donc contenant des sommets et des arcs :
fig-1
fig-2 fig-3
Ci dessus 3 reprsentations graphiques de la mme structure d'arbre : dans la figure fig-1 tous
les sommets ont une disposition quivalente, dans la figure fig-2 et dans la figure fig-3 le
sommet "cercl" se distingue des autres.
Lorsqu'un sommet est distingu par rapport aux autres, on le dnomme racine et la mme
structure d'arbre s'appelle une arborescence, par abus de langage dans tout le reste du
document nous utliserons le vocable arbre pour une arborescence.
Enfin certains arbres particuliers nomms arbres binaires sont les plus utiliss en informatique
et les plus simples tudier. En outre il est toujours possible de "binariser" un arbre non
binaire, ce qui nous permettra dans ce chapitre de n'tudier que les structures d'arbres binaires.
1.1Vocabulaire employ sur les arbres
Un arbre dont tous les noeuds sont nomms est dit tiquet. L'tiquette
(ou nom du sommet) reprsente la "valeur" du noeud ou bien
l'information associe au noeud.
Ci-dessous un arbre tiquet dans les entiers entre 1 et 10 :
Ci-dessous un arbre tiquet dans les entiers entre 1 et 10 :
Etiquette
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
384
Nous rappellons la terminologie de base sur les arbres:
Nous conviendrons de dfinir la hauteur (ou profondeur
ou niveau d'un noeud ) d'un noeud X comme gale au
nombre de noeuds partir de la racine pour aller
jusqu'au noeud X.
En reprenant l'arbre prcdant et en notant h la fonction hauteur d'un noeud :
Pour atteindre le noeud tiquet 9 , il faut parcourir le lien 1--5, puis 5--8, puis enfin 8--9 soient 4 noeuds donc 9
est de profondeur ou de hauteur gale 4, soit h(9) = 4.
Pour atteindre le noeud tiquet 7 , il faut parcourir le lien 1--4, et enfin 4--7, donc 7 est de profondeur ou de
hauteur gale 3, soit h(7) = 3.
Par dfinition la hauteur de la racine est gal 1.
h(racine) =1 (pour tout arbre non vide)
(Certains auteurs adoptent une autre convention pour calculer la hauteur d'un noeud: la racine a pour hauteur
0 et donc n'est pa compte dans le nombre de noeuds, ce qui donne une hauteur infrieure d'une unit notre
dfinition).
On appelle chemin du noeud X la suite des noeuds par
lesquels il faut passer pour aller de la racine vers le
noeud X.
Racine , noeud,
branche , feuille
Hauteur d'un
noeud
Chemin d'un noeud
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
385
Chemin du noeud 10 = (1,5,8,10)
Chemin du noeud 9 = (1,5,8,9)
.....
Chemin du noeud 7 = (1,4,7)
Chemin du noeud 5 = (1,5)
Chemin du noeud 1 = (1)
Remarquons que la hauteur h d'un noeud X est gale au nombre de noeuds dans le chemin :
h( X ) = NbrNoeud( Chemin( X ) ).
Le vocabulaire de lien entre noeuds de niveau diffrents et relis entres eux est emprunt la
gnalogie :
9 est l'enfant de 8 10 est l'enfant de 8
8 est le parent de 9 10 est le parent de 8
9 et 10 sont des frres
5 est le parent de 8 et l'anctre de 9 et 10.
On parle aussi d'ascendant, de descendant ou de fils pour voquer des relations entres les
noeuds d'un mme arbre relis entre eux.
Parents, enfants
Noeuds frres,
anctres
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
386
Nous pouvons dfinir rcursivement la hauteur h d'un noeud X partir de celle de son parent :
h (racine) = 1;
h ( X ) = 1+ h ( parent ( X ) )
Reprenons l'arbre prcdent en exemple :
Calculons rcursivement la hauteur du noeud 9, note h(9) :
h(9) = 1+h(8)
h(8) = 1+h(5)
h(5) = 1+h(1)
h(1) = 1 = h(5)=2 = h(8)=3 = h(9)=4
Par dfinition le degr d'un noeud est gal au nombre de
ses descendants (enfants).
Soient les deux exemples ci-dessous extraits de l'arbre prcdent :
Le noeud 1 est de degr 4, car il a 4 enfants
Le noeud 5 n'ayant qu'un enfant son degr est 1.
Le noeud 8 est de degr 2 car il a 2 enfants.
Remarquons
que lorsqu'un arbre a tous ses noeuds de degr 1, on le nomme arbre dgnr et que c'est
en fait une liste.
Par dfinition c'est le nombre de noeuds du chemin
le plus long dans l'arbre.; on dit aussi profondeur de
l'arbre.
Degr d'un noeud
Hauteur d'un
noeud (rcursif)
Hauteur d'un arbre
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
387
La hauteur h d'un arbre correspond donc au nombre maximum de niveaux :
h (Arbre) = max { h ( X ) / X, X noeud de Arbre }
si Arbre = C alors h( Arbre ) = 0
La hauteur de l'arbre ci-dessous :
Le degr d'un arbre est gal au plus grand des degrs
de ses nuds :
d(Arbre) = max { d( X ) / X, X noeud de Arbre }
Soit rpertorier dans l'arbre ci-dessous le degr de chacun des noeuds :
d(1) = 4 d(2) = 0
d(3) = 0 d(4) = 2
d(5) = 1 d(6) = 0
d(7) = 0 d(8) = 2
d(9) = 0 d(10) = 0
La valeur maximale est 4 , donc cet arbre est de degr 4.
L'arbre ci-contre a pour taille 10
(car il a 10 noeuds)
On appelle taille d'un arbre le nombre total de noeuds
de cet arbre :
taille( < r , fg , fd > ) = 1 + taille( fg ) + taille( fd )
Degr d'un arbre
Hauteur d'un arbre
Taille d'un arbre
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
388
1.2 Exemples et implmentation d'arbre
Les structures de donnes arborescentes permettent de reprsenter de nombreux problmes,
nous proposons ci-aprs quelques exemples d'utilisations d'arbres dans des contextes
diffrents.
Exemple - 1
arbre d'analyse
Soit la grammaire G
2
: VN = {S}
V
T
= {( , )}
Axiome : S
Rgles
1 : S (SS)S
2 : S c
Le langage L(G
2
) se dnomme langage des parenthses bien formes.
Soit le mot (( )) de G
2
, voici un arbre de drivation de (( )) dans G
2
:
Exemple - 2
arbre abstrait
Soit la grammaire Gexp :
G
exp
= (V
N
,V
T
,Axiome,Rgles)
V
T
= { 0, ..., 9, +,-, /, *, ), (}
V
N
= { ( Expr ), ( Nbr ), ( Cte ), ( Oper )}
Axiome : ( Expr )
Rgles :
1 :( Expr ) ( Nbr ) | (( Expr ) )| ( Expr ) ( Oper ) ( Expr )
2 :( Nbr ) ( Cte ) | ( Cte ) ( Nbr )
3 :( Cte ) 0 | 1 |...| 9
4 :( Oper ) + | - | * | /
soit : 327 - 8 un mot de L(G
exp
)
Soit son arbre de drivation dans G
exp
:
Arbre de drivation d'un mot dans
une grammaire
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
389
Larbre obtenu ci-dessous en gris partir de larbre de drivation sappelle larbre abstrait du
mot " 327-8 " :
On note ainsi cet arbre abstrait :
Voici d'autres abres abstraits d'expressions arithmtiques :
expr = 2 + 5*4
expr = a*b + c-(d+e)
Rangement de mots par ordre lexical (alphabtique)
Soient les mots BON, BONJOUR, BORD, BOND, BOREALE, BIEN, il est possible de les
ranger ainsi dans une structure d'arbre :
Arbre abstrait
Arbres abstraits
Arbre lexicographique
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
390
Voici titre d'exemple que nous tudierons plus loin en dtail, un arbre dont les noeuds sont
de degr 2 au plus et qui est tel que pour chaque noeud la valeur de son enfant de gauche lui
est infrieure ou gale, la valeur de son enfant de droite lui est strictement suprieure.
Ci-aprs un tel arbre ayant comme racine 30 et stockant des entiers selon cette rpartition :
Arbre
lexicographique
Arbre d'hritage en Delphi
Arbre de recherche
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
391
2 Les arbres binaires
Un arbre binaire est un arbre de degr 2 (dont les noeuds sont de degr 2 au plus).
L'arbre abstrait de l'expression a*b + c-(d+e) est un arbre binaire :
Vocabulaire :
Les descendants (enfants) d'un noeud sont lus de gauche droite et sont appels
respectivement fils gauche (descendant gauche) et fils droit (descendant droit) de ce noeud.
Les arbres binaires sont utiliss dans de trs nombreuses activits informatiques et comme
nous l'avons dj signal il est toujours possible de reprrsenter un arbre gnral (de degr 2 )
par un arbre binaire en oprant une "binarisation".
Nous allons donc tudier dans la suite, le comportement de cette structure de donne
rcursive.
2.1 TAD d'arbre binaire
Afin d'assurer une cohrence avec les autres structures de donnes dj vues (liste, pile, file)
nous proposons de dcrire une abstraction d'un arbre binaire avec un TAD. Soit la signature
du TAD d'arbre binaire :
Arbre de recherche
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
392
TAD ArbreBin
utilise : T
0
, Noeud, Booleens
oprations :
C : ArbreBin
Racine : ArbreBin Noeud
filsG : ArbreBin ArbreBin
filsD : ArbreBin ArbreBin
Constr : Noeud x ArbreBin x ArbreBin ArbreBin
Est_Vide : ArbreBin Booleens
Info : Noeud T
0
prconditions :
Racine(Arb) def_ssi Arb = C
filsG(Arb) def_ssi Arb = C
filsD(Arb) def_ssi Arb = C
axiomes :
rac e Noeud , fg e ArbreBin , fd e ArbreBin
Racine(Constr(rac,fg,fd)) = rac
filsG(Constr(rac,fg,fd)) = fg
filsD(Constr(rac,fg,fd)) = fd
Info(rac) eT
0
FinTAD-PILIFO
T
0
est le type des donnes ranges dans l'arbre.
L'oprateur filsG( ) renvoie le sous-arbre gauche de l'arbre binaire, l'oprateur filsD( )
renvoie le sous-arbre droit de l'arbre binaire, l'oprateur Info( ) permet de stocker des
informations de type T
0
dans chaque noeud de l'arbre binaire.
Nous noterons < rac, fg , fd > avec conventions implicites un arbre binaire dessin ci-
dessous :
Exemple, soit l'arbre binaire A : Les sous-arbres gauche et droit de l'arbre A :
A =
filsG( A ) = < * , a , b >
filsD( A ) = < - , c , < + , d , e > >
< rac, fg , fd >
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
393
2.2 Exemples et implmentation d'arbre binaire tiquet
Nous proposons de reprsenter un arbre binaire tiquet selon deux spcifications
diffrentes classiques :
1) Une implantation fonde sur une structure de tableau en allocation de mmoire statique,
ncessitant de connatre au pralable le nombre maximal de noeuds de l'arbre (ou encore sa
taille).
2) Une implantation fonde sur une structure d'allocation de mmoire dynamique
implmente soit par des pointeurs (variables dynamiques) soit par des rfrences (objets) .
Spcification concrte
Un noeud est une structure statique contenant 3 lments :
- l'information du noeud
- le fils gauche
- le fils droit
Pour un arbre binaire de taille = n, chaque noeud de l'arbre binaire est stock dans une
cellule d'un tableau de dimension 1 n cellules. Donc chaque noeud est repr dans le
tableau par un indice (celui de la cellule le contenant).
Le champ fils gauche du noeud sera l'indice de la cellule contenant le descendant gauche, et le
champ fils droit vaudra l'indice de la cellule contenant le descendant droit.
Exemple
Soit l'arbre binaire ci-contre :
Selon l'implantation choisie, par hypothse de dpart, la racine <a, vers b, vers c >est
contenue dans la cellule d'indice 2 du tableau, les autres noeuds sont supposs tre rangs
dans les cellules 1, 3,4,5 :
Nous avons :
racine = table[2]
table[1] = < d , 0 , 0 >
table[2] = < a , 4 , 5 >
table[3] = < e , 0 , 0 >
table[4] = < b , 0 , 0 >
table[5] = < c , 1 , 3 >
Implantation dans un tableau statique
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
394
Explications :
table[2] = < a , 4 , 5 >signifie que le fils gauche de ce noeud est dans table[4] et son fils droit dans table[5]
table[5] = < c , 1 , 3 >signifie que le fils gauche de ce noeud est dans table[1] et son fils droit dans table[3]
table[1] = < d , 0 , 0 > signifie que ce noeud est une feuille
...etc
Spcification d'implantation en
Nous proposons d'utiliser les dclarations suivantes :
const
taille = n;
type
Noeud = record
info : T0;
filsG , filsD : 0..taille ;
end;
Tableau = Array[1..taille] of Noeud ;
ArbrBin = record
ptrRac : 0..taille;
table : Tableau ;
end;
Var
Tree : ArbrBin ;
Explications :
Lorsque Tree.ptrRac = 0 on dit que l'arbre est vide.
L'accs la racine de l'arbre s'effectue ainsi : Tree.table[ptrRac]
L'accs l'info de la racine de l'arbre s'effectue ainsi :
Tree.table[ptrRac].info
L'accs au fils gauche de la racine de l'arbre s'effectue ainsi :
var ptr:0..taille ;
ptr := Tree.table[ptrRac].filsG;
Tree.table[ptr] ....
L'insertion ou la suppression d'un noeud dans l'arbre ainsi reprsent s'effectue directement
dans une cellule du tableau. Il faudra donc possder une structure (de liste, de pile ou de file
par exemple) permettant de connatre les cellules libres ou de ranger une cellule nouvellement
libre. Une telle structure se dnomme "espace libre".
L'insertion se fera dans la premire cellule libre, l'espace libre diminuant d'une unit.
La suppression rajoutera une nouvelle cellule dans l'espace libre qui augmentera d'une unit.
Spcification concrte
Le noeud reste une structure statique contenant 3 lments dont 2 sont dynamiques :
- l'information du noeud
- une rfrence vers le fils gauche
- une rfrence vers le fils droit
Exemple
Soit l'arbre binaire ci-contre :
Selon l'implantation choisie, par hypothse de dpart, la rfrence vers la racine pointe vers
la structure statique (le noeud) < a, ref vers b, ref vers c >
Implantation avec des variables dynamiques
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
395
Nous avons :
ref racine < a, ref vers b, ref vers c >
ref vers b < b, null, null >
ref vers c < a, ref vers d, ref vers e >
ref vers d < d, null, null >
ref vers e < e, null, null >
Spcification d'implantation en
Nous proposons d'utiliser les dclarations de variables dynamiques suivantes :
type
ArbrBin = ^Noeud ;
Noeud = record
info : T0;
filsG , filsD : ArbrBin ;
end;
Var
Tree : ArbrBin ;
Explications :
Lorsque Tree = nil on dit que l'arbre est vide.
L'accs la racine de l'arbre s'effectue ainsi : Tree
L'accs l'info de la racine de l'arbre s'effectue ainsi :
Tree^.info
L'accs au fils gauche de la racine de l'arbre s'effectue ainsi :
Tree^.filsG
L'accs au fils gauche de la racine de l'arbre s'effectue ainsi :
Tree^.filsD
Nous noterons une simplification notable des critures dans cette implantation par rapport
l'implantation dans un tableau statique. Ceci provient du fait que la structure d'arbre est
dfinie rcursivement et que la notion de variable dynamique permet une dfinition
rcursive donc plus proche de la structure.
Nous livrons ci-dessous une criture de la signature et l'implmentation minimale d'une classe
d'arbre binaire nomme TreeBin en Delphi (l'implmentation complte est construire lors des
exercices sur les classes) :
TreeBin = class
public
Info : string;
filsG , filsD : TreeBin;
constructor CreerTreeBin(s:string);overload;
constructor CreerTreeBin(s:string; fg , fd : TreeBin);overload;
destructor Liberer;
end;
Implantation avec une classe
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
396
2.3 Arbres binaires de recherche
- Nous avons tudi prddement des algorithmes de recherche en table, en particulier
la recherche dichotomique dans une table trie dont la recherche s'effectue en
O(log(n)) comparaisons.
- Toutefois lorsque le nombre des lments varie (ajout ou suppression) ces ajouts ou
suppressions peuvent ncessiter des temps en O(n).
- En utilisant une liste chane qui approche bien la structure dynamique (plus
gourmande en mmoire qu'un tableau) on aura en moyenne des temps de suppression
ou de recherche au pire de l'ordre de O(n). L'ajout en fin de liste ou en dbut de liste
demandant un temps constant not O(1).
Les arbres binaires de recherche sont un bon compromis pour un temps quilibr entre ajout,
suppression et recherche.
Un arbre binaire de recherche satisfait aux critres suivants :
- L'ensemble des tiquettes est totalement ordonn.
- Une tiquette est dnomme clef.
- Les clefs de tous les noeuds du sous-arbre gauche d'un noeud X,
sont infrieures ou gales la clef de X.
- Les clefs de tous les noeuds du sous-arbre droit d'un noeud X, sont
suprieures la clef de X.
Nous avons dj vu plus haut un arbre binaire de recherche :
Prenons par exemple le noeud (25) son sous-arbre droit est bien compos de noeuds dont les
clefs sont suprieures 25 : (29,26,28). Le sous-arbre gauche du noeud (25) est bien compos
de noeuds dont les clefs sont infrieures 25 : (18,9).
On appelle arbre binaire dgnr un arbre binaire dont le degr = 1, ci-dessous 2 arbres
binaires de recherche dgnrs :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
397
Nous remarquons dans les deux cas que nous avons affaire une liste chane donc le nombre
d'opration pour la suppression ou la recherche est au pire de l'ordre de O(n).
Il faudra donc utiliser une catgorie spciale d'arbres binaires qui restent quilibrs (leurs
feuilles sont sur 2 niveaux au plus) pour assurer une recherche au pire en O(log(n)).
2.4 Arbres binaires partiellement ordonns (tas)
Nous avons dj voqu la notion d'arbre parfait lors de l'tude du tri par tas, nous
rcapitulons ici les lments essentiels le lecteur
c'est un arbre binaire dont tous les noeuds de chaque
niveau sont prsents sauf ventuellement au dernier
niveau o il peut manquer des noeuds (noeuds terminaux
= feuilles), dans ce cas l'arbre parfait est un arbre binaire
incomplet et les feuilles du dernier niveau doivent tre
regroupes partir de la gauche de l'arbre.
parfait complet : le dernier niveau est complet car il contient tous les enfants
un abre parfait peut tre incomplet lorsque le dernier niveau de l'arbre est incomplet (dans
le cas o manquent des feuilles la droite du dernier niveau, les feuilles sont regroupes
gauche)
Arbres binaires
dgnrs
Arbre parfait
Arbre parfait
complet
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
398
parfait icomplet: le dernier niveau est incomplet car il manque 3 enfants la droite
Exemple d'arbre non parfait :
(non parfait : les feuilles ne sont pas regroupes gauche)
Autre exemple d'arbre non parfait :
(non parfait : les feuilles sont bien regroupes gauche, mais il manque 1 enfant l'avant dernier niveau )
Un arbre binaire parfait se reprsente classiquement dans un tableau :
Les noeuds de l'arbre sont dans les cellules du tableau, il n'y a pas d'autre information dans
une cellule du tableau, l'accs la topologie arborescente est simule travers un calcul
d'indice permettant de parcourir les cellules du tableau selon un certain 'ordre' de
numrotation correspondant en fait un parcours hirarchique de l'arbre. En effet ce sont
les numros de ce parcours qui servent d'indice aux cellules du tableau nomm t ci-dessous :
Arbre parfait
incomplet
Arbre binaire parfait
complet dans un
tableau
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
399
Si t est ce tableau, nous avons les rgles suivantes :
t[i div 2] est le pre de t[i] pour i > 1 t[2 * i] et t[2 * i + 1] sont les deux fils, s'ils existent, de t[i]
si p est le nombre de noeuds de l'arbre et si 2 * i = p, t[i] n'a qu'un fils, t[p].
si i est suprieur p div 2, t[i] est une feuille.
Exemple de rangement d'un tel arbre dans un tableau
(on a figur l'indice de numrotation hirarchique de chaque noeud dans le rectangle associ au noeud)
Cet arbre sera stock dans un tableau en disposant squentiellement et de faon contige les
noeuds selon la numrotation hirarchique (l'index de la cellule = le numro hirarchique du
noeud).
Dans cette disposition le passage d'un noeud de numro k (indice dans le tableau) vers son
fils gauche s'effectue par calcul d'indice, le fils gauche se trouvera dans la cellule d'index 2*k
du tableau, son fils droit se trouvant dans la cellule d'index 2*k + 1 du tableau. Ci-dessous
l'arbre prcdent est stock dans un tableau : le noeud d'indice hirarchique 1 (la racine) dans
la cellule d'index 1, le noeud d'indice hirarchique 2 dans la cellule d'index 2, etc...
t[1] est la racine
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
400
Le nombre qui figure dans la cellule (nombre qui vaut l'index de la cellule = le numro
hirarchique du noeud) n'est mis l qu' titre pdagogique afin de bien comprendre le
mcanisme.
On voit par exemple, que par calcul on a bien le fils gauche du noeud d'indice 2 est dans la
cellule d'index 2*2 = 4 et son fils droit se trouve dans la cellule d'index 2*2+1 = 5 ...
Exemple d'un arbre parfait tiquet avec des caractres :
arbre parfait
parcours hirarchique
numrotation hirarchique
rangement de l'arbre
dans un tableau
Soit le noeud 'b' de numro hirarchique 2
(donc rang dans la cellule de rang 2 du
tableau), son fils gauche est 'd', son fils droit
est 'e'.
C'est un arbre tiquet dont les valeurs des noeuds
appartiennent un ensemble muni d'une relation
d'ordre total (les nombres entiers, rels etc... en sont des
exemples) tel que pour un noeud donn tous ses fils ont
une valeur suprieure ou gale celle de leur pre.
Arbre partiellement
ordonn
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
401
Exemple de deuxarbres partiellement ordonns
sur l'ensemble {20,27,29,30,32,38,45,45,50,51,67,85} d'entiers naturels :
Nous remarquons que la racine d'un tel arbre est toujours l'lment de l'ensemble
possdant la valeur minimum(le plus petit lment de l'ensemble), car la valeur de ce noeud
par construction est infrieure celle de ses fils et par transitivit de la relation d'ordre celles
de ses descendants c'est le minimum. Si donc nous arrivons ranger une liste d'lments dans
un tel arbre le minimum de cette liste est atteignable immdiatement comme racine de l'arbre.
En reprenant l'exemple prcdent sur 3 niveaux : (entre parenthses le numro hirarchique du noeud)
Voici rellement ce qui est stock dans le tableau : (entre parenthses l'index de la cellule contenant le
noeud)
Arbre partiellement
ordonn n1
Arbre partiellement
ordonn n2
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
402
On appelle tas un tableau reprsentant un arbre parfait partiellement ordonn.
L'intrt d'utiliser un arbre parfait complet ou incomplet rside dans le fait que le tableau
est toujours compact, les cellules vides s'il y en a se situent la fin du tableau.
Le fait d'tre partiellement ordonn sur les valeurs permet d'avoir immdiatement un
extremum la racine.
2.5 Parcours d'un arbre binaire
Objectif : les arbres sont des structures de donnes. Les informations sont contenues dans les
noeuds de l'arbre, afin de construire des algorithmes effectuant des oprations sur ces
informations (ajout, suppression, modification,...) il nous faut pouvoir examiner tous les
noeuds d'un arbre. Examinons les diffrents moyens de parcourir ou de traverser chaque
noeud de l'arbre et d'appliquer un traitement la donne rattache chaque noeud.
L'opration qui consiste retrouver systmatiquement tous les noeuds d'un
arbre et d'y appliquer un mme traitement se dnomme parcours de l'arbre.
Un algorithme classique consiste explorer chaque noeud d'un niveau donn de
gauche droite, puis de passer au niveau suivant. On dnomme cette stratgie
le parcours en largeur de l'arbre.
La stratgie consiste descendre le plus profondment soit jusqu'aux feuilles
d'un noeud de l'arbre, puis lorsque toutes les feuilles du noeud ont t visites,
l'algorithme "remonte" au noeud plus haut dont les feuilles n'ont pas encore t
visites.
Notons que ce parcours peut s'effectuer systmatiquement en commenant par le
fils gauche, puis en examinant le fils droit ou bien l'inverse.
Le tas
Parcours d'un arbre
Parcours en largeur ou hirarchique
Parcours en profondeur
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
403
Traditionnellement c'est l'exploration fils gauche, puis ensuite fils droit qui est
retenue on dit alors que l'on traverse l'arbre en "profondeur par la gauche".
Schmas montrant le principe du parcours exhaustif en "profondeur par la gauche" :
Soit l'arbre binaire suivant: Appliquons la mthode de parcours propose :
Chaque noeud a bien t examin selon les principes du parcours en profondeur :
En fait pour ne pas surcharger les schmas arborescents, nous omettons de dessiner la fin de
chaque noeud de type feuille les deux noeuds enfants vides qui permettent de reconnatre que
le parent est une feuille :
Lorsque la comprhension ncessitera leur dessin nous conseillons au lecteur de faire figurer
explicitement dans son schma arborescent les noeuds vides au bout de chaque feuille.
Nous proposons maintenant, de donner une description en langage algorithmique LDFA
du parcours en profondeur d'un arbre binaire sous forme rcursive.
Parcours en profondeur par la gauche
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
404
parcourir ( Arbre )
si Arbre = C alors
Traiter-1 (info(Arbre.Racine)) ;
parcourir ( Arbre.filsG ) ;
Traiter-2 (info(Arbre.Racine)) ;
parcourir ( Arbre.filsD ) ;
Traiter-3 (info(Arbre.Racine)) ;
Fsi
Les diffrents traitements Traiter-1 ,Traiter-2 et Traiter-3 consistent traiter l'information
situe dans le noeud actuellement travers soit lorsque l'on descend vers le fils gauche (
Traiter-1 ), soit en allant examiner le fils droit ( Traiter-2 ), soit lors de la remont aprs
examen des 2 fils ( Traiter-3 ).
En fait on n'utilise en pratique que trois variantes de cet algorithme, celles qui constituent des
parcours ordonns de l'arbre en fonction de l'application du traitement de l'information situe
aux noeuds. Chacun de ces 3 parcours dfinissent un ordre implicite (prfix, infix, postfix)
sur l'affichage et le traitement des donnes contenues dans l'arbre.
Algorithme de parcours en pr-ordre :
parcourir ( Arbre )
si Arbre = C alors
Traiter-1 (info(Arbre.Racine)) ;
parcourir ( Arbre.filsG ) ;
parcourir ( Arbre.filsD ) ;
Fsi
Algorithme de parcours en post-ordre :
parcourir ( Arbre )
si Arbre = C alors
parcourir ( Arbre.filsG ) ;
parcourir ( Arbre.filsD ) ;
Traiter-3 (info(Arbre.Racine)) ;
Fsi
Algorithme de parcours en ordre symtrique :
parcourir ( Arbre )
si Arbre = C alors
parcourir ( Arbre.filsG) ;
Traiter-2 (info(Arbre.Racine)) ;
parcourir ( Arbre.filsD ) ;
Fsi
Algorithme gnral rcursif de parcours
en profondeur par la gauche
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
405
Illustration prtaique d'un parcours gnral en profondeur
Le lecteur trouvera plus loin des exemples de parcours selon l'un des 3 ordres infix, prfix,
postfix, nous proposons ici un exemple didactique de parcours gnral avec les 3 traitements.
Nous allons voir comment utiliser une telle structure arborescente afin de restituer du texte
algorithmique linaire en effectuant un parcours en profondeur.
Voici ce que nous donne une analyse descendante du problme de rsolution de l'quation du
second degr (nous avons fait figurer uniquement la branche gauche de l'arbre de
programmation) :
Ci-dessous une reprsentation schmatique de la branche gauche de l'arbre de programmation prcdent :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
406
Nous avons tabli un modle d'arbre (binaire ici) o les informations au noeud sont au
nombre de 3 (nous les nommerons attribut n1, attribut n2 et attribut n3). Chaque attribut est
une chane de caractres, vide s'il y a lieu.
Nous noterons ainsi un attribut contenant une chane vide : C
Traitement des attributs pour produire le texte
Traiter-1 (Arbre.Racine.Attribut n1) consiste crire le
contenu de l'Attribut n1 :
si Attribut n1 non vide alors
ecrire( Attribut n1 )
Fsi
Traiter-2 (Arbre.Racine.Attribut n2) consiste crire le
contenu de l'Attribut n2 :
si Attribut n2 non vide alors
ecrire( Attribut n2 )
Fsi
Traiter-3 (Arbre.Racine.Attribut n3) consiste crire le
contenu de l'Attribut n3 :
si Attribut n3 non vide alors
ecrire( Attribut n3 )
Fsi
Parcours en profondeur de l'arbre de programmation de l'quation du second degr :
parcourir ( Arbre )
si Arbre = C alors
Traiter-1 (Attribut n1) ;
parcourir ( Arbre.filsG ) ;
Traiter-2 (Attribut n2) ;
parcourir ( Arbre.filsD ) ;
Traiter-3 (Attribut n3) ;
Fsi
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
407
si Arbre = C alors
Traiter-1 (Attribut n1) ;
parcourir ( Arbre.filsG ) ;
Traiter-2 (Attribut n2) ;
parcourir ( Arbre.filsD ) ;
Traiter-3 (Attribut n3) ;
Fsi
C
si A=0 alors
si B=0 alors
si C=0 alors
ecrire(R est sol)
sinon
C
C
ecrire(pas de sol)
Fsi
sinon
C
C
X1=-C/B;
ecrire(X1);
Fsi
sinon
C
C
Equation2
Fsi
C
Rappelons que le symbole C reprsente la chane vide il est uniquement mis dans le texe dans
le but de permettre le suivi du parcours de l'arbre.
Pour bien comprendre le parcours aux feuilles de l'arbre prcdent, nous avons fait figurer ci-
dessous sur un exemple, les noeuds vides de chaque feuille et le parcours complet associ :
Le parcours partiel ci-haut produit le texte algorithmique suivant (le symbole C est encore
crit pour la comprhension de la traverse) :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
408
si B=0 alors
si C=0 alors
ecrire(R est sol)
sinon
C
C
ecrire(pas de sol)
Fsi
sinon
Exercice
Soit l'arbre ci-contre possdant 2 attributs par
noeuds (un symbole de type caractre)
On propose le traitement en profondeur de l'arbre comme suit :
L'attribut de gauche est crit en descendant, l'attribut de droite est
crit en remontant, il n'y a pas d'attribut ni de traitement lors de
l'examen du fils droit en venant du fils gauche.
crire la chane de caractre obtenue par le parcours ainsi dfini.
Rponse :
abcdfghjkiemnoqrsuvtpl
Terminons cette revue des descriptions algorithmiques des diffrents parcours
classiques d'arbre binaire avec le parcours en largeur (Cet algorithme ncessite l'utilisation d'une
file du type Fifo dans laquelle l'on stocke les nuds).
Largeur ( Arbre )
si Arbre = C alors
ajouter racine de l'Arbre dans Fifo;
tantque Fifo = C faire
prendre premier de Fifo;
traiter premier de Fifo;
ajouter filsG de premier de Fifo dans Fifo;
ajouter filsD de premier de Fifo dans Fifo;
ftant
Fsi
Algorithme de parcours en largeur
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
409
2.6 I nsertion, suppression, recherche dans un arbre binaire de recherche
placer l'lment Elt dans l'arbre Arbre par adjonctions successives aux feuilles
placer ( Arbre Elt )
si Arbre = C alors
creer un nouveau noeud contenant Elt ;
Arbre.Racine = ce nouveau noeud
sinon
{ - tous les lments "info" de tous les noeuds du sous-arbre de gauche
sont infrieurs ou gaux l'lment "info" du noeud en cours (arbre)
- tous les lments "info" de tous les noeuds du sous-arbre de droite
sont suprieurs l'lment "info" du noeud en cours (arbre)
}
si clef ( Elt ) s clef ( Arbre.Racine ) alors
placer ( Arbre.filsG Elt )
sinon
placer ( Arbre.filsD Elt )
Fsi
Soit par exemple la liste de caractres alphabtiques : e d f a c b u w , que nous rangeons
dans cet ordre d'entre dans un arbre binaire de recherche. Ci-dessous le suivi de
l'algorithme de placements successifs de chaque caractre de cette liste dans un arbre de
recherche:
Insertions successives des lments Arbre de recherche obtenu
placer ( racine , 'e' )
e est la racine de l'arbre.
e
placer ( racine , 'd' )
d < e donc fils gauche de e.
placer ( racine , 'f' )
f > e donc fils droit de e.
placer ( racine , 'a' )
a < e donc gauche, a < d donc fils gauche de d.
Algorithme dinsertion dans un arbre
binaire de recherche
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
410
placer ( racine , 'c' )
c < e donc gauche, c < d donc gauche, c > a donc fils droit
de a.
placer ( racine , 'b' )
b < e donc gauche, b < d donc gauche, b > a donc droite
de a, b < c donc fils gauche de c.
placer ( racine , 'u' )
u > e donc droite de e, u > f donc fils droit de f.
placer ( racine , 'w' )
w > e donc droite de e, w > f donc droite de f, w > u donc fils
droit de u.
chercher l'lment Elt dans l'arbre Arbre :
Chercher ( Arbre Elt ) : Arbre
si Arbre = C alors
Afficher Elt non trouv dans l'arbre;
sinon
si clef ( Elt ) < clef ( Arbre.Racine ) alors
Algorithme de recherche dans un arbre
binaire de recherche
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
411
Chercher ( Arbre.filsG Elt ) //on cherche gauche
sinon
si clef ( Elt ) > clef ( Arbre.Racine ) alors
Chercher ( Arbre.filsD Elt ) //on cherche droite
sinon retourner Arbre.Racine //l'lment est dans ce noeud
Fsi
Fsi
Fsi
Ci-dessous le suivi de l'algorithme de recherche du caractre b dans l'arbre prcdent :
Chercher ( Arbre , b )
Chercher ( Arbre.filsG , b )
Chercher ( Arbre.filsG , b ) Chercher ( Arbre.filsD , b )
Chercher ( Arbre.filsG , b )
retourner Arbre
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
412
Afin de pouvoir supprimer un lment dans un arbre binaire de recherche, il est ncessaire de
pouvoir d'abord le localiser, ensuite supprimer le noeud ainsi trouv et ventuellement
procder la rorganisation de l'arbre de recherche.
Nous supposons que notre arbre binaire de recherche ne possde que des lments tous
distincts (pas de redondance).
supprimer l'lment Elt dans l'arbre Arbre :
Supprimer ( Arbre Elt ) : Arbre
local Node : Noeud
si Arbre = C alors
Afficher Elt non trouv dans l'arbre;
sinon
si clef ( Elt ) < clef ( Arbre.Racine ) alors
Supprimer ( Arbre.filsG Elt ) //on cherche gauche
sinon
si clef ( Elt ) > clef ( Arbre.Racine ) alors
Supprimer ( Arbre.filsD Elt ) //on cherche droite
sinon //l'lment est dans ce noeud
si Arbre.filsG = C alors //sous-arbre gauche vide
Arbre Arbre.filsD //remplacer arbre par son sous-arbre droit
sinon
si Arbre.filsD = C alors //sous-arbre droit vide
Arbre Arbre.filsG //remplacer arbre par son sous-arbre gauche
sinon //le noeud a deux descendants
Node PlusGrand( Arbre.filsG ); //Node =le max du fils gauche
clef ( Arbre.Racine ) clef ( Node ); //remplacer etiquette
dtruire ( Node ) //on limine ce noeud
Fsi
Fsi
Fsi
Fsi
Fsi
Cet algorithme utilise lalgorithme rcursif PlusGrand de recherche du plus grand lment dans l'arbre
Arbre:
//par construction il suffit de descendre systmatiquement toujours le plus droite
PlusGrand ( Arbre ) : Arbre
si Arbre.filsD = C alors
retourner Arbre.Racine //c'est le plus grand lment
sinon
PlusGrand ( Arbre.filsD )
Fsi
Algorithme de suppression dans un arbre
binaire de recherche
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 413
Exercices chapitre 4
Ex-1 : On dfini un nombre rationnel (fraction) comme un couple de deux entiers : le numrateur et le
dnominateur. On donne ci-dessous un TAD minimal de rationnel et l'on demande de l'implanter en Unit Delphi.
TAD : rationnel
Utilise : Z //ensemble des entiers relatifs.
Champs : (Num , Denom ) e Z x Z
*
Oprations :
Num : > rationnel
Denom : > rationnel
Reduire : rationnel > rationnel
Addratio : rationnel x rationnel > rationnel
Divratio : rationnel x rationnel > rationnel
Mulratio : rationnel x rationnel > rationnel
AffectQ : rationnel > rationnel
OpposeQ : rationnel > rationnel
Prconditions :
Divratio (x,y) defssi y.Num = 0
Finrationnel
Ex-2 : On dfini un nombre complexe coefficient entiers relatifs comme un couple de deux entiers relatifs : la
partie relle et la partie imaginaire. On donne ci-dessous un TAD minimal de nombre et l'on demande de
l'implanter en Unit Delphi.
TAD complexe
Utilise : Z
Champs : (part_reel , part_imag ) e Z x Z
*
Oprations :
part_reel : > Z
part_imag : > Z
Charger : Z x Z > complexe
AffectC : complexe > complexe
plus : complexe x complexe > complexe
moins: complexe x complexe > complexe
mult : complexe x complexe > complexe
OpposeC : complexe > complexe
Prconditions :
aucune
Fincomplexe
Ex-3 : On dfini un nombre complexe coefficient rationnel comme un couple de deux rationnels : la partie
relle et la partie imaginaire. On demande de construire un TAD minimal de nombre complexe utilisant le TAD
rationnel et de l'implanter en Unit Delphi.
Ex-4 : En reprenant l'nonc de l'exercice Ex-1 TAD rationnel, on implante sous forme de classe Delphi ce TAD
et on compare son implantation en Unit.
Ex-5 : En reprenant l'nonc de l'exercice Ex-3 TAD de nombre complexe coefficients rationnels, on implante
sous forme de classe Delphi ce TAD et on compare son implantation en Unit.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 414
Ex-6 : Implantations des 4 algorithmes de parcours dun arbre binaire tudis dans le cours :
Il est demand dimplanter en Delphi chacun des trois parcours en profondeur par la gauche dfinissant un ordre
implicite (prfix, infix, postfix) sur l'affichage et le traitement des donnes de type string contenues dans un
arbre binaire, et le parcours en largeur avec une file Fifo.
Il est demand dcrire en Delphi console, limplantation de la structure darbre binaire et des algorithmes de
parcours avec des variables dynamiques de type parbre = ^arbre o arbre est un type record dfinir selon le
schma fournit par lexemple ci-dessous :
Larbre : Est implant par les pointeurs parbre suivants :
Le traitement au nud consistera afficher la donne de type string.
Puis uniquement lorsque vous aurez lu les chapitre sur les classes et la programmation objet, vous
reprendrez limplantation de la structure darbre binaire et des algorithmes de parcours avec une classe
TreeBin selon le modle ci-aprs :
TreeBin = class
private
FInfo : string ;
procedure FreeRecur( x :TreeBin ) ;
procedure PreOrdre ( x : TreeBin ; var res : string);
procedure PostOrdre ( x : TreeBin ; var res : string);
public
filsG , filsD : TreeBin ;
constructor Create(s:string; fg , fd : TreeBin);
destructor Liberer;
function Prefixe : string ;
function Postfixe : string ;
property Info:string read FInfo write FInfo;
end;
Ex-7 : Il est demand dimplanter en Delphi les 3 algorithmes dinsertion, de suppression et de recherche dans
un arbre binaire de recherche ; comme dans lexercice prcdent vous proposerez une version avec variables
dynamiques et une version avec une classe TreeBinRech hritant de la classe TreeBin dfinie lexercice
prcdent.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 415
Ex-1 TAD rationnel - solution en Unit Delphi
TAD : rationnel
Utilise : Z //ensemble des entiers relatifs.
Champs : (Num , Denom ) e Z x Z
*
Oprations :
Num : > rationnel
Denom : > rationnel
Reduire : rationnel > rationnel
Addratio : rationnel x rationnel > rationnel
Divratio : rationnel x rationnel > rationnel
Mulratio : rationnel x rationnel > rationnel
AffectQ : rationnel > rationnel
OpposeQ : rationnel > rationnel
Prconditions :
Divratio (x,y) defssi y.Num = 0
Finrationnel
Reduire: rendre le rationnel irrductible en calculant le pgcd du numrateur et du dnominateur, puis diviser les
deux termes par ce pgcd.
Addratio: addition de deux nombres rationnels par la recherche du plus petit commun multiple des deux
dnominateurs et mise de chacun des deux rationnels au mme dnominateur.
Mulratio: multiplication de deux nombres rationnels, par le produit des deux dnominateurs et le produit des
deux numrateurs.
Divratio: division de deux nombres rationnels, par le produit du premier par linverse du second.
AffectQ: affectation classique dun rationnel dans un autre rationnel.
OpposeQ: renvoie loppos dun rationnel dans un autre rationnel
La structure de donnes choisie est le type record permettant de stocker les champs numrateur et dnominateur
d'un nombre rationnel :
unit Uratio; {unit de rationnels spcification classique ZxZ/R }
interface
type rationnel = record
num: integer;
denom: integer
end;
procedure reduire (var r: rationnel);
procedure addratio (a, b: rationnel; var s: rationnel);
procedure divratio (a, b: rationnel; var s: rationnel);
procedure mulratio (a, b: rationnel; var s: rationnel);
procedure affectQ(var s: rationnel; b: rationnel);
procedure opposeQ(x:rationnel;var s:rationnel);
Spcifications oprationnelles
Spcifications d'implantation
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 416
unit Uratio; {unit de rationnels spcification classique ZxZ/R}
interface
type
rationnel =
record
num: integer;
denom: integer
end;
procedure reduire (var r: rationnel);
procedure addratio (a, b: rationnel; var s: rationnel);
procedure divratio (a, b: rationnel; var s: rationnel);
procedure mulratio (a, b: rationnel; var s: rationnel);
procedure affectQ(var s: rationnel; b: rationnel);
procedure opposeQ(x:rationnel;var s:rationnel);
implementation
procedure maxswap (var a: integer; var b: integer);
var
t: integer;
begin
if a < b then
begin
t := a;
a := b;
b := t
end;
end;
function pgcd (a, b: integer): integer;
var
r: integer;
begin
maxswap(a, b);
if a*b=0 then
pgcd:=1
else
begin
repeat
r := a mod b;
a := b;
b := r
until
r = 0;
pgcd := a
end
end;
Code de la Unit : Uratio
----------------- SPECIFICATIONS ---------------
maxswap : N x N ---> N x N
met le plus grand des deux entiers a et b dans a,
et le plus petit dans b.
local: t
paramtre-Entre: a, b
paramtre-Sortie: a, b
----------------- SPECIFICATIONS ---------------
pgcd : N x N ---> N
renvoie le pgcd de deux entiers non nuls
pgcd=1, si l'un des 2 au moins est nul.
local: r
paramtre-Entre: a, b
paramtre-Sortie: pgcd
utilise: maxswap
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 417
function ppcm (a, b: integer): integer;
var
k, p: integer;
begin
maxswap(a, b);
if a*b=0 then
ppcm:=0
else
begin
k := 1;
p := b;
while (k <= a) and (p mod a <> 0) do
begin
p := b * k;
k := k + 1
end;
ppcm := p
end
end;
procedure reduire (var r: rationnel);
var pg: integer;
begin
if r.denom=0 then
halt
else
begin
pg := pgcd(r.num, r.denom);
if pg <> 1 then
begin
r.num := r.num div pg;
r.denom := r.denom div pg
end;
if (r.num>0) and (r.denom>0)
or (r.num<0) and (r.denom<0) then
begin {positif}
r.num:=abs(r.num);
r.denom:=abs(r.denom);
end
else
begin{ngatif}
r.num:=-abs(r.num);
r.denom:=abs(r.denom);
end
end
end;
procedure affectQ( var s: rationnel; b: rationnel);
begin
s.num:=b.num;
s.denom:=b.denom
end;
----------------- SPECIFICATIONS ---------------
ppcm: N x N ---> N
renvoie le ppcm de deux entiers non nuls
renvoie 0, si l'un des 2 au moins est nul.
local: k, p
paramtre-Entre: a, b
paramtre-Sortie: ppcm
utilise: maxswap
----------------- SPECIFICATIONS ---------------
reduire : Q ---> Q
rend un rationnel non nul irrductible
arrte l'excution, si le dnominateur est nul.
Le signe est dtenu par le numrateur.
local: pg
paramtre-Entre: r
paramtre-Sortie: r
utilise: pgcd
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 418
procedure opposeQ(x:rationnel;var s:rationnel);
begin
s.num:=-x.num;
s.denom:=x.denom
end;
procedure addratio (a, b: rationnel; var s: rationnel);
var
divcom, coeff_a, coeff_b: integer;
begin
reduire(a);
reduire(b);
divcom := ppcm(a.denom, b.denom);
coeff_a := divcom div a.denom;
coeff_b := divcom div b.denom;
s.num := a.num * coeff_a + b.num * coeff_b;
s.denom := divcom;
reduire(s);
end;
procedure divratio (a, b: rationnel; var s: rationnel);
begin
reduire(a);
reduire(b);
if b.num=0 then
halt
else
begin
s.num := a.num * b.denom;
s.denom := a.denom * b.num;
reduire(s)
end
end;
procedure mulratio (a, b: rationnel; var s: rationnel);
begin
reduire(a);
reduire(b);
s.num := a.num * b.num;
s.denom := a.denom * b.denom;
reduire(s)
end;
end.
Utilisation de la unit
----------------- SPECIFICATIONS ---------------
addratio : Q x Q ---> Q
donne dans s la somme des deux rationnels non
nuls, s=a+b
a et b sont rendus irrductibles avant le calcul.
Le rsultat s est rendu irrductible aprs calcul.
local: divcom, coeff_a, coeff_b
paramtre-Entre: a, b
paramtre-Sortie: s
utilise: reduire,ppcm
----------------- SPECIFICATIONS ---------------
divratio : Q x Q ---> Q
donne dans s le rapport des deux rationnels non
nuls, s=a/b
a et b sont rendus irrductibles avant le calcul.
Le rsultat s est rendu irrductible aprs calcul.
paramtre-Entre: a, b
paramtre-Sortie: s
utilise: reduire
----------------- SPECIFICATIONS ---------------
multratio : Q x Q ---> Q
donne dans s le produit des deux rationnels non
nuls, s=a*b
a et b sont rendus irrductibles avant le calcul.
Le rsultat s est rendu irrductible aprs calcul.
paramtre-Entre: a, b
paramtre-Sortie: s
utilise: reduire
program essaiRatio; {dbut programme de test de la unit Uratio de nombres rationnels }
uses Uratio;
var r1, r2, r3, r4, r5 : rationnel;
begin { exemple de calcul sur les rationnels non nuls continuer}
r1.num :=18; r1.denom := 15; r2.num := 7; r2.denom := 12;
addratio(r1, r2, r3);
writeln('18/15 + 7/12 = ', r3.num, '/', r3.denom);
mulratio(r1, r2, r4);
writeln('18/15 * 7/12 = ', r4.num, '/', r4.denom); ..
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 419
Ex-2 TAD nombre complexe coeff entiers - solution en Unit Delphi
TAD complexe
Utilise : Z
Champs : (part_reel , part_imag ) e Z x Z
*
Oprations :
part_reel : > Z
part_imag : > Z
Charger : Z x Z > complexe
AffectC : complexe > complexe
plus : complexe x complexe > complexe
moins: complexe x complexe > complexe
mult : complexe x complexe > complexe
OpposeC : complexe > complexe
Prconditions :
aucune
Fincomplexe
Charger : remplit les deux champs part_reel et part_imag dun nombre complexe.
AffectC: affectation classique dun complexe dans un autre.
plus: addition de 2 nombres complexes spcif. mathmatique classique :
z
1
=x+iy et z
2
=x+iy =>z
1
+z
2
=(x+x)+(y+y)i.
moins: soustraction de 2 nombres complexes spcif. mathmatique classique :
z
1
=x+iy et z
2
=x+iy =>z
1
-z
2
=(x-x)+(y-y)i.
mult : multiplication de 2 nombres complexes spcif mathmatique classique :
z
1
=x+iy et z
2
=x+iy =>z
1
+z
2
=(x.x- y.y)+(x.y+x.y)i.
OpposeC : pour un nombre complexe x+iy cet oprateur renvoie x iy
La structure de donnes choisie est aussi ici le type record permettant de stocker les champs partie relle et
partie imaginaire d'un nombre complexe :
unit UComplx1; {unit de calcul sur les nombres complexes coefficients entiers}
interface
type complex = record
part_reel: integer;
part_imag: integer
end;
procedure Charger (x, y: integer; var z: complex);
procedure affectC (var z: complex;y: complex );
procedure plus (x, y: complex; var z: complex);
procedure moins (x, y: complex; var z: complex);
procedure mult (x, y: complex; var z: complex);
procedure OpposeC (x:complex; var z:complex);
Spcifications oprationnelles
Spcifications d'implantation
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 420
unit UComplx1;{unit de calcul sur les nombres complexes coefficients entiers }
interface
type
complex = record
part_reel: integer;
part_imag: integer
end;
procedure Charger (x, y: integer; var z: complex);
procedure affectC (var z: complex;y: complex );
procedure plus (x, y: complex; var z: complex);
procedure moins (x, y: complex; var z: complex);
procedure mult (x, y: complex; var z: complex);
procedure OpposeC(x:complex;var z:complex);
implementation
procedure Charger (x, y: integer; var z: complex);
begin
z.part_reel := x;
z.part_imag := y
end;
procedure affectC (var z: complex;y: complex );
begin
z.part_reel := y.part_reel;
z.part_imag := y.part_imag
end;
procedure plus (x, y: complex; var z: complex);
begin
z.part_reel := x.part_reel + y.part_reel;
z.part_imag := x.part_imag + y.part_imag
end;
procedure moins (x, y: complex; var z: complex);
begin
z.part_reel := x.part_reel - y.part_reel;
z.part_imag := x.part_imag - y.part_imag
end;
procedure mult (x, y: complex; var z: complex);
begin
z.part_reel := x.part_reel * y.part_reel
- x.part_imag * y.part_imag;
z.part_imag := x.part_reel * y.part_imag
+ y.part_reel * x.part_imag
end;
procedure OpposeC(x:complex;var z:complex);
begin
z.part_reel := -x.part_reel;
z.part_imag := x.part_imag
end;
end.
Utilisation de la unit
program essai_complexe1;
{test de l'utilisation de la unit Ucomplx1
de nombres complexes coeff. Entiers }
uses
Ucomplx1;
var
u, z, z1, z2: complex;
procedure ecrit (v: string; z: complex);
begin
writeln(v, ': ', z.part_reel : 3,
'+ ', z.part_imag : 3, '.i')
end;
begin
writeln('_________');
Charger(2, -3, z1);
ecrit('z1', z1);
Charger(8, 113, z2);
ecrit('z2', z2);
affectC(z, z1);
ecrit('z', z);
plus(z1, z2, u);
ecrit('u=z1+z2', u);
moins(z1, z2, u);
ecrit('u=z1-z2', u);
Charger(1, 0, z);
mult(z1, z2, u);
ecrit('u=z1*z2', u);
mult(z, z2, u);
ecrit('u=1*z2', u);
end.
Code de la Unit : UComplx1
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 421
Ex-3 TAD nombre complexe coeff rationnels - solution en Unit Delphi
TAD complexe
Utilise : rationnel
Champs : (part_reel , part_imag ) e rationnel x rationnel
Oprations :
part_reel : > rationnel
part_imag : > rationnel
Charger : rationnel x rationnel > complexe
AffectC : complexe > complexe
plus : complexe x complexe > complexe
moins: complexe x complexe > complexe
mult : complexe x complexe > complexe
OpposeC : complexe > complexe
Prconditions :
aucune
Fincomplexe
Charger : remplit les deux champs part_reel et part_imag dun nombre complexe.
AffectC: affectation classique dun complexe dans un autre.
plus: addition de 2 nombres complexes spcif. mathmatique classique :
z
1
=x+iy et z
2
=x+iy =>z
1
+z
2
=(x+x)+(y+y)i.
moins: soustraction de 2 nombres complexes spcif. mathmatique classique :
z
1
=x+iy et z
2
=x+iy =>z
1
-z
2
=(x-x)+(y-y)i.
mult : multiplication de 2 nombres complexes spcif mathmatique classique :
z
1
=x+iy et z
2
=x+iy =>z
1
+z
2
=(x.x- y.y)+(x.y+x.y)i.
OpposeC : pour un nombre complexe x+iy cet oprateur renvoie x iy
unit UComplx2; {unit de nombres complexes
coefficients rationnels utilisant
la unit de rationnels dj construite Uratio}
interface
uses Uratio;
type
complex = record
part_reel: rationnel;
part_imag: rationnel
end;
procedure Charger (x, y: integer; var z: complex);
procedure affectC (var z: complex;y: complex );
procedure plus (x, y: complex; var z: complex);
procedure moins (x, y: complex; var z: complex);
procedure mult (x, y: complex; var z: complex);
procedure OpposeC(x:complex; var z:complex);
Le TAD complexe utilisant
Le TAD rationnel
Spcifications oprationnelles
(identiques l'exercice prcdent)
Spcifications d'implantation
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 422
unit UComplx2;
{unit de nombres complexes coefficients rationnels utilisant la unit de rationnels dj construite Uratio }
interface
uses Uratio;
type
complex = record
part_reel: rationnel;
part_imag: rationnel
end;
procedure Charger (x, y: rationnel; var z: complex);
procedure affectC (var z: complex;y: complex );
procedure plus (x, y: complex; var z: complex);
procedure moins (x, y: complex; var z: complex);
procedure mult (x, y: complex; var z: complex);
procedure OpposeC(x:complex;var z:complex);
implementation
procedure OpposeC ( x:complex; var z:complex); (* fournit l'oppos de x dans z *)
begin
OpposeQ(x.part_reel,z.part_reel);
OpposeQ(x.part_imag,z.part_imag);
end;
procedure Charger (x, y : rationnel; var z : complex);
begin
reduire(x);
reduire(y);
affectQ(z.part_reel,x);
affectQ(z.part_imag,y);
end;
procedure affectC (var z: complex;y: complex );
begin
Charger(y.part_reel,y.part_imag,z)
end;
procedure plus (x, y: complex; var z: complex);
var r1,r2:rationnel;
begin
addratio(x.part_reel,y.part_reel,r1);
addratio(x.part_imag, y.part_imag,r2);
Charger (r1,r2,z)
end;
procedure moins (x, y: complex; var z: complex);
var z1:complex;
begin
OpposeC(y,z1);
plus(x,z1,z)
end;
procedure mult (x, y: complex; var z: complex);
var r1,r2,r3,r4:rationnel;
begin
{z.part_reel := x.part_reel * y.part_reel - x.part_imag * y.part_imag;}
Code de la Unit : Ucomplx2
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 423
mulratio(x.part_reel,y.part_reel,r1);
mulratio(x.part_imag, y.part_imag,r2);
OpposeQ(r2,r3);
addratio(r1,r3,r4);
{z.part_imag := x.part_reel * y.part_imag + y.part_reel * x.part_imag}
mulratio(x.part_reel,y.part_imag,r1);
mulratio(x.part_imag, y.part_reel,r2);
addratio(r1,r2,r3);
Charger(r4,r3,z)
end;
end.
program essai_complexe2;
{programme de test et d'utilisation de la unit Ucomplx2 de nombres complexes coeff. rationnels }
uses
Uratio,Ucomplx2 ;
procedure ecrit (v: string; z: complex);
begin
writeln(v, ': (', z.part_reel.num,'/', z.part_reel.denom, ')+ (', z.part_imag.num,'/', z.part_imag.denom, ').i')
end;
var r1,r2,r3:rationnel;
u, z, z1, z2: complex;
begin
writeln('______________________');
{//// les chargements dpendent du type des donnes ////}
r1.num :=18;
r1.denom := 15;
r2.num := 7;
r2.denom := 12;
Charger(r1, r2, z1);
ecrit('z1', z1);
r1.num :=35;
r1.denom := 25;
r2.num := 11;
r2.denom := 6;
Charger(r1, r2, z2);
ecrit('z2', z2);
{//// les appels d'oprateurs sont identiques ceux de l'exercice prcdent: ////}
affectC(z, z1);
ecrit('z=z1', z);
plus(z1, z2, u);
ecrit('u=z1+z2', u);
moins(z1, z2, u);
ecrit('u=z1-z2', u);
r1.num :=1;
r1.denom := 1;
r2.num := 0;
r2.denom := 1;
Charger(r1, r2, z1);
mult(z1, z2, u);
ecrit('u=1*z2', u);
mult(z, z2, u);
ecrit('u=z1*z2', u);
end.
Utilisation de la unit Ucomplx2
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 424
Ex-4 TAD nombre rationnel - solution en classe Delphi
Le TAD
La classe
TAD : rationnel
Utilise : Z //ensemble des entiers relatifs.
Champs : (Num , Denom ) e Z x Z
*
Oprations :
Num : > rationnel
Denom : > rationnel
Reduire : rationnel > rationnel
Addratio : rationnel rationnel > rationnel
Divratio : rationnel rationnel > rationnel
Mulratio : rationnel rationnel > rationnel
AffectQ : rationnel > rationnel
OpposeQ : rationnel > rationnel
Prconditions :
Divratio (x,y) defssi y.Num =
Finrationnel
En Delphi
unit UClasseratio;
interface
type
rationnel = class
private
function pgcd (a, b: integer): integer;
function ppcm (a, b: integer): integer;
procedure maxswap (var a: integer;
var b: integer);
public
num: integer;
denom: integer;
procedure reduire ;
procedure Addratio (a,s: rationnel);
procedure Divratio (a,d: rationnel);
procedure Mulratio (a,m: rationnel);
procedure affectQ (s: rationnel);
procedure opposeQ (s:rationnel);
end;
implementation
procedure rationnel.maxswap (var a: integer;
var b: integer);
function rationnel.pgcd (a, b: integer): integer;
function rationnel.ppcm (a, b: integer): integer;
procedure rationnel.reduire ;
procedure rationnel.Addratio (a,s: rationnel);
procedure rationnel.Divratio (a,d: rationnel);
procedure rationnel.Mulratio (a,m: rationnel);
procedure rationnel.affectQ (s: rationnel);
procedure rationnel.opposeQ (s: rationnel);
unit Unitratio;
interface
type
rationnel = record
num: integer;
denom: integer
end;
procedure reduire (var r: rationnel);
procedure Addratio (a, b: rationnel; var s: rationnel);
procedure Divratio (a, b: rationnel; var s: rationnel);
procedure Mulratio (a, b: rationnel; var s: rationnel);
procedure affectQ (var s: rationnel; b: rationnel);
procedure opposeQ (x:rationnel;var s:rationnel);
implementation
procedure maxswap (var a: integer; var b: integer);
function pgcd (a, b: integer): integer;
function ppcm (a, b: integer): integer;
procedure reduire (var r: rationnel);
procedure Addratio (a, b: rationnel; var s: rationnel);
procedure Divratio (a, b: rationnel; var s: rationnel);
procedure Mulratio (a, b: rationnel; var s: rationnel);
procedure affectQ (var s: rationnel; b: rationnel);
procedure opposeQ (x: rationnel;var s: rationnel);
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 425
Ex-5 TAD nombre complexe - solution en classe Delphi
Le TAD
La classe complex utilise la classe rationnel
TAD complex
Utilise : Z
Champs : (part_reel , part_imag ) e Z x Z
*
Oprations :
part_reel : Z
part_imag : Z
Charger : Z Z complex
AffectC : complex complex
plus : complex complex complex
moins: complex complex complex
mult : complex complex complex
OpposeC : complex complex
Fincomplexe
En Delphi
unit UClasseComplexe2;
interface
uses UClasseratio;
type
complex = class
private
//pas d'lments privs pour l'instant
public
part_reel: rationnel;
part_imag: rationnel;
procedure Charger (x, y: rationnel);
procedure affectC (z: complex);
procedure plus (x,z: complex);
procedure moins (x,z: complex);
procedure mult (x,z: complex);
procedure OpposeC(z: complex);
end;
implementation
procedure complex.Charger (x, y: rationnel);
procedure complex.affectC (z: complex);
procedure complex.plus (x,z:complex);
procedure complex.moins (x,z: complex);
procedure complex.mult (x,z: complex);
procedure complex.OpposeC(z:complex);
end.
unit Ucomplx2;
interface
uses Uratio;
type
complex =
record
part_reel: rationnel;
part_imag: rationnel
end;
procedure Charger (x, y: rationnel; var z: complex);
procedure affectC (var z: complex;y: complex );
procedure plus (x, y: complex; var z: complex);
procedure moins (x, y: complex; var z: complex);
procedure mult (x, y: complex; var z: complex);
procedure OpposeC(x:complex;var z:complex);
implementation
procedure Charger (x, y: rationnel; var z: complex);
procedure affectC (var z: complex;y: complex );
procedure plus (x, y: complex; var z: complex);
procedure moins (x, y: complex; var z: complex);
procedure mult (x, y: complex; var z: complex);
procedure OpposeC(x:complex;var z:complex);
end.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 426
Ex-6 : Solution des 4 algorithmes de parcours dun arbre
Nous implantons en Delphi les 4 algorithmes dont 3 sont sous forme de procdures rcursives. Nous supposons
que les informations stockes dans un noeud sont du type chane de caractre (string), le traitement consistera
ici crire le contenu de la string d'un noeud lorsqu'il est parcouru. La structure de donnes darbre est
reprsente par
I mplantations des donnes avec variables dynamique et classe
Nous proposons paralllement les deux implantations demandes que le lecteur testera sur sa machine en
fonction de son avancement dans le cours.
Implantation en Delphi avec des variables dynamiques :
type
parbre = ^arbre;
arbre = record
info : string ;
filsG, filsD: parbre
end;
Implantation en Delphi avec une classe :
interface
// dans cette classe tous les champ sont publics afin de simplifier l'criture
type
TreeBin = class
private
procedure FreeRecur( x :TreeBin ) ;
public
Info : string;
filsG , filsD : TreeBin;
constructor CreerTreeBin(s:string);overload;
constructor CreerTreeBin(s:string; fg , fd : TreeBin);overload;
destructor Liberer;
end;
implementation
{-------------------- Mthodes priv -------------------------}
procedure TreeBin.FreeRecur ( x : TreeBin ) ;
// parcours postfixe pour dtruire les objets de l'arbre x
begin
FreeRecur( x.filsG );
FreeRecur( x.filsD );
x.Free
end;
{-------------------- Mthodes public -------------------------}
constructor TreeBin.CreerTreeBin(s:string);
begin
self.info := s;
self.filsG := nil;
self.filsD := nil;
end;
constructor TreeBin.CreerTreeBin(s : string ; fg, fd : TreeBin);
begin
self.info := s;
self.filsG := fg;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 427
self.filsD := fd;
end;
destructor TreeBin.Liberer;
// la destruction de tout l'arbre :
begin
FreeRecur (self) ;
self := nil;
end;
end.
Nous prenons comme exemple sur lequel appliquer les 4 algorithmes, l'arbre binaire X suivant (chaque noeud a
une info de type caractre stock dans une string) :
x =
Implantation de lalgorithme de parcours en pr-ordre :
parcourir ( Arbre )
si Arbre =C alors
Traiter-1 (info(Arbre.Racine)) ;
parcourir ( Arbre.filsG ) ;
parcourir ( Arbre.filsD ) ;
Fsi
La procdure crira successivement : abdecf
Prordre en Delphi avec les variables dynamiques :
procedure prefixe (f : parbre);
begin
if f <> nil then
with f^ do
begin
write(info);
prefixe( filsG );
prefixe( filsD )
end
end;
Prordre en Delphi avec la classe :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 428
interface
type
TreeBin = class
private
procedure FreeRecur( x :TreeBin ) ;
procedure PreOrdre ( x : TreeBin);
public
Info : string;
filsG , filsD : TreeBin;
constructor CreerTreeBin(s:string);overload;
constructor CreerTreeBin(s:string; fg , fd : TreeBin);overload;
destructor Liberer;
procedure Prefixe;
end;
implementation
{-------------------- Mthodes priv -------------------------}
procedure TreeBin.PreOrdre ( x : TreeBin ) ;
// parcours prfix d'un arbre x
begin
if x<>nil then
begin
write(x.info);
PreOrdre( x.filsG );
PreOrdre( x.filsD )
end
end;
//autres mthodes ......
{-------------------- Mthodes public -------------------------}
procedure Prefixe;
// parcours prfix de l'objet
begin
PreOrdre( self );
end;
//autres mthodes ......
end.
Implantation de lalgorithme en post-ordre :
parcourir ( Arbre )
si Arbre = C alors
parcourir ( Arbre.filsG ) ;
parcourir ( Arbre.filsD ) ;
Traiter-3 (info(Arbre.Racine)) ;
Fsi
La procdure crira successivement: debfca
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 429
Postordre en Delphi avec les variables dynamiques :
procedure postfixe (f : parbre);
begin
if f <> nil then
with f^ do
begin
postfixe( filsG );
postfixe( filsD );
write(info)
end
end;
Postordre en Delphi avec la classe :
interface
type
TreeBin = class
private
procedure FreeRecur( x :TreeBin ) ;
procedure PreOrdre ( x : TreeBin);
procedure PostOrdre ( x : TreeBin);
public
Info : string;
filsG , filsD : TreeBin;
constructor CreerTreeBin(s:string);overload;
constructor CreerTreeBin(s:string; fg , fd : TreeBin);overload;
destructor Liberer;
procedure Prefixe;
procedure Postfixe;
end;
implementation
{-------------------- Mthodes priv -------------------------}
procedure TreeBin.PostOrdre ( x : TreeBin ) ;
// parcours postfix d'un arbre x
begin
if x<>nil then
begin PostOrdre( x.filsG );
PostOrdre( x.filsD );
write(x.info);
end
end;
//autres mthodes ......
{-------------------- Mthodes public -------------------------}
procedure Postfixe;
// parcours prfix de l'objet
begin
PostOrdre( self );
end;
//autres mthodes ......
end.
Implantation de lalgorithme en ordre symtrique :
parcourir ( Arbre )
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 430
si Arbre =C alors
parcourir ( Arbre.filsG ) ;
Traiter-2 (info(Arbre.Racine)) ;
parcourir ( Arbre.filsD ) ;
Fsi
La procdure crira successivement : dbeafc
Ordre infix en Delphi avec les variables dynamiques :
procedure infixe (f : parbre);
begin
if f <> nil then
with f^ do
begin
infixe( filsG );
write(info);
infixe( filsD )
end
end;
Ordre infix en Delphi avec la classe :
interface
type
TreeBin = class
private
procedure FreeRecur( x :TreeBin ) ;
procedure PreOrdre ( x : TreeBin);
procedure PostOrdre ( x : TreeBin);
procedure InfixeOrdre ( x : TreeBin);
public
Info : string;
filsG , filsD : TreeBin;
constructor CreerTreeBin(s:string);overload;
constructor CreerTreeBin(s:string; fg , fd : TreeBin);overload;
destructor Liberer;
procedure Prefixe;
procedure Postfixe;
procedure Infixe;
end;
implementation
{-------------------- Mthodes priv -------------------------}
procedure TreeBin.InfixeOrdre ( x : TreeBin ) ;
// parcours infix d'un arbre x
begin
if x<>nil then
begin
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 431
InfixeOrdre( x.filsG );
write(x.info);
InfixeOrdre( x.filsD );
end
end;
//autres mthodes ......
{-------------------- Mthodes public -------------------------}
procedure Infixe;
// parcours prfix de l'objet
begin
InfixeOrdre( self );
end;
//autres mthodes ......
end.
Algorithme de parcours en largeur (hirarchique)
Largeur ( Arbre )
si Arbre = C alors
ajouter Arbre.racine dans Fifo;
tantque Fifo = C faire
prendre premier de Fifo;
traiter premier de Fifo;
ajouter filsG de premier de Fifo dans Fifo;
ajouter filsD de premier de Fifo dans Fifo;
ftant
Fsi
La procdure crira successivement : abcdef
Implantation en Delphi avec les variables dynamiques et un TList :
type
parbre = ^arbre;
arbre = record
info : string ;
filsG, filsD: parbre
end;
Nous utilisons un objet Delphi de classe TList pour implanter notre Fifo.
Un TList stocke un tableau de pointeurs (Pointer en Delphi). Un objet TList est souvent utilis pour grer une
liste d'objets. TList introduit des proprits et mthodes permettant d'ajouter ou de supprimer des objets de la
liste. En particulier afin d'implanter une file de type Fifo, nous utiliserons les membres suivants du TList.
mthodes
function Add( x : Pointer): Integer; Ajoute un nouvel lment en fin de liste et renvoie son rang.
function First : Pointer; Renvoie le premier lment du tableau (celui de rang 0).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 432
procedure Delete( Index : Integer); Supprime l'lment d'indice spcifi par le paramtre Index.
attributs
property Count : Integer; Indique le nombre d'entres utilises de la liste.
Le TList ne contiendra pas les noeuds de l'arbre eux-mmes mais les pointeurs vers les noeuds (type parbre ici)
:
procedure Largeur ( x : parbre);
var Fifo : TList;
begin
if f <> nil then
begin
Fifo:=TList.Create; // cre la Fifo
Fifo.Add( x ); // ajoute la racine x dans Fifo
while Fifo.Count<>0 do
begin
write(parbre(Fifo.First)^.info); // traitement du premier
if parbre(Fifo.First)^.filsG <> nil then
Fifo.Add(parbre(Fifo.First)^.filsG); // ajoute le fils gauche du premier dans Fifo
if parbre(Fifo.First)^.filsD <> nil then
Fifo.Add(parbre(Fifo.First)^.filsD); // ajoute le fils droit du premier dans Fifo
Fifo.delete(0); // supprime l'lment de rang 0 (le premier)
end;
Fifo.Free ; // supprime la Fifo
end
end;
On applique la procdure Largeur l'arbre X afin de parcourir et d'crire hirarchiquement les caractres de
chaque noeud. Ci-dessous le dbut d'un suivi d'excution de la procdure Largeur :
Instruction excute Action sur le TList Fifo
Fifo:=TList.Create;
// ajouter la racine x dans Fifo
Fifo.Add( x );
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 433
Dbut de la boucle while :
// traitement du premier
write(parbre(Fifo.First)^.info)
ecrit : a
// ajoute le fils gauche du premier dans Fifo
Fifo.Add(parbre(Fifo.First)^.filsG)
// ajoute le fils droit du premier dans Fifo
Fifo.Add(parbre(Fifo.First)^.filsD)
// supprime l'lment de rang 0 (le premier)
Fifo.delete(0);
Reprise de la boucle while :
// traitement du premier
write(parbre(Fifo.First)^.info)
etc ....
ecrit : b
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 434
Programmes Delphi complets
Ci-dessous un programme complet en Delphi (avec variables dynamiques)
excuter tel quel avec Delphi en mode console :
programTree;
{les arbres sont parcourus sous les 3 formes
in, post et pr-fixes
}
{$APPTYPE CONSOLE}
uses sysutils;
type
parbre = ^arbre;
arbre =
record
val: char;
g, d: parbre
end;
var
rac,arb1,arb2,arb3,arb4,arb5: parbre;
procedure construit (var rac:parbre;
filsg,filsd:parbre;elt:string);
// construit un arbre
begin
if rac=nil then
begin
new(rac);
with rac^ do
begin
val := elt;
g := filsg;
d := filsd
end;
end
end;{construit}
procedure edite (f: parbre);
{infixe avec parentheses}
begin
if f <> nil then
with f^ do
begin
write('(');
edite(g);
write(val);
edite(d);
write(')')
end
end;{edite}
procedure postfixe (f: parbre);
begin
if f <> nil then
with f^ do
begin
postfixe(g);
postfixe(d);
write(val);
end
end;{postfixe}
procedure prefixe (f: parbre);
begin
if f <> nil then
with f^ do
begin
write(val);
prefixe(g);
prefixe(d)
end
end;{prefixe}
procedure infixe (f: parbre);
begin
if f <> nil then
with f^ do
begin
infixe(g);
write(val);
infixe(d);
end
end;{infixe}
procedure Largeur ( f : parbre);
var Fifo : TList;
begin
if f <> nil then
begin
Fifo:=TList.Create; // cre la Fifo
Fifo.Add( f ); // ajoute la racine f dans Fifo
while fifo.count<>0 do
begin
write(parbre(Fifo.First)^.info); // traitement du
premier
if parbre(Fifo.First)^.filsG <> nil then
Fifo.Add(parbre(Fifo.First)^.filsG); // ajoute le fils
begin {prog-principal}
arb1:=nil;
arb2:=nil;
arb3:=nil;
arb4:=nil;
arb5:=nil;
construit(arb1,nil,nil,'d');
construit(arb2,nil,nil,'e');
construit(arb3,arb1,arb2,'c');
construit(arb4,nil,nil,'f');
construit(arb5,arb3,arb4,'b');
{---------------------------------- }
b
/ \
c f
/ \
d e
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 435
gauche du premier dans Fifo
if parbre(Fifo.First)^.filsD <> nil then
Fifo.Add(parbre(Fifo.First)^.filsD); // ajoute le fils
droit du premier dans Fifo
Fifo.delete(0); // supprime l'lment de rang 0 (le
premier)
end;
Fifo.Free ; // supprime la Fifo
end
end;{Largeur}
arb1:=nil;
arb2:=nil;
arb3:=nil;
construit(arb1,nil,nil,'h');
construit(arb2,nil,nil,'i');
construit(arb3,arb1,arb2,'g');
{----------------------------------}
rac:=nil;
construit(rac,arb5,arb3,'a');
{----------------------------------}
writeln('lecture parenthse:');
edite(rac); writeln;
writeln('lecture notation infixe:');
infixe(rac); writeln; //dcebfahgj
writeln('lecture notation postfixe:');
postfixe(rac); writeln; //decfbhjga
writeln('lecture notation prfixe:');
prefixe(rac); writeln; //abcdefghj
writeln('lecture hirarchique:');
Largeur(rac); writeln //abgcfhjde
end.
Ci-dessous une unit complte en Delphi de la classe TreeBin :
unit UTreeBin;
interface
uses Classes;
type
TreeBin = class
private
FInfo : string;
procedure FreeRecur ( x :TreeBin ) ;
procedure PreOrdre ( x : TreeBin ; var res :string);
procedure PostOrdre ( x : TreeBin ; var res :string);
procedure SymOrdre ( x : TreeBin ; var res :string);
procedure Hierarchie (x: TreeBin ; var res:string);
public
filsG , filsD : TreeBin;
constructor Create(s:string; fg , fd : TreeBin);
destructor Liberer;
function Prefixe : string;
function Postfixe : string;
function Infixe : string;
function Largeur : string;
property Info : string read FInfo write FInfo;
end;
implementation
{-------------------- Mthodes priv -------------------------}
procedure TreeBin.FreeRecur ( x : TreeBin ) ;
// parcours postfixe pour dtruire les objets de l'arbre x
begin
FreeRecur( x.filsG );
FreeRecur( x.filsD );
x.Free
end;
g
/ \
h i
a
/ \
b g
a
/ \
b g
/ \ / \
c f h i
/ \
d e
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 436
procedure TreeBin.PostOrdre (x: TreeBin ;var res:string);
// parcours postfix d'un arbre x
begin
if x<>nil then
begin
PostOrdre( x.filsG ,res );
PostOrdre( x.filsD ,res );
res:=res+x.FInfo
end
end;
procedure TreeBin.PreOrdre (x: TreeBin ;var res:string);
begin
if x<>nil then
begin
res:=res+x.FInfo;
PreOrdre( x.filsG ,res );
PreOrdre( x.filsD ,res );
end
end;
procedure TreeBin.SymOrdre ( x : TreeBin ;var res:string);
begin
if x<>nil then
begin
SymOrdre ( x.filsG ,res );
res:=res+x.FInfo;
SymOrdre ( x.filsD ,res );
end
end;
procedure TreeBin.Hierarchie (x: TreeBin ;var res:string);
var Fifo : TList;
begin
if x <> nil then
begin
Fifo:=TList.Create; // cre la Fifo
Fifo.Add( x ); // ajoute la racine f dans Fifo
while fifo.count<>0 do
begin
res:=res+ TreeBin (Fifo.First).info;
if TreeBin (Fifo.First).filsG <> nil then
Fifo.Add(TreeBin (Fifo.First).filsG); // ajoute le fils gauche du premier dans Fifo
if TreeBin (Fifo.First).filsD <> nil then
Fifo.Add(TreeBin (Fifo.First).filsD); // ajoute le fils droit du premier dans Fifo
Fifo.delete(0); // supprime l'lment de rang 0 (le premier)
end;
Fifo.Free ; // supprime la Fifo
end
end;{ Hierarchie }
{-------------------- Mthodes public -------------------------}
constructor TreeBin.Create(s : string ; fg, fd : TreeBin);
begin
self.Finfo := s;
self.filsG := fg;
self.filsD := fd;
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 437
destructor TreeBin.Liberer;
// la destruction de tout l'arbre :
begin
FreeRecur (self) ;
self := nil;
end;
function TreeBin.Postfixe:string;
var parcours:string;
begin
parcours:='';
PostOrdre( self , parcours );
result:=parcours
end;
function TreeBin.Prefixe : string;
var parcours:string;
begin
parcours:='';
PreOrdre( self , parcours );
result:=parcours
end;
function TreeBin.Infixe : string;
var parcours:string;
begin
parcours:='';
SymOrdre ( self , parcours );
result:=parcours
end;
function TreeBin.Largeur : string;
var parcours:string;
begin
parcours:='';
Hierarchie ( self , parcours );
result:=parcours
end;
end.
Ci-aprs le programme dutilisation de la unit sur larbre ci-dessous :
programPrTreeBin;
{$APPTYPE CONSOLE}
uses
SysUtils,
UTreeBin in 'UTreeBin.pas';
var racine,rac0,rac1,fg,fd : TreeBin;
begin
fg:=TreeBin.Create('d',nil,nil);
fd:=TreeBin.Create('e',nil,nil);
rac0:=TreeBin.Create('c',fg,fd);
fd:=TreeBin.Create('f',nil,nil);
rac1:=TreeBin.Create('b',rac0,fd);
fg:=TreeBin.Create('h',nil,nil);
fd:=TreeBin.Create('j',nil,nil);
rac0:=TreeBin.Create('g',fg,fd);
racine:=TreeBin.Create('a',rac1,rac0);
a
/ \
b g
/ \ / \
c f h i
/ \
d e
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 438
writeln('lecture notation infixee:');
writeln(racine.infixe);
writeln('lecture notation postfixee:');
writeln(racine.postfixe);
writeln('lecture notation prefixee:');
writeln(racine.prefixe);
writeln('lecture hierarchique:');
writeln(racine.Largeur);
readln
end.
Ex-7 : Solution des linsertion, de la suppression et de la recherche dans une
arbre binaire de recherche
Insertion procdure Placer en Delphi avec les variables dynamiques :
procedure placer (var arbre:parbre ; elt:string);
{remplissage rcursif de l'arbre binaire de recherche
par adjonctions successives aux feuilles de l'arbre }
begin
if arbre = nil then
begin
new(arbre);
arbre^.info:=elt;
arbre^.filsG :=nil;
arbre^.filsD :=nil
end
else
if elt <= arbre^.info then placer (arbre^.filsG ,elt)
else placer (arbre^.filsD , elt);
end;
procdure Placer en Delphi avec la classe TreeBinRech hritant de TreeBin (ex-6):
interface
type
TreeBinRech = class ( TreeBin )
private
procedure placerArbre (var arbre:TreeBinRech ; elt : string);
public
procedure Placer ( elt : string);
end;
implementation
{-------------------- Mthodes priv -------------------------}
procedure TreeBinRech.placerArbre (var arbre:TreeBinRech ; elt:string);
{remplissage rcursif de l'arbre binaire de recherche
par adjonctions successives aux feuilles de l'arbre }
begin
if not Assigned(arbre) then
arbre:=TreeBinRech.CreerTreeBin( elt )
else
if elt <= arbre.info then placerArbre (TreeBinRech(arbre.filsG) ,elt)
else placerArbre (TreeBinRech(arbre.filsD) , elt);
end;
{-------------------- Mthodes public -------------------------}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 439
procedure TreeBinRech.Placer ( elt : string);
begin
placerArbre ( self, elt )
end;
end.
Procdure Chercher en Delphi avec les variables dynamiques :
function Chercher( arbre:parbre; elt:string) : parbre;
begin
if arbre = nil then
begin
result := nil;
writeln('lment non trouv')
end
else
if elt = arbre^.info then result := arbre //l'lment est dans ce noeud
else
if elt < arbre^.info then
result := Chercher(arbre^.filsG , elt) //on cherche gauche
else
result := Chercher(arbre^.filsD , elt) //on cherche droite
end;
procdure Chercher en Delphi avec la classe TreeBinRech :
interface
type
TreeBinRech = class ( TreeBin )
private
procedure placerArbre (var arbre:TreeBinRech ; elt : string);
function ChercherArbre( arbre:TreeBinRech; elt:string) : TreeBinRech;
public
procedure Placer ( elt : string);
procedure Chercher ( elt : string);
end;
implementation
{-------------------- Mthodes priv -------------------------}
function TreeBinRech.ChercherArbre( arbre:TreeBinRech; elt:string) : TreeBinRech;
begin
if not Assigned(arbre) then
begin
result := nil;
writeln('lment non trouv')
end
else
if elt = arbre.info then result := arbre //l'lment est dans ce noeud
else
if elt < arbre.info then
result := ChercherArbre(TreeBinRech(arbre.filsG) , elt) //on cherche gauche
else
result := ChercherArbre(TreeBinRech(arbre.filsD) , elt) //on cherche droite
end;
{-------------------- Mthodes public -------------------------}
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 440
procedure TreeBinRech.Chercher ( elt : string);
begin
ChercherArbre( self , elt )
end;
end.
procdure Supprimer avec les variables dynamiques :
function PlusGrand ( arbre : parbre ) : parbre;
begin
if arbre^.filsD = nil then
result := arbre
else
result := PlusGrand( arbre^.filsD ) //on descend droite
end;
procedure Supprimer (var arbre:parbre; elt:string ) ;
var Node,Loc:parbre;
begin
if arbre <> nil then
if elt < arbre^.info then
Supprimer (arbre^.filsG, elt )
else
if elt > arbre^.info then
Supprimer (arbre^.filsD, elt )
else // elt =arbre^.info
if arbre^.filsG = nil then
begin
Loc:=arbre;
arbre := arbre^.filsD;
dispose(Loc)
end
else
if arbre^.filsD = nil then
begin
Loc:=arbre;
arbre := arbre^.filsG;
dispose(Loc)
end
else
begin
Node := PlusGrand ( arbre^.filsG );
Loc:=Node;
arbre^.info := Node^.info;
arbre^.filsG :=Node^.filsG;
dispose(Loc)
end
end;
procdure Supprimer en Delphi avec la classe TreeBinRech :
interface
type
TreeBinRech = class ( TreeBin )
private
procedure placerArbre (var arbre:TreeBinRech ; elt : string);
function ChercherArbre( arbre:TreeBinRech; elt:string) : TreeBinRech;
function SupprimerElt( arbre:TreeBinRech; elt:string) : TreeBinRech;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 441
function PlusGrand(arbre: TreeBinRech): TreeBinRech;
public
procedure Placer ( elt : string);
procedure Chercher ( elt : string);
procedure Supprimer ( elt : string);
end;
implementation
{-------------------- Mthodes priv -------------------------}
function TreeBinRech.PlusGrand(arbre: TreeBinRech): TreeBinRech;
begin
if not Assigned(Arbre.filsD) then
result:=Arbre //c'est le pus grand lment
else
result:=PlusGrand (TreeBinRech(Arbre.filsD))
end;
function TreeBinRech.SupprimerElt ( arbre:TreeBinRech; elt:string) : TreeBinRech;
var Noeud:TreeBinRech;
begin
if not Assigned(Arbre) then
writeln('element ',Elt,' non trouve dans l''arbre')
else
if Elt < Arbre.Info then
SupprimerElt (TreeBinRech(Arbre.filsG), Elt ) //on cherche gauche
else
if Elt > Arbre.Info then
SupprimerElt ( TreeBinRech(Arbre.filsD), Elt ) //on cherche droite
else //l'lment est dans ce noeud
begin
if Arbre.filsG = nil then //sous-arbre gauche vide
begin
Noeud :=Arbre;
Arbre := TreeBinRech(Arbre.filsD); //remplacer arbre par son sous-arbre droit
end
else
if Arbre.filsD = nil then //sous-arbre droit vide
begin
Noeud :=Arbre;
Arbre :=TreeBinRech(Arbre.filsG); //remplacer arbre par son sous-arbre gauche
end
else //le noeud a deux descendants
begin
Noeud := PlusGrand( TreeBinRech(Arbre.filsG )); //Node = le max du fils gauche
Arbre.Info:= Noeud.Info; //remplacer etiquette
Arbre.filsG := Noeud.filsG;
end ;
Noeud.Free; //on supprime ce noeudil;
writeln('element ',Elt,' supprime !')
end
end;
{-------------------- Mthodes public -------------------------}
procedure TreeBinRech.Supprimer ( elt : string);
begin
SupprimerElt ( self , elt )
end;
end.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 442
Programme Delphi complet
Ci-dessous un programme complet en Delphi (avec variables dynamiques)
excuter tel quel avec Delphi en mode console; il est conseill au lecteur de r-
crire ce programme en utilisant la classe TreeBinRech dcrite ci-haut :
programarbre_binaire_Rech;
{remplissage d'un arbre binaire de recherche
aussi dnomm arbre binaire ordonn horizontalement }
{$APPTYPE CONSOLE}
uses sysutils;
type
pointeur = ^noeud;
noeud = record
info:string;
filsGauche:pointeur;
filsDroit:pointeur
end;
var
racine,tree:pointeur;
procedure placer_arbre(var arbre:pointeur; elt:string);
{remplissage rcursif de l'arbre binaire de recherche}
begin
if arbre=nil then
begin
new(arbre);
arbre^.info:=elt;
arbre^.filsGauche:=nil;
arbre^.filsDroit:=nil
end
else
{ - tous les lments "info" de tous les noeuds du sous-arbre de gauche
sont infrieurs ou gaux l'lment "info" du noeud en cours (arbre)
- tous les lments "info" de tous les noeuds du sous-arbre de droite
sont suprieurs l'lment "info" du noeud en cours (arbre)
}
if elt<=arbre^.info then placer_arbre(arbre^.filsGauche,elt)
else placer_arbre(arbre^.filsDroit,elt);
end;
procedure infixe(branche:pointeur);
{lecture symtrique de l'arbre binaire}
begin
if branche<>nil then
begin
infixe(branche^.filsGauche);
write(branche^.info,' ');
infixe(branche^.filsDroit);
end
end;
function ChercherArbre( arbre:pointeur; elt:string):pointeur;
begin
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 443
if arbre=nil then
begin
ChercherArbre:=nil;
writeln('lment: '+elt+' non trouv.')
end
else
if elt = arbre^.info then ChercherArbre:=arbre
else
if elt < arbre^.info then ChercherArbre:=ChercherArbre(arbre^.filsGauche,elt)
else ChercherArbre:=ChercherArbre(arbre^.filsDroit,elt)
end;
function PlusGrand ( arbre : pointeur ) : pointeur;
// renvoie le plus grand lment de larbre
begin
if arbre^.filsDroit = nil then result := arbre
else result := PlusGrand ( arbre^.filsDroit ) //on descend droite
end;
procedure Supprimer (var arbre:pointeur; elt:string ) ;
var Node,Loc:pointeur;
begin
if arbre <> nil then
if elt < arbre^.info then
Supprimer (arbre^.filsGauche, elt )
else
if elt > arbre^.info then
Supprimer (arbre^.filsDroit, elt )
else // elt =arbre^.info
if arbre^.filsGauche = nil then
begin
Loc:=arbre;
arbre := arbre^.filsDroit;
dispose(Loc)
end
else
if arbre^.filsDroit = nil then
begin
Loc:=arbre;
arbre := arbre^.filsGauche;
dispose(Loc)
end
else
begin
Node := PlusGrand ( arbre^.filsGauche );
Loc:=Node;
arbre^.info := Node^.info;
arbre^.filsGauche :=Node^.filsGauche;
dispose(Loc)
end
end;
begin
racine:=nil;
{soit la liste entre : e d f a c b u w }
placer_arbre(racine,'e');
placer_arbre(racine,'d');
placer_arbre(racine,'f');
placer_arbre(racine,'a');
placer_arbre(racine,'c');
placer_arbre(racine,'b');
placer_arbre(racine,'u');
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 444
placer_arbre(racine,'w');
{on peut aussi entrer 8 lments au clavier
for i:=1 to 8 do
begin
readln(entree);
placer_arbre(racine,entree);
end; }
supprimer(racine, 'b');
writeln('parcours infix (ou symtrique):');
infixe(racine);
writeln;
tree:=ChercherArbre(racine,'c');
if tree<>nil then writeln( 'recherche de "c" : ok');
tree:=ChercherArbre(racine,'g');
if tree<>nil then writeln( 'recherche de "g" : ok');
{ Notons que le parcours infix produit une liste des
lments info, classe par ordre croissant
}
end.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
445
Chapitre 5 : Programmation objet et
vnementielle
5.1 Introduction la programmation oriente objet (POO)
- concepts fondamentaux de la POO
- initiation la conception oriente objet (OOD,UML...)
5.2 Programmez objet avec Delphi
- Description gnrale de Delphi
- Modules dans Delphi
- Delphi et la POO
- Les proprits en Delphi
5.3 Polymorphisme avec Delphi
- Polymorphisme d'objet
- Polymorphisme de mthodes
- Polymorphisme de classe abstraite
- Exercice trait sur le polymorphisme
5.4.Programmation vnementielle et visuelle
- programmation visuelle base sur les pictogrammes
- programmation oriente vnements
- normalisation du graphe vnementiel
- tableau des actions vnementielles
- interfaces lies un graphe vnementiel
- avantage et modle de dveloppement RAD visuel
- Notice sur les interfaces de communication
5.5.les vnements avec Delphi
- Pointeur de mthode
- Affecter un pointeur de mthode
- Un vnement est un pointeur de mthode
- Quel est le code engendr
- Exercice-rcapitulatif
- Notice mthodologique pour crer un nouvel vnement
- Code pratique : une pile lifo vnementielle
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
446
- Exemple trait : Un diteur de texte
5.6.programmation dfensive : les exceptions
- Notions de dfense et de protection
Outils participant la programmation dfensive
Rle et mode daction dune exception
Gestion de la protection du code
Fonctionnement sans incident
Fonctionnement avec incident
Effets dus la position du bloc except...end
Fonctionnement sans incident
Fonctionnement avec incident
Interception dune exception dune classe donne
Ordre dans linterception dune exception
Interception dans lordre de la hirarchie
Interception dans lordre inverse
- Traitement dun exemple de protections
Le code de dpart de lunit
Code de la version.1 (premier niveau de scurit)
Code de la version.2 (deuxime niveau de scurit)
Code pratique : une pile Lifo avec exception
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
447
5.1 Introduction la programmation
oriente objet
Plan du chapitre:
Introduction
1. Concepts fondamentaux de La P.O.O
1.1 les objets
1.2 les classes
1.3 Lhritage
2. Introduction la conception oriente objet:
2.1 La mthode de conception OOD
2.2 Notation UML de classes et d'objets
SCHEMA UML DE CLASSE
VISIBILITE DES ATTRIBUTS ET DES METHODES
SCHEMA UML D'UN OBJET
SCHEMA UML DE L'HERITAGE
SCHEMA UML DES ASSOCIATIONS
UNE ASSOCIATION PARTICULIERE : L'AGREGATION
NOTATION UML DES MESSAGES
2.3 Attitudes et outils mthodologiques
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
448
Introduction
Le lecteur qui connat les fondements de ce chapitre peut l'ignorer et passer au chapitre
suivant. Dans le cas contraire, la programmation visuelle tant intimement lie aux outils et
aux concepts objets, ce chapitre est un minimum incontournable.
La programmation classique ou procdurale telle que le dbutant peut la connatre travers
des langages de programmation comme Pascal, C etc... traite les programmes comme un
ensemble de donnes sur lesquelles agissent des procdures. Les procdures sont les lments
actifs et importants, les donnes devenant des lments passifs qui traversent larborescence
de programmation procdurale en tant que flot dinformation.
Cette manire de concevoir les programmes reste proche des machines de Von Neuman et
consiste en dernier ressort traiter indpendamment les donnes et les algorithmes (traduits
par des procdures) sans tenir compte des relations qui les lient.
En introduisant la notion de modularit dans la programmation structure descendante, lapproche diffre
lgrement de lapproche habituelle de la programmation algorithmique classique. Nous avons dfini des
machines abstraites qui ont une autonomie relative et qui possdent leurs propres structures de donnes; la
conception dun programme relevait ds lors essentiellement de la description des interactions que ces machines
ont entre elles.
La programmation oriente objet relve d'une conception ascendante dfinie comme des
"messages" changs par des entit de base appeles objets.
comparaison des deux topologies de programmation
Les langages objets sont fonds sur la connaissance dune seule catgorie dentit
informatique : lobjet. Dans un objet, traditionnellement ce sont les donnes qui deviennent
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
449
prpondrantes. On se pose dabord la question : "de quoi parle-t-on ?" et non pas la question
"que veut-on faire ?", comme en programmation algorithmique. Cest en ce sens que les
machines abstraites de la programmation structure modulaire peuvent tre considres
comme des pr-objets.
En fait la notion de TAD est utilise dans cet ouvrage comme spcification dun objet, en ce
sens nous nous proccupons essentiellement des services offerts par un objet indpendamment
de sa structure interne.
Programmation structure :
1. Concepts fondamentaux de La P.O.O
Nous crirons P.O.O pour : programmation oriente objet.
Voici trois concepts qui contribuent la puissance de la P.O.O.
- Concept de modlisation travers la notion de classe et
dinstanciation de ces classes.
- Concept daction travers la notion denvoi de messages et de
mthodes lintrieur des objets.
- Concept de construction par rutilisation et amlioration par
lutilisation de la notion dhritage.
1.1 les objets
Un module reprsente un objet ou une classe dobjet de lespace du
problme et non une tape principale du processus total, comme en
programmation descendante.
Objet
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
450
Recenser les objets du monde rel
Lors de lanalyse du problme, on doit faire ltat de lexistant en recensant les objets du
monde rel. On tablit des classes dobjets et pour chaque objet on inventorie les
connaissances que lon a sur lui :
- Les connaissances dclaratives,
- les connaissances fonctionnelles,
- lobjet rel et les connaissances que lon a sur lui sont regroups dans une mme entit.
On dcrit alors les systmes en classes dobjets plutt quen terme de fonctions.
Par Exemple : Une application de gestion bancaire est organise sur les objets comptes,
critures, tats.
Les objets rassemblent une partie de la connaissance totale portant sur le problme. Cette
connaissance est rpartie sur tous les objets sous forme dclarative ou procdurale.
Les objets sont dcrits selon le modle des structures abstraites de donnes (TAD) : ils
constituent des botes noires dissimulant leur implantation avec une interface publique pour
les autres objets. Les interactions stablissant travers cette interface.
Vocabulaire objet
Encapsulation
cest le fait de runir l'intrieur d'une mme
entit (objet) le code (mthodes) + donnes
(champs).
Il est donc possible de masquer les
informations d'un objet aux autres objets.
Deux niveaux dencapsulation sont dfinis :
Priv
les champs et les mthodes masqus sont
dans la partie prive de lobjet.
Public
les champs et les mthodes visibles sont
dans la partie interface de lobjet.
Les notions de priv et de public comme dans un objet n'ont trait qu' la communication entre
deux objets, l'intrieur d'un objet elles n'ont pas cours.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
451
Figure sur la visibilit entre deux objets
Les mthodes de public ou priv de l'objet A accdent et peuvent utiliser les mthodes et les champs public de B.
Les mthodes de public ou priv de l'objet B accdent et peuvent utiliser les mthodes et les champs public de A.
1.2 les classes
Postulons une analogie entre les objets matriels de la vie courante et les objets informatiques.
Un objet de tous les jours est souvent obtenu partir dun moule industriel servant de modle
pour en fabriquer des milliers. Il en est de mme pour les objets informatiques.
Une classe est une sorte de moule ou de matrice partir duquel sont
engendrs les objets rels qui sappellent des instancesde la classe
considre.
Des attributs (ou champs, ou variables dinstances).
Les attributs de la classe dcrivent la structure de ses instances (les objets).
Des mthodes (ou oprations de la classe).
Les mthodes dcrivent les oprations qui sont applicables aux instances de la classe.
les attributs et les mthodes d'une classe sont des membres de la classe.
Classe
Une classe contient
Membres
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
452
Un objet de classe A est appel aussi une instance de classe A, l'opration
de construction d'un objet s'appelle alors l'instanciation.
Remarque
En POO, programmer revient donc dcrire des classes dobjets, caractriser leur
structure et leur comportement, puis instancier ces classes pour crer des objets rels. Un
objet rel est matrialis dans lordinateur par une zone de mmoire que les donnes et son
code occupent.
Un exemple : des tudiants
Supposons que chaque tudiant soit caractris par sa note en mathmatiques (NoteMath) et
sa note en informatique (NoteInfo). Un tudiant doit pouvoir effectuer ventuellement des
oprations de calcul de ses moyennes dans ces deux matires (MoyMath, MoyInfo)et
connatre sa moyenne gnrale calcule partir de ces deux notes (MoyTotale).
La classe Etudiant a t cre. Elle
ne possde que les attributs
NoteMath et NoteInfo. Les
mthodes de cette classe sont par
exemple MoyMath, MoyInfo,
MoyTotale.
Nous avons cr deux objets
tudiants de la classe Etudiant (deux
instances : Julien et Claudie).
1.3 Lhritage
Dans un LOO (Langage Orient Objet), il existe une particularit dans la faon dorganiser
ses classes : lhritage de proprits. Lobjectif est de construire de nouvelles classes en
rutilisant des attributs et des mthodes de classes dj existantes.
Cest un mcanisme trs puissant qui permet de dcrire des structures gnriques
en transmettant depuis lintrieur dune mme classe toutes les proprits
communes toutes les " sous-classes " de cette classe. Par construction toutes les
sous-classes dune mme classe possdent toutes les attributs et les mthodes de
leur classe parent.
Instance
Hritage
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
453
- Les attributs et les mthodes peuvent tre modifis au niveau de la
sous-classe qui hrite.
- Il peut y avoir des attributs et/ou des mthodes supplmentaires
dans une sous-classe.
- Une classe A qui hrite dune classe B dispose implicitement de
tous les attributs et de toutes les mthodes dfinis dans la classe B.
- Les attributs et les mthodes dfinis dans A sont prioritaires par
rapport aux attributs et aux mthodes de mme nom dfinis dans
Exemple :
La classe " Etudiant premier cycle" hritant de la classe Etudiant prcdemment dfinie.
Tout se passe comme si
toute la classe Etudiant
tait recopie dans la
sous-classe Etudiant
premier cycle (mme si
limplmentation nest
pas faite ainsi).
La nouvelle classe
dispose dun attribut
supplmentaire (Mention)
et dune mthode
supplmentaire
(EvaluerMention).
type Tmention=(Passable, Abien, Bien, Tbien);
Etudiant = class
NoteMath : real;
NoteInfo : real;
procedure MoyMath(UneNote:real);
procedure MoyInfo(UneNote:real);
function MoyTotale : real ;
end;
Etudiant1erCycle = class(Etudiant)
Mention: Tmention ;
function EvaluerMention: Tmention;
end;
Ceci est une implantation
possible de la signature de la
classe en :
Proprits de l'hritage
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
454
class Etudiant {
public float NoteMath;
public float NoteInfo;
public void MoyMath(float UneNote){
... }
public void MoyInfo(float UneNote){
... }
public float MoyTotale(){
... }
}// fin classe Etudiant
public class Etudiant1erCycle extends Etudiant{
public String Mention;
public String EvaluerMention( ){
... }
public static void Main(String[ ] args){
... }
}// fin
Ceci est une implantation
possible de la signature de la
classe en :
Exemples dhritage dans dautres domaines :
Hritage dans les structures mathmatiques :
Hritage de figures de base en gomtrie affine :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
455
Hritage d'objets graphiques dans un systme multi-fentr fictif :
2. Introduction la conception oriente objet
Lattitude est ici rsolument sous-tendue par un double souci : fournir des outils
mthodologiques rationalisant leffort de production du logiciel, sans que leur lourdeur rebute
ltudiant non professionnel et masque ainsi lintrt de leur utilisation. Lexprience
denseignement de lauteur avec des dbutants a montr que si les tudiants sont appels
dvelopper sans outils mthodiques, ils pratiquent ce quappelle J.Arsac " la grande bidouille
". Mais dans le cas contraire, lapprentissage dtaill de trop de mthodes strictes bien
qu'efficaces (OOD, OMT, HOOD, UML,...)finit par ennuyer ltudiant ou du moins par
endormir son sens de lintrt. Dans ce dernier cas lon retrouve " la grande bidouille "
comme tape finale. Le chemin est donc troit et il appartient chaque enseignant de doser en
fonction de lauditoire lutile et le superflu.
Nous utilisons ici un de ces dosages pour montrer ltudiant comment crire des
programmes avec des objets sans tre un grand spcialiste. Une aide irremplaable cet gard
nous sera fournie par lenvironnement de dveloppement visuel Delphi.
2.1 La mthode de conception OOD simplifie
La mthode O.O.D (object oriented design) de G.Booch propose 5 tapes dans ltablissement
dune conception oriente objet. Ces tapes nont pas obligatoirement tre enchanes dans
lordre dans lequel nous les citons dans le paragraphe suivant. Cest cette souplesse qui nous a
fait choisir la dmarche de G.Booch, car cette mthode est fondamentalement incrmentale et
nimpose pas un cadre trop prcis et trop rigide dans son application. Cette dmarche se
rvle tre utile pour un dbutant et lui permettra de fabriquer en particulier des prototypes
avec efficacit sans trop surcharger sa mmoire.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
456
On cherchera identifier les objets du monde rel que lon voudra raliser.
Conseil : Il faut identifier les proprits caractristiques de lobjet (par lexprience,
lintuition,...).On pourra saider dune description textuelle (en langage naturel) du
problme. La lecture de cette prose aidera dduire les bons candidats pour les noms
utiliser dans cette description ainsi que les proprits des adjectifs et des autres
qualifiants.
On cherchera ensuite identifier les actions que lobjet subit de la part de son
environnement et quil provoque sur son environnement.
Conseil : Les verbes utiliss dans la description informelle (textuelle) fournissent de
bons indices pour lidentification des oprations. Si ncessaire, cest cette tape que
lon pourra dfinir les conditions dordonnancement temporel des oprations (les
vnements ayant lieu).
Lobjet tant maintenant identifi par ses caractristiques et ses oprations, on dfinira
ses relations avec les autres objets.
Conseil : On tablira quels objets le voient et quels objets sont vus par lui (les
spcialistes disent alors quon insre lobjet dans la topologie du projet). Il faudra
prendre bien soin de dfinir ce qui est visible ou non, quitte y revenir plus tard si un
choix sest rvl ne pas tre judicieux.
Ds que la visibilit est acquise, on dfinit linterface prcise de lobjet avec le monde
extrieur.
Conseil : Cette interface dfinit exactement quelles fonctionnalits sont accessibles
et sous quelles formes. Cette tape doit pouvoir tre dcrite sous notation formelle; les
TAD sont loutil que nous utiliserons cette tape de conception.
La dernire tape consiste implanter les objets en crivant le code.
Conseil : Cette tape peut donner lieu la cration de nouvelles classes
correspondant par exemple des ncessits dimplantation. Le code en gnral
correspond aux spcifications concrtes effectues avec les TAD, ou la traduction
des algorithmes dvelopps par la mthode structure. Lors de cette tape, on
identifiera ventuellement de nouveaux objets de plus bas niveau dabstraction qui ne
pouvaient pas tre analyss en premire lecture(ceci provoquant litration de la
mthode ces niveaux plus bas).
Nous nopposons pas cette mthode de conception la mthode structure modulaire. Nous la
considrons plutt comme complmentaire (en appliquant des dbutants une ide contenue
dans la mthode HOOD). La mthode structure modulaire sert laborer des algorithmes
classiques comme des actions sur des donnes. La COO permet de dfinir le monde de
lenvironnement de faon modulaire. Nous rutiliserons les algorithmes construits dans des
objets afin de montrer la complmentarit des deux visions.
Identifier les objets et leurs attributs
Identifier les opration
Etablir la visibilit
Etablir linterface
Implmenter les objets
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
457
2.2 Notation UML de classes et d'objets
La notion d'un langage de modlisation standard pour tout ce qui concerne les
dveloppements objets a vu le jour en 1997 il sagit dUML (Unified Modeling Language).
UML n'est pas une mthode, mais une notation graphique et un mtamodle.
Nous allons fournir ici les principaux schmas d'UML permettant de dcrire des dmarches de
conception objets simples. Le document de spcification de la version 1.4 d'UML par l'OMG
(l'Object Management Group) reprsente 1400 pages de dfinitions smantiques et de
notations; il n'est donc pas question ici de dvelopper l'ensemble de la notation UML (que
d'ailleurs l'auteur ne possde pas lui-mme).
Nous nous attacherons dtailler les diagrammes de base qui pourront tre utiliss par la suite
dans le reste du document.
Nous nous limiterons aux notations relatives aux classes, aux objets, et l'hritage.
SCHEMA UML DE CLASSE
Notations UML possibles d'une classe :
Reprenons l'exemple prcdent avec la classe tudiant :
trois notations UML possibles
Simplifie Avec attributs Attributs et mthodes
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
458
Deux autres notations UML plus complte pour la mme classe
Attributs
et mthodes types
Attributs typs
et mthodes types
Une classe abstraite est note :
VISIBILITE DES ATTRIBUTS ET DES METHODES
Notation prfixe UML pour trois niveaux de visibilit ( +, - , # , $) :
Pour les attributs :
public priv protg
+ Attribut1 : DeType1 - Attribut2 : DeType2 # Attribut3 : DeType3
Pour les mthodes :
public priv protg
+ Methode1 ( ):
DeType1
- Methode2 ( ) :
DeType2
# Methode3 ( ) :
DeType3
Mthode de classe
$ Methode4 ( ) : DeType4
Explicitation dans la classe Etudiant :
- Dans la classe tudiant les deux attributs
NoteMath et NoteInfo sont de type rel et sont
privs (prfixe -).
- Les trois mthodes de calcul de moyennes sont
publiques (prfixe +).
SCHEMA UML D'UN OBJET
Notations UML pour deux objets tudiants instancis partir de la classe Etudiant :
Schma UML simplifi :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
459
Schma UML avec valeur des attributs :
Ces notations correspondent l'exemple ci-dessous :
SCHEMA UML DE L'HERITAGE
Notation UML de l'hritage :
Soit pour l'exemple de hirarchie de classes fictives ci-dessous :
La notation UML suivante :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
460
SCHEMA UML DES ASSOCIATIONS
Une association binaire (ou plus gnralement n-aire), reprsente un lien conceptuel entre
deux classes. Par exemple un tudiant travaille dans un groupe (association entre la classe
Etudiant et la classe Groupe).
Une association peut tre dnote par une expression appele nom d'association (nomm
Travailler ci-dessous) :
Chaque association possde donc deux extrmits appeles aussi rles, il est possible de
nommer les extrmits (nom de rles, ci-dessous un tudiant est un acteur travaillant dans un
groupe qui est un ensemble) :
Une association peut possder une multiplicit qui reprsente sous forme d'un intervalle de
nombres entiers a..b, le nombre d'objets de la classe d'arrive qui peut tre mis en association
avec un objet de la classe de dpart. Supposons qu'un tudiant doive s'inscrire au moins 2
groupes de travail et au plus 5 groupes, nous aurons le schma UML suivant :
La prsence d'une toile dans la multiplicit indiquant un nombre quelquonque (par exemple
un tudiant peut s'inscrire au moins 2 groupes sans limite suprieure):
Par exemple pour dnoter en UML le fait qu'un nombre quelconque d'tudiants doit travailler
dans au moins deux groupes nous crirons:
UNE ASSOCIATION PARTICULIERE : L'AGREGATION
Une agrgation est une association correspondant une relation qui lorsqu'elle est lue dans un
sens signifie "est une partie de" et lorsqu'elle est lue dans l'autre sens elle signifie "est
compos de". UML disposant de plusieurs raffinements possibles nous utiliserons l'agrgation
comme composition par valeur en ce sens que la construction du tout implique la construction
automatique de toutes les parties et que la destruction du tout entrane en cascade la
destruction de chacune de ses parties.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
461
Notation UML de l'agrgation
Exemple :
un groupe contient au moins 3 tudiants et chaque
tudiant doit s'inscrire au moins 2 groupes :
NOTATION UML DES MESSAGES
Un message envoy par une classe une autre classe est reprsent par une flche vers la
classe qui s'adresse le message, le nommage de la flche indique le message excuter :
2.3 Attitudes et outils mthodologiques
Afin dutiliser une mthodologie pratique et rationnelle, nous numrons au lecteur les outils
que nous utilisons selon les besoins, dans le processus dcriture dun logiciel.
En tout premier la notion de module :
Cest la dcomposition dun logiciel en sous-ensembles que lon peut changer
comme des pices dun patchwork.
La notion de cycle de vie du logiciel :
Dvelopper un logiciel ce nest pas seulement crire du Pascal, de lAda etc...
Utiliser des TAD :
Un type abstrait de donnes correspond trs exactement linterface dun
module. Il renforce la mthodologie modulaire.
La programmation structure par machines abstraites :
On se sert dune mthode de conception descendante et modulaire des
algorithmes utiles pour certaines actions dans le logiciel.
La conception et la programmation orientes objet :
On utilise une version simplifie de la COO de G.Booch pour dfinir les classes
et leurs relations en attendant une simplification pdagogique dUML.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
462
5.2 Programmez objet avec Delphi
Plan du chapitre:
1. Description gnrale de Delphi
1.1 L'application Delphi
1.2 Les fiches et les contrles
2. Les modules dans Delphi
2.1 Partie " public " dune UNIT : " Interface "
2.2 Partie " prive " dune UNIT : " Implementation "
2.3 Initialisation et finalisation dune UNIT
3. Delphi et la POO
3.1 Les lments de base
3.2 Fonctionnalits
3.3 Les classes
3.3.1 Mta-classe
3.3.2 Classe amie
3.4 Le modle objet
3.5 Les objets
3.6 Encapsulation
3.7 Hritage
3.8 Polymorphisme - surcharge (bases)
3.9 En rsum
3.10 Activit vnementielle
4. Les proprits en Delphi
4.1 Dfinition
4.2 Accs par read/write aux donnes d'une proprit
4.3 Proprits tableaux
4.4 Surcharge de proprit
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
463
Introduction
Delphi' de Borland est un RAD visuel fond sur une extension oriente objet, visuelle et vnementielle de
Pascal, il fonctionne depuis 2004 sous le systme Windows toutes versions, sous Linux et sous l'architecture
.Net.
Pascal est le langage utilis pour linitiation dans de trs nombreux tablissements denseignement europens. Le
RAD Delphi est un prolongement intressant de ce langage. Nous allons explorer certains aspects les plus
importants et significatifs du pascal objet de Delphi. Le langage pascal de base tant suppos connu par le
lecteur, nous souhaitons utiliser ce RAD visuel en rutilisant du savoir faire pascal tout en y rajoutant les
possibilits objet offertes par Delphi.
1. Description minimale de Delphi ...
La version utilise pour crire les exemples est la dernire disponible sur Windows, mais tous les exemples sont
crits avec les fonctionnalits gnrales de Delphi ce qui permet de les compiler sur n'importe quelle version de
Delphi depuis la version 5.
1.1L'application Delphi
Une application console (non fentre) Delphi se compose d'un projet "xxx.dpr" et d'au
minimum un fichier d'Unit "xxx.pas" pour le code source. Lors de la compilation d'un projet
Delphi engendre un code "xxx.exe" directement excutable.
Tous les projets Delphi s'excutent sous
windows sans aucune Dll supplmentaire
autre que celles que vous programmerez
vous-mme :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
464
Une application fentre Delphi se compose d'un projet "xxx.dpr" et d'au minimum deux
fichiers de fiche "xxx.dfm" pour la description et "xxx.pas" et d'Unit pour le code source.
Ci-contre un projet minimal Delphi
comportant une fiche principale.
Le projet se dnomme
Project1.dpr
La fiche principale Form1 et le
code source de l'application sont
rangs dans la Unit Unit1.pas.
La description de la fiche Form1
et de ce qu'elle contient se trouve
dans un fichier nomm Unit1.dfm.
A quoi sert une fiche ?
Les systmes d'exploitation actuels sont dit fentrs au sens o ils fournissent un mode de
communication avec l'homme fond sur la notion de fentre, Windows en est un exemple.
La premire action entreprendre lors du dveloppement d'une application Interface Homme
Machine (IHM) avec un langage de programmation, est la cration de l'interface de
l'application et ensuite les interactions avec l'utilisateur. Le langage de programmation doit
donc permettre de construire au moins une fentre
En Delphi pour crer une IHM, il faut utiliser
des fiches (ou fentres) et des contrles.
Ces fiches sont des objets au sens
informatique de la POO, mais elles possdent
une reprsentation visuelle.
La fiche Form1 du projet Projet1 minimal
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
465
1.2 Les objets de fiches et les objets contrles
Chaque fiche est en fait un objet instanci partir de la classe interne des TFormde Delphi.
Cette classe possde des proprits(attributs) qui dcrivent l'apparence de la fiche, des
mthodes qui dcrivent le comportement de la fiche et enfin des gestionnaires d'vnements
(pointeurs de mthodes) qui permettent de programmer la raction de la fiche aux vnements
auxquels elles est sensible.
Sur une fiche vous dposez des contrles qui sont eux aussi d'autres classes d'objets visuels,
mais qui sont contenus dans la fiche.
Ci-dessous la palette des composants de Delphi dposables sur une fiche :
la fiche Form1 tat initial
la fiche Form1 aprs dpt de 3 contrles
Que se passe-t-il lors du dpt des contrles ?
code dans la fiche Form1 avant dpt code dans la fiche Form1 aprs dpt
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Dclarations prives }
public
{ Dclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Edit1: TEdit;
private
{ Dclarations prives }
public
{ Dclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
466
Il existe dans Delphi une notion de classe conteneur, la fiche (classe TForm) en est le
principal reprsentant. Delphi est un gnrateur automatique de programme source Pascal
objet et ds l'ouverture du projet, il dfinit une classe conteneur TForm1 qui hrite de la
classe TFormet qui au dpart ne contient rien :
TForm1 = class(TForm)
private
{ Dclarations prives }
public
{ Dclarations publiques }
end;
Lorsque nous dposons les 3 contrles Button1, Edit1, Memo1, ce sont des champs objets qui
sont automatiquement ajouts par Delphi dans le code source de la classe :
TForm1 = class(TForm)
Memo1: T Memo;
Button1: TButton;
Edit1: TEdit;
private
{ Dclarations prives }
public
{ Dclarations publiques }
end;
Donc l'environnement Delphi, n'est pas seulement un langage de programmation, mais aussi
un gnrateur de programme partir de dpt de composants visuels, c'est la fonction d'un
systme RAD (Rapid Application Developpement).
Pour une utilisation de Delphi, nous renvoyons le lecteur la documentation du constructeur,
nous attachons par la suite faire ressortir et utiliser les lments de Delphi qui concernent
la programmation modulaire et la programmation objet
2. Les modules dans Delphi
Nous avons dj vu au chapitre sur les TAD (types abstraits de donnes) que le Pascal de
Delphi permettait de traduire sous une premire forme la notion de type abstrait : la Unit. Une
Unit Delphi permet aussi de reprsenter la notion de module.
Une Unit est une unit compilable sparment de tout programme et stockable en
bibliothque.
Une Unit comporte une partie " public " et une partie " priv ". Elle implante donc lide
de module et tend la notion de bloc (procdure ou fonction) en Pascal. Elle peut contenir
des descriptions de code simple ou de classe.
Chaque unit Unit est stocke dans un fichier xxx.pas distinct et compile sparment ; les
units compiles (les fichiers xxx.DCU) sont lies pour crer une application.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
467
Les units en Delphi permettent aussi :
- De diviser de grands programmes en modules qui peuvent tre modifis
sparment.
- De crer des bibliothques qui peuvent tre partages par plusieurs programmes.
- De distribuer des bibliothques d'autres dveloppeurs sans leur donner le code
source.
Pour gnrer un code xcutable partir d'un projet comportant plusieurs units, le
compilateur Delphi doit disposer, pour chaque unit, soit du fichier source xxx.PAS, soit du
fichier XXX.DCU rsultant d'une compilation antrieure. Cette dernire possibilit permet de
fournir des units compiles d'autres personnes sans leur fournir le code source.
Syntaxe d'une unit :
Unit Truc;
<partie public >
<partie prive >
<initialisation >
end.
Utilisation d'une unit :
Le programme principal se nomme le
projet, il est rang dans le fichier
"xxx.dpr".
Ici le programme principal utilise 3 Unit :
UnitA , UnitB et UnitC
Squelette du code associ au schma prcdent :
unit UnitA;
interface
implementation
end.
unit UnitB;
interface
implementation
end.
unit UnitC;
interface
implementation
end.
Program project1;
Uses UnitA, UnitB, UnitC;
Begin
end.
Fichiers disque (sources et compils) associs au code prcdent :
project1.dpr
UnitA.pas
UnitA.pas
UnitA.pas
project1.exe
UnitA.dcu
UnitA.dcu
UnitA.dcu
Aprs compilation
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
468
Pour ajouter au projet une nouvelle Unit :
On peut utiliser l'environnement d'ajout de Delphi :
qui cre par exemple un fichier Unit2.pas contenant le
squelette de la Unit2 et rajoute automatiquement cette
unit au programme principal.
On peut crire soi-mme un fichier
texte contenant la unit :
unit Unit2;
interface
implementation
end.
Et rajouter soi-mme au texte source
du programme principal la unit :
Program project1;
Uses Unit2 ;
Begin
end.
2.1 Partie " public " dune UNIT : " Interface "
Cette partie d'une unit, correspond exactement la partie publique du module reprsent par
la UNIT. Cette partie dcrit les en-ttes des procdures et des fonctions publiques et
utilisables par les clients. Les clients peuvent tre soit dautres procdures Delphi, des
programmes Delphi ou dautres Unit.
La clause Uses XXX dans un programme Delphi, permet dindiquer la rfrence la Unit
XXX et autorise laccs aux procdures et fonctions publiques de linterface dans tout le
programme.
Syntaxe de l'interface :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
469
2.2 Partie " prive " dune UNIT : " Implementation "
Correspond la partie prive du module reprsent par la UNIT. Cette partie intimement lie
linterface, contient le code interne du module.
Elle contient deux sortes dlments : les dclarations compltes des procdures et des
fonctions prives ainsi que les structures de donnes prives. Elle contient aussi les
dclarations compltes des fonctions et procdures publiques dont les en-ttes sont prsentes
dans linterface.
Syntaxe de l'implementation :
2.3 Initialisation et finalisation dune UNIT
Syntaxe de l'initialisation :
La partie initialisation d'une unit en Delphi
comporte deux sous parties Initialization et
Finalization la seconde tant optionnelle:
Initialization Finalization
Il est possible d'initialiser des variables et d'excuter
des instructions au lancement de l'UNIT. Elles
correspondent des instructions classiques Pascal sur
des donnes publiques ou prives de la Unit
(initialisation de tableaux, mise zro de divers
indicateurs, chargement de fichiers etc...).
Une fois que le code d'initialisation d'une unit a
commenc s'excuter, la section de finalisation
correspondante si elle existe, s'excute obligatoirement
l'arrt de l'application (libration de mmoire, de
fichiers, rcupration d'incidents etc...).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
470
Exemple de programme console modulaire
Unit Delphi Uratio du TAD rationnel Programme principal Delphi utilisant Uratio
unit Uratio;
{unit de rationnels spcification classique ZxZ/R}
interface
type
rationnel =
record
num: integer;
denom: integer
end;
procedure reduire (var r: rationnel);
procedure addratio (a, b: rationnel; var s:
rationnel);
procedure divratio (a, b: rationnel; var s:
rationnel);
procedure mulratio (a, b: rationnel; var s:
rationnel);
procedure affectQ(var s: rationnel; b: rationnel);
procedure opposeQ(x:rationnel;var s:rationnel);
implementation
procedure reduire .
procedure addratio .
Procedure divratio .
procedure mulratio .
procedure affectQ.
procedure opposeQ.
end.
program essaiRatio;
{programme de test de la unit Uratio }
{$APPTYPE CONSOLE}
uses SysUtils , Uratio;
var
r1, r2, r3, r4, r5: rationnel;
begin
r1.num :=18;
r1.denom := 15;
r2.num := 7;
r2.denom := 12;
addratio(r1, r2, r3);
writeln('18/15 + 7/12 = ', r3.num, '/', r3.denom);
mulratio(r1, r2, r4);
writeln('18/15 * 7/12 = ', r4.num, '/', r4.denom);
divratio(r1, r2, r5);
writeln('18/15 / 7/12 = ', r5.num, '/', r5.denom);
r1.num := 72;
r1.denom := 60;
affectQ(r3,r1);
reduire(r1);
writeln('72/60 = ', r1.num, '/', r1.denom);
writeln('avant rduction ', r3.num, '/', r3.denom);
end.
Exemple fiche : le programme lanant une fiche vierge
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Dclarations prives }
public
{ Dclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.
programProject1;
uses Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
471
3. Delphi et la POO ...
Notre objectif est d'apprendre comment Delphi implante les notions contenues dans la P.O.O.
et d'utiliser ces outils dans nos programmes.
Delphi est un langage orient objet, dans ce domaine il possde des fonctionnalits
quivalentes C++ et java, avec sa version .Net, il possde les fonctionnalits quivalentes
celles de C# de microsoft.
3.1 Les lments de base
Sachons que dans Delphi tout est objet, des contrles de la VCL (Visual Component Library
commportant plus de 600 classes dont environ 75 sont visuelles, les autres tant non visuelles
ou concernant des objets de service).
Delphi possde de par son fondement sur Object Pascal tous les types prdfinis du pascal et
les constructeurs de types (supposs connus du lecteur), plus des types prdfinis tendus
spcifique Delphi. Ce qui signifie qu'il est tout fait possible de rutiliser en Delphi sans
effort de conversion ni d'adaptation tout programme pascal ISO ou UCSD dj crit.
Les types integer, real et string sont des types gnriques c'est dire qu'ils s'adaptent tous
les types d'entiers, de rels et de chanes de Delphi.
Par exemple les entiers de base de Delphi suivants :
Shortint -128..127 8 bits sign
Smallint -32768..32767 16 bits sign
Longint -2147483648..2147483647 32 bits sign
Byte 0..255 8 bits non sign
Word 0..65535 16 bits non sign
Longword 0..4294967295 32 bits non sign
peuvent tre affects une variable x : integer car c'est un type gnrique.
var x : integer ;
a : Longint; b : Longword; c: Byte; d: Word; e: Smallint; f: Shortint;
x := a ; x := b ; x := c ; x := d ; x := e ; x := f ;
Delphi dispose d'un type gnrique variant
polymorphe sur les types de donnes prdfinis
de Delphi.
Un variant peut s'adapter ou se changer en
pratiquement n'importe quel type de Delphi
Var x : variant;
begin
x:='abcdefgh'; // x est une string
x:=123.45; // x est un real
x:=true; // x est un boolen
x:=5876 // x est un integer
etc...
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
472
Les passages des paramtres s'effectuent principalement selon les deux modes classiques du
pascal : le passage par valeur (pas de mot cl), le passage par rfrence (mot cl Var). Par
dfaut si rien n'est spcifi le passage est par valeur.
Amliorations de ces passages de paramtres :
Delphi autorise un mode de passage dit des paramtres constants permettant une
scurit accrue au passage par valeur (mot cl Const).
Delphi dispose d'une autre amlioration concernant le passage par rfrence : le
passage par sortie (mot cl out), qui indique simplement la procdure o
placer la valeur en sortie sans spcifier de valeur en entre, qui si elle existe
n'est pas utilise.
Exemple d'utilisation des variant dans un tri rcursif sur un tableau de variant :
(les paramtres sont tous passs par
rfrence )
const n=100;
type Tableau =array[0..n] of variant;
procedure quicksort (var G,D:integer; var
tabl:Tableau);
var i , j : Integer;
x , w : variant;
begin
i := G;
j := D;
x := tabl[(i + j) div 2];
repeat
While tabl[i] < x do i := i + 1;
While tabl[j] x do j := j - 1;
If i <= j Then
begin
w := tabl[i];
tabl[i] := tabl[j];
tabl[j] := w;
i := i + 1;
j := j - 1
End;
Until i j;
If G < j Then quicksort(G, j, tabl);
If D i Then quicksort(i, D, tabl)
End;
La procdure gnrique quicksort permet de trier un tableau
de variant.
Grce son pouvoir polymorphe un variant peut devenir au
choix soit:
Entier long
Entier court
Un rel simple ou double
Une chane de caractres.
Ce qui revient dire que la procdure gnrique quicksort
permet de trier un tableau de :
Entiers longs
Entiers courts
Rels simples ou doubles
Chanes de caractres.
Dans le cas o le type variant n'existe pas, il faut au moins 3
procdures diffrentes quicksortXXX qui diffrent par le type
de leur paramtres, mais avec le mme code :
procedure quicksortEntier (sur un tableau d'integer)
procedure quicksortReel (sur un tableau de real)
procedure quicksortString (sur un tableau de string)
Remarque :
D'autres modes de passage des paramtres sont possibles en Delphi, nous n'en parlons pas ici.
3.2 Fonctionnalits du pascal objet de Delphi
Delphi est un langage structure de blocs complet. Sa gestion est identique
celle du langage pascal.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
473
La visibilit est identique celle qui est inhrente tout langage de bloc Algol-like :
variables globales, variables locales, masquage des identificateurs.
Les entits gres dynamiquement le sont selon un modle classique de tas et de pile
d'excution.
Les entits gres d'une faon permanente (donnes globales)sont persistantes durant toute
la dure de l'excution du programme, elles existent dans le segment de donnes allou
l'application.
Dans un langage structure de bloc comme
Delphi, la mmoire centrale contient deux
entits fondamentales : le tas et de pile
d'excution.
Le tas est une structure de donnes dj
tudie (arbre parfait partiellement
ordonn gr dans un tableau).
La pile d'excution est une pile LIFO.
La pile d'excution de Delphi a une taille paramtrable par le programmeur (maximum=2 147
483 647 octets), elle permet toutes les rcursivits utiles.
Ci-dessous l'illustration du fonctionnement du tas et de la pile dans le cas de l'appel d'une
procdure P0 qui appelle une procdure P1 qui appelle elle-mme une procdure P2:
Le tas contient les
structures
dynamiques et les
codes.
La pile
d'excution
contient les
contextes des
procdures
appeles.
procedure P0;
begin
P1
end:
procedure P1;
begin
P2
end:
Delphi est un langage acceptant la rcursisvit
La rcursivit d'une procdure ou d'une fonction est la capacit que cette fonction/procdure a
de s'appeler elle-mme.
Soit par exemple la somme des n premiers entiers dfinie par la suite rcurrente S
n
:
S
n
= S
n-1
+ n
S
0
= 0
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
474
Ci-dessous une fonction de calcul rcursif de la somme des n premiers entiers :
Function S(n : integer) : integer;
begin
If n = 0 Then
result:= 0
Else
result := n + S(n - 1)
End;
Delphi affiche un message d'erreur de pile pleine sur l'appel S(129937), donc une profondeur de
129936 appels recursifs a t atteinte sur ce programme avec le paramtrage standard fournit de 1
Mo comme taille maximum de la pile.
3.3 Les classes
La notion de classe est essentielle dans Delphi en mode application visuelle. Les classes sont
dclares comme des types et contiennent des champs, des mthodes et des proprits. Il
existe une classe d'objet primitive appele TObject , qui est l'anctre de toutes les autres
classes de Delphi.
Voici un extrait de la hirarchie des classes visuelles VCL (Visual Component Library) dans Delphi :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
475
Comment dclarer une classe en Delphi
Un type classe doit tre dclar et nomm avant de pouvoir tre instanci. Une classe est
considr par Delphi comme un nouveau type et doit donc tre dclar l o en Pascal l'on
construit les nouveaux types : au paragraphe des dclarations l'alina de dclaration des
types.
Les types classes peuvent tre dclars pratiquement partout o le mot cl type est autoris
l'exception suivante : ils ne doivent pas tre dclars l'intrieur d'une procdure ou d'une
fonction.
Les deux dclarations ci-dessous sont quivalentes :
Type
ma_classe = class
{dclarations de champs }
{spcification mthodes }
{spcification proprits }
end;
Type
ma_classe = class(Tobject)
{dclarations de champs }
{spcification mthodes }
{spcification proprits }
end;
Mta-classe
Delphi autorise la construction de mta-classes. Une Mta-classe est un gnrateur de
classe. En Delphi les mta-classes sont utilises afin de pouvoir passer des paramtres dont
la valeur est une classe dans des procdures ou des fonction.
Les mta-classes en Delphi sont reprsentes par une rfrence de classe
Une mta-classe Une variable de mta-classe
Type
TMetaWinClasse = class of TWinControl;
var x : TMetaWinClasse;
La variable x de classe TMetaWinClasse, peut contenir une rfrence sur n'importe quelle
classe de TWinControl : x :=Tmemo; x :=TEdit; x :=TButton;
Exemple d'utilisation de la notion de mta-
classe pour tester le type rel du paramtre
effectif lors de l'appel de TwinEssai.
procedure TwinEssai (UnWinControl : TmetaWinClasse );
begin
if UnWinControl =TEdit then
else if UnWinControl=TMemo then
....etc
end;
A comparer avec l'utilisation de l'oprateur is
sur le mme problme
procedure TwinEssai (UnWinControl : TWinControl);
begin
if UnWinControl is TEdit then
else if UnWinContro is TMemo then
....etc
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
476
En passant un constructeur un paramtre de mta-classe on peut alors construire des objets
dont la classe ne sera connue que lors de l'excution.
O dclarer une classe en Delphi ?
- Les classes sont dclares dans des unit.
- Toutes les classes dclares dans la mme unit sont amies, c'est dire que
chacune d'elle a accs aux membres privs de toutes les autres classes
declares dans cette unit.
- Si l'on souhaite avoir n classes non amies, il faut les dclarer chacune dans
une unit spare.
3.4 Le modle objet de Delphi
Le modle physique choisi pour Delphi est celui de la rfrence :
- Chaque objet est caractris par un couple ( rfrence, bloc de donnes).
- Si la variable de rfrence est locale une procdure,elle est alors situe physiquement
dans la pile dexcution avec les autres variables locales.
- Si la variable de rfrence est globale, elle est situe physiquement dans le segment de
donnes (permanent durant toutes la dure de l'excution). Dans les deux cas, le bloc
de donnes (l'objet effectif) est allou dans le tas.
Ci-dessous une carte mmoire fictive d'un processus (une application Delphi classique un
seul thread):
La simplicit du modle (semblable aux variables dynamiques ou pointeurs du pascal) permet
de dire quen Delphi les pointeurs sont sous-jacents mais entirement encapsuls.
Ce modle impose une contrainte dcriture en dcouplant la dclaration dobjet et sa cration.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
477
3.5 Les objets en Delphi
Un objet Delphi suit trs exactement les dfinitions gnrales d'objets.
Un objet Delphi est une instance d'une classe.
Un objet Delphi contient des membres qui sont :
des variables pascal (champs ou attributs)
des procdures et des fonctions (mthodes)
des proprits.
Nous verrons plus loin que ces proprits peuvent tre de diffrentes catgories, en premire
lecture nous dirons que ce sont des champs possdant des spcificateurs d'accs.
clA = class
private
x : integer ;
y : real ;
Obj : clA ;
procedure P1 (var a: integer);
function F1 (a integer): char;
function F2 : integer;
public
a , b : integer ;
D : clA ;
procedure P2 ;
function F3 : boolean;
property pr:real read y write y ;
property ch:char read F1 ;
end;
Les classes et les objets sont dclars dans les units (dans la partie dclaration de l'interface
ou de l'implementation de l'unit), le code des mthodes est dfini uniquement dans la partie
implementation de l'unit.
Constructeur / Destructeurs d'objets
En Delphi, chaque variable d'instance (objet instanci) doit obligatoirement tre initialise et
peut tre dtruite lorsqu'elle n'est plus utile. Tout objet doit tre d'abord construit avant son
utilisation. Ceci se fait l'aide d'une mthode spcifique dclare par le mot clef constructor.
La destruction d'une instance s'effectue par une mthode aux proprits identiques un
constructor et elle se dnomme un destructor.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
478
Par dfaut les classes disposent (provenant de la classe mre TObject) d'une mthode
permettant la construction des objets de la classe : cette mthode de type constructor est
dnomme Create. Ce genre de mthode assure la cration de l'objet physique en mmoire et sa
liaison avec l'identificateur dclar dans le code (l'identificateur contient aprs l'action du Create,
l'adresse physique de l'objet).
Il en est de mme pour la dsallocation des objets de vos classes (leur destruction), celles-ci
disposent d'un destructeur d'objets dnomm Destroy. Cette mthode de type destructor rend
au processus, tout l'espace mmoire utilis par l'objet physique, mais attention elle ne d-
rfrence pas l'identificateur, si ncessaire cette opration est la charge du programmeur (grce
l'instruction : identificateur:=nil).
Unit Uclasses contenant une classe clA Programme principal utilisant Uclasses
Unit Uclasses ;
Interface type
clA = class
private
x : integer ;
y : real ;
Obj : clA ;
procedure P1 (var a: integer);
function F1 (a integer): char;
function F2 : integer;
public
a , b : integer ;
D : clA ;
procedure P2 ;
function F3 : integer;
property prop1: integer read x write x ;
property prop2 : char read F1 ;
end;
implementation
procedure clA.P1 (var a: integer);
function clA.F1 (a integer): char;
function clA.F2 : integer;
procedure clA.P2 ;
function clA.F3 : boolean;
end.
Program principal ;
Uses Uclasses ;
procedure utilise (ObjA : clA);
begin
if ObjA.a > 5 then
begin
ObjA.P2 ;
ObjA.b := ObjA.F3 - ObjA.a +1;
end
else
prop1 := ObjA.a -1
end;
var refA : clA ;
begin
refA : = clA.Create ;
utilise ( refA ) ;
refA.destroy;
end.
var refA : clA ;
Lors de la dclaration une variable refA vide est cre :
refA : = clA.Create ;
Lors de l'instanciation, un objet de type clA est cr
dans le tas, puis sa rfrence (son adresse 98752) est
mise dans la variable refA :
Instanciation
d'un objet de
type clA.
Destruction de
l'objet de type
clA.
Dclaration
d'une rfrence
de type clA.
98752
clA.Create
refA := clA.create
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
479
refA.destroy;
Lors de la destruction , l'objet du tas est dtruit, la
mmoire qu'il occupait est rendu au tas et la variable
refA ne rfrence plus un objet.
Le paramtre implicite self
Etant donne une classe quelconque, chaque mthode de cette classe possde systmatiquement
dans son implmentation un paramtre implicite dnomm Self, que vous pouvez utiliser.
Cet identificateur Self dsigne l'objet (lorsqu'il sera instanci)dans lequel la mthode est
appele.
Exemple:
Unit Uclasses;
Interface
type
clA = class
private
Obj : clA ;
public
x , y : integer ;
a , b : integer ;
function F1 : integer;
end;
implementation
function clA.F1 : integer;
begin
self.a := self.x +2;
result := self.a;
end;
end.
Program principal ;
Uses Uclasses ;
var refA : clA ;
n : integer;
begin
refA : = clA.Create ; .
refA.F1
end.
Lors de l'instanciation (refA : = clA.Create ) la valeur 98752 de la rfrence, est passe
automatiquement dans la variable implicite self de chaque mthode de l'objet refA, ce qui a
pour rsultat que dans la mthode F1, les expressions formelles self.a et self.x prennent une
valeur effective et dsignent les valeurs effectives des champs a et x de l'objet n 98752 du
tas.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
480
3.6 Encapsulation
Rappelons que pratiquement, en POO l'encapsulation permet de masquer les informations et
les oprations d'un objet aux autres objets. Contrairement certains autres langages orients
objet, dans Delphi par dfaut, sil ny a pas de descripteur dencapsulation, tout est visible
(donc public).
Delphi possde au moins quatre niveaux d'encapsulation des informations dans un objet qui
sont matrialiss par des descripteurs :
published : Les informations sont accessibles par toutes les instances de toutes les
classes (les clients) + accessibles l'inspecteur d'objet de Delphi.
public : Les informations sont accessibles par toutes les instances de toutes les
classes (les clients).
protected : Les informations ne sont accessibles qu' toutes les instances de la
classe elle-mme et toutes celles qui en hritent (ses descendants).
private : Les informations ne sont accessibles qu' toutes les instances de la classe
elle-mme.
3.7 Hritage
Il s'agit en Delphi de l'hritage simple (graphe arborescent) dans lequel une famille drive
d'une seule classe de base. Voici une partie du graphe d'hritage simple de certaines classes de
Delphi :
Syntaxe de la dclaration d'hritage :
Type classe_fille = class(classe_ancetre)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
481
Type
classe_ancetre = class
{ champs }
{ mthodes }
end;
Type
classe_fille = class(classe_ancetre)
{ champs }
{ mthodes }
end;
Nous indiquons donc ainsi en Delphi que la classe_fille hrite de la classe_ancetre.
Nous avons vu que les deux dclarations ci-dessous taient quivalentes :
Type
ma_classe = class
{dclarations de champs }
{spcification mthodes }
{spcification proprits }
end;
Type
ma_classe = class(TObject)
{dclarations de champs }
{spcification mthodes }
{spcification proprits }
end;
L'criture de gauche indique en fait que toutes les classes dclares sans qualificatif d'hritage
hritent automatiquement de la classe TObject. La VCL de Delphi est entirement construite
par hritage (une hirarchie objet complte) partir de TObject.
Ci-dessous la dclaration de la classe TObject dans Delphi :
TObject = class
constructor Create;
procedure Free;
class function InitInstance(Instance: Pointer): TObject;
procedure CleanupInstance;
function ClassType: TClass;
class function ClassName: ShortString;
class function ClassNameIs(const Name: string): Boolean;
class function ClassParent: TClass;
class function ClassInfo: Pointer;
class function InstanceSize: Longint;
class function InheritsFrom(AClass: TClass): Boolean;
class function MethodAddress(const Name: ShortString): Pointer;
class function MethodName(Address: Pointer): ShortString;
function FieldAddress(const Name: ShortString): Pointer;
function GetInterface(const IID: TGUID; out Obj): Boolean;
class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
class function GetInterfaceTable: PInterfaceTable;
function SafeCallException(ExceptObject: TObject;
ExceptAddr: Pointer): HResult; virtual;
procedure AfterConstruction; virtual;
procedure BeforeDestruction; virtual;
procedure Dispatch(var Message); virtual;
procedure DefaultHandler(var Message); virtual;
class function NewInstance: TObject; virtual;
procedure FreeInstance; virtual;
destructor Destroy; virtual;
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
482
La classe Tobject utilise ici la notion de mthode de classe:
Une mthode de classe est une mthode (autre qu'un constructeur) qui agit sur des
classes et non sur des objets.
La dfinition d'une mthode de classe doit commencer par le mot rserv class.
Par exemple dans Tobject :
TObject = class
...
class function ClassName: ShortString;
class function ClassParent: TClass; ...
La dclaration de dfinition d'une mthode de classe doit galement commencer par
class :
class function TObject.ClassName: ShortString;
begin
//...le paramtre self est ici la classe Tobject
end;
etc...
Outre la classe TObject, Delphi fournit le type de mta-classe
(rfrence de classe) gnrale TClass :
TClass = class of TObject;
3.8surcharge de mthode
Signature d'une mthode -- dfinition
C'est son nom , le nombre et le type de ses paramtres
On dit qu'une mthode est surcharge dans sa classe si l'on peut trouver dans la classe
plusieurs signatures diffrentes de la mme mthode.
En Delphi, les en-ttes des mthodes surcharges de la mme classe, doivent tre suivies du
qualificateur overload afin d'indiquer au compilateur qu'il s'agit d'une autre signature de la
mme mthode.
Dans la classe classeA nous avons dclar 3 surcharges
de la mme mthode Prix, qui pourrait valuer un prix
en fonction du montant rentr selon trois types de
donnes exprimes en yen, en euro ou en dollar.
Type
classeA = class
public
function Prix(x:yen) : real;overload;
function Prix(x:euro): real;overload;
function Prix(x:dollar) : real;overload;
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
483
Comment appeler une surcharge de mthode ?
Soit le programme de droite qui utilise la classeA dfinie gauche avec 3 surcharges de la mthode Prix
Unit Uclasses ;
interface
Type
yen = class end;
euro = class end;
dollar = class end;
classeA = class
public
function Prix(x:yen) : real;overload;
function Prix(x:euro): real;overload;
function Prix(x:dollar) : real;overload;
end;
implementation
function classeA.Prix(x:yen) : real; // signature n1
begin

end;
function classeA.Prix(x:euro): real;
begin

end;
function classeA.Prix(x:dollar) : real;
begin

end;
Program principal ;
Uses Uclasses ;
var refA : classeA;
a : yen ; b : euro ; c : dollar ;
Procedure Calcul1 (ObjA : classeA; valeur : yen );
begin
ObjA.Prix ( valeur)
end;
Procedure Calcul2 (ObjA : classeA; valeur : euro);
begin
ObjA.Prix ( valeur )
end;
Procedure Calcul3 (ObjA : classeA; valeur : dollar);
Var ObjA : classeA ;
begin
ObjA.Prix ( valeur)
end;
begin
refA:= classeA.Create ;
a := yen.Create ;
b := euro.Create ;
c := dollar.Create ;
Calcul1 ( refA , a );
Calcul2 ( refA , b );
Calcul3 ( refA , c );
End.
L'appel ObjA.Prix(valeur) dans Calcul1( refA , a ) sur a de type yen provoque la recherche de la signature
suivante Prix ( type yen), c'est la signature n1 qui est trouve et excute.
L'appel ObjA.Prix(valeur) dans Calcul2( refA , b ) sur a de type euro provoque la recherche de la signature
suivante Prix ( type euro) ), c'est la signature n 2 qui est trouve et excute.
L'appel ObjA.Prix(valeur) dans Calcul3( refA , c ) sur a de type dollar provoque la recherche de la signature
suivante Prix ( type dollar) ), c'est la signature n3 qui est trouve et excute.
4. Les proprits en Delphi
Une proprit dfinie dans une classe permet d'accder certaines informations contenues dans les objets
instancis partir de cette classe. Une proprit a la mme syntaxe de dfinition et d'utilisation que celle d'un
champ d'objet (elle possde un type de dclaration), mais en fait elle peut invoquer une ou deux mthodes
internes pour fonctionner ou se rfrer directement un champ. Les mthodes internes sont dclares l'intrieur
d'un bloc de dfintion de la proprit.
Le compilateur connat
le type du second
paramtre, lorsqu'il
appelle :
ObjA.Prix ( valeur )
Il va alors chercher s'il
existe une signature
correspondant ce type
et va excuter le code de
la surcharge adquate
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
484
Nous nous limiterons aux proprits non tableau, car cette notion est commune d'autres
langages (C# en particulier)
4.1. Dfinition
Comme un champ, une proprit dfinit un attribut d'un objet.
Mais un champ n'est qu'un emplacement de stockage dont le contenu peut tre consult et
modifi, tandis qu'une proprit peut associer des actions spcifiques la lecture et lors de la
modification de ses donnes : une proprit peut tre utilise comme un attribut.
Les proprits proposent un moyen de contrler l'accs aux attributs d'un objet et autorisent
ou non le calcul sur les attributs.
Syntaxe :
property nomProprit[indices] : type [index constanteEntire] spcificateurs ;
Remarque :
il faut au minimum un descripteur (ou spcificateur) d'accs pour une proprit :
soit lecture seule (spcificateur read),
soit criture seule (spcificateur write),
soit lecture et criture read . write .
Attention :
Une proprit ne peut pas tre transmise comme paramtre rfrence dans une
procdure ou une mthode !
Exemple de syntaxe d'criture de proprits :
classeA = class
public
property prop1 : integer read y write z ; // lecture et criture
property prop2 : char read F1 ; // lecture seule
property prop3 : string write t ; // criture seule
end;
4.2. Accs par read/write aux donnes d'une proprit
Aprs les spcificateurs read et write, il obligatoire de prciser le moyen d'accs la
proprit : Ce moyen peut tre un attribut, ou une mthode.
Accs une proprit par un attribut
property proprit1: type read Fproprit1 ;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
485
La property proprit1 fait rfrence l'attribut Fproprit1 et en permet l'accs en lecture
seule.
Pour avoir un intrt, la property proprit1 doit tre dclare en public, tandis que l'attribut
Fproprit1 est dclar en private.
Lorsque la proprit est dfinie, il faut que le champ auquel elle se rfre ait dj t dfini
dans la classe, ou dans une classe anctre.
D'une faon gnrale on peut comparer la lecture et l'criture dans un champ et dans une
proprit comme ci-dessous :
Soit la classe classeA :
classeA = class
public
champ : integer ;
end;
Soit une autre version de la classe classeA :
classeA = class
private
Fchamp : integer ;
public
property propr1 : integer read Fchamp write Fchamp ;
end;
On peut donc assimiler la proprit propr1 une clef ouvrant une porte sur un champ
priv de l'objet. et autorisant la lecture et/ou l'criture dans ce champ.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
486
Exemple d'utilisation :
Accs une proprit par une mthode
Cas du spcificateur d'accs read
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
487
La mthode d'accs en lecture LireProp1 doit :
tre une fonction,
tre sans paramtres,
renvoyer un rsultat du mme type que celui de la proprit.
Cas du spcificateur d'accs write
La mthode d'accs en criture EcririreProp1 doit :
tre une procdure,
n'avoir qu'un seul paramtre formel pass par constante ou par
valeur (pas par rfrence),
ce paramtre doit tre du mme type que celui de la proprit.
4.4 Surcharge de proprits
Surcharge permettant d'augmenter la visibilit
Lorsqu'une proprit est dclare dans une classe, on peut la surcharger dans
les classes drives en augmentant son niveau de visibilit.
MaClasse = class
private
Fchamp : integer ;
protected
property propr1 : integer read Fchamp
write Fchamp ;
end;
MaFille = class (MaClasse)
private
Fchamp : integer ;
public
property propr1 : integer read Fchamp
write Fchamp ;
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
488
Surcharge permettant de redfinir un spcificateur existant
On ne peut pas supprimer de spcificateur.
Par contre on peut modifier le/les spcificateur(s) existant(s) ou ajouter le
spcificateur manquant.
MaClasse = class
private
Fchamp : integer ;
public
property propr1 : integer read Fchamp ;
property propr2 : integer read Fchamp ;
end;
MaFille = class (MaClasse)
private
Fchamp : integer ;
function lirePropr2 : integer ;
public
property propr1 : integer read Fchamp write Fchamp ;
property propr2 : integer read lirePropr2 ;
end;
Redfinition et masquage d'une proprit
Une proprit redfinie dans une classe remplace l'ancienne avec ses nouveaux
attributs, son nouveau type.
MaClasse = class
private
Fchamp : integer ;
protected
property propr1 : integer read Fchamp
write Fchamp ;
end;
MaFille = class (MaClasse)
private
FNom : string ;
public
property propr1 : string read Fnom ;
end;
Ds qu'une redclaration de proprit contient une redfinition de type, elle
masque automatiquement la proprit parent hrite et la remplace
entirement. Elle doit donc tre redfinie avec au moins un spcificateur
d'accs.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
489
5.3 Polymorphisme avec Delphi
Plan de ce chapitre:
Polymorphisme d'objet
Introduction
Instanciation et utilisation dans le mme type
Instanciation et utilisation dans un type diffrent
Polymorphisme implicite
Instanciation dans un type descendant
Polymorphisme explicite par transtypage
Utilisation pratique du polymorphisme d'objet
instanciation dans un type ascendant
Polymorphisme de mthode
Introduction
Vocabulaire et concepts
Surcharge dans la mme classe
Surcharge dans une classe drive
Surcharge dynamique dans une classe drive
Rpartition des mthodes en Delphi
Rutilisation de mthodes avec inherited
Polymorphisme de classe abstraite
Introduction
Vocabulaire et concepts
Exercice trait sur le polymorphisme
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
490
1. Polymorphisme d'objet
Conversion de rfrences d'objet entre classe et classe drive
Il existe un concept essentiel en POO dsignant la capacit d'une hirarchie de classes
fournir diffrentes implmentations de mthodes portant le mme nom et par corollaire la
capacit qu'ont des objets enfants de modifier les comportements hrits de leur parents.
Ce concept d'adaptation diffrentes "situations" se dnomme le polymorphisme qui
peut tre implment de diffrentes manires.
Polymorphisme d'objet - dfinition gnrale
C'est une interchangeabilit entre variables d'objets de classes de la mme hirarchie sous certaines conditions,
que dnommons le polymorphisme d'objet.
Soit une classe Mere et une Fille hritant de la classe Mere :
Les objets peuvent avoir des comportements polymorphes (s'adapter et se comporter
diffremment selon leur utilisation) licites et des comportements polymorphes dangereux
selon les langages.
Dans un langage dont le modle objet est la rfrence (un objet est un couple : rfrence,
bloc mmoire) comme C++, C#, Delphi ou Java, il y a dcouplage entre les actions
statiques du compilateur et les actions dynamiques du systme d'excution selon le
langage utilis le compilateur protge ou non statiquement des actions dynamiques sur les
objets une fois crs. C'est la dclaration et l'utilisation des variables de rfrences qui
autorise ou non les actions licites grce la compilation.
Supposons que nous ayons dclar deux variables de rfrence, l'une de classe Mere,
l'autre de classe Fille, une question qui se pose est la suivante : au cours du programme
quel genre d'affectation et d'instanciation est-on autoris effectuer sur chacune de ces
variables. L'hritage permet une variabilit entre variables d'objets de classes de la mme
hirarchie, c'est cette variabilit que dnommons le polymorphisme d'objet.
Nous allons ds lors envisager toutes les situations possibles et les valuer, les exemples
appuyant le texte sont prsents en Delphi.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
491
instanciation dans le type initial et utilisation dans le mme type
Il s'agit ici d'une utilisation la plus classique qui soit, dans laquelle une variable est utilise
dans son type de dfinition initial.
var
x,u : Mere;
y,v : Fille ;
.....
x : = Mere.Create ; // instanciation dans le type initial
u := x; // affectation de rfrences du mme type
y : = Fille.Create ; // instanciation dans le type initial
v := y; // affectation de rfrences du mme type
instanciation dans le type initial et utilisation diffrente
Il s'agit ici de l'utilisation licite commune tous les langages cits plus haut, nous
illustrons le discours en explicitant deux champs de la classe Mere (chm:chaine et
a:entier) et un champ supplmentaire (chf:chaine) dans la classe Fille. il existe 3
possibilits diffrentes, la figure ci-dessous indique les affectations possibles :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
492
var
x , ObjM : Mere;
y , ObjF : Fille;
ObjM := Mere.Create; // instanciation dans le type initial
ObjF := Fille.Create; // instanciation dans le type initial
x := ObjM; // affectation de rfrences du mme type
x := ObjF; // affectation de rfrences du type descendant implicite
y := ObjF; // affectation de rfrences du mme type
y := Fille(ObjM); // affectation de rfrences du type ascendant explicite mais dangereux si ObjM
est uniquement Mere
Les trois possibilits sont :
L'instanciation et l'utilisation de rfrences dans le mme type
L'affectation de rfrences : polymorphisme implicite
L'affectation de rfrences : polymorphisme par transtypage d'objet
La dernire de ces possibilits pose un problme d'excution lorsqu'elle est mal employe !
Polymorphisme d'objet implicite
Dans l'exemple prcdent le compilateur accepte le transtypage 'y :=Fille(ObjM)' car il
autorise un polymorphisme d'objet de classe ascendante vers une classe descendante (c'est
dire que ObjM peut se rfrer implicitement tout objet de classe Mere ou de toute
classe descendante de la classe Mere).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
493
Nous pouvons en effet dire que x peut se rfrer implicitement tout objet de classe Mere ou
de toute classe hritant de la classe Mere :
fig - 1
fig - 2
Dans la figure fig-1 ci-dessus, une hirarchie de classes decendant toutes de la classe
Mere.
Dans la figure fig-2 ci-dessus le schma montre une rfrence de type Mere qui peut
'pointer' vers n'importe quel objet de classe descendante (polymorphisme d'objet).
Exemple pratique tir du schma prcdent
Le polymorphisme d'objet est typiquement fait pour reprsenter des situations pratiques
figures ci-dessous : (Mere=vehicule, Fille1=terrestre, Fille2=voiture, Fille3=marin,
Fille4=voilier, Fille5=croiseur)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
494
Une hirarchie de classes de vhicules descendant toutes de la classe mre Vehicule.
Dclaration de cette hirarchie en
Vehicule = class
..........
end;
terrestre = class (Vehicule)
..........
end;
voiture = class (terrestre)
..........
end;
Marin = class (Vehicule)
..........
end;
voilier = class (marin)
..........
end;
croiseur = class (marin)
..........
end;
On peut noncer le fait qu'un vhicule peut tre de plusieurs sortes : soit un croiseur, soit
une voiture, soit un vhicule terrestre etc...
En traduisant cette phrase en termes informatiques :
Si l'on dclare une rfrence de type vhicule (var x : vehicule) elle pourra pointer vers
n'importe quel objet d'une des classe filles de la classe vehicule.
Polymorphisme implicite =cration d'objet de classe descendante rfrencpar une
variable parent
Quand peut-on crire x := y sur des objets ?
D'une faon gnrale vous pourrez toujours crire des affectations entre deux rfrences d'objets :
var
x : Classe1
y : Classe2
..........
x := y;
si et seulement si Classe2 est une classe descendante de Classe1.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
495
instanciation dans un type descendant
Polymorphisme par cration d'objet de classe descendante
Dans ce paragraphe nous signalons qu'il est tout fait possible, du fait du transtypage
implicite, de crer un objet de classe descendante rfrenc par une variable de classe
parent.
Ajoutons 2 classes la hirarchie
des vhicules :
La nouvelle hirarchie est la suivante :
Ensuite nous dclarons 3 rfrences de type x:vehicule, y:voiture et z:break , puis nous
crons 3 objets de classe voiture, berline et break, il est possible de crer directement un
objet de classe descendante partir d'une rfrence de classe mre :
- on cre une voiture rfrence par la variable x de classe vehicule,
- on cre une berline rfrence par la variable y de classe voiture,
- enfin on cre un break rfrenc par la variable z de classe break.
Rcrivons ces phrases afin de comprendre quel genre de situation pratique cette
opration correspond :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
496
on cre un vhicule du type voiture
on cre une voiture de type berline
enfin on cre un break de type break
var
x : vehicule;
y : voiture;
z : break;
...
x := voiture.Create; // objet de classe enfant voiture rfrenc par x de classe parent vehicule
y := berline.Create; // objet de classe enfant berline rfrenc par x de classe parent voiture
z := break.Create; // instanciation dans le type initial
Polymorphisme d'objet explicite par transtypage
Reprenons le code prcdent en extrayant la partie qui nous intresse :
var
x , ObjM : Mere;
y : Fille;
ObjM := Mere.Create; // instanciation dans le type initial
x := ObjM; // affectation de rfrences du mme type
y := Fille(ObjM); // affectation de rfrences du type ascendant explicite licite
Nous avons signal que l'affectation y := Fille(ObjM) pouvait tre dangereuse si ObjM
pointe vers un objet purement de type Mere. Voyons ce qu'il en est.
Nous avons vu plus haut qu'une rfrence de type parent peut 'pointer' vers n'importe quel
objet de classe descendante. Si l'on sait qu'une refrence x de classe parent, pointe vers un
objet de classe enfant, on peut en toute suret procder une affectation de cette refrence
une autre refrence y dfinie comme refrence classe enfant ( opration y := x ).
La situation informatique est la suivante :
on dclare une variable x de type Mere,
on dclare une variable y de type Fille hritant de Mere,
on instancie la variable x dans le type descendant Fille (polymorphisme implicite).
Il est alors possible de faire "pointer" la variable y (de type Fille) vers l'objet (de type
Fille) auquel se rfre x en effectuant une affectation de rfrences.
Toutefois le compilateur refusera l'criture y := x, il suffit de lui indiquer qu'il faut
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
497
transtyper la variable de rfrence x et la considrer dans cette instruction comme une
refrence sur un enfant
var
x : Mere;
y : Fille;
x := Mere.Create; // instanciation dans le type initial
y := Fille(ObjM); // affectation de rfrences du type ascendant explicite licite
Dans la dernire instruction, la refrence ObjM est transtype en type Fille, de telle
manire que le compilateur puisse faire pointer y vers l'objet dj point par ObjM. En
reprenant l'exemple pratique de la hirarchie des vhicules :
Puisque x pointe vers un objet de type voiture toute variable de rfrence voiture
acceptera de pointer vers cet objet, en particulier la variable y :voiture aprs transtypage
de la rfrence de x.
var
x : vehicule;
y : voiture;
...
x := voiture.Create; // objet de classe enfant voiture rfrenc par x de classe parent vehicule
y := voiture ( x ); // transtypage
En Delphi l'affectation s'crit par application de l'oprateur de transtypage :
y := voiture ( x );
ATTENTION
- La validit du transtypage n'est pas vrifie statiquement par le compilateur, donc si votre variable de
rfrence pointe vers un objet qui n'a pas la mme nature que l'oprateur de transtypage, c'est de
l'excution qu'il y aura production d'un message d'erreur indiquant le transtypage impossible.
- Il est donc impratif de tester l'appartenance la bonne classe de l'objet transtyper avant de le
transtyper, les langages C#, Delphi et Java disposent d'un oprateur permettant de tester cette
appartenance ou plutt l'appartenance une hirarchie.
L'oprateur "is" en
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
498
L'oprateur is, qui effectue une vrification de type dynamique, est utilis pour vrifier quelle est effectivement
la classe d'un objet l'excution.
L'expression : objet is classeT
renvoie True si objet est une instance de la classe dsigne par classeT ou de l'un de ses descendants, et False
sinon. Si objet a la valeur nil, le rsultat est False.
L'oprateur "as" en
L'oprateur as est un oprateur de transtypage de rfrence d'objet semblable l'oprateur ( ).
L'oprateur as fournit la valeur null en cas d'chec de conversion alors que l'oprateur ( ) lve une exception.
(objet as classeT) renvoie une rfrence de type classeT
Exemple d'utilisation des deux oprateurs :
var x : classeT;
if objet is classeT then
x := objet as classeT ;
Utilisation pratique du polymorphisme d'objet
Le polymorphisme d'objet associ au transtypage est trs utile dans les paramtres des
mthodes.
Lorsque vous dclarez une mthode P avec un paramtre formel de type ClasseT :
procedure P( x : ClasseT );
begin
........
end;
Vous pouvez utiliser lors de l'appel de la procdure P n'importe quel paramtre effectif de
ClasseT ou bien d'une quelconque classe descendant de ClasseT et ensuite l'intrieur de
la procdure vous transtypez le paramtre. Cet aspect est abondamment utilis en Delphi
lors de la cration de gestionnaires d'vnements communs plusieurs objets :
procedure P1( Sender : Tobject );
begin
if Sender is TEdit then
TEdit(Sender).text := 'ok'
else
if Sender is TButton then
TButton(Sender).caption := 'oui'
............
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
499
Autre exemple avec une mthode P2 personnelle sur la hirarchie des vhicules dfinies
plus haut :
procedure P2( Sender : vehicule );
begin
if Sender is voiture then
voiture(Sender). .......
else
if Sender is voilier then
voilier(Sender). .......
............
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
500
2. Polymorphisme de mthode
Introduction
Lorsqu'une classe enfant hrite d'une classe mre, des mthodes supplmentaires
nouvelles peuvent tre implmentes dans la classe enfant mais aussi des mthodes des
parents redfinies pour obtenir des implmentations diffrentes.
Une classe drive hrite de tous les membres de sa classe parent ; c'est--dire que tous les
membres du parent sont disponibles pour l'enfant, rappelons qu'une mthode est un
membre qualifiant un comportement d'un objet de la classe. En POO on distingue deux
catgories de mthodes selon les besoins des applications et du polymorphisme : les
mthodes statiques et les mthodes dynamiques.
2.1 Vocabulaire et concepts gnraux :
L'action qui consiste donner le mme nom plusieurs mthodes dans la mme classe ou d'une classe
parent une classe enfant, se dnomme d'une manire gnrale la surcharge de nom de mthode (avec
ou non la mme signature).
Le vocabulaire n'tant pas stabilis selon les auteurs (surcharge, redfinition, substitution,...) nous
employerons les mots redfinition, surcharge dynamique ou substitution dans le mme sens, en
prcisant lorsque cela s'avrera ncessaire de quel genre de laison il s'agit.
Les actions des mthodes hrites du parent peuvent tre modifis
par l'enfant de deux manires, selon le type de liaison du code utilis
pour la mthode (la liaison statique ou prcoce ou bien la liaison
dynamique ou retarde).
Les deux modes de liaison du code d'une mthode
La liaison statique ou prcoce (early-binding) :
Lorsqu'une mthode liaison statique est invoque dans le corps d'un programme, le compilateur tablit
immdiatement dans le code appelant l'adresse prcise et connue du code de la mthode invoquer. Lors
de l'excution c'est donc toujours le mme code invoqu.
La liaison dynamique ou retarde (lazy-binding) :
Lorsqu'une mthode liaison dynamique est invoque dans le corps d'un programme, le compilateur
n'tablit pas immdiatement dans le code appelant l'adresse de la mthode invoquer. Le compilateur met
en place un mcanisme de refrence (rfrence vide lors de la compilation) qui, lors de l'excution,
dsignera (pointera vers) le code que l'on voudra invoquer; on pourra donc invoquer des codes diffrents.
2.2 Surcharge dans la mme classe :
Dans une classe donne, plusieurs mthodes peuvent avoir le mme nom, mais les
signatures des mthodes ainsi surcharges doivent obligatoirement tre diffrentes et
peuvent ventuellement avoir des niveaux de visibilit diffrents.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
501
Nous avons dj vu les bases de ce type de surcharge lors de l'tude de Delphi et la POO.
Soit par exemple, la classe ClasseA ci-dessous, ayant 3 mthodes de mme nom P, elles
sont surcharges dans la classe selon 3 signatures diffrentes :
Classe A
public methode P(x,y);
priv methode P(a,b,c);
protg methode P( );
finClasse A
La premire surcharge de P dispose de 2 paramtres, la seconde de 3 paramtres, la
dernire enfin n'a pas de paramtres. C'est le compilateur du langage qui devra faire le
choix pour slectionner le code de la bonne mthode utiliser. Pour indiquer ce genre de
surcharge, en Delphi il faut utiliser un qualificateur particulier dnot overload.
Syntaxe de l'exemple en Delphi, en Java et en C# :
Delphi Java - C#
ClasseA = class
public
procedure P(x,y : integer);overload;
private
procedure P(a,b,c : string); overload;
protected
procedure P;overload;
end;
class ClasseA {
public void P( int x,y ){ }
private void P( String a,b,c ){ }
protected void P( ){ }
}
Utilisation pratique : permettre une mthode d'accepter plusieurs types de paramtres
en conservant le mme nom, comme dans le cas d'oprateur arithmtique travaillant sur
les entiers, les rels,...
Exemple de code Delphi :
ClasseA = class
public
procedure P(x,y : integer);overload;
procedure P(a,b,c : string);overload;
procedure P;overload;
end;
var Obj:ClasseA;
.....
Obj := ClasseA.create;
Obj.P( 10, 5 );
Obj.P( 'abc', 'ef', 'ghi' );
Obj.P;
2.3 Surcharge statique dans une classe drive :
D'une manire gnrale, Delphi et C# disposent par dfaut de la notion de mthode
statique, Java n'en dispose pas sauf dans le cas des mthodes de classes. Dans l'exemple
ci-dessous en Delphi et en C#, les trois mthodes P,Q et R sont liaison statique dans leur
dclaration par dfaut sans utiliser de qualificateur spcial.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
502
Delphi C#
ClasseA = class
public
procedure P(x,y : integer);
private
procedure Q(a,b,c : string);
protected
procedure R;
end;
class ClasseA {
public void P( int x,y ){ }
private void Q( String a,b,c ){ }
protected void R( ){ }
}
Une classe drive peut masquer une mthode liaison statique hrite en dfinissant une
nouvelle mthode avec le mme nom.
Si vous dclarez dans une classe drive, une mthode ayant le mme nom qu'une mthode liaison statique
d'une classe anctre, la nouvelle mthode remplace simplement la mthode hrite dans la classe drive.
Dans ce cas nous employerons aussi le mot de masquage qui semble tre utilis par beaucoup d'auteurs pour
dnommer ce remplacement, car il correspond bien l'ide d'un masquage "local" dans la classe fille du code
de la mthode de la classe parent par le code de la mthode fille.
Ci-dessous un exemple de hirarchie de classes et de masquages successifs licites de
mthodes liaison statiques dans certaines classes drives avec ou sans modification de
visibilit :
Classe A
public statique methode P;
priv statique methode Q;
protg statique methode R;
finClasse A
Classe B hrite de Classe A
public statique methode P;
priv statique methode Q;
protg statique methode R;
finClasse B
Classe C hrite de Classe B
protg statique methode P;
priv statique methode Q;
finClasse C
Classe D hrite de Classe C
public statique methode P;
finClasse D
Classe E hrite de Classe D
protg statique methode P;
finClasse E
Classe F hrite de Classe E
priv statique methode P;
public statique methode R;
finClasse F
Dans le code d'implmentation de la Classe F :
La mthode P utilise est celle qui dfinie dans la Classe F et elle masque la mthode P de la Classe E.
La mthode Q utilise est celle qui dfinie dans la Classe C.
La mthode R utilise est celle qui dfinie dans la Classe F et elle masque la mthode R de la Classe B
Soit en Delphi l'criture des classes ClasseA et ClasseB de la hirarchie ci-haut :
Delphi Explications
ClasseA = class
public
procedure P(x,y : integer);
private
procedure Q(a,b,c : string);
protected
procedure R;
end;
Dans la classe ClasseB :
La mthode procedure P(u : char) surcharge
statiquement (masque) avec une autre signature, la
mthode hrite de sa classe parent procedure
P(x,y : integer).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
503
ClasseB = class ( ClasseA )
public
procedure P(u : char);
private
procedure Q(a,b,c : string);
protected
procedure R(x,y : real);
end;
La mthode procedure Q(a,b,c : string) surcharge
statiquement (masque) avec la mme signature, la
mthode hrite de sa classe parent procedure
Q(a,b,c : string).
La mthode procedure R(x,y : real) surcharge
statiquement (masque) avec une autre signature, la
mthode hrite de sa classe parent procedure R.
Utilisation pratique : Possibilit notamment de dfinir un nouveau comportement li la
classe descendante et ventuellement de changer le niveau de visibilit de la mthode.
Exemple de code Delphi :
ClasseA = class
public
procedure P(x,y : integer);
procedure Q(a,b,c : string);
procedure R;
end;
ClasseB = class ( ClasseA )
public
procedure P(u : char);
procedure Q(a,b,c : string);
procedure R(x,y : real);
end;
........
.........
var ObjA:ClasseA;
ObjB:ClasseB;
.....
ObjA := ClasseA.create;
ObjA.P( 10, 5 );
ObjA.Q( 'abc', 'ef', 'ghi' );
ObjA.R;
.........
ObjB := ClasseB.create;
ObjB.P( 'g' );
ObjB.Q( 'abc', 'ef', 'ghi' );
ObjB.R( 1.2, -5.36 );
2.4 Surcharge dynamique dans une classe drive :
Un type driv peut redfinir (surcharger dynamiquement) une mthode liaison dynamique hrite. On
appelle aussi virtuelle une telle mthode liaison dynamique, nous utiliserons donc souvent ce raccourci de
notation pour dsigner une mthode surchargeable dynamiquement.
L'action de redfinition fournit une nouvelle dfinition de la mthode qui sera appele en fonction du type de
l'objet au moment de l'excution et non du type de la variable de refrence connue au moment de la
compilation.
Ci-dessous un exemple de hirarchie de classes et de redfinitions (surcharges
dynamiques) successives fictives de mthodes liaison dynamique dans certaines classes
drives, pour les modifications de visibilit il faut tudier le manuel de chaque langage :
Classe A
public dynamique methode P;
priv dynamique methode Q;
protg dynamique methode R;
finClasse A
Classe B hrite de Classe A
public dynamique methode P;
priv dynamique methode Q;
protg dynamique methode R;
finClasse B
Classe C hrite de Classe B
protg dynamique methode P;
priv dynamique methode Q;
finClasse C
Classe D hrite de Classe C
public dynamique methode P;
finClasse D
Classe E hrite de Classe D
protg dynamique methode P;
finClasse E
Classe F hrite de Classe E
priv dynamique methode P;
public dynamique methode R;
finClasse F
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
504
Remarque pratique :
Une mthode redfinissant une mthode virtuelle peut selon les langages changer le niveau de visibilit ( il est
conseill de laisser la nouvelle mthode redfinie au moins aussi visible que la mthode virtuelle parent).
Tableau comparatif liaison dynamique-statique
Liaison statique Liaison dynamique
Lors d'un appel pendant l'excution leur liaison est
trs rapide car le compilateur a gnr l'adresse
prcise du code de la mthode lors de la
compilation.
Lors d'un appel pendant l'excution leur liaison plus
lente car l'adresse prcise du code de la mthode est
obtenu par un processus de recherche dans une
structure de donnes.
Une telle mthode fonctionne comme une
procdure ou fonction d'un langage non orient
objet et ne permet pas le polymorphisme. Car lors
d'un appel pendant l'excution c'est toujours le
mme code qui est excut quel que soit le type de
l'objet qui l'invoque.
Une telle mthode autorise le polymorphisme, car
bien que portant le mme nom dans une hirarchie de
classe, lors d'un appel pendant l'excution c'est
toujours le type de l'objet qui l'invoque qui dclenche
le mcanisme de recherche du code adquat.
2.5 La rpartition des mthodes en Delphi
Le terme de rpartition des mthodes est synonyme de liaison et fait rfrence la faon
dont un programme dtermine o il doit rechercher le code d'une mthode lorsqu'il rencontre
un appel cette mthode.
En Delphi, il existe trois modes de rpartition des mthodes qui peuvent tre :
Statiques ,
Virtuelles,
Dynamiques.
Mthodes statiques en Delphi
Les mthodes statiques de Delphi sont des mthodes liaison prcoce.
type
MaClasse=class
Etat:string;
procedure Un; //statique
procedure Deux; //statique
end;
SousClasse=class(MaClasse)
procedure Trois; //statique
end;
Dans SousClas nous avons 3 mthodes statiques :
Un (celle de la mre) , Deux (celle de la mre), Trois (celle de la
fille).
Var Obj : MaClasse ;
Obj := SousClasse.Create ;
Obj.Un ;
Obj.Deux ;
Obj.Trois ;
Appel de
Un de
MaClasse
Appel de
Deux de
MaClasse
Appel de
Trois de
sousClasse
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
505
Voyons ce qui se passe lorsque dans la classe fille on tente de "redfinir" une mthode hrite
de la classe mre. Ci-aprs nous tentons de "redfinir" la mthode Deux :
type
MaClasse=class
Etat:string;
procedure Un; //statique
procedure Deux; //statique
end;
SousClasse=class(MaClasse)
procedure Deux; //statique
procedure Trois; //statique
end;
Dans SousClas nous avons 3 mthodes statiques :
Un (celle de la mre) , Deux (celle de la mre), Trois (celle de la
fille).
Var Obj : MaClasse ;
Obj := SousClasse.Create ;
Obj.Un ;
Obj.Deux ;
Obj.Trois ;
Lors de l'excution de l'appel Obj.Deux, rien n'a chang. En effet lors de la compilation la
variable Obj est dclare de type MaClasse, c'est donc l'adresse du code de la mthode Deux
de la classe MaClasse qui est lie. Le type SousClasse de l'objet rel vers lequel pointe Obj
pendant l'excution n'a aucune influence sur le mode de rpartition :
Cela signifie qu'il est impossible de redfinir une mthode statique P; c'est toujours le
mme code qui est excut, quelque soit la classe dans laquelle P est appele.
Si l'on dclare dans une classe drive une mthode portant le mme nom qu'une mthode
statique de la classe mre avec la mme signature ou bien avec une signature diffrente, la
nouvelle mthode remplace simplement la mthode hrite dans la classe drive, nous
dirons qu'elle masque la mthode mre.
Masquage avec la mme signature Masquage avec une signature diffrente
type
MaClasse=class
Etat:string;
procedure Un; //statique
procedure Deux; //statique
end;
SousClasse=class(MaClasse)
procedure Deux; // masque la mthode mre
procedure Trois; //statique
end;
type
MaClasse=class
Etat:string;
procedure Un; //statique
procedure Deux; //statique
end;
SousClasse=class(MaClasse)
procedure Deux ( x : byte ) ; // masque la mthode mre
procedure Trois; //statique
end;
Var Obj : MaClasse ;
Obj := SousClasse.Create ;
Obj.Un ;
Obj.Deux ;
Obj.Trois ;
Var Obj : MaClasse ;
Obj := SousClasse.Create ;
Obj.Un ;
Obj.Deux ;
Obj.Trois ;
Obj.Deux ( 49 ) ;
Appel de
Un de
MaClasse
Appel de
Deux de
MaClasse
Appel de
Trois de
sousClasse
Appel de
Deux de
MaClasse
Appel de
Deux de
MaClasse
Erreur de compilation ! car
Obj est de type MaClasse et
la signature Deux (byte)
n'existe pas dans MaClasse.
Important
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
506
Mthodes virtuelles en Delphi
Les mthodes virtuelles utilisent un mcanisme de rpartition ncessitant une recherche
contrairement aux mthodes statiques. Une mthode virtuelle peut tre redfinie dans les
classes descendantes sans masquer ses diffrentes versions dans les classes anctres.
A l'oppos d'une mthode statique l'adresse du code de la mthode virtuelle n'est pas
dtermine lors de la compilation, mais seulement lors de l'excution et en fonction du type de
l'objet qui l'appelle.
Les mthodes virtuelles de Delphi sont des mthodes liaison tardive.
Pour dclarer une mthode virtuelle, il faut ajouter le qualificateur virtual la fin de la
dclaration de l'en-tte de la mthode :
procedure P(x,y : integer); virtual ;
Comment se passe la liaison dynamique avec Delphi ?
Delphi implante d'une faon classique le mcanisme de liaison dynamique :
Lors de la compilation, Delphi rajoute chaque classe une Table des Mthodes
Virtuelles (TMV). Cette table contient en principal, pour chaque mthode dclare
avec le qualificateur virtual :
- un pointeur sur le code de la mthode,
- la taille de l'objet lui-mme
Donc chaque objet possde sa propre TMV , et elle est unique.
La TMV d'un objet est cre avec des pointeurs vides lors de la compilation, elle est
remplie lors de l'excution du programme ( plus prcisment lors de l'instanciation
de l'objet) car c'est l'excution que l'adresse du code de la mthode est connue et
donc stocke dans la TMV.
En fait c'est le constructeur de l'objet lors de son instanciation qui lance le stockage
dans la TMV des adresses de toutes les mthodes virtuelles de l'objet, la fois les
mthodes hrites et les mthodes nouvelles.
Lorsque l'on construit une nouvelle classe hritant d'une autre classe mre, la nouvelle classe
rcupre dans sa TMV toutes les entres de la TMV de sa classe mre, plus les nouvelles
entres correspondant aux mthodes virtuelles dclares dans la nouvelle classe. Une TMV
est donc une structure de donnes qui grossit au cours de l'hritage de classe et peut tre assez
volumineuse pour des objets de classes situes en fin de hirarchie.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
507
Redfinition de mthode virtuelle avec Delphi
Pour redfinir une mthode virtuelle dans les classes descendantes sans masquer ses
diffrentes versions dans les classes anctres, il faut ajouter la fin de sa dclaration d'en-tte
le qualificateur override.
Reprenons l'exemple prcdent et tentons de "redfinir" la mthode Deux cette fois en la
dclarant virtuelle dans la classe mre et redfinie dans la classe fille, puis comparons le
comportement polymorphique de la mthode Deux selon qu'elle est virtuelle ou statique :
type
MaClasse=class
Etat:string;
procedure Un; //statique
procedure Deux; virtual ; //virtuelle
end;
SousClasse=class(MaClasse)
procedure Deux; override; //redfinie
procedure Trois; //statique
end;
Dans SousClas nous avons 2 mthodes statiques : Un , Trois
et une mthode virtuelle redfinie : Deux
Var Obj : MaClasse ;
Obj := SousClasse.Create ;
Obj.Un ;
Obj.Deux ;
Obj.Trois ;
type
MaClasse=class
Etat:string;
procedure Un; //statique
procedure Deux; //statique
end;
SousClasse=class(MaClasse)
procedure Deux; //statique
procedure Trois; //statique
end;
Dans SousClas nous avons 3 mthodes statiques :
Un (celle de la mre) , Deux (celle de la mre), Trois (celle de la
fille).
Var Obj : MaClasse ;
Obj := SousClasse.Create ;
Obj.Un ;
Obj.Deux ;
Obj.Trois ;
Mthodes dynamiques en Delphi
Les mthodes dynamiques sont des mthodes virtuelles avec un mcanisme de rpartition
diffrent, donc les mthodes dynamiques de Delphi sont des mthodes liaison tardive.
Au lieu d'tre stockes dans la Table des Mthodes Virtuelles, les mthodes dynamiques
sont ajoutes dans une structure de donnes de liste spcifique pour chaque objet (la liste
des mthodes dynamiques).
Seules les adresses des mthodes nouvelles ou redfinies d'une classe sont ranges dans sa
liste.
Appel de
Deux de
sousClasse
Appel de
Deux de
MaClasse
technique
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
508
La liaison prcode d'une mthode dynamique hrite s'effectue en recherchant dans la liste
des mthodes dynamiques de chaque anctre, en remontant la hirarchie de l'hritage.
Pour dclarer une mthode dynamique, il faut ajouter le qualificateur dynamic la fin de la
dclaration de l'en-tte de la mthode :
procedure P(x,y : integer); dynamic ;
Toute mthode sans qualification particulire est considre comme
statique par dfaut.
Comme les mthodes dynamiques ne disposent pas d'entres dans la table
des mthodes virtuelles de l'objet, elles rduisent la quantit de mmoire
occupe par les objets.
Si une mthode est appele frquemment, ou si le temps d'excution est un
paramtre important, il vaut mieux dclarer une mthode virtuelle plutt
que dynamique.
Masquage de mthode virtuelle avec Delphi
Pour masquer une mthode virtuelle dans une de ses classes, il suffit de ne pas ajouter la fin
de sa dclaration d'en-tte le qualificateur override.
Ceci peut se faire de deux faons soit en masquant par une mthode statique, soit en masquant
par une mthode dynamique.
Masquage par une mthode dynamique
Dans le code suivant, la mthode Deux dclare virtuelle dans la classe mre, est masque par
une mthode Deux ayant la mme signature et dclare elle aussi virtuelle dans la classe fille :
type
MaClasse=class
Etat:string;
procedure Un; //statique
procedure Deux; virtual; //virtuelle
end;
SousClasse=class(MaClasse)
procedure Un ; //statique, masque la mthode anctre
procedure Deux;virtual; // virtuelle, masque la mthode anctre, mais elle-mme est redfinissable
end;
Remarques de Borland
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
509
comparons le comportement polymorphique de la mthode Deux selon qu'elle est redfinie,
masque par une mthode statique ou masque par une mthode virtuelle :
type
MaClasse=class
Etat:string;
procedure Un; //statique
procedure Deux; virtual ; //virtuelle
end;
SousClasse=class(MaClasse)
procedure Deux; override; //redfinie
procedure Trois; //statique
end;
Dans SousClas nous avons 2 mthodes statiques : Un , Trois
et une mthode virtuelle redfinie : Deux
Var Obj : MaClasse ;
Obj := SousClasse.Create ;
Obj.Un ;
Obj.Deux ;
Obj.Trois ;
type
MaClasse=class
Etat:string;
procedure Un; //statique
procedure Deux; virtual ; //virtuelle
end;
SousClasse=class(MaClasse)
procedure Deux; //masquage
procedure Trois; //statique
end;
Dans SousClas nous avons 2 mthodes statiques : Un , Trois
et une mthode virtuelle masque statiquement : Deux
Var Obj : MaClasse ;
Obj := SousClasse.Create ;
Obj.Un ;
Obj.Deux ;
Obj.Trois ;
type
MaClasse=class
Etat:string;
procedure Un; //statique
procedure Deux; virtual ; //virtuelle
end;
SousClasse=class(MaClasse)
procedure Deux; virtual ; //masquage
procedure Trois; //statique
end;
Dans SousClas nous avons 2 mthodes statiques : Un , Trois
et une mthode virtuelle masque virtuellemnt: Deux
Var Obj : MaClasse ;
Obj := SousClasse.Create ;
Obj.Un ;
Obj.Deux ;
Obj.Trois ;
Nous pouvons conclure de ce tableau de comparaison que le masquage (par une mthode
statique ou virtuelle) ne permet jamais le polymorphisme.
Le polymorphisme de mthode offre la possibilit de conserver le mme nom de mthode
dans une hirarchie de classe, afin de ne pas "surcharger" le cerveau de l'utilisateur. Les
comportements seront diffrents selon le type d'objet utilis.
Par exemple l'action de Dmarrer dans une hirarchie de vhicules :
Appel de
Deux de
sousClasse
Appel de
Deux de
MaClasse
Appel de
Deux de
MaClasse
Exemple pratique
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
510
Nous voyons bien que smantiquement parlant on peut dire qu'une
voiture dmarre, qu'un voilier dmarre, qu'un croiseur dmarre,
toutefois les actions internes permettant le comportement
dmarrage ne sont pas les mmes.
Dmarrer dans la classe voiture : tourner la clef de contact,
engager une vitesse,...
Dmarrer dans la classe voilier : hisser les voiles, dgager la
barre,...
Dmarrer dans la classe croiseur : lancer les moteurs,
modifier la barre,...
L'action Dmarrer est polymorphe (car elle s'adapte au type de vhicule qui l'excute).
Pour traduire en Delphi, ce comportement polymorphe de l'action Dmarrer, nous allons
utiliser une mthode virtuelle que nous redfinissons dans toutes les classes drives.
Soit en Delphi l'criture de l'exemple de la hirarchie prcdente :
Delphi
Vehicule = class
public
procedure Demarrer; virtual; //virtuelle
end;
Terrestre = class ( Vehicule )
.....
end;
Voiture = class ( Terrestre )
public
procedure Demarrer; override; //redfinie
end;
Marin = class ( Vehicule )
.....
end;
Voilier = class ( Marin )
public
procedure Demarrer; override; //redfinie
end;
Croiseur = class ( Marin )
public
procedure Demarrer; override; //redfinie
end;
Exemple de code d'utilisation :
Vehicule = class
public
procedure Demarrer; virtual; (1)
end;
Voiture = class ( Terrestre )
public
procedure Demarrer; override; (2)
end;
........
var Vehic1 : Vehicule;
Auto1, Auto2 : Voiture;
.....
Vehic1 := Vehicule.Create; //instanciation dans le type
Auto1 := Voiture.Create; //instanciation dans le type
Auto2 := Voiture.Create; //instanciation dans le type
Vehic1.Demarrer; //mthode du type Vehicule (1)
Auto1.Demarrer; //mthode du type Voiture (2)
Auto2.Demarrer; //mthode du type Voiture (2)
Vehic1 := Auto1; //pointe vers un objet de type hrit
Vehic1.Demarrer; // polymorphisme l'uvre ici: (2)
.........
Vehic1 := Voiture.Create; //instanciation un type hrit
Vehic1.Demarrer; // polymorphisme l'uvre ici: (2)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
511
Illustrons l'exemple prcdent avec une image de la partie de code gnr sur la mthode
Demarrer et ensuite l'excution de ce code sur des objets effectifs. Nous avons numrot
(1) et (2) les deux codes d'implantation de la mthode Demarrer dans la classe parent et
dans la classe enfant :
Le code engendr contient des refrences vides
Lors de l'excution aprs mcanisme de rpartition selon le
genre de liaison et le type de l'objet, les refrences pointent
vers le code de la mthode du type effectif de l'objet.
2.6 Rutilisation de mthodes avec inherited
Le mot rserv inherited joue dans Delphi un rle particulier dans l'implmentation de
comportements polymorphiques (il joue un rle semblable super dans java et base dans
C#).
Il ne peut qu'apparatre dans une dfinition de mthode avec ou sans identificateur la suite.
Si inherited prsent dans une methode P de la classeA est suivi par le nom d'une mthode
Q, il reprsente un appel normal de la mthode Q, sauf que la recherche de la mthode
invoquer commence dans l'anctre immdiat de la classe de la mthode et remonte la
hirarchie.
Si inherited prsent dans une methode P de la classeA, n'est suivi d'aucun nom de
mthode, il reprsente alors un appel une mthode de mme nom P, la recherche de la
mthode invoquer commence dans l'anctre immdiat de la classe de la mthode P
actuelle et remonte la hirarchie.
procedure classeA.P(x,y : integer);
begin
inherited ;
end;
procedure classeA.P(x,y : integer);
begin
inherited Q ( x );
end;
<=> inherited P(x,y);
pui recherche et appel
de P(x,y) dans les
anctres de classeA
Recherche et appel de
Q ( x ) dans les
anctres de classeA
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
512
3. Polymorphisme de classes abstraites
Introduction
Les classes abstraites permettent de crer des classes gnriques expliquant certains comportements sans
les implmenter et fournissant une implmentation commune de certains autres comportements pour
l'hritage de classes. Les classes abstraites sont un outil prcieux pour le polymorphisme.
Vocabulaire et concepts :
Une classe abstraite est une classe qui ne peut pas tre instancie.
Une classe abstraite peut contenir des mthodes dj implmentes.
Une classe abstraite peut contenir des mthodes non implmentes.
Une classe abstraite est hritable.
On peut contsruire une hirarchie de classes abstraites.
Pour pouvoir construire un objet partir d'une classe abstraite, il faut driver une classe non
abstraite en une classe implmentant toutes les mthodes non implmentes.
Une mthode dclare dans une classe, non implmente dans cette classe, mais juste dfinie par
la dclaration de sa signature, est dnomme mthode abstraite.
Une mthode abstraite est une mthode liaison dynamique nayant pas dimplmentation dans la
classe o elle est dclare. L' implmentation d'une mthode abstraite est dlgue une classe
drive.
Si vous voulez utiliser la notion de classe abstraite pour fournir un comportement
polymorphe un groupe de classes, elles doivent toutes hriter de la mme classe abstaite,
comme dans l'exemple ci-dessous :
La classe Vhicule est abstraite, car la mthode Dmarrer est abstraite et sert de
"modle" aux futures classes drivant de Vhicule, c'est dans les classes voiture, voilier
et croiseur que l'on implmente le comportement prcis du genre de dmarrage.
Notons au passage que dans la hirarchie prcdente, les classes vehicule Terrestre et
Marin hritent de la classe Vhicule, mais n'implmentent pas la mthode abstraite
Dmarrer, ce sont donc par construction des classes abstraites elles aussi.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
513
Les classes abstraites peuvent galement contenir des membres dj implments. Dans cette ventualit,
une classe abstraite propose un certain nombre de fonctionnalits identiques pour tous ses futurs descendants
(ceci n'est pas possible avec une interface).
Exemple : la classe abstraite Vhicule n'implmente pas la mthode abstraite Dmarrer,
mais fournit et implante une mthode "RpartirPassagers" de rpartition des passagers
bord du vhicule (fonction de la forme, du nombre de places, du personnel charg de
s'occuper de faire fonctionner le vhicule...), elle fournit aussi et implante une mthode
"PriodicitMaintenance" renvoyant la priodicit de la maintenance obligatoire du
vhicule (fonction du nombre de km ou miles parcourus, du nombre d'heures
d'activits,...)
Ce qui signifie que toutes les classes voiture, voilier et croiseur savent comment rpartir
leurs ventuels passagers et quand effectuer une maintenance, chacune d'elle implmente
son propre comportement de dmarrage.
Syntaxe de l'exemple en Delphi et en Java :
Delphi Java
Vehicule = class
public
procedure Demarrer; virtual;abstract;
procedure RpartirPassagers; virtual;
procedure PriodicitMaintenance; virtual;
end;
abstract class ClasseA {
public abstract void Demarrer( );
public void RpartirPassagers( );
public void PriodicitMaintenance( );
}
Utilisez une classe abstraite lorsque vous voulez :
regrouper un ensemble de mthodes prsentant des fonctionnalits identiques,
dlguer l'implmentation de certaines mthodes une classe drive,
disposer immdiatement de fonctionnalits concrtes pour d'autres mthodes,
assurer un comportement polymorphe aux mthodes dont on dlgue l'implantation
du code des classes drives.
Utilisation pratique des classes abstraites
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
514
Exemple de code Delphi pour la hirarchie ci-dessous :
Soit en Delphi l'criture d'un exemple tir de cette hirarchie :
Delphi
Unit UclassVehicules;
interface
Vehicule = class
public
procedure Demarrer; virtual;abstract;
procedure RpartirPassagers; virtual;
procedure PriodicitMaintenance; virtual;
end;
Terrestre = class ( Vehicule )
public
procedure PriodicitMaintenance; override;
end;
Voiture = class ( Terrestre )
public
procedure Demarrer; override;
procedure RpartirPassagers; override;
end;
Marin = class ( Vehicule )
public
procedure PriodicitMaintenance; override;
end;
Voilier = class ( Marin )
public
procedure Demarrer; override;
procedure RpartirPassagers; override;
end;
Croiseur = class ( Marin )
public
procedure Demarrer; override;
procedure RpartirPassagers; override;
end;
implementation
//--- les mthodes implantes de la classe abstraite Vehicule :
procedure Vehicule.RpartirPassagers;
begin
..........
end;
procedure Vehicule.PriodicitMaintenance;
begin
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
515
..........
end;
//--- les mthodes implantes de la classe abstraite Terrestre :
procedure Terrestre.PriodicitMaintenance;
begin
..........
end;
//--- les mthodes implantes de la classe abstraite Marin :
procedure Marin.PriodicitMaintenance;
begin
..........
end;
//--- les mthodes implantes de la classe Voiture :
procedure Voiture.Demarrer;
begin
..........
end;
procedure Voiture.RpartirPassagers;
begin
..........
end;
//--- les mthodes implantes de la classe Voilier :
procedure Voilier.Demarrer;
begin
..........
end;
procedure Voilier.RpartirPassagers;
begin
..........
end;
//--- les mthodes implantes de la classe Croiseur :
procedure Croiseur.Demarrer;
begin
..........
end;
procedure Croiseur.RpartirPassagers;
begin
..........
end;
end.
Dans cet exemple :
Les classes Vehicule, Marin et Terrestre sont abstraites car aucune n'implmente la
mthode abstraite Demarrer
Les classes Marin et Terrestre contiennent chacune une surcharge dynamique
implmente de la mthode virtuelle PriodicitMaintenance qui est dj implmente
dans la classe Vhicule.
Les classes Voiture, Voilier et Croiseur ne sont pas abstraites car elles implmentent les
(la) mthodes abstraites de leurs parents.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
516
Exercice trait sur le polymorphisme
Objectifs : Comparer le polymorphisme et l'utilisation de tests de type if...then avec
l'oprateur is.
On souhaite construire une application utilisant des classes de gestion de structures de
donnes de noms (chanes). Ces classes devraient tre capables de lancer une intialisation
de la structure, de trier par ordre croissant les donnes, de les afficher dans un diteur de
texte. Nous voulons disposer d'une quatrime classe possdant une mthode gnrale
d'dition d'une structure de donnes aprs son ordonnancement.
- Au dpart nous travaillons sur une classe contenant un tableau, une classe
contenant une liste chane et une classe contenant un fichier. Chaque classe
contient trois mthodes : Tri, Initialiser, et Ecrire qui ne seront qu'esquisses, car
c'est la conception de la hirarchie qui nous intresse dans cet exemple et non le
code interne. Le lecteur peut s'il le souhaite dvelopper un code personnel pour
toutes ces mthodes.
LES TYPES DE STRUCTURES DE BASE PROPOSES
Nous proposons de travailler avec les types de donnes suivants :
type
Element=record
clef : integer;
info : ShortString;
end;
tableau=Array[1..100]of Element;
fichier = file of Element; pointeur = ^chainon;
chainon=record
data:Element;
suivant:pointeur
end;
Nous supposons avoir fourni ces informations deux quipes de dveloppement leur
laissant le choix de l'organisation des classes.
La premire quipe dcide d'implanter les 3 classes partir de la classe racine
(TObject en Delphi).
La seconde quipe de dveloppement a choisi pour le mme problme d'implmenter
les 3 classes partir d'une hirarchie de classes fonde sur une classe abstraite.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
517
CLASSES DESCENDANT DE TObject
Equipe1-1) L'quipe implmente une gestion de structure de donnes partir de classe
hritant toutes de la classe racine TObject avec des mthodes liaison statique.
Ttable=class
T:Tableau;
procedure Tri;
procedure Initialiser;
procedure Ecrire(Ed:Tedit);
end ;
Tliste=class
L:pointeur;
procedure Tri;
procedure Initialiser;
procedure Ecrire(Ed:Tedit);
end ;
Tfichier=class
F:fichier;
procedure Tri;
procedure Initialiser;
procedure Ecrire(Ed:Tedit);
end ;
Ce choix permet aux membres de l'quipe n1 de dclarer et d'instancier des objets dans
chaque classe :
var
S1:Ttable; S2:Tliste; S3:Tfichier;
S1:=Ttable.Create;
S1.Initialiser;
S1.Tri;
S1.Ecrire(Form1.Edit1);
S2:=Tliste.Create;
S2.Initialiser;
S2.Tri;
S2.Ecrire(Form1.Edit1);
S3:=Tfichier.Create;
S3.Initialiser;
S3.Tri;
S3.Ecrire(Form1.Edit1);
L'quipe n1 pourra utiliser le polymorphisme d'objet en dclarant une refrence d'objet de
classe racine puis en l'instanciant selon les besoins dans l'une des trois classes. Il sera alors
ncessaire de transtyper la refrence en testant auparavant par scurit, l'appartenance de
l'objet refrenc la bonne classe :
var
S1:TObject;
if S1 is Ttable then
begin
Ttable(S1).Initialiser;
Ttable(S1).Tri;
Ttable(S1).Ecrire(Form1.Edit1);
End
if S1 is Tliste then
begin
Tliste(S1).Initialiser;
Tliste(S1).Tri;
Tliste(S1).Ecrire(Form1.Edit1);
end
if S1 is Tfichier then
begin
Tfichier(S1).Initialiser;
Tfichier(S1).Tri;
Tfichier(S1).Ecrire(Form1.Edit1);
end
<< S1:=Ttable.Create; >> << S1:=Tliste.Create; >> << S1:=TFichier.Create; >>
Dans l'application, l'quipe n1 construit une classe TUseData qui possde une mthode
gnrale d'dition d'une structure de donnes aprs ordonnancement , cette mthode utilise
le polymorphisme d'objet pour s'adapter la structure de donnes diter :
TUseData=class
Procedure Editer ( x : Tobject );
end ;
C'est le paramtre formel de classe gnrale TObject qui est polymorphe, les valeurs
effectives qu'il peut prendre sont : n'importe quel objet de classe hritant de Tobject.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
518
Code de la mthode Editer de TuseData :
Procedure TUseData .Editer ( x : Tobject );
Begin
if x is Ttable then
begin
Ttable(x).Tri;
Ttable(x).Ecrire(Form1.Edit1);
end
Else
if x is Tliste then
begin
Tliste(x).Tri;
Tliste(x).Ecrire(Form1.Edit1);
end
Else
if x is Tfichier then
begin
Tfichier(x)Tri;
Tfichier(x).Ecrire(Form1.Edit1);
end
End;
Equipe1-2) L'quipe livre au client l'application contenant en de multiples endroits un
appel la mthode Editer.
Equipe1-3) Deux mois aprs la livraison et la mise en place, le client souhaite rajouter
une nouvelle structure de donnes que nous nommons TDatas (par exemple de structure
d'arbre binaire).
L'quipe propose de poursuivre la mme
organisation en crant et en implantant
une nouvelle classe drivant de TObject :
TAutre=class
Data : TDatas;
procedure Tri;
procedure Initialiser;
procedure Ecrire(Ed:Tedit);
end ;
Equipe1-4) L'quipe 1 doit alors reprendre et modifier le code de la mthode Procedure
Editer ( x : Tobject); de la classe TUseData, en y ajoutant le test du nouveau type TDatas
comme suit :
Procedure TUseData .Editer ( x : Tobject);
Begin
if x is Ttable then else
if x is Tliste then else
if x is Tfichier then else
if x is TDatas then
begin
TDatas (x).Tri;
TDatas (x).Ecrire(Form1.Edit1);
end;
End;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
519
Cette dmarche de rajout et de recompilation, les membres de l'quipe n1 devront
l'accomplir dans chaque partie de l'application qui utilise la mthode Editer.
Equipe1-5) L'quipe n1 envoie ensuite au client :
- La nouvelle classe et son code,
- ainsi que la nouvelle version de toutes les parties de l'application qui font appel
la mthode Editer dont la prcdente version est maintenant caduque.
CLASSES DESCENDANT DE LA MEME CLASSE ABSTRAITE
Equipe2-1) L'quipe de dveloppement a choisi pour le mme problme d'implmenter
une hirarchie de classes fonde sur une classe abstraite qui a t nomme TStructData.
TStructData=class
procedure Tri;virtual;abstract;
procedure Initialiser;virtual;abstract;
procedure Ecrire(Ed:Tedit);virtual;abstract;
end ;
Toutes les autres classes driveront de TStructData, et possderont des mthodes
liaisons dynamiques afin d'utiliser ici le polymorphisme de mthodes :
Ttable=class (TStructData)
T:Tableau;
procedure Tri;override;
procedure Initialiser;override;
procedure Ecrire(Ed:Tedit);override;
end ;
Tliste=class (TStructData)
L:pointeur;
procedure Tri;override;
procedure Initialiser;override;
procedure Ecrire(Ed:Tedit);override;
end ;
Tfichier=class (TStructData)
F:fichier;
procedure Tri;override;
procedure Initialiser;override;
procedure Ecrire(Ed:Tedit);override;
end ;
Ce choix permet aux membres de l'quipe n2, comme pour ceux de l'quipe n1, de
dclarer et d'instancier des objets dans chaque classe :
var
S1:Ttable; S2:Tliste; S3:Tfichier;
S1:=Ttable.Create;
S1.Initialiser;
S1.Tri;
S1.Ecrire(Form1.Edit1);
S2:=Tliste.Create;
S2.Initialiser;
S2.Tri;
S2.Ecrire(Form1.Edit1);
S3:=Tfichier.Create;
S3.Initialiser;
S3.Tri;
S3.Ecrire(Form1.Edit1);
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
520
L'quipe n2 pourra utiliser le polymorphisme de mthode en dclarant une refrence
d'objet de classe racine abstraite puis en l'instanciant selon les besoins dans l'une des
trois classes. Mais ici, il ne sera pas ncessaire de transtyper la refrence ni de tester
auparavant par scurit, l'appartenance de l'objet refrenc la bonne classe. En effet les
mthodes Initialiser, Tri et Ecrire tant virtuelles, c'est le type de l'objet lors de l'excution
qui dterminera le bon choix :
Var S1 : TStrucData;
<< S1:=Ttable.Create; >> << S1:=Tliste.Create; >> << S1:=TFichier.Create; >>
S1.Initialiser;
S1.Tri;
S1.Ecrire (Form1.Edit1);
Dans l'application, l'quipe n2 comme l'quipe n1, construit une classe TUseData qui
possde une mthode gnrale d'dition d'une structure de donnes aprs ordonnancement,
cette mthode utilise le polymorphisme d'objet et le polymorphisme de mthode pour
s'adapter la structure de donnes diter :
TUseData=class
Procedure Editer ( x : TstructData );
end ;
Mthode Editer de TuseData :
Mthode Editer de TuseData : quipe n2 Mthode Editer de TuseData : quipe n1
Procedure TuseData.Editer ( x : TstructData );
Begin
x.Tri;
x.Ecrire(Form1.Edit1);
End;
Procedure TUseData .Editer ( x : Tobject );
Begin
if x is Ttable then
begin
Ttable(x).Tri;
Ttable(x).Ecrire(Form1.Edit1);
end else
if x is Tliste then
begin
Tliste(x).Tri;
Tliste(x).Ecrire(Form1.Edit1);
end else
if x is Tfichier then
begin
Tfichier(x)Tri;
Tfichier(x).Ecrire(Form1.Edit1);
end
End;
Equipe2-2) L'quipe livre au client l'application contenant en de multiples endroits un
appel notre mthode Editer.
Equipe2-3) Deux mois aprs l'quipe n2 s'est vu demander comme pour l'autre quipe,
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
521
de rajouter une nouvelle structure de donnes (par exemple de structure d'arbre binaire).
L'quipe n2 cre et implante une nouvelle classe drivant de la classe abstraite
TStructData comme pour les 3 autres classes dj existantes :
TAutre=class (TStructData)
Data : TDatas;
procedure Tri;override;
procedure Initialiser;override;
procedure Ecrire(Ed:Tedit);override;
end ;
Grce au polymorphisme d'objet et de mthode liaison dynamique la mthode Editer
fonctionne avec toutes les descendants de TstructData.
Equipe2-4) L'quipe n2 n'a pas modifier le code de la mthode Procedure Editer ( x :
TStructData).
Equipe2-5) Il suffit l'quipe n2 d'envoyer au client la nouvelle classe et son code
(toutes les parties de l'application qui font appel la mthode Editer fonctionneront
correctement automatiquement) !
Squelettes des mthodes
Les deux quipes ont coopr entre elles, le code des mthodes est le mme quelque soit le choix effectu
(hriter de TObject ou hriter d'une classe abstraite).
//////////////////// Les tableaux /////////////////////////
procedure Ttable.Tri;
begin
//algorithme de tri d'un tableau
T[1].info:=T[1].info+' : tableau tri'
end;
procedure Ttable.Initialiser;
begin
T[1].clef:=100;
T[1].info:='Durand';//etc...
end;
procedure Ttable.Ecrire(Ed:Tedit);
begin
Ed.Text:='Clef= '+inttostr(T[1].clef)+'//'+T[1].info
end;
//////////////////// Les listes chanes /////////////////////////
procedure Tliste.Tri;
begin
//algorithme de tri d'une liste ...
L.data.info:=L.data.info+' : liste trie'
end;
procedure Tliste.Initialiser;
begin
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
522
new(L);
L.data.clef:=100;
L.data.info:='Durand';
L.suivant:=nil //etc...
end;
procedure Tliste.Ecrire(Ed:Tedit);
begin
Ed.Text:='Clef= '+inttostr(L.data.clef)+'//'+L.data.info
end;
//////////////////// Les fichiers /////////////////////////
procedure Tfichier.Tri;
var UnElement:Element;
begin
//algorithme de tri d'un fichier ...
AssignFile(F,'FichLocal');
reset(F);
read(F,UnElement);
CloseFile(F);
UnElement.info:=UnElement.info+' : fichier tri';
reset(F);
write(F,UnElement);
CloseFile(F)
end;
procedure Tfichier.Initialiser;
var UnElement:Element;
begin
AssignFile(F,'FichLocal');
rewrite(F);
UnElement.clef:=100;
UnElement.info:='Durand';
write(F,UnElement); //etc...
CloseFile(F)
end;
procedure Tfichier.Ecrire(Ed:Tedit);
var UnElement:Element;
begin
AssignFile(F,'FichLocal');
reset(F);
read(F,UnElement);
Ed.Text:='Clef= '+inttostr(UnElement.clef)+'//'+UnElement.info;
CloseFile(F);
end;
end.
Conclusion
Le polymorphisme a montr dans cet exemple ses extraordinaires facults d'adaptation et de
rutilisation. Nous avons constat le gain en effort de dveloppement obtenu par l'quipe qui a
choisi de rflchir la construction d'une hirarchie fonde sur une classe abstraite. Nous
conseillons donc de penser la notion de classe abstraite et aux mthodes virtuelles lors de
la programmation d'un problme avec des classes.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
523
5.4 Programmation vnementielle et
visuelle
Plan du chapitre:
Introduction
Programmation visuelle base sur les pictogrammes
Programmation oriente vnements
Normalisation du graphe vnementiel
le graphe vnementiel arcs et sommets
les diagrammes d'tats UML rduits
Tableau des actions vnementielles
Interfaces lies un graphe vnementiel
Avantages et modle de dveloppement RAD visuel
le modle de la spirale (B.Boehm)
le modle incrmental
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
524
1. Programmation visuelle base sur les pictogrammes
Le dveloppement visuel rapide d'application est fond sur le concept de programmation
visuelle associe la monte en puissance de l'utilisation des Interactions Homme-Machine
(IHM) dont le dynamisme rcent ne peut pas tre mconnu surtout par le dbutant. En
informatique les systmes MacOs, Windows, les navigateurs Web, sont les principaux
acteurs de l'ingnierie de l'IHM. Actuellement dans le dveloppement d'un logiciel, un temps
trs important est consacr l'ergonomie et la communication, cette part ne pourra que
grandir dans un avenir proche; car les utilisateurs veulent s'adresser des logiciels efficaces
(ce qui va de soi) mais aussi conviviaux et faciles d'accs.
Les dveloppeurs ont donc besoin d'avoir leur disposition des produits de dveloppement
adapts aux ncessits du moment. A ce jour la programmation visuelle est une des rponses
cette attente des dveloppeurs.
La programmation visuelle au tout dbut a t conue pour des personnes n'tant pas des
programmeurs en basant ses outils sur des manipulations de pictogrammes.
Le raisonnement communment admis est qu'un dessin associ une action lmentaire est
plus porteur de sens qu'une phrase de texte.
A titre d'exemple ci-dessous l'on enlve le "fichier.bmp" afin de l'effacer selon deux modes de
communication avec la machine: utilisation d'icnes ou entre d'une commande textuelle.
Effacement avec un langage d'action visuelle (souris)
Action : Rponse :
Effacement avec un langage textuel (clavier)
Action :
del c:\Exemple\Fichier.bmp
Rponse :
| ?
Nous remarquons donc dj que l'interface de communication MacOs, Windows dnomme
"bureau lectronique" est en fait un outil de programmation de commandes systmes.
Un langage de programmation visuelle permet "d'crire" la partie communication d'un
programme uniquement avec des dessins, diagrammes, icnes etc... Nous nous intressons
aux systmes RAD (Rapid Application Development) visuels, qui sont fonds sur des
langages objets bases d'icnes ou pictogrammes. Visual Basic de MicroSoft est le premier
RAD visuel a avoir t commercialis ds 1991, il est fond sur un langage Basic tendu
incluant des objets tendus en VB.Net depuis 2001, puis ds 1995 Delphi le premier RAD
visuel de Borland fond sur Pascal objet, puis actuellement toujours de Borland : C++Builder
RAD visuel fond sur le langage C++ et Jbuilder, NetBeans RAD visuel de Sun fonds sur le
langage Java, Visual C++, Visual J++ de Microsoft, Visual C# etc...
Le dveloppeur trouve actuellement, une offre importante en outil de dveloppement de RAD
visuel y compris en open source. Nous proposons de dfinir un langage de RAD visuel ainsi :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
525
Un langage visuel dans un RAD visuel est un gnrateur de code source du langage de base qui,
derrire chaque action visuelle (dpt de contrle, click de souris, modifications des proprits, etc...)
engendre des lignes de code automatiquement et d'un manire transparente au dveloppeur.
Des outils de dveloppement tels que Visual Basic ou Delphi sont adapts la programmation
visuelle pour dbutant. Toutefois l'efficacit des dernires versions depuis 3 ans a tendu leur
champ au dveloppement en gnral et dans l'activit industrielle et commerciale avec des
versions "entreprise" pour VB et "Architect "pour Delphi.
En outre, le systme windows est le plus largement rpandu sur les machines grand public
(90% des PC vendus en sont quips), il est donc trs utile que le dbutant en programmation
sache utiliser un produit de dveloppement (rapide si possible) sur ce systme.
Proposition :
Nous considrons dans cet ouvrage, la programmation visuelle la fois
comme une fin et comme un moyen.
La programmation visuelle est sous-tendue par la ractivit des programmes en rponse aux
actions de l'utilisateur. Il est donc ncessaire de construire des programmes qui rpondent
des sollicitations externes ou internes et non plus de programmer squentiellement (ceci est
essentiellement d aux architectures de Von Neumann des machines) : ces sollicitations sont
appeles des vnements.
Le concept de programmation dirige ou oriente par les vnements est donc la
composante essentielle de la programmation visuelle.
Terminons cette prsentation par 5 remarques sur le concept de RAD :
Nous ne considrerons pas comme utile pour des dbutants de dmarrer la programmtion visuelle
avec des RAD bass sur le langage C++. Du fait de sa large permissivit ce langage permet au
programmeur d'adopter certaines attitudes dangereuses sans contrle possible. Seul le programmeur
confirm au courant des piges et des subtilits de la programmation et du langage, pourra exploiter
sans risque la richesse de ce type de RAD.
Le RAD Delphi de Borland conu en 1995 est une extension du langage Object Pascal, qui a des
caractristiques trs proches de celles de C++ sans en avoir les inconvnients. L'aspect fortement
typ du langage pascal autorise la prise en compte par le dveloppeur dbutant de bonnes attitudes de
programmation.
Utiliser un RAD simple mais puissant
Avoir de bonnes mthodes ds le dbut
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
526
Le premier environnement de dveloppement visuel professionnel bas sur Object Pascal a t
conu par Apple pour le systme d'exploitation MacOs, sous la dnomination de MacApp en
1986. Cet environnement objet visuel permettait de dvelopper des applications MacIntosh avec
souris, fentre, menus droulants etc...
Le RAD Visual Basic de MicroSof conu partir de 1992, bas sur le langage Basic avait pour
objectif le dveloppement de petits logiciels sous Windows par des programmeurs non
expriments et occasionnels. Actuellement il se dcline en VB.Net un langage totalement
orient objet faisant partie intgrante de la plate-forme .Net Framework de Microsoft.
Le mtier de dveloppeur devrait terme, consister grce des outils tels que les RAD visuels,
prendre un "caddie" et aller dans un supermarch de composants logiciels gnriques adapts
son problme. Il ne lui resterait plus qu' assembler le flot des vnements reliant entre eux ces
logiciels en kit.
2. Programmation oriente vnements
Sous les versions actuelles de Windows, systme multi-tches premptif sur micro-ordinateur,
les concepts quant la programmation par vnement restent sensiblement les mmes que
sous les anciennes versions.
Nous dirons que le systme dexploitation passe lessentiel de son " temps " attendre une
action de lutilisateur (vnement). Cette action dclenche un message que le systme traite et
envoie ventuellement une application donne.
C'est Apple qui en a t le promoteur
Microsoft l'a popularis
Le concept de RAD a de beaux jours devant lui
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
527
Logique de conception selon laquelle un programme est construit avec des
objets et leurs proprits et daprs laquelle les interventions de lutilisateur
sur les objets du programme dclenchent lexcution des routines associes.
Par la suite, nous allons voir dans ce chapitre que la programmation dune application "
windows-like " est essentiellement une programmation par vnements associe une
programmation classique.
Nous pourrons construire un logiciel qui ragira sur les interventions de lutilisateur si nous
arrivons intercepter dans notre application les messages que le systme envoie. Or
lenvironnement RAD ( Delphi , comme dailleurs avant lui Visual Basic de Microsoft),
autorise la consultation de tels messages dun faon simple et souple.
Lapproche vnementielleintervient principalement dans linterface entre
le logiciel et lutilisateur, mais aussi dans la liaison dynamique du logiciel
avec le systme, et enfin dans la scurit.
Lapproche visuellenous aide et simplifie notre tche dans la construction
du dialogue homme-machine.
La combinaison de ces deux approches produit un logiciel habill et adapt
au systme dexploitation.
Il est possible de relier certains objets entre eux par des relations vnementielles. Nous les
reprsenterons par un graphe (structure classique utilise pour reprsenter des relations).
Lorsque lon utilise un systme multi-fentr du genre windows, lon dispose du clavier et de
la souris pour agir sur le systme. En utilisant un RAD visuel, il est possible de construire un
logiciel qui se comporte comme le systme sur lequel il sexcute. Lintrt est que
lutilisateur aura moins defforts accomplir pour se servir du programme puisquil aura des
fonctionnalits semblables au systme. Le fait que lutilisateur reste dans un environnement
familier au niveau de la manipulation et du confort du dialogue, assure le logiciel dun capital
confiance de dpart non ngligeable.
3. Normalisation du graphe vnementiel
Il nexiste que peu dlments accessibles aux dbutants sur la programmation oriente
objet par vnements. Nous construisons une dmarche mthodique pour le dbutant, en
partant de remarques simples que nous dcrivons sous forme de schmas drivs des
diagrammes d'tats d'UML. Ces schmas seront utiles pour nous aider dcrire et
implanter des relations vnementielles en Delphi ou dans un autre RAD vnementiel.
Une dfinition de la programmation oriente vnements
Deux approches pour construire un programme
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
528
Voici deux principes qui pour linstant seront suffisants nos activits de programmation.
Dans une interface windows-like nous savons que:
Certains vnements dclenchent immdiatement des actions comme par
exemple des appels de routines systme.
Dautres vnements ne dclenchent pas dactions apparentes mais activent
ou dsactivent certains autres vnements systme.
Nous allons utiliser ces deux principes pour conduire notre programmation par vnements.
Nous commencerons par le concept dactivation et de dsactivation, les autres vnements
fonctionneront selon les mmes bases. Dans un enseignement sur la programmation
vnementielle, nous avons constat que ce concept tait suffisant pour que les tudiants
comprennent les fondamentaux de lapproche vnementielle.
Remarque :
Attention! Il ne sagit que dune manire particulire de conduire notre
programmation, ce ne peut donc tre ni la seule, ni la meilleure (le sens accord
au mot meilleur est relatif au domaine pdagogique). Cette dmarche sest rvle
tre fructueuse lors denseignements dinitiation ce genre de programmation.
Nous supposons donc que lorsque lutilisateur intervient sur le programme en cours
dexcution, ce dernier ragira en premire analyse de deux manires possibles :
soit il lancera lappel dun routine (excution dune action, calcul, lecture de fichier,
message un autre objet comme ouverture dune fiche etc...),
soit il modifiera ltat dactivation dautres objets du programme et/ou de lui-mme, soit il
ne se passera rien, nous dirons alors quil sagit dune modification nulle.
Ces hypothses sont largement suffisantes pour la plupart des logiciels que nous pouvons
raisonnablement esprer construire en initiation. Les concepts plus techniques de messages
dpassent assez vite ltudiant qui risque de replonger dans de " la grande bidouille ".
3.1 le graphe vnementiel arcs et sommets
Nous proposons de construire un graphe dans lequel :
chaque sommet est un objet
sensible un vnement donn.
Hypothses de construction
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
529
Lvnement donn est dclench
par une action extrieure lobjet.
Les arcs du graphe reprsentent des actions lances par un sommet.
Soit le graphe vnementiel suivant compos de 5 objets sensibles chacun un vnement particulier dnot
Evt-1,..., Evt-5; ce graphe comporte des ractions de chaque objet l'vnement auquel il est sensible :
Les actions sont de 4 types
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
530
Imaginons que ce graphe corresponde une analyse de chargements de deux types diffrents
de donnes des fins de calcul sur leurs valeurs.
La figure suivante propose un tel graphe vnementiel partir du graphe vide prcdent.
Cette notation de graphe vnementiel est destine s'initier la pratique de la description
d'au maximum 4 types de ractions d'un objet sur la sollicitation d'un seul vnement.
Remarques :
- L'arc nomm, reprsentant l'activation d'une mthode correspond trs exactement la notation
UML de l'envoi d'un message.
- Lorsque nous voudrons reprsenter d'une manire plus complte d'autres ractions d'un seul
objet plusieurs vnements diffrents, nous pourrons utiliser la notation UML rduite de
diagramme d'tat pour un objet (rduite parce qu'un objet visuel ne prendra pour nous, que 2
tats: activ ou dsactiv).
3.2 les diagrammes d'tats UML rduits
Nous livrons ci-dessous la notation gnrale de diagramme d'tat en UML, les cas particuliers
et les dtails complets sont dcrits dans le document de spcification d'UML.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
531
Voici les diagrammes d'tats rduits extraits du graphe vnementiel prcdent, pour les
objets Evt-1 et Evt-2 :
..... etc...
Nous remarquerons que cette criture, pour l'instant, ne produit pas plus de sens que le graphe
prcdent qui comporte en sus la vision globale des interrelations entre les objets.
Ces diagrammes d'tats rduits deviennent plus intressants lorsque nous voulons exprimer le
fait par exemple, qu'un seul objet Obj1 ragit 3 vnements (vnement-1, vnement-2,
vnement-3). Dans ce cas dcrivons les portions de graphe vnementiel associs chacun
des vnements :
Raction de obj1 l'vnement-1 : Raction de obj1 l'vnement-2 :
Raction de obj1 l'vnement-3 :
Synthtisons dans un diagramme d'tat rduit les ractions ces 3 vnements :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
532
Lorsque nous jugerons ncessaire la comprhension de relations vnementielles dans un
logiciel visuel, nous pourrons donc utiliser ce genre de diagramme pour renforcer la
smantique de conception des objets visuels. La notation UML sur les diagrammes d'tats
comprend les notions d'tat de dpart, de sortie, imbriqu, historis, concurrents...
Lorsque cela sera ncessaire nous utiliserons la notation UML de synchronisation
d'vnements :
Dans le premier cas la notation reprsente la
conjonction des deux vnements ev1 et ev2 qui
dclenche l'vnement ev3.
ev1 ev2
ev3
Dans le second cas la notation reprsente
l'vnement ev4 dclenchant conjointement les
deux vnements ev5 et ev6.
ev4
ev5 ev6
4. Tableau des actions vnementielles
Lexemple de graphe vnementiel prcdent correspond une application qui serait sensible
5 vnements nots EVT-1 EVT-5, et qui excuterait 3 procdures utilisateur. Nous
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
533
notons dans un tableau (nomm " tableau des actions vnementielles")les rsultats obtenus
par analyse du graphe prcdent, vnement par vnement..
EVT-1
EVT-3 activable
EVT-4 activable
EVT-2 Appel de procdure
utilisateur "chargement-1"
dsactivation de l vnement
EVT-2
EVT-3 Appel de procdure
utilisateur "Analyser"
EVT-2 activable
EVT-4 EVT-2 dsactiv
EVT-5 activable
EVT-5 EVT-4 dsactiv immdiatement
Appel de procdure utilisateur
"chargement-2"
Nous adjoignons ce tableau une table des tats des vnements ds le lancement du logiciel
(elle correspond ltat initial des objets). Par exemple ici :
Evt1 activ
Evt2 dsactiv
Evt3 activ
Evt4 activ
Evt5 dsactiv
etc...
5. Interfaces lies un graphe vnementiel
construction dinterfaces lies au graphe prcdent
Interface n1
Dans lexemple de droite,
(i1,i2,i3,i4,i5)est une permutation sur
(1,2,3,4,5) .
Ce qui nous donne dj 5!=120
interfaces possibles avec ces objets et
uniquement avec cette topologie.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
534
La figure prcdente montre une IHM (construite avec des objets Delphi) partir du graphe
vnementiel tudi plus haut. Ci-dessous deux autres structures dinterfaces possibles avec
les mmes objets combins diffremment et associs au mme graphe vnementiel :
Interface n2
Interface n3
Pour les choix n2 et n3, il y a aussi 120 interfaces possibles
6. Avantages du modle de dveloppement RAD visuel
Lapproche uniquement structure (privilgiant les fonctions du logiciel) impose dcrire du
code long et compliqu en risquant de ne pas aboutir, car il faut tout tester afin dassurer un
bon fonctionnement de tous les lments du logiciel.
Lapproche vnementielle prfre btir un logiciel fond sur une construction graduelle en
fonction des besoins de communication entre lhumain et la machine. Dans cette optique, le
programmeur labore les fonctions associes une action de communication en privilgiant le
dialogue. Ainsi les actions internes du logiciel sont subordonnes au flux du dialogue.
Avantages lis la programmation par RAD visuel
Il est possible de construire trs rapidement un prototype.
Les fonctionnalits de communication sont les guides principaux du dveloppement
(approche plus vivante et attrayante).
Ltudiant est impliqu immdiatement dans le processus de conception - construction.
Ltudiant acquiert trs vite comme naturelle lattitude de rutilisation en se servant de "
logiciels en kit " (soit au dbut des composants visuels ou non, puis par la suite ses propres
composants).
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
535
Il ny a pas de conflit ni dincohrence avec la dmarche structure : les algorithmes tant
conus comme des botes noires permettant dimplanter certaines actions, seront rutiliss
immdiatement.
La mthodologie objet de COO et de POO reste un facteur dintgration gnral des activits
du programmeur.
Les actions de communications classiques sont assures immdiatement par des objets
standards (composants visuels ou non) ragissant des vnements extrieurs.
Le RAD fournira des classes dobjets standards non visuels (extensibles si ltudiant
augmente sa comptence) grant les structures de donnes classiques (Liste, arbre, etc..).
Lextensibilit permet lenseignant de rajouter ses kits personnels dobjets et de les mettre
la disposition des tudiants comme des outils standards.
Modles de dveloppement avec un RAD visuel objet
Le dveloppement avec ce genre de produit autorise une logique gnrale articule sur la
combinaison de deux modles de dveloppement :
le modle de la spirale (B.Boehm) en version simplifie
Dans le modle de la spirale la programmation exploratoire est utilise sous forme de
prototypes simplifis cycle aprs cycle. L'analyse s'amliore au cours de chaque cycle et fixe
le type de dveloppement pour ce tour de spirale.
le modle incrmental
Il permet de raliser chaque prototype avec un bloc central au dpart, s'enrichissant chaque
phase de nouveaux composants et ainsi que de leurs interactions.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
536
Associ un cycle de prototypage dans la spirale, une seule famille de composants est
dveloppe pour un cycle fix.
prototype 1 :
prototype 2 :
prototype 3 :
etc...
Ce modle de dveloppement l'aide d'objets visuels ou non, fournira en fin de parcours un
prototype oprationnel qui pourra s'intgrer dans un projet plus gnral.
Nous verrons sur des exemples comment ce type d'outil peut procurer aussi des
avantages au niveau de la programmation dfensive.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
537
5.5 Les vnements avec Delphi
Plan du chapitre:
Programmes vnementiels
Pointeur de mthode
Affecter un pointeur de mthode
Un vnement est un pointeur de mthode
Quel est le code engendr
Exercice-rcapitulatif
Notice mthodologique pour crer un nouvel vnement
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
538
1. Programmes vnementiels avec Delphi
Delphi comme les autres RAD vnementiels permet de construire du code qui est excut en
rponse des vnements. Un vnement Delphi est une proprit d'un type spcial que nous
allons examiner plus loin.
Le code de raction un vnement particulier est une mthode qui s'appelle un gestionnaire
de cet vnement.
Un vnement est en fait un pointeur vers la mthode qui est charge de le grer. Dfinissons
la notion de pointeur de mthode qui est utilise ici, notion largement utilise en gnral dans
les langages objets.
Pointeur de mthode
Un pointeur de mthode est une paire de pointeurs (adresses mmoire), le premier
contient l'adresse d'une mthode et le second une rfrence l'objet auquel appartient la
mthode.
Schma ci-aprs d'un objet Obj1 de classe clA contenant un champ du type pointeur vers la
mthode meth1 de l'objet Obj2 de classe clB :
Pointeur de mthode en Delphi
Pour pointer la mthode d'une instance d'objet en Delphi, nous devons dclarer un nouveau
type auquel nous ajoutons la fin le qualificateur of object .
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
539
Exemples de types pointeurs de mthode et de variable de type pointeur de mthode :
type
ptrMethode1 = procedure of object;
ptrMethode2 = procedure (x : real) of object;
ptrMethode3 = procedure (x,y: integer; var z:char) of object;
var
Proc1 : ptrMethode1; // pointeur vers une mthode sans paramtre
Proc2 : ptrMethode2; // pointeur vers une mthode un paramtre real
Proc3 : ptrMethode3; // pointeur vers une mthode trois paramtres 2 entiers, 1 char
Schma ci-aprs d'un objet Obj1 de classe clA contenant un champ proc1 du type
ptrMethode1 qui pointe vers la meth1 de l'objet Obj2 de classe clB. On suppose que l'adresse
mmoire de l'objet est 14785 et l'adresse de la mthode meth1 de l'objet est 14792 :
Il est impratif que la mthode vers laquelle pointe la variable de pointeur de mthode soit du
type prvu par le type pointeur de mthode, ici la mthode meth1 doit obligatoirement tre
une procdure sans paramtre (compatibilit d'en-tte).
Schma ci-aprs d'un objet Obj1 de classe clA contenant un champ proc2 du type
ptrMethode2 qui pointe vers la meth2 de l'objet Obj2 de classe clB. On suppose que l'adresse
mmoire de l'objet est 14785 et l'adresse de la mthode meth2 de l'objet est 14805 :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
540
La remarque prcdente sur l'obligation de compatibilit de l'en-tte de la mthode et le type
pointeur de mthode implique que la mthode meth2 doit ncessairement tre une procdure
un seul paramtre real.
Affecter un pointeur de mthode
Nous venons de voir comment dclarer un type pointeur de mthode et un champ de ce mme
type, nous avons signal que ce champ doit pointer vers une mthode ayant une en-tte
compatible avec le type pointeur de mthode, il nous reste connatre le mcanisme qu'utilise
Delphi pour lier un champ pointeur et une mthode pointer.
Types pointeurs de mthodes
ptrMethode1 = procedure of object;
ptrMethode2 = procedure (x : real) of object;
champs de pointeurs de mthodes
Proc1 : ptrMethode1; // pointeur vers une mthode sans paramtre
Proc2 : ptrMethode2; // pointeur vers une mthode un paramtre real
Diverses mthodes :
procedure P1;
begin
end;
procedure P2 (x:real);
begin
end;
procedure P3 (x:char);
begin
end;
procedure P4;
begin
end;
Recensons d'abord les compatibilits d'en-tte qui autoriseront le pointage de la mthode :
Proc1 peut pointer vers P1 , P4 qui sont les deux seules mthodes compatibles.
Proc2 ne peut pointer que vers P2 qui est la seule mthode un paramtre de type real.
La liaison (le pointage) s'effectue tout naturellement travers une affectation :
L'affectation Proc1 := P1; indique que Proc1 pointe maintenant vers la mthode P1 et peut
tre utilis comme un identificateur de procdure ayant la mme signature que P1.
Exemple d'utilisation :
Proc2 := P2; // liaison du pointeur et de la procdure P2
Proc2(45.8); // appel de la procdure vers laquelle Proc2 pointe avec passage du paramtre 45.8
Un vnement est un pointeur de mthode
Nous avons indiqu que les gestionnaires d'vnements sont des mthodes, les champs du
genre vnements prsents dans les classes Delphi sont en fait des pointeurs de mthode, qui
peuvent pointer vers des gestionnaires d'vnements.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
541
Un type d'vnement est donc un type pointeur de mthode, Delphi possde plusieurs types
d'vnements par exemple :
TNotifyEvent = procedure (Sender: TObject) of object;
TMouseMoveEvent = procedure (Sender: TObject; Shift: TShiftState; X, Y: Integer) of object;
TKeyPressEvent = procedure (Sender: TObject; var Key: Char) of object;
etc
Un vnement est donc une proprit de type pointeur de mthode (type vnement) :
property OnClick: TNotifyEvent; // vnement click de souris
property OnMouseMove: TMouseMoveEvent; // vnement passage de la souris
property OnKeyPress: TKeyPressEvent; // vnement touche de clavier presse
Quel est le code engendr pour grer un vnement ?
Intressons nous maintenant au code engendr par un programme simple constitu d'une fiche
Form1 de classe TForm1 avec un objet Button1 de classe Tbutton dpos sur la fiche :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
private
{ Dclarations prives }
public
{ Dclarations publiques }
end;
var Form1: TForm1;
implementation
{$R *.dfm}
end.
object Form1: TForm1
Left = 198
Top = 109
Width = 245
Height = 130
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [ ]
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 80
Top = 32
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
end
end
Le code intermdiaire cach
au programmeur. Il permet
l'initialisation automatique
de la fiche et de ses
composants.
Le code source
apparent fournit au
programmeur. Il
permet
l'intervention du
programmeur sur la
fiche et sur ses
composants.
Le code intermdiaire cach
de l'objet Button1 dpos sur
la fiche Form1.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
542
Demandons Delphi de nous fournir ( partir de l'inspecteur d'objet) les gestionnaires des 3
vnements OnClick, OnMouseMove et OnKeyPress de raction de l'objet Button1 au click
de souris, au passage de la souris et l'appui sur une touche du clavier:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click (Sender: TObject);
procedure Button1MouseMove (Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure Button1KeyPress (Sender: TObject; var Key: Char);
private
{ Dclarations prives }
public
{ Dclarations publiques }
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click (Sender: TObject);
begin
end;
procedure TForm1.Button1MouseMove (Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
end;
procedure TForm1.Button1KeyPress (Sender: TObject; var Key: Char);
begin
end;
end.
object Button1: TButton
Left = 80
Top = 32
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
OnKeyPress = Button1KeyPress
OnMouseMove = Button1MouseMove
end
Nouveau code intermdiaire cach de
l'objet Button1 contenant les affectations
des vnments leurs gestionnaires.
{ Gestionnaire OnClick }
{ Gestionnaire OnMouseMove }
{ Gestionnaire OnKeyPress }
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
543
Delphi engendre un code source visible en pascal objet modifiable et un code intermdiaire
(que l'on peut voir et ventuellement modifier) :
Le code source visible est celui qui nous sert programmer nos algorithmes, nos classes,
et les ractions aux vnements.
Le code intermdiaire est gnr au fur et mesure que nous intervenons visuellement sur
l'interface et contient l'initialisation de l'interface (affectations de gestionnaires
d'vnements, couleurs des fonds, positions des composants, taille, polices de caractres,
conteneurs et contenus etc) il sert au compilateur.
Nous venons de voir que Delphi a gnr en code intermdiaire pour nous, les affectations de
chaque vnement un gestionnaire :
OnClick = Button1Click
OnKeyPress = Button1KeyPress
OnMouseMove = Button1MouseMove
Et il nous a fournit les squelettes vides de chacun des trois gestionnaires :
procedure TForm1.Button1Click (Sender: TObject);
procedure TForm1.Button1MouseMove (Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure TForm1.Button1KeyPress (Sender: TObject; var Key: Char);
La dernire tape du processus de programmation de la raction du Button1 est de
programmer du code l'intrieur des squelettes des gestionnaires.
Lors de l'excution si nous cliquons avec la souris sur le Button1, un mcanisme
d'interception et de rpartition figur ci-dessous appelle le gestionnaire de l'vnment
OnClick dont le corps a t programm :
fig : Appel du gestionnaire procedureTForm1.Button1Click (Sender: TObject) sur click de souris
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
544
Exercice-rcapitulatif
Nous voulons construire une interface permettant la saisie par lutilisateur de deux entiers et lautorisant
effectuer leur somme et leur produit uniquement lorsque les entiers sont entrs tous les deux. Aucune scurit
nest apporte pour linstant sur les donnes.
Voici l'tat visuel de l'interface au
lancement du programme :
2 zones de saisie
2 boutons d'actions
2 zones d'affichages des rsultats
Ds que les deux entiers sont
entrs, le bouton Calcul est activ:
Lorsque lon clique sur le bouton
Calcul, le bouton EFFACER est
activ et les rsultats s'affichent
dans leurs zones respectives :
Un clic sur le bouton EFFACER ramne linterface ltat initial.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
545
Graphe vnementiel complet de l'interface
Avec comme conventions sur les messages :
X
1
= excuter les calculs sur les valeurs entres.
X
2
= excuter leffacement des rsultats.
M
1
= message ledit1 de tout effacer.
M
2
= message ledit2 de tout effacer.
Table des actions vnementielles associes au graphe
Changer
Edit1
Calcul activable
(si changer Edit2 a eu lieu)
Changer
EDIT2
Calcul activable
(si changer Edit1 a eu lieu)
Clic
CALCUL
Excuter X1
EFFACER activable
Afficher les rsultats
Clic
EFFACER
EFFACER dsactiv
CALCUL dsactiv
Message M1
Message M2
Table des tats initiaux des objets sensibles aux vnements
Edit1 activ
Edit2 activ
Buttoncalcul dsactiv
Buttoneffacer dsactiv
- Nous voulons disposer dun bouton permettant de lancer le calcul lorsque cest possible et
dun bouton permettant de tout effacer. Les deux boutons seront dsactivs au dpart.
- Nous choisissons 6 objets visuels : deux TEdit, Edit1 et Edit2 pour la saisie ; deux
Tbutton, ButtonCalcul et Buttoneffacer pour les changements de plans daction ; deux
Tlabel LabelSomme et LabelProduit pour les rsultats
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
546
Les objets visuels Delphi choisis
Edit1: TEdit;
Edit2: TEdit;
LabelSomme: TLabel;
LabelProduit: TLabel;
ButtonCalcul: TButton;
Buttoneffacer: TButton;
Construction progressive du gestionnaire d'vnement Onchange
Nous devons raliser une synchronisation des entres dans Edit1 et Edit2 : le dverrouillage
(activation) du bouton " ButtonCalcul " ne doit avoir lieu que lorsque Edit1 et Edit2
contiennent des valeurs. Ces deux objets de classe TEdit, sont sensibles lvnement
OnChange qui indique que le contenu du champ text a t modifi, laction est indique dans
le graphe vnementiel sous le vocable " changer ".
La synchronisation se fera laide de deux drapeaux binaires (des boolens) qui seront levs
chacun sparment par les TEdit lors du changement de leur contenu. Le drapeau Som_ok est
lev par lEdit1, le drapeau Prod_ok est lev par lEdit2.
Implantation : deux champs privs boolens
Som_ok , Prod_ok : boolean;
Le drapeau Som_ok est lev par lEdit1 lors du changement du contenu de son champ text,
sur lapparition de lvnement OnChange, il en est de mme pour le drapeau Prod_ok et
lEdit2 :
Implantation n1 du gestionnaire de OnChange :
procedure TForm1.Edit1Change(Sender: TObject);
begin
Som_ok:=true; // drapeau de Edit1 lev
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
Prod_ok:=true; // drapeau de Edit2 lev
end;
Une mthode prive de test vrifiera que les deux drapeaux ont t levs et lancera
lactivation du ButtonCalcul.
procedure TForm1.TestEntrees;
{les drapeaux sont-ils levs tous les deux ?}
begin
if Prod_ok and Som_ok then
ButtonCalcul.Enabled:=true // si oui: le bouton calcul est activ
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
547
Nous devons maintenant tester lorsque nous levons un drapeau si lautre nest pas dj lev.
Cette opration seffectue dans les gestionnaires de lvnement OnChange de chacun des
Edit1 et Edit2 :
Implantation n2 du gestionnaire de OnChange :
procedure TForm1.Edit1Change(Sender: TObject);
begin
Som_ok:=true; // drapeau de Edit1 lev
TestEntrees;
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
Prod_ok:=true; // drapeau de Edit2 lev
TestEntrees;
end;
Construction des gestionnaires d'vnement Onclick
Nous devons grer lvnement clic sur le bouton calcul qui doit calculer la somme et le
produit, placer les rsultats dans les deux Tlabels et activer le Buttoneffacer.
Implantation du gestionnaire de OnClick du ButtonCalcul :
procedure TForm1.ButtonCalculClick(Sender: TObject);
var S , P : integer;
begin
S:=strtoint(Edit1.text); // transtypage : string integer
P:=strtoint(Edit2.text); // transtypage : string integer
LabelSomme.caption:=inttostr(P+S);
LabelProduit.caption:=inttostr(P*S);
Buttoneffacer.Enabled:=true // le bouton effacer est activ
end;
Nous codons une mthode prive dont le rle est de rinitialiser linterface son tat de
dpart indiqu dans la table des tats initiaux :
Edit1
Activ
Edit2
Activ
Buttoncalcul
Dsactiv
Buttoneffacer dsactiv
procedure TForm1.RAZTout;
begin
Buttoneffacer.Enabled:=false; //le bouton effacer se dsactive
ButtonCalcul.Enabled:=false; //le bouton calcul se dsactive
LabelSomme.caption:='0'; // RAZ valeur somme affiche
LabelProduit.caption:='0'; // RAZ valeur produit affiche
Edit1.clear; // message M1
Edit2.clear; // message M2
Prod_ok:=false; // RAZ drapeau Edit2
Som_ok:=false; // RAZ drapeau Edit1
end;
Nous devons grer lvnement click sur le Buttoneffacer qui doit remettre linterface son
tat initial (par appel la procdure RAZTout ) :
Implantation du gestionnaire de OnClick du Buttoneffacer:
procedure TForm1.ButtoneffacerClick(Sender: TObject);
begin
RAZTout;
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
548
Au final, lorsque l'application se lance et que l'interface est cre nous devons positionner
tous les objets ltat initial (nous choisissons de lancer cette initialisation sur lvnement
OnCreate de cration de la fiche):
Implantation du gestionnaire de OnCreate de la fiche Form1:
procedure TForm1.FormCreate(Sender: TObject);
begin
RAZTout;
end;
Si nous essayons notre interface nous constatons que nous avons un problme de scurit
deux niveaux dans notre saisie :
Le premier niveau est celui des corrections apportes par lutilisateur (effacement de
chiffres dj entrs) et la synchronisation avec lventuelle vacuit dau moins un des
champs text aprs une telle modification : en effet lutilisateur peut effacer tout le contenu
dun " Edit " et lancer alors le calcul, provoquant ainsi des erreurs.
Le deuxime niveau classique est celui du transtypage incorrect, dans le cas o
lutilisateur commet des fautes de frappe et rentre des donnes autres que des chiffres (des
lettres ou dautres caractres du clavier).
Amliorations de scurit du premier niveau par plan daction
Nous protgeons les calculs dans le logiciel, par un test sur la vacuit du champ text de
chaque objet de saisie TEdit. Dans le cas favorable o le champ nest pas vide, on autorise la
saisie ; dans lautre cas on dsactive systmatiquement le ButtonCalcul et lon abaisse le
drapeau qui avait t lev lors de lentre du premier chiffre, ce qui empchera toute erreur
ultrieure. Lutilisateur comprendra de lui-mme que tant quil ny a pas de valeur dans les
entres, le logiciel ne fera rien et on ne passera donc pas au plan daction suivant (calcul et
affichage). Cette amlioration seffectue dans les gestionnaires dvnement OnChange des
deux TEdit.
Implantation n2 du gestionnaire de OnChange :
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.text<' ' then // champ text non vide ok !
begin
Som_ok:=true;
TestEntrees;
end
else
begin
ButtonCalcul.enabled:=false; // bouton dsactiv
Som_ok:=false; // drapeau de Edit1 baiss
end
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit2.text<' ' then // champ text non vide ok !
begin
Prod_ok:=true;
TestEntrees;
end
else
begin
ButtonCalcul.enabled:=false; //bouton dsactiv
Prod_ok:=false; // drapeau de Edit2 baiss
end
end;
On remarque que les deux codes prcdents sont trs proches, ils diffrent par leTEdit et le
drapeau auxquels ils s'appliquent. Il est possible de rduire le code redondant en construisant
par exemple une mthode prive avec deux paramtres.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
549
Regroupement du code
Soit la mthode prive Autorise possdant deux paramtres, le premier est la rfrence d'un
des deux TEdit, le second le drapeau boolen associ :
procedure TForm1.Autorise ( Ed : TEdit ; var flag : boolean );
begin
if Ed.text<' ' then // champ text non vide ok !
begin
flag :=true;
TestEntrees;
end
else
begin
ButtonCalcul.enabled:=false; //bouton dsactiv
flag:=false; // drapeau de Ed baiss
end
end;
Nouvelle implantation n2 du gestionnaire de OnChange :
procedure TForm1.Edit1Change(Sender: TObject);
begin
Autorise ( Edit1 , Som_ok );
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
Autorise ( Edit2 , Prod_ok );
end;
Code final o tout est regroup dans la classe TForm1
unit UFcalcul;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForm1= class ( TForm )
Edit1: TEdit;
Edit2: TEdit;
ButtonCalcul: TButton;
LabelSomme: TLabel;
LabelProduit: TLabel;
Buttoneffacer: TButton;
procedure FormCreate(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure ButtonCalculClick(Sender: TObject);
procedure ButtoneffacerClick(Sender: TObject);
private { Dclarations prives }
Som_ok , Prod_ok :
procedure TestEntrees;
procedure RAZTout;
procedure Autorise ( Ed : TEdit ; var flag : boolean );
public { Dclarations publiques }
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
550
implementation
{ --------------- Mthodes prives ---------------------}
procedure TForm1.TestEntrees;
{les drapeaux sont-ils levs tous les deux ?}
begin
if Prod_ok and Som_ok then
ButtonCalcul.Enabled:=true // si oui: le bouton calcul est activ
end;
procedure TForm1.RAZTout;
begin
Buttoneffacer.Enabled:=false; //le bouton effacer se dsactive
ButtonCalcul.Enabled:=false; //le bouton calcul se dsactive
LabelSomme.caption:='0'; // RAZ valeur somme affiche
LabelProduit.caption:='0'; // RAZ valeur produit affiche
Edit1.clear; // message M1
Edit2.clear; // message M2
Prod_ok:=false; // RAZ drapeau Edit2
Som_ok:=false; // RAZ drapeau Edit1
end;
procedure TForm1.Autorise ( Ed : TEdit ; var flag : boolean );
begin
if Ed.text<' ' then // champ text non vide ok !
begin
flag :=true;
TestEntrees;
end
else
begin
ButtonCalcul.enabled:=false; //bouton dsactiv
flag:=false; // drapeau de Ed baiss
end
end;
{ ------------------- Gestionnaires d'vnements -------------------}
procedure TForm1.FormCreate(Sender: TObject);
begin
RAZTout;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
Autorise ( Edit1 , Som_ok );
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
Autorise ( Edit2 , Prod_ok );
end;
procedure TForm1.ButtonCalculClick(Sender: TObject);
var S , P : integer;
begin
S:=strtoint(Edit1.text); // transtypage : string integer
P:=strtoint(Edit2.text); // transtypage : string integer
LabelSomme.caption:=inttostr(P+S);
LabelProduit.caption:=inttostr(P*S);
Buttoneffacer.Enabled:=true // le bouton effacer est activ
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
551
procedure TForm1.ButtoneffacerClick(Sender: TObject);
begin
RAZTout;
end;
end.
Un gestionnaire d'vnement centralis grce au :
- polymorphisme d'objet
- pointeur de mthode
Chaque Edit possde son propre gestionnaire de l'vnement OnChange :
procedure TForm1.Edit1Change(Sender: TObject);
begin
Autorise ( Edit1 , Som_ok );
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
Autorise ( Edit2 , Prod_ok );
end;
On peut avoir envie de mettre en place un gestionnaire unique de l'vnement OnChange, puis
de le lier chaque zone de saisie Edit1 et Edit2 (souvenons-nous qu'un champ d'vnement
est un pointeur de mthode) :
Nous dfinissons d'abord une mthode public par exemple, qui jouera le rle de gestionnaire
centralis d'vnement, nous la nommons TexteChange.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
552
Cette mthode pour tre considre comme un gestionnaire de l'vnement OnChange, doit
obligatoirement tre compatible avec le type de l'vnement Onchange. Une consultation de
la documentation Delphi nous indique que :
property OnChange: TNotifyEvent;
L'vnement OnChange est du mme type que l'vnement OnClick ( TnotifyEvent =
procedure(Sender:Tobject) of object ), donc notre gestionnaire centralis TexteChange doit avoir
l'en-tte suivante :
procedure TexteChange ( Sender : Tobject );
Le paramtre Sender est la rfrence de l'objet qui appelle la mthode qui est pass
automatiquement lors de l'excution, en l'occurrence ici lorsque Edit1 appellera ce
gestionnaire c'est la rfrence de Edit1 qui sera passe comme paramtre, de mme lorsqu'il
s'agira d'un appel de Edit2.
Implantation du gestionnaire centralis
procedure TForm1.TexteChange(Sender: TObject);
begin
if Sender is TEdit then
begin
if (Sender as TEdit )=Edit1 then
Autorise ( (Sender as TEdit ) , Som_ok );
else
Autorise ( (Sender as TEdit ) , Prod_ok );
end
end;
On teste si l'metteur Sender est bien un TEdit,
polymorphisme d'objet :
Si l'metteur est Edit1 on le transtype en TEdit
pour pouvoir le passer en premier paramtre la
mthode Autorise sinon c'est Edit2 et l'on fait la
mme opration.
On lie maintenant ce gestionnaire chacun des champs OnChange de chaque TEdit ds la
cration de la fiche :
procedure TForm1.FormCreate(Sender: TObject);
begin
RAZTout;
Edit1.OnChange := TexteChange ;
Edit2.OnChange := TexteChange ;
end;
pointeur de mthode
chaque champ Onchange pointe vers le mme
gestionnaire (mthode)
TForm1= class ( TForm )
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure ButtonCalculClick(Sender: TObject);
procedure ButtoneffacerClick(Sender: TObject);
private { Dclarations prives }
Som_ok , Prod_ok :
procedure TestEntrees;
procedure RAZTout;
procedure Autorise ( Ed : TEdit ; var flag : boolean );
public { Dclarations publiques }
procedure TexteChange(Sender: TObject);
end;
Le gestionnaire centralis est
dclar ici, puis il est
implment la section
implementation de la unit.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
553
NOTICE METHODOLOGIQUE
construire un nouvel vnement
Objectif : Nous proposons ici en suivant pas pas l'enrichissement du code de
montrer comment implanter un nouvel vnement nomm OnTruc dans une classe
dnote ClassA. Puis nous appliquerons cette dmarche une pile Lifo qui sera rendu
sensible l'empilement et au dpilement, par adjonction de deux vnements la classe.
Pour construire un nouvel vnement dans ClassA :
Il nous faut d'abord dfinir un type pour l'vnement : EventTruc
Il faut ensuite mettre dans ClassA une proprit d'vnement : property OnTruc : EventTruc
Il faut crer un champ priv nomm FOnTruc de type EventTruc en lecture et criture qui servira de
champ de stockage de la proprit OnTruc.
Version-1 du code source
Unit UDesignEvent ;
interface
type
EventTruc = procedure (Sender:TObject; info:string) of object ;
ClassA = class
private
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
554
FOnTruc : EventTruc ;
public
OnTruc : EventTruc read FOnTruc write FOnTruc ;
end;
implementation
end.
Il nous faut maintenant construire une mthode qui va dclencher l'vnement, nous
utilisons une procdure surchargeable dynamiquement afin de permettre des
redfinitions utlrieures par les descendants.
Lorsque l'vnement se nomme OnXXX, les quipes de dveloppement Borland donnent la fin du nom de
l'vnement OnXXX la procdure redfinissable. Ici pour l'vnement OnTruc la place de
DeclencheTruc, nous la nommerons Truc.
Version-2 du code source
Unit UDesignEvent ;
interface
type
EventTruc = procedure (Sender:TObject; info:string) of object ;
ClassA = class
private
FOnTruc : EventTruc ;
protected
procedure Truc(s:string);virtual; // surchargeable dynamiquement
public
OnTruc : EventTruc read FOnTruc write FOnTruc ;
end;
implementation
procedure ClassA.Truc(s:string);
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
555
begin
if Assigned ( FOnTruc ) then
FOnTruc (self , s)
end;
end.
Pour terminer, il nous reste dfinir un ou plusieurs gestionnaires possibles de
l'vnement OnTruc (ici nous en avons mis quatre), et en connecter un la proprit
OnTruc de l'objet de classe ClassA.
Nous dfinissons une classe ClasseUse qui utilise sur un objet de classe ClassA l'vnement OnTruc.
Version-3 du code source
Unit UDesignEvent ;
interface
type EventTruc = procedure (Sender:TObject; info:string) of object ;
ClassA = class
private
FOnTruc : EventTruc ;
protected
procedure Truc(s:string);virtual; // surchargeable dynamiquement
public
ObjA : ClassA ;
OnTruc : EventTruc read FOnTruc write FOnTruc ;
procedure LancerTruc; // Declenche l'vnement OnTruc
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
556
end;
ClasseUse = class
public
procedure method_100(Sender:TObject; info:string);
procedure method_101(Sender:TObject; info:string);
procedure method_102(Sender:TObject; info:string);
procedure method_103(Sender:TObject; info:string);
procedure principale;
end;
implementation
{------------------- ClassA ------------------------}
procedure ClassA.Truc(s:string);
begin
if Assigned ( FOnTruc ) then
FOnTruc (self , s)
end;
procedure ClassA.LancerTruc ;
begin
....
Truc ("vnement dclench");
....
end;
{------------------- ClasseUse ------------------------}
procedure ClasseUse.principale;
begin
//....
ObjA := ClassA.Create ;
ObjA.OnTruc := method_102 ; // connexion
//....
ObjA.LancerTruc ; // lancement
end;
procedure ClasseUse.method_100(Sender:TObject; info:string);
begin
//....
end;
procedure ClasseUse.method_101(Sender:TObject; info:string);
begin
//....
end;
procedure ClasseUse.method_102(Sender:TObject; info:string);
begin
//....
end;
procedure ClasseUse.method_103(Sender:TObject; info:string);
begin
//....
end;
end.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
557
Code pratique : une pile Lifo vnementielle
Objectif : Nous livrons une classe de pile lifo hritant d'une Tlist (Un objet Tlist de Delphi, stocke un
tableau de pointeurs, utilis ici pour grer une liste d'objets) et qui est ractive l'empilement et au dpilement
d'un objet. Nous suivons la dmarche prcdente en nous inspirant de son code final pour construire deux
vnements dans la pile lifo et lui permettre de ragir ces deux vnements.
unit ULifoEvent ;
interface
uses classes,Dialogs ;
type
DelegateLifo = procedure ( Sender: TObject ; s :string ) of object ;
ClassLifo = class (TList)
private
FOnEmpiler : DelegateLifo ;
FOnDepiler : DelegateLifo ;
public
function Est_Vide : boolean ;
procedure Empiler (elt : string ) ;
procedure Depiler ( var elt : string ) ;
property OnEmpiler : DelegateLifo read FOnEmpiler write FOnEmpiler ;
property OnDepiler : DelegateLifo read FOnDepiler write FOnDepiler ;
end;
ClassUseLifo = class
public
procedure EmpilerListener( Sender: TObject ; s :string ) ;
procedure DepilerListener( Sender: TObject ; s :string ) ;
constructor Create ;
procedure main ;
end;
implementation
procedure ClassLifo.Depiler( var elt : string ) ;
begin
if not Est_Vide then
begin
elt :=string (self.First) ;
self.Delete(0) ;
self.Pack ;
self.Capacity := self.Count ;
if assigned(FOnDepiler) then
FOnDepiler ( self ,elt )
end
end;
procedure ClassLifo.Empiler(elt : string ) ;
begin
self.Insert(0 , PChar(elt)) ;
if assigned(FOnEmpiler) then
FOnEmpiler ( self ,elt )
end;
Le type de l'vnement : type
pointeur de mthode (2 paramtres)
Champs privs stockant la valeur de
l'vnement (pointeur de mthode).
Evnement OnEmpiler :
- pointeur de mthode.
Evnement OnDepiler :
- pointeur de mthode.
Si une mthode dont la signature est celle du type
DelegateLifo est lie (gestionnaire de l'vnement
OnDepiler), le champ FOnDepiler pointe vers elle,
il est donc non nul.
Sinon FOnDepiler est nul (non assign)
L'instruction FOnDepiler ( self ,elt ) sert appeler
la mthode vers laquelle FOnDepiler pointe.
Si une mthode dont la signature est celle du type
DelegateLifo est lie (gestionnaire de l'vnement
OnDepiler), le champ FOnEmpiler pointe vers elle,
il est donc non nul.
Sinon FOnEmpiler est nul (non assign)
L'instruction FOnEmpiler ( self ,elt ) sert appeler
la mthode vers laquelle FOnEmpiler pointe.
self = la pile Lifo
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
558
function ClassLifo.Est_Vide : boolean ;
begin
result := self.Count = 0 ;
end;
{ ClassUseLifo }
constructor ClassUseLifo.Create ;
begin
inherited;
end;
procedure ClassUseLifo.DepilerListener( Sender: TObject ; s :string ) ;
begin
writeln ( 'On a depile : ' ,s) ;
end;
procedure ClassUseLifo.EmpilerListener( Sender: TObject ; s :string ) ;
begin
writeln ( 'On a empile : ' ,s) ;
end;
procedure ClassUseLifo.main ;
var
pileLifo : ClassLifo ;
ch :string ;
begin
pileLifo := ClassLifo.Create ;
pileLifo.OnEmpiler := EmpilerListener ;
pileLifo.OnDepiler := DepilerListener ;
pileLifo.Empiler( '[ eau ]' ) ;
pileLifo.Empiler( '[ terre ]' ) ;
pileLifo.Empiler( '[ mer ]' ) ;
pileLifo.Empiler( '[ voiture ]' ) ;
writeln ( 'Depilement de la pile :' ) ;
while not pileLifo.Est_Vide do
begin
pileLifo.Depiler(ch) ;
writeln (ch) ;
end;
writeln ( 'Fin du depilement.' ) ;
readln ;
end;
end.
programProject2;
{$APPTYPE CONSOLE}
uses SysUtils , UlifoEvent ;
var execLifo : ClassUseLifo;
begin
execLifo := ClassUseLifo.Create;
execLifo.main
end.
excution
Classe de test crant une pile Lifo
Mthode main de test
Affectation de chaque gestionnaire
l'vnement qu'il est charg de grer.
Instanciation d'une
pile Lifo tester.
Empilement de 4 lments
Dpilement de toute la pile
Gestionnaire de l'vnement OnDepiler :
signature compatible avec DelegateLifo.
Gestionnaire de l'vnement OnEmpiler :
signature compatible avec DelegateLifo.
Application console Project2.dpr instanciant
un objet de ClassUseLifo et lanant le test de
la pile lifo par invocation de la mthode main.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
559
Exemple vnementiel : un diteur de texte
1. L'nonc et les choix
Nous souhaitons dvelopper rapidement un petit diteur de texte qui nous permettra :
- de lire du texte partir d'un fichier sur disque ou sur disquette (ouvrir),
- de taper du texte (nouveau),
- de visualiser le texte entr,
- deffectuer sur ce texte les oprations classiques de copier/ coller/ couper,
- de le sauvegarder sur disque ou sur disquette (enregistrer).
Les objets potentiels ragiront ces vnements selon le graphe ci-dessous
Lobjet TextEditeur est lobjet central sur lequel agissent tous les autres objets, il contiendra
le texte diter.
En faisant ressortir les oprations effectuer, lutilisation de la notion dabstraction est
naturelle.
Nous envisageons les actions suivantes obtenues par raction un vnement Click de souris
(choix des objets du graphe prcdent):
nouveau (utilise un objet dfinir)
couper (utilise un objet dfinir)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
560
copier (utilise un objet dfinir)
coller (utilise un objet dfinir)
ouvrir (utilise un objet de dialogue)
enregistrer (utilise un objet de dialogue)
quitter (utilise un objet prdfini Form)
2. Les objets de composants
Delphi tant orient objet nous allons exploiter compltement l'analyse prsente dans le
graphe vnementiel ci-haut en mettant en place quatre objets du genre composants visuels ou
non visuels de Delphi.
Linterface choisie
Une fiche (Form1) comportant :
Un Tmemo avec deux ascenseurs
Trois composants non visuels :
TMainmenu (une barre de 2 menus)
TopenDialog (pour le chargement de
fichier)
TSaveDialog (pour la sauvegarde d'un
texte)
Le composant TMainmenu(1
er
menu)
comporte un premier menu Fichier 5 items
Le composant TMainmenu (2
me
menu)
comporte un deuxime menu Edition 3
items.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
561
Les menus dans la barre et les sous-menus sont tous des objets de classe TmenuItem qui sont
grs travers le champ Items d'un objet de classe TMainMenu :
object MainMenu1: TMainMenu
.
object fichier1: TMenuItem
Caption = 'fichier'
end
object edition1: TMenuItem
Caption = 'edition'
object couper1: TMenuItem
Caption = 'couper'
end
object copier1: TMenuItem
Caption = 'copier'
end
object coller1: TMenuItem
Caption = 'coller'
end
end
end ..
Correspondance entre le code cach par
Delphi et l'inclusion des objets de
TmenuItem dans un TmainMenu.
Mise en place de la gestion des vnements.
A chacun des items utilisables de chacun des 2 menus, il nous faut associer un gestionnaire
dvnement qui indique au programme comment il doit ragir lorsque l'utilisateur
slectionne un champ de l'un des menus par un click de souris. Nous avons vu que Delphi
contient le mcanisme d'association des vnements nos gestionnaires. Beaucoup de
contrles (classes visuelles)et beaucoup d'autres classes non visuelles comme les TMenuItem,
de Delphi sont sensibles lvnement de click de souris : property OnClick : TnotifyEvent.
Chacun des 3 items est
associ un raccourci
clavier classique (Ctrl+...)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
562
Les gestionnaires de lvnement OnClick pour les TMenuItem
Voici les en-ttes des 7 gestionnaires de OnClick automatiquement construits:
procedure Nouveau1Click(Sender: TObject);
procedure Ouvrir1Click(Sender: TObject);
procedure Enregistrersous1Click(Sender: TObject);
procedure Quitter1Click(Sender: TObject);
procedure Couper1Click(Sender: TObject);
procedure Copier1Click(Sender: TObject);
procedure Coller1Click(Sender: TObject);
Voici pour chaque gestionnaire le code crit par le programmeur.
Le code du gestionnaire Quitter1Click
procedure TForm1.Quitter1Click(Sender: TObject);
begin
Close; //crit par le dveloppeur (fermeture de la fentre)
end;
Le code du gestionnaire Ouvrir1Click
procedure TForm1.Ouvrir1Click(Sender: TObject);
begin
if OpenDialog1.Execute then //crit par le dveloppeur
begin
Enregistrersous1.enabled:=true;
TextEditeur.Lines.LoadFromFile(OpenDialog1.FileName);
end
end;
Le code du gestionnaire Enregistrersous1Click
procedure TForm1.Enregistrersous1Click(Sender: TObject);
begin
if SaveDialog1.Execute then // crit par le dveloppeur
begin
Enregistrersous1.enabled:=false;
TextEditeur.Lines.SaveToFile( SaveDialog1.FileName );
end
end;
Le code du gestionnaire Couper1Click
procedure TForm1.Couper1Click(Sender: TObject);
begin
TextEditeur.CutToClipboard; //crit par le dveloppeur
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
563
Le code du gestionnaire Copier1Click
procedure TForm1.Copier1Click(Sender: TObject);
begin
TextEditeur.CopyToClipboard; //crit par le dveloppeur
end;
Le code du gestionnaire Coller1Click
procedure TForm1.Coller1Click(Sender: TObject);
begin
TextEditeur.PasteFromClipboard; //crit par le dveloppeur
end;
Le code du gestionnaire Nouveau1Click
procedure TForm1.Nouveau1Click(Sender: TObject);
begin
TextEditeur.Clear; &not; crit par le dveloppeur
Enregistrersous1.enabled:=true &not; crit par le dveloppeur
end;
Il est noter que nous avons crit au total 16 lignes de programme Delphi pour construire
notre micro-diteur. Ceci est rendu possible par la rutilisabilit de mthodes dj intgres
dans les objets de Delphi et en fait prsentes dans le systme Windows.
Vous pouvez voir la puissance de ce RAD lorsque vous observez par exemple l'instruction qui
a permis de faire excuter le "copier" ou le "chargement d'un fichier" :
TextEditeur.CopyToClipboard;
La mthode CopyToClipboard s'applique l'objet TextEditeur qui est de la classe TMemo;
cette instruction correspond un ensemble complexe d'oprations de bas niveau :
le TMemo autorise une suite complexe d'oprations permettant de slectionner un texte crit
sur plusieurs lignes du TMemo. Il les affiche en surbrillance et la mthode
CopyToClipboard rcupre le texte slectionn puis le recopie enfin dans le presse-papier du
systme.
TextEditeur.Lines.LoadFromFile(OpenDialog1.FileName);
Nous n'avons par ailleurs eu aucun code particulier crire pour le chargement de fichier
texte, la mthode LoadFromFile prsente dans l'objet Lines (de classe TStrings) effectue
toutes les actions.
A titre de travail personnel il est recommand d'enrichir ce micro-diteur avec la possibilit de
changer la police de caractre, la couleur du fond etc
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
564
5.6 Programmation dfensive
(les exceptions)
Plan du chapitre:
Introduction
1.Notions de dfense et de protection
1.1 Outils participant la programmation dfensive
1.2 Rle et mode daction dune exception
1.3 Gestion de la protection du code
Fonctionnement sans incident
Fonctionnement avec incident
1.4 Effets dus la position du bloc except...end
Fonctionnement sans incident
Fonctionnement avec incident
1.5 Interception dune exception dune classe donne
1.6 Ordre dans linterception dune exception
Interception dans lordre de la hirarchie
Interception dans lordre inverse
2. Traitement dun exemple de protections
2.1 Le code de dpart de lunit
2.2 Code de la version.1 (premier niveau de scurit)
2.3 Code de la version.2 (deuxime niveau de scurit)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
565
Introduction
Nous allons montrer comment on peut concevoir la programmation dfensive en protgeant
directement le code laide de la notion dexception (semblable celle du C++ ou dAda).
Lobjectif principal est damliorer la qualit de " robustesse " (dfinie par B.Meyer) dun
logiciel. Lutilisation des exceptions avec leur mcanisme intgr, autorise la construction
rapide et nanmoins efficace de logiciels robustes.
Rappelons au lecteur que la scurit d'une application est susceptible d'tre mise mal par
toute une srie de facteurs :
les problmes lis au matriel : par exemple la perte subite d'une connection
un port, un disque dfectueux...
les actions imprvues de l'utilisateur, entrainant par exemple une division par
zro...
1. Notions de dfense et de protection
A loccasion de la traduction Algorithme langage volu comme pascal, nous avons
rpertori en plus des actions algorithmiques, des actions de scurit et des actions
ergonomiques qui doivent elles aussi tre programmes.
La partie ergonomie est incluse dans la notice consacre aux interfaces de communication
logiciel-utilisateur.
La partie scurit a dj t aborde ailleurs, nous regroupons ici ce que nous devons
connatre.
Pour obtenir une certaine " robustesse " dans nos programmes nous savons dj que la
scurit doit porter au moins sur :
les domaines de dfinitions des donnes,
les contraintes dimplantation,
le filtrage des saisies,
les problmes de transtypage
Toutefois les faiblesses dans un logiciel pendant son excution, peuvent survenir : lors des
entres-sorties, lors de calculs mathmatiques interdits (comme la division par zro), lors de
fausses manoeuvres de la part de lutilisateur, ou encore lorsque la connexion un
priphrique est inopinment interrompue.
La programmation dfensiveest plus une attitude de pense et de comportement quune
nouvelle mthode. Cette attitude consiste prvoir que le logiciel sera soumis des
dfaillances dues certains paramtres externes ou internes et donc prvoir une rponse
adapte chaque type de situation.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
566
La comparaison des cots de diffrents ratios de productivit tablie par B.Boehm, montre
que lexigence de fiabilit est lune des plus chres (surcot de 87%). Cette remarque
pourrait en apparence nous conduire croire que ce facteur est donc une affaire de spcialistes
et ne constitue pas une proccupation dans un discours dinitiation. Nous allons voir quil
nen est rien et quen fait notre mthode de travail et les outils que nous utilisons concourent
une attitude de programmation dfensive sans que nous contraignions fortement notre pense
en ce sens.
Nous pensons enfin quil est bon dinduire dans lesprit du dveloppeur en programmation
visuelle dbutant des ides fondes sur des pratiques mthodiques qui lui viteront lcueil de
" lart indisciplin " du logiciel, mais qui pourraient lui donner le got de continuer dans cette
discipline.
1.1 Outils participant la programmation dfensive
Voici cinq secteurs dactivit parmi ceux que nous connaissons, participant une mthode de
programmation dfensive.
La modularit
Le principe du dcoupage en modules restreint la propagation des effets
perturbateurs sur dautres modules partir dune erreur survenant dans un module
donn.
Lencapsulation
Associe la modularit, elle protge les constituants internes dun module
(champs et mthodes).
Les TAD (types abstraits)
En fournissant un outil de spcification des donnes avec des prconditions sur la
validit des oprateurs, un TAD assure la description des vrifications de
domaines.
Lutilisation de mthodes systmatiques
Comme lalgorithmique, la programmation par la syntaxe, les machines abstraites,
les gnrateurs dautomates,... ces outils encouragent ltudiant sessayer une
programmation sre.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
567
Lutilisation dun RAD visuel comme Delphi
Ce genre de systme de dveloppement apporte un certains nombres davantages
en la matire :
- il autorise la mise en uvre des cinq secteurs prcdents dactivit,
- il fournit au programmeur des kits dobjets scuriss et rutilisables,
- il permet de construire rapidement des interfaces qui participent
une meilleure dfense du logiciel contre des actions non valides (par
exemple en utilisant la mthode de squencement par plans
daction).
A ct de cet ventail doutils intgrant en gnral la notion de programmation dfensive, il
existe un outil spcifique ddi ce genre de programmation : les exceptions.
1.2 Rle et mode daction dune exception
Rle dune exception
Rserv jusqu' prsent aux spcialistes en Ada, en C++ ou en Java, cet outil est mis dans le
RAD Delphi la porte du dbutant. Comme son nom lindique, une exception est charge de
signaler un comportement exceptionnel (mais prvu) dune partie spcifique dun logiciel.
Dans les langages de programmation actuels, les exceptions font partie du langage lui-mme.
Cest le cas de Delphi qui intgre les exceptions comme une classe particulire : la classe
Exception. Cette classe contient un nombre important de classes drives.
Comment agit une exception
Ds quune erreur se produit comme un manque de mmoire , un calcul impossible, un
fichier inexistant, un transtypage non valide,..., un objet de la classe adquate drive de la
classe Exception est instanci. Nous dirons que le logiciel " dclenche une exception ".
Exemple : soit une saisie dun entier dans un Tedit nomm Editsaisie.
Objets visuels :
Editsaisie: TEdit;
Editresultat: TEdit;
Button1: TButton;
Actions :
Lutilisateur entre un entier dans Editsaisie, il clique
sur le bouton Button1 qui effectue un transtypage
dans une variable locale " n : integer " puis il se
dsactive et le Tedit Editresultat, change de couleur.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
568
Le gestionnaire dvnement clic de Button1 est alors le suivant :
procedure TForm1.Button1Clic(Sender: TObject);
var n:integer;
begin
Editresultat.color:=clAqua;
n:=StrtoInt(Editsaisie.text);
Editresultat.color:=clyellow;
Editresultat.text:= Editsaisie.text;
Editsaisie.clear ;
end;
Une excution sans incident donne ceci :
avant clic sur Button1 aprs clic sur Button1
Lors de lexcution, supposons que nous entrons dans Editsaisie la chane " asa12324 " qui
nest pas un entier.
La fonction StrtoInt dclenche une exception et nous envoie un message derreur gnral sur
lincident qui vient de se produire : (aprs clic sur Button1 Message derreur )
En outre, lincident a arrt lexcution du code dans le gestionnaire Button1Clic. Le code a
t excut normalement jusqu' linstruction de transtypage qui a dclench lexception. Le
reste des lignes de code a t ignor :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
569
Si nous voulons que le message soit plus explicite, ou si nous voulons par exemple que
malgr tout une certaine partie du code sexcute en fournissant des valeurs par dfaut malgr
lincident, nous devons grer nous-mmes cette exception.
Afin de pouvoir grer une exception dclenche, il nous faut disposer dun gestionnaire
dexception qui permette de traiter tous les types dexception.
1.3 Gestion de la protection du code
Le langage Delphi contient un mcanisme appel gestionnaire dexception qui sinsre dans
les lignes de code l o nous souhaitons assurer une protection.
Syntaxe du gestionnaire : mots clefs (try, except)
try
- ...
<lignes de code protger>
- ...
except
- ...
<lignes de code ragissant lexception>
- ...
end ;
Principe de fonctionnement dun tel gestionnaire :
Ds quune exception est dclenche dans le bloc de lignes compris entre try....except, il y a
droutement de lexcution (arrt dexcution squentielle du code) vers la premire ligne du
bloc except...end et lexcution continue squentiellement partir de cet endroit.
Reprenons lexemple prcdent lgrement modifi dans le code du gestionnaire du clic de
Button1.
procedure TForm1.Button1Clic(Sender: TObject);
var n:integer;
begin
Editresultat.color:=clAqua;
n:=StrtoInt(Editsaisie.text);
Editresultat.color:=clyellow;
Editresultat.text:= inttostr(n);
Editsaisie.clear ;
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
570
Mettons en place une protection de linstruction incrimine, tout en conservant lexcution
des lignes de code suivantes. Comme la variable " n " naura pas de valeur cause de
lincident, nous lui attribuons la valeur zro par dfaut si un incident se produit.
procedure TForm1.Button1Clic(Sender: TObject);
var n:integer;
begin
try
Editresultat.color:=clAqua;
n:=StrtoInt(Editsaisie.text);
except
showmessage('tapez un entier (zro par dfaut !');
n:=0
end;
Editresultat.color:=clyellow;
Editresultat.text:= inttostr(n);
Editsaisie.clear ;
end;
1.3.1 - Fonctionnement sans incident :
(Lgende : la flche indique lexcution squentielle de la ligne de code devant laquelle elle est place).
Les lignes de code sont excutes squentiellement sauf le bloc except...end (qui nest excut quen cas
dincident).
1.3.2 - Fonctionnement avec incident :
Nous entrons dans Editsaisie comme prcdemment une valeur non entire.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
571
Message envoy par la fonction Showmessage
dans le bloc except...end.
Ensuite le code continue sexcuter en
squence partir de n :=0 ;...
Suite du droulement squentiel de lexcution dans le bloc exceptend :
En fait dans cet exemple, nimporte quelle exception dclenche dans le bloc tryexcept
droute vers le bloc exceptend.
1.4 Effets dus la position du bloc except...end
Afin de bien comprendre cette notion de droutement (dont le placement est la charge du
programmeur) observons ce quapporte une modification de la place du bloc except...end au
droulement du code pendant lexcution.
Soit, dans le mme exemple, le nouveau code dans Button1Clmick o nous avons repouss le
bloc except...end la fin.
procedure TForm1.Button1Clic(Sender: TObject);
var n:integer;
begin
try
Editresultat.color:=clAqua;
n:=StrtoInt(Editsaisie.text);
Editresultat.color:=clyellow;
Editresultat.text:= inttostr(n);
Editsaisie.clear ;
except
showmessage('tapez un entier (zro par dfaut !');
n:=0
end;
end;
Puis excutons le programme.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
572
1.4.1 - Fonctionnement sans incident :
Identique au prcdent paragraphe, le bloc except...end tant ignor.
1.4.2 - Fonctionnement avec incident :
(Lgende : la flche indique lexcution squentielle de la ligne de code devant laquelle elle est place).
le code continue son droulement dans le bloc except...end en " sautant " trois instructions.
Etat final des rsultats aprs traitement de lexception :
les deux Tedit Editresultat et Editsaisie nont
pas chang puisque les instructions:
Editresultat.color:=clyellow;
Editresultat.text:= inttostr(n);
Editsaisie.clear ;
nont pas t excutes, par suite du
droutement du code.
Nous notons que cette mthode de droutement du code est trs proche du fonctionnement
dune machine de Von Neumann. Nous venons de voir comment intercepter une exception
quelconque sans savoir exactement sa catgorie. Nous pouvons en fait intercepter une
exception dune manire encore plus " fine " avec le gestionnaire try...except...end.
Il nous permet de slectionner la classe exacte de lexception et de ne faire fonctionner le
droutement du code que pour une exception dfinie lavance.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
573
1.5 Interception dune exception dune classe donne
Diagrammes de syntaxe du gestionnaire :
<instruction try> :
<Bloc dexception> :
<gestionnaire dexception> :
Diffrentes classes dexception Delphi
Ci-dessous la hirarchie des classes dexception, qui drivent toutes de la classe Exception:
Exemple dcriture d'un gestionnaire :
try
<lignes de code protger>
except
On EConvertError do begin
<lignes de code ragissant lexception EConvertError >
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
574
end ;
On EintError do begin
<lignes de code ragissant lexception EintError >
end ;
else begin
<lignes de code ragissant dautres exceptions >
end ;
end ;
Principe de fonctionnement dun tel gestionnaire
Ds quune exception est dclenche dans le bloc de lignes compris entre try....except, il y a
droutement de lexcution (arrt dexcution squentielle du code) vers le bloc except...end.
Le slecteur de gestionnaire dexception on...do fonctionne approximativement comme un
case...of, en nexcutant que le champ slectionn.
Supposons que lexception leve soit de la classe EintError ; linstruction try nexcute alors
que le code du " bon " gestionnaire en loccurrence :
On EintError do begin
<lignes de code ragissant lexception EintError >
end ;
Puis lexcution se poursuit aprs le end du bloc except...end.
1.6 Ordre dans linterception dune exception
A la diffrence dun "case of" pascal, le choix du slecteur de gestionnaire (on...do)
seffectue squentiellement dans lordre dcriture des lignes de code. On choisira donc,
lorsquil y a une hirarchie entre les exceptions intercepter, de placer le code de leurs
gestionnaires dans lordre inverse de la hirarchie.
Exemple : division par zro dans un calcul en virgule flottante
EMathError est la classe des exceptions pour les erreurs de calcul.
EZeroDivide indique la division par zro dans une telle opration.
Programmons un calcul partir dun bouton :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
575
procedure TForm1.Button1Clic(Sender:
TObject);
var x,y,z:real;
begin
try
x:=StrtoFloat(Edit1.text);
y:=StrtoFloat(Edit2.text);
z:=x /y ;
Edit3.text:=FloattoStr(z);
except
............
............
end;
end;
Au dpart nous avons edit1.text = 12,875 et edit2.text = 0. Le calcul est erron car x vaut
12,85 et y vaut zro ce qui va induire une erreur de division par zro dans linstruction z := x /
y .
Observons ce qui se passe lorsque nous interceptons les exceptions EMathError et
EZeroDivide.
1.6.1 - Interception dans lordre de la hirarchie :
La slection dexception est programme dans lordre de la hirarchie des classes :
EMathError
|____ EZeroDivide
procedure TForm1.Button1Clic(Sender: TObject);
var x,y,z:real;
begin
try
x:=StrtoFloat(Edit1.text);
y:=StrtoFloat(Edit2.text);
z:=x /y ;
Edit3.text:=FloattoStr(z);
except
on EMathError do
Edit3.text:='Erreur gnrale';
on EZeroDivide do
Edit3.text:='division par zro';
end;
end;
EMathError est intercepte en premier.
1.6.2 - Interception dans lordre inverse :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
576
La slection dexception est programme dans lordre inverse de la hirarchie des classes.
procedure TForm1.Button1Clic(Sender: TObject);
var x,y,z:real;
begin
try
x:=StrtoFloat(Edit1.text);
y:=StrtoFloat(Edit2.text);
z:=x /y ;
Edit3.text:=FloattoStr(z);
except
on EZeroDivide do
Edit3.text:='division par zro';
on EMathError do
Edit3.text:='Erreur gnrale';
end;
end;
Cest EZeroDivide qui est intercepte en premier.
2. Traitement dun exemple de protections
Reprenons comme base le premier exemple tudi dans le chapitre sur les interfaces.
Supposons que nous voulons largir notre interface de calcul aux oprations entires :
Mutiplication, Division, Addition, Soustraction, Quotient, Reste.
Nous limiterons nos entiers au type Smallint Delphi identique au type integer du pascal
(Smallint = -32768..32767, sign sur 16 bits).
Interface retenue
Editnbr1: TEdit;
Editnbr2: TEdit;
Editmessage: TEdit;
Editresult: TEdit;
ListBoxOperation: TListBox;
ButtonCalcul: TBitBtn;
Labeltypoperat: TLabel;
2.1 Le code de dpart de lunit
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
577
Champ priv de la classe Tform1 :
Toper:array[0..5]of string;
implementation
Le tableau Toper contient les symboles des oprateurs entiers, il est initialis lors de
lactivation de la fiche
procedure TForm1.FormActivate(Sender: TObject);
begin
Toper[0]:='*'; Toper[1]:='/';
Toper[2]:='+'; Toper[3]:='-';
Toper[4]:=' div '; Toper[5]:=' mod ';
end;
Lutilisateur choisit par slection dans le ListBoxOperation lopration quil veut effectuer ;
ltiquette Labeltypoperat affiche le symbole associ :
procedure TForm1.ListBoxOperationClic(Sender: TObject);
begin
Labeltypoperat.caption:=Toper[ListBoxOperation.ItemIndex];
end;
Les deux Edit de saisie Editnbr1 et Editnbr2 sont sensibles lvnement OnChange qui
permet de dverrouiller le bouton de calcul :
procedure TForm1.Editnbr1Change ( Sender :
TObject);
begin
ButtonCalcul.enabled:=true;
end;
procedure TForm1.Editnbr2Change ( Sender :
TObject);
begin
ButtonCalcul.enabled:=true;
end;
Une fois que les entiers sont entrs et le genre dopration slectionn, le ButtonCalcul lance
le calcul sur un clic de lutilisateur :
procedure TForm1.ButtonCalculClic(Sender: TObject);
var op1,op2,result:smallint;
begin
ButtonCalcul.enabled:=false;
op1:=strtoint(Editnbr1.text);
op2:=strtoint(Editnbr2.text);
case ListBoxOperation.ItemIndex of
0: result:=op1 * op2;
1: result:=trunc(op1 / op2);
2: result:=op1 + op2;
3: result:=op1 - op2;
4: result:=op1 div op2;
5: result:=op1 mod op2;
end;
Editresult.text:=inttostr(result);
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
578
Editmessage.text:=inttostr(op1)+Toper[ListBoxOperation.ItemIndex]
+' '+inttostr(op2)+'= '+Editresult.text;
end;
A ce stade la saisie nest pas encore scurise. Afin que le lecteur puisse retrouver les
lments dj traits dans le chapitre sur les interfaces, nous reprenons comme premier niveau
de scurit le mme genre de programmation : synchronisation des 3 objets de saisie Editnbr1,
Editnbr2 et ListBoxOperation, puis programmation par plans daction.
2.2 Code de la version.1 (premier niveau de scurit)
Champs privs de la classe Tform1:
oper1,oper2,operat:boolean; //les 3 drapeaux
Toper:array[0..5]of string;
implementation
- Le tableau Toper contient les symboles des oprateurs entiers, il est initialis lors de
lactivation de la fiche (pas dajout de code ni de changement).
- Ajout de la mthode RAZtout positionnant linterface son tat initial (correspondant la
table des tats initiaux) :
procedure TForm1.RAZTout;
begin
ButtonCalcul.enabled:=false;
Editnbr1.clear;
Editnbr2.clear;
Editresult.clear;
Editmessage.clear;
oper1:=false;
oper2:=false;
operat:=false;
end;
Adjonction de la mthode TestEntrees charge de lancer lactivation deButtonCalcul si les
trois drapeaux sont tous levs :
procedure TForm1.TestEntrees;
begin
if oper1 and oper2 and operat then
ButtonCalcul.enabled:=true
end;
Lutilisateur choisit par slection dans le ListBoxOperation lopration quil veut effectuer,
ltiquette Labeltypoperat affiche le symbole associ. Adjonction dans le code du drapeau et
du test :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
579
procedure TForm1.ListBoxOperationClic(Sender: TObject);
begin
operat:=true;
TestEntrees;
Labeltypoperat.caption:=Toper[ListBoxOperation.ItemIndex];
end;
Les deux Edit de saisie Editnbr1 et Editnbr2 sont sensibles lvnement OnChange ; voici
lajout du code de plans daction dans les gestionnaires de cet vnement :
procedure TForm1.Editnbr1Change(Sender: TObject);
begin
if Editnbr1.text<>'' then begin
oper1:=true;
TestEntrees;
end
else begin
ButtonCalcul.enabled:=false;
oper1:=false; // drapeau de Editnbr1 baiss
end
end;
procedure TForm1.Editnbr12Change(Sender: TObject);
begin
if Editnbr2.text<>'' then begin
oper2:=true;
TestEntrees;
end
else begin
ButtonCalcul.enabled:=false;
oper2:=false; // drapeau de Editnbr2 baiss
end
end;
Le code du plan daction associ au ButtonCalcul reste strictement le mme.
Nous proposons dans le paragraphe qui suit, un complment de scurit apport par des
interceptions dexception.
2.3 Code de la version.2 (deuxime niveau de scurit)
Tout le code de la version.1 reste identique dans la version.2, les adjonctions sont uniquement
dans le gestionnaire du ButtonCalcul. Nous lanons les leves dexception lorsque les
incidents ont lieu. Nous avons ajout une mthode signe qui renvoie +1 ou -1 selon le signe
de lentier dentre et dune constante dentier maximum:
const Maxint=32767;
function signe(n:smallint):smallint;
begin
if n>0 then signe:=1
else if n<0 then signe:=-1
else signe:=0
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
580
Le code est protg par les exceptions suivantes :
procedure TForm1.ButtonCalculClic(Sender: TObject);
var op1,op2,result:smallint;
begin
ButtonCalcul.enabled:=false;
try
op1:=strtoint(Editnbr1.text);
except
on ERangeError do
if Editnbr1.text[1]='-' then
op1:=-Maxint
else op1:=Maxint;
on EConvertError do op1:=Maxint;
end;
try
op2:=strtoint(Editnbr2.text);
except
on EConvertError do op2:=Maxint;
on ERangeError do
if Editnbr2.text[1]='-' then
op2:=-Maxint
else op2:=Maxint;
end;
try
case ListBoxOperation.ItemIndex of
0: result:=op1 * op2;
1: result:=trunc(op1 / op2);
2: result:=op1 + op2;
3: result:=op1 - op2;
4: result:=op1 div op2;
5: result:=op1 mod op2;
end;
except
on EDivByZero do
if ListBoxOperation.ItemIndex=4 then
result:=signe(op1)*Maxint
else result:=op1;
on EZeroDivide do
result:=signe(op1)*Maxint;
on EIntOverFlow do
result:=signe(op1)*signe(op2)*Maxint;
end;
Editresult.text:=inttostr(result);
Editmessage.text:=inttostr(op1)+Toper[ListBoxOperation.ItemIndex]
+' '+inttostr(op2)+'= '+Editresult.text;
end;
Le lecteur modifiera les choix de valeurs par dfaut dans les gestionnaires dexception. Dans
lexemple plus haut, ces choix ne sont quindicatifs et servent montrer que lon peut, soit
arrter un calcul, soit le continuer avec une valeur de remplacement aprs signalement de
lerreur. Il sassurera par lui-mme que la conjonction entre les plans daction et les
exceptions est un systme de programmation dfensive efficace.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) page
581
Crer et lancer ses propres exceptions
Il est possible de construire de nouvelle classe d'exceptions personnalises en hritant
d'une des classes de Delphi mentionnes plus haut, ou minima de la classe de base
Exception.(cette classe contient une proprit public property Message: string, qui
contient en type string le texte afficher dans la bote de dialogue des exceptions quand
l'exception est dclenche).
Il est aussi possible de lancer une exception personnalise (comme si c'tait une exception
propre Delphi) n'importe quel endroit dans le code d'une mthode d'une classe en
instanciant un objet d'exception personnalis et en le prfixant du mot clef raise.
Le mcanisme gnral d'interception des exceptions travers des gestionnaires
d'exceptions tryexcept s'applique tous les types d'exceptions y compris les exceptions
personnalises.
Cration d'une nouvelle classe
Type
MonExcept = class (Exception)
End;
MonExcept hrite par construction de la proprit public
Message de sa mre.
Lancer une MonExcept
Type
MonExcept = class (Exception)
End;
Procedure classA.Truc;
begin
..
raise MonExcept.Create ( 'salut' );
..
end;
intercepter une MonExcept
MonExcept = class (Exception) end;
Procedure classB.Meth;
begin
..
try.. // code protger
except on MonExcept do begin
.. // code de raction l'exception
end;
end;
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 582
Exercices chapitre 5
Ex-1 : Il est demand de construire une classe de pile lifo ClassLifo hritant d'une Tlist (Un objet Tlist de
Delphi, stocke un tableau de pointeurs, utilis ici pour grer une liste d'objets) et qui est ractive l'empilement
et au dpilement d'un objet. Nous proposons de suivre la dmarche de la notice mthodologique du cours en nous
inspirant de son code final pour construire deux vnements dans la pile lifo et lui permettre de ragir ces deux
vnements.
Ex-2 : Nous souhaitons dvelopper rapidement un petit diteur de texte qui nous permettra :
- de lire du texte partir d'un fichier sur disque ou sur disquette (ouvrir),
- de taper du texte (nouveau),
- de visualiser le texte entr,
- deffectuer sur ce texte les oprations classiques de copier/ coller/ couper,
- de le sauvegarder sur disque ou sur disquette (enregistrer).
Ex-3 : Nous reprenons la classe dj construite ClassLifo de pile lifo hritant d'une Tlist ractive l'empilement
et au dpilement d'un objet, il est demand de la rendre plus robuste en lui permettant lorsque la pile est vide de
lancer une exception dpilement impossible.
Ex-4 : On dfinit la structure de donnes de liste chane double, qui est une liste chane pouvant se parcourir
dans les deux sens, chaque maillon de la liste est li son suivant et son prcdent sauf les maillons situs aux
extrmits de la liste; ( a1, , an ) sont les donnes de la liste :
Implanter en delphi la classe TListeDble reprsentant une telle liste chane double et TcellDble un maillon de la
liste (un maillon est donc un objet de calesse TcellDble), l'information du maillon est une chane de caractres.
TCellDble = class
public
info:string;
constructor Crer (avant , apres:TCellDble;
elt:string);
procedure InsererAvant (cell:TCellDble);
procedure InsererApres (cell:TCellDble);
private
next:TCellDble;
prec:TCellDble;
end;
Les mthodes InsererAvant et InsererApres ralisent
l'insertion (avant l'objet ou aprs l'objet)
TlisteDble =class
public
constructor Create;
destructor Liberer;
procedure AjouterLeft (elt:string);
procedure AjouterRight (elt:string);
procedure InsererLeft (rang:integer;elt:string);
procedure InsererRight (rang:integer;elt:string);
procedure SupprimerLeft (rang:integer);
procedure SupprimerRight (rang:integer);
function ElementFromLeft (rang:integer):string;
function ElementFromRight (rang:integer):string;
function IndexFromLeftOf (elt:string):integer;
function IndexFromRightOf (elt:string):integer;
function Tete:TCellDble;
function Fin:TCellDble;
function Longueur : integer;
procedure Clear;
function ParcourirLeft:string;
private
head , tail : TCellDble;
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 583
On propose pour simplifier l'criture des algorithmes de parcours de la liste de mettre deux sentinelles headet
tail bornant les deux "bouts" de la liste ( cellules ne contenant de donnes significatives) :
Spcifications des mthodes implanter :
constructor Create; Cre une liste vide :
destructor Liberer; Libre la mmoire utilise par la liste.
procedure AjouterLeft (elt : string); Ajoute la donne elt: string aprs head.
procedure AjouterRight (elt : string); Ajoute la donne elt: string avant tail.
procedure InsererLeft ( rang:integer ; elt:string ); Insre la donne elt: string au rang : integer , rang
compt partir de head (parcours gauche).
procedure InsererRight ( rang:integer ; elt:string ); Insre la donne elt: string au rang : integer , rang
compt partir de tail (parcours droite).
procedure SupprimerLeft (rang:integer); Supprime la donne de rang : integer , compte partir
de head (parcours gauche).
procedure SupprimerRight (rang:integer); Supprime la donne de rang : integer , compte partir
de tail (parcours droite).
function ElementFromLeft (rang:integer):string; Renvoie la donne de rang : integer , compte partir
de head (parcours gauche).
function ElementFromRight (rang:integer):string; Renvoie la donne de rang : integer , compte partir
de tail (parcours droite).
function IndexFromLeftOf (elt : string):integer; Renvoie le rang de la position de la donne elt : string
compt partir de head (parcours gauche).
function IndexFromRightOf (elt : string):integer; Renvoie le rang de la position de la donne elt: string
compt partir de tail (parcours droite).
function Tete:TCellDble; Renvoie une rfrence sur head.
function Fin:TCellDble; Renvoie une rfrence sur tail.
function Longueur : integer; Fournit le nombre d'lments utiles de la liste.
procedure Clear; Remet la liste vide :
function ParcourirLeft : string; Parcours des chanes de la liste de head tail en les
concatnant entre elles et renvoie la chane unique
obtenue.
Ex-5 : On dfinit la hirarchie suivante dans les figures gometriques :
Un quadrilatre est une figure (A,B,C,D) possdant
quatre cts.
Un paralllogramme est un quadrilatre dont les cts
opposs sont parallles et les angles opposs gaux.
Un rectangle est un paralllogramme dont tous les
angles ont la mme mesure : 90
Un carr est un rectangle dont tous les cts sont gaux.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 584
Il est demand d'implanter en Delphi la hirarchie de classe selon les diagrammes UML ci-aprs :
Spcifications des mthodes implanter
type cotes = string;
angles = string;
Les noms des cts ou des sous forme de string angles ( cts
:"AB", "CD", ou angles : "ABC", "BCD",).
function PropAngles (x:angles) : string; Renvoie dans une string les proprits d'un angle x : angles.
function PropCotes (x:cotes) : string; Renvoie dans une string les proprits d'un ct x : cotes.
procedure AfficheCotes (List : TlistBox); Affiche dans un TlistBox les proprits des 4 cts.
procedure AfficheAngles (List : TlistBox); Affiche dans un TlistBox les proprits des 4 angles.
Il est demand de construire une interface visuelle de test d'un objet de classe quadrilatre instanci la demande
selon l'une des trois classes filles (exemple ci-dessous d'une instanciation d'un quadrilatre en carr):
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 585
Ex-6 : Vous aurez utiliser la classe TTimer qui encapsule les fonctions de timer de l'API Windows, on
rappelle les proprits utiles que cette classe contient :
property Enabled: Boolean; // Dtermine si le timer rpond aux vnements timer.
property Interval: Cardinal; // Dtermine l'intervalle de temps, exprim en millisecondes, s'coulant avant que le
composant timer gnre un autre vnement OnTimer.
property OnTimer: TNotifyEvent; // Se produit quand le temps spcifi par la proprit Interval s'est coul.
unit UClassclickMemo;
// classe TMemoFlash
interface
uses stdctrls, extctrls, Graphics, classes, controls;
type
TMemoFlash = class ()
public

private

end;
implementation
end.
Questions :
Construire une classe visuelle complte TMemoFlash hrite des TMemo qui clignote 10 fois (il changera de
couleur jaune-bleu, par intermittence de 100ms entre chaque flash) lorsque l'utilisateur clique avec la souris dans
le composant. Un TMemoFlash doit avoir automatiquement comme parent son propritaire et lors de sa cration
il affichera l'adresse mmoire de la fentre de son parent et celle de sa propre fentre.
Ex-7 : construire une IHM de filtrage d'un texte entr au clavier dans un TEdit et recopi dans un TMemo une
fois filtr :
Le filtrage consiste ne conserver dans EditFiltrage que les lettres majuscules et minuscules, et exclure tout
autre caractre lors de la recopie du texte entr dans EditSaisie.
Le filtrage doit s'effectuer la vole (c'est dire au fur et mesure que l'on tape du texte au clavier dans
EditSaisie) et lorsque l'utilisateur appui sur la touche entre du clavier le texte qui a t filtr doit tre rang dans
un TMemo nomm MemoApresFiltrage. Prvoir deux versions possibles selon que l'utilisateur est autoris
utiliser la touche d'effacement arrire (backspace) ou non dans la saisie du texte et utiliser l'vnement
OnKeypress pour effectuer le filtrage la vole.
Texte brut entr au clavier
dans le TEdit : EditSaisie.
Texte recopi une fois filtr
dans le TEdit : EditFiltrage.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 586
Ex-1 Code solution pratique : une pile Lifo vnementielle
unit ULifoEvent ;
interface
uses classes,Dialogs ;
type
DelegateLifo = procedure ( Sender: TObject ; s :string ) of object ;
ClassLifo = class (TList)
private
FOnEmpiler : DelegateLifo ;
FOnDepiler : DelegateLifo ;
public
function Est_Vide : boolean ;
procedure Empiler (elt : string ) ;
procedure Depiler ( var elt : string ) ;
property OnEmpiler : DelegateLifo read FOnEmpiler write FOnEmpiler ;
property OnDepiler : DelegateLifo read FOnDepiler write FOnDepiler ;
end;
ClassUseLifo = class
public
procedure EmpilerListener( Sender: TObject ; s :string ) ;
procedure DepilerListener( Sender: TObject ; s :string ) ;
constructor Create ;
procedure main ;
end;
implementation
procedure ClassLifo.Depiler( var elt : string ) ;
begin
if not Est_Vide then
begin
elt :=string (self.First) ;
self.Delete(0) ;
self.Pack ;
self.Capacity := self.Count ;
if assigned(FOnDepiler) then
FOnDepiler ( self ,elt )
end
end;
procedure ClassLifo.Empiler(elt : string ) ;
begin
self.Insert(0 , PChar(elt)) ;
if assigned(FOnEmpiler) then
FOnEmpiler ( self ,elt )
end;
Le type de l'vnement : type
pointeur de mthode (2 paramtres)
Champs privs stockant la valeur de
l'vnement (pointeur de mthode).
Evnement OnEmpiler :
- pointeur de mthode.
Evnement OnDepiler :
- pointeur de mthode.
Si une mthode dont la signature est celle du type
DelegateLifo est lie (gestionnaire de l'vnement
OnDepiler), le champ FOnDepiler pointe vers elle,
il est donc non nul.
Sinon FOnDepiler est nul (non assign)
L'instruction FOnDepiler ( self ,elt ) sert appeler
la mthode vers laquelle FOnDepiler pointe.
Si une mthode dont la signature est celle du type
DelegateLifo est lie (gestionnaire de l'vnement
OnDepiler), le champ FOnEmpiler pointe vers elle,
il est donc non nul.
Sinon FOnEmpiler est nul (non assign)
L'instruction FOnEmpiler ( self ,elt ) sert appeler
la mthode vers laquelle FOnEmpiler pointe.
self = la pile Lifo
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 587
function ClassLifo.Est_Vide : boolean ;
begin
result := self.Count = 0 ;
end;
{ ClassUseLifo }
constructor ClassUseLifo.Create ;
begin
inherited;
end;
procedure ClassUseLifo.DepilerListener( Sender: TObject ; s :string ) ;
begin
writeln ( 'On a depile : ' ,s) ;
end;
procedure ClassUseLifo.EmpilerListener( Sender: TObject ; s :string ) ;
begin
writeln ( 'On a empile : ' ,s) ;
end;
procedure ClassUseLifo.main ;
var
pileLifo : ClassLifo ;
ch :string ;
begin
pileLifo := ClassLifo.Create ;
pileLifo.OnEmpiler := EmpilerListener ;
pileLifo.OnDepiler := DepilerListener ;
pileLifo.Empiler( '[ eau ]' ) ;
pileLifo.Empiler( '[ terre ]' ) ;
pileLifo.Empiler( '[ mer ]' ) ;
pileLifo.Empiler( '[ voiture ]' ) ;
writeln ( 'Depilement de la pile :' ) ;
while not pileLifo.Est_Vide do
begin
pileLifo.Depiler(ch) ;
writeln (ch) ;
end;
writeln ( 'Fin du depilement.' ) ;
readln ;
end;
end.
programProject2;
{$APPTYPE CONSOLE}
uses SysUtils , UlifoEvent ;
var execLifo : ClassUseLifo;
begin
execLifo := ClassUseLifo.Create;
execLifo.main
end.
excution
Classe de test crant une pile Lifo
Mthode main de test
Affectation de chaque gestionnaire
l'vnement qu'il est charg de grer.
Instanciation d'une
pile Lifo tester.
Empilement de 4 lments
Dpilement de toute la pile
Gestionnaire de l'vnement OnDepiler :
signature compatible avec DelegateLifo.
Gestionnaire de l'vnement OnEmpiler :
signature compatible avec DelegateLifo.
Application console Project2.dpr instanciant
un objet de ClassUseLifo et lanant le test de
la pile lifo par invocation de la mthode main.
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 588
Ex-2 Solution dtaille : un diteur de texte
1. Les choix partir de l'nonc
Les objets potentiels ragiront ces vnements selon le graphe ci-dessous
Lobjet TextEditeur est lobjet central sur lequel agissent tous les autres objets, il contiendra le texte diter.
En faisant ressortir les oprations effectuer, lutilisation de la notion dabstraction est naturelle.
Nous envisageons les actions suivantes obtenues par raction un vnement Click de souris (choix des objets
du graphe prcdent):
nouveau (utilise un objet dfinir)
couper (utilise un objet dfinir)
copier (utilise un objet dfinir)
coller (utilise un objet dfinir)
ouvrir (utilise un objet de dialogue)
enregistrer (utilise un objet de dialogue)
quitter (utilise un objet prdfini Form)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 589
2. Les objets de composants
Delphi tant orient objet nous allons exploiter compltement l'analyse prsente dans le graphe vnementiel ci-
haut en mettant en place quatre objets du genre composants visuels ou non visuels de Delphi.
Linterface choisie
Une fiche (Form1) comportant :
Un Tmemo avec deux ascenseurs
Trois composants non visuels :
TMainmenu (une barre de 2 menus)
TopenDialog (pour le chargement de
fichier)
TSaveDialog (pour la sauvegarde d'un
texte)
Le composant TMainmenu(1
er
menu)
comporte un premier menu Fichier 5 items
Le composant TMainmenu (2
me
menu)
comporte un deuxime menu Edition 3
items.
Les menus dans la barre et les sous-menus sont tous des objets de classe TmenuItem qui sont grs travers le
champ Items d'un objet de classe TMainMenu :
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 590
object MainMenu1: TMainMenu
.
object fichier1: TMenuItem
Caption = 'fichier'
end
object edition1: TMenuItem
Caption = 'edition'
object couper1: TMenuItem
Caption = 'couper'
end
object copier1: TMenuItem
Caption = 'copier'
end
object coller1: TMenuItem
Caption = 'coller'
end
end
end ..
Correspondance entre le code cach par
Delphi et l'inclusion des objets de
TmenuItem dans un TmainMenu.
Mise en place de la gestion des vnements.
A chacun des items utilisables de chacun des 2 menus, il nous faut associer un gestionnaire dvnement qui
indique au programme comment il doit ragir lorsque l'utilisateur slectionne un champ de l'un des menus par un
click de souris. Nous avons vu que Delphi contient le mcanisme d'association des vnements nos
gestionnaires. Beaucoup de contrles (classes visuelles)et beaucoup d'autres classes non visuelles comme les
TMenuItem, de Delphi sont sensibles lvnement. de click de souris : property OnClick : TnotifyEvent.
Les gestionnaires de lvnement OnClick pour les TMenuItem
Voici les en-ttes des 7 gestionnaires de OnClick automatiquement construits :
Chacun des 3 items est
associ un raccourci
clavier classique (Ctrl+...)
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 591
procedure Nouveau1Click(Sender: TObject);
procedure Ouvrir1Click(Sender: TObject);
procedure Enregistrersous1Click(Sender: TObject);
procedure Quitter1Click(Sender: TObject);
procedure Couper1Click(Sender: TObject);
procedure Copier1Click(Sender: TObject);
procedure Coller1Click(Sender: TObject);
Voici pour chaque gestionnaire le code crit par le programmeur.
Le code du gestionnaire Quitter1Click
procedure TForm1.Quitter1Click(Sender: TObject);
begin
Close; //crit par le dveloppeur (fermeture de la fentre)
end;
Le code du gestionnaire Ouvrir1Click
procedure TForm1.Ouvrir1Click(Sender: TObject);
begin
if OpenDialog1.Execute then //crit par le dveloppeur
begin
Enregistrersous1.enabled:=true;
TextEditeur.Lines.LoadFromFile(OpenDialog1.FileName);
end
end;
Le code du gestionnaire Enregistrersous1Click
procedure TForm1.Enregistrersous1Click(Sender: TObject);
begin
if SaveDialog1.Execute then // crit par le dveloppeur
begin
Enregistrersous1.enabled:=false;
TextEditeur.Lines.SaveToFile( SaveDialog1.FileName );
end
end;
Le code du gestionnaire Couper1Click
procedure TForm1.Couper1Click(Sender: TObject);
begin
TextEditeur.CutToClipboard; //crit par le dveloppeur
end;
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 592
Le code du gestionnaire Copier1Click
procedure TForm1.Copier1Click(Sender: TObject);
begin
TextEditeur.CopyToClipboard; //crit par le dveloppeur
end;
Le code du gestionnaire Coller1Click
procedure TForm1.Coller1Click(Sender: TObject);
begin
TextEditeur.PasteFromClipboard; //crit par le dveloppeur
end;
Le code du gestionnaire Nouveau1Click
procedure TForm1.Nouveau1Click(Sender: TObject);
begin
TextEditeur.Clear; &not; crit par le dveloppeur
Enregistrersous1.enabled:=true &not; crit par le dveloppeur
end;
Il est noter que nous avons crit au total 16 lignes de programme Delphi pour construire notre micro-diteur.
Ceci est rendu possible par la rutilisabilit de mthodes dj intgres dans les objets de Delphi et en fait
prsentes dans le systme Windows.
Vous pouvez voir la puissance de ce RAD lorsque vous observez par exemple l'instruction qui a permis de faire
excuter le "copier" ou le "chargement d'un fichier" :
TextEditeur.CopyToClipboard;
La mthode CopyToClipboard s'applique l'objet TextEditeur qui est de la classe TMemo; cette instruction
correspond un ensemble complexe d'oprations de bas niveau :
le TMemo autorise une suite complexe d'oprations permettant de slectionner un texte crit sur plusieurs lignes
du TMemo. Il les affiche en surbrillance et la mthode CopyToClipboard rcupre le texte slectionn puis le
recopie enfin dans le presse-papier du systme.
TextEditeur.Lines.LoadFromFile(OpenDialog1.FileName);
Nous n'avons par ailleurs eu aucun code particulier crire pour le chargement de fichier texte, la mthode
LoadFromFile prsente dans l'objet Lines (de classe TStrings) effectue toutes les actions.
A titre de travail personnel il est recommand d'enrichir ce micro-diteur avec la possibilit de changer la police
de caractre, la couleur du fond etc
Les bases de linformatique - programmation - ( rv. 04.01.2005 ) EXERCICES page 593
Ex-3 Code solution pratique : une pile Lifo avec exception
Cration d'une nouvelle classe
PileVideException = class (Exception)
end;
Lancer une PileVideException
procedure ClassLifo.Depiler( var elt : string ) ;
begin
if not Est_Vide then
begin

end
else raise PileVideException.Create ('Impossible de dpiler: la pile est vide' )
end;
Code complet de la pile
unit ULifoEvent ;
interface
uses classes,Dialogs, SysUtils ;
type
DelegateLifo = procedure ( Sender: TObject ; s :string ) of object ;
PileVideException = class (Exception)
end;
ClassLifo = class (TList)
private
FOnEmpiler : DelegateLifo ;
FOnDepiler : DelegateLifo ;
public
function Est_Vide : boolean ;
procedure Empiler (elt : string ) ;
procedure Depiler ( var elt : string ) ;
property OnEmpiler : DelegateLifo read FOnEmpiler write FOnEmpiler ;
property OnDepiler : DelegateLifo read FOnDepiler write FOnDepiler ;
end;
ClassUseLifo = class
public<