Beruflich Dokumente
Kultur Dokumente
exercices de programmation ;
exercices complmentaires ;
exercices thoriques.
Pour obtenir les corrigs, le tlchargement n'est possible que via un login et un mot de passe, que vous pouvez
obtenir en envoyant un mail l'adresse suivante :
Les bases de la programmation par Eric Thirion
- 61 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
en prcisant un peu qui vous tes et les raisons pour lesquelles ce cours vous intresse.
Sous-programmes
But de ce chapitre
Les sous-programmes existent dans tous les langages de programmation, depuis les origines. En effet, les
dveloppeurs se sont vite rendu compte que dans la programmation on retrouve trs souvent des traitements
similaires. Avec les sous-programmes, il devient possible de regrouper ces traitements en un seul bout de code
rutilisable, ce qui permet une conomie de temps considrable. D'autre part, l'utilisation de sous-programmes rend
le code plus lisible et plus facile mettre jour. C'est donc une bonne manire de programmer.
Dans ce chapitre, nous verrons comment crire et utiliser des sous-programmes. Nous verrons galement qu'il est
possible de dclarer des variables l'intrieur d'un sous-programme et que ces variables, appeles variables locales,
se diffrencient subtilement des variables globales que nous avons dj rencontres dans le premier cours.
Introduction
Le but de la programmation n'est pas seulement de faire des programmes qui marchent. Ils doivent galement tre
lisibles, faciles mettre jour et plus concis.
C'est essentiellement cela que servent les sous-programmes.
Dcoupage d'un programme en sous-programmes
crire du code l'aide de sous-programmes est avant tout une manire de programmer : au lieu de concevoir un
programme en un seul bloc, on le dcoupe en plusieurs parties aussi indpendantes que possible. Chacune de ces
parties porte un nom : ce sont les sous-programmes.
Bien entendu, cette manire de programmer n'est pas obligatoire. On peut trs bien programmer sans jamais crire
de sous-programmes, mais cela donne des programmes trs longs, peu lisibles et difficiles mettre jour.
Par analogie, on pourrait comparer ceci au dcoupage d'une entreprise en plusieurs services. Chaque service
ayant un rle particulier jouer dans l'entreprise. De mme, on peut concevoir un programme en plusieurs sous-
programmes ralisant chacun un traitement particulier.
Le PC est une autre analogie intressante. Dans un PC, chaque partie est facilement remplaable par une autre :
vous pouvez remplacer l'cran par un autre cran, la carte son par une autre carte son, le clavier par un autre clavier,
etc. Cette possibilit de remplacer chaque partie par une autre partie compatible est possible grce la conception
modulaire du PC. Un programme sans sous-programme est comme un PC en un seul bloc : impossible d'interchanger
les parties.
Sous-programmes non vnementiels
Dans le premier cours, nous avons dj vu quelques sous-programmes.
Les bases de la programmation par Eric Thirion
- 62 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Reprenons l'exemple du projet Addition.
Lorsque l'utilisateur clique sur le bouton, la procdure vnementielle BoutonAdditionnerClick est automatiquement
excute.
Cette procdure vnementielle est un exemple de sous-programme.
Une autre catgorie de sous-programmes, que j'appellerais sous-programmes non vnementiels, ne peuvent
s'excuter que s'il existe quelque part une instruction spciale : l'appel de sous-programme.
De telles instructions figurent l'intrieur de la procdure BoutonAdditionnerClick :
procedure TForm1.BoutonAdditionnerClick(Sender: TObject);
begin
LireEntier (x,zoneTexteX); { <-- }
LireEntier (y,ZoneTexteY); { <-- }
somme := x + y;
AfficherEntier (somme, ZoneTexteSomme); { <-- }
end;
LireEntier et AfficherEntier sont en fait des sous-programmes (non vnementiels). Dans cet exemple, les trois
instructions marques d'une flche sont des appels de sous-programme. LireEntier est donc appel deux fois et
AfficherEntier, une fois.
Par contre, le code du projet Addition ne contient aucun appel du sous-programme BoutonAdditionnerClick.
Comme il s'agit d'un sous-programme vnementiel, son excution sera dclenche par un vnement ; en
l'occurrence, un clic sur le bouton Additionner.
videmment, l'excution des sous-programmes LireEntier et AfficherEntier est galement dclenche, mais de
manire indirecte. Si BoutonAdditionClick ne contenait pas des instructions d'appel de ces procdures, elles ne
seraient jamais excutes !
Les units
Un projet Lazarus est gnralement compos de plusieurs fichiers source Pascal appels units.
Dans le projet Addition, par exemple, nous avons deux modules :
Les bases de la programmation par Eric Thirion
- 63 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
l'unit UnitAddition, qui contient la procdure vnementielle du bouton Additionner ;
l'unit entrees_sorties, qui contient le code des procdures Lire, Afficher, etc.
De manire gnrale, chaque formulaire est associ une unit contenant les procdures vnementielles. C'est
l'unit qui gre l'interface graphique du programme. Dans notre exemple, c'est l'unit UnitAddition. Mais il peut y
avoir plusieurs autres units contenant le code de sous-programmes non vnementiels. Dans notre exemple, il n'y
a qu'une seule unit de ce type. C'est l'unit entrees_sorties.
Procdures et fonctions
Jetons un il dans le fichier entrees_sorties. On y trouve, par exemple, le code du sous-programme AfficherEntier
que voici :
procedure AfficherEntier(x: integer;c:TObject);
begin
if c is TEdit then
(c as TEdit).Text:=IntToStr(x)
else
if c is TListBox then
(c as TListBox).Items.Add(IntToStr(x))
else
begin
ShowMessage('Erreur dans la fonction Afficher :
type du 2e paramtre non valide');
end;
end;
Pour l'instant, vous ne comprenez pas grand-chose ce code, car il fait appel plein de notions que vous n'avez
pas encore vues (structures de contrles, programmation objet). Notez simplement que la premire ligne commence
par le mot-cl procedure, suivi du nom du sous-programme. Cela signifie que le sous-programme appartient la
catgorie des procdures.
droite du nom de la procdure, on trouve les paramtres. Dans cet exemple, il y a deux paramtres : x de type
integer et c de type TObject.
Toute la premire ligne du sous-programme constitue l'entte : elle contient donc le nom du sous-programme et ses
ventuels paramtres. Tout ce qui suit est le corps du sous-programme. l'intrieur du corps du sous-programme
figurent donc les instructions que le sous-programme doit excuter.
Les paramtres sont les donnes d'un sous-programme. Dans le cas de la procdure AfficherEntier, x est le nombre
afficher et c le composant de l'interface graphique (zone de texte ou zone de liste) dans lequel on souhaite afficher x.
Nous reviendrons plus en dtail sur cette notion de paramtres. Pour l'instant, sachez que tout sous-programme peut
avoir des paramtres ou ne pas en avoir.
D'autres sous-programmes du fichier commencent par le mot-cl function. Ce sont les fonctions. C'est par exemple
le cas du sous-programme ZoneDeTexteVide :
function ZoneDeTexteVide (zt: TEdit) : boolean;
begin
ZoneDeTexteVide := zt.Text = '';
end;
Nous avons donc deux catgories de sous-programmes : les procdures et les fonctions. Les diffrences entre ces
deux catgories seront vues dans la suite du cours.
Les bases de la programmation par Eric Thirion
- 64 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Porte des variables
Une variable peut tre de porte locale ou globale. Elle est globale si elle est dclare en dehors de tout sous-
programme. Au contraire, une variable locale est dclare l'intrieur d'un sous-programme.
Mais pour l'instant, nous n'avons pas dfini ce qu'est un sous-programme de manire gnrale. Par contre, vous
savez ce qu'est une procdure vnementielle. Or, les procdures vnementielles reprsentent une catgorie
particulire de sous-programme.
Nous allons donc, pour l'instant, baser nos explications concernant la porte des variables en utilisant uniquement
les procdures vnementielles. Gardez toutefois l'esprit que ces explications seront valables pour n'importe quel
type de sous-programme.
Les variables locales et globales ne se comportent pas de la mme manire, notamment en ce qui concerne leur
dure de vie.
Pour illustrer la diffrence entre une variable locale et une variable globale, nous commencerons par quelques
exemples de programmes, que vous pouvez tlcharger sur le site de l'auteur :
exemple 1 ;
exemple 2 ;
exemple 3 ;
exemple 4.
Vous pouvez donc les ouvrir et les excuter pour vous aider mieux comprendre ou pour vous convaincre.
Exemple 1 (fichier : Global/ProjetGlobal.lpi)
Voici le formulaire du programme :
et voici un extrait du code de ce programme :
var
Form1: TForm1;
x : integer;
implementation
Les bases de la programmation par Eric Thirion
- 65 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
procedure TForm1.BoutonAffecterClick(Sender: TObject);
begin
x := 1961;
end;
procedure TForm1.BoutonAfficherClick(Sender: TObject);
begin
AfficherEntier (x, ZoneTexteX);
end;
Dans ce premier exemple, la variable x est dclare l'extrieur de tout sous-programme. Il s'agit donc d'une variable
globale.
Cela a les consquences suivantes :
x peut tre utilise dans tout le fichier de code o elle est dclare et, par consquent, l'intrieur
de toutes les procdures dfinies dans ce fichier. Dans notre exemple, la variable x est utilise dans
les deux procdures vnementielles BoutonAffecterClick et BoutonAfficherClick. La procdure
BoutonAffecterClick affecte la valeur 1961 x et la procdure BoutonAfficherClick affiche la valeur de x ;
x a une dure de vie gale celle de l'excution du programme : ds le dmarrage du programme, de
l'espace mmoire est allou la variable x. Lorsque le programme s'arrte, cet espace mmoire n'est plus
rserv la variable et on peut donc considrer qu'elle cesse d'exister. Pour vous en convaincre, lancez
le programme, affectez la valeur 1961 x. Vrifiez que x a bien la valeur 1961. Arrtez le programme et
relancez-le. Vous constaterez que x n'a plus la valeur 1961.
Exemple 2 (fichier : Local0/ProjetLocal0.lpi)
Dclarons cette fois-ci la variable x l'intrieur de la procdure BoutonAffecterClick. On obtient le rsultat suivant :
Lazarus affiche un message d'erreur Identifier not found x . Cette erreur est localise dans l'instruction
AfficherEntier(x, ZoneTexteX) de la procdure BoutonAfficherClick.
Lazarus prtend ne pas connatre l'identificateur x dont on parle dans cette instruction.
Or nous avons bien dclar x !
Comment expliquer cette erreur ?
Les bases de la programmation par Eric Thirion
- 66 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Le problme vient du fait qu'une variable locale n'est accessible qu' l'intrieur du sous-programme o elle est
dclare. Autrement dit, la porte d'une variable locale est limite ce sous-programme.
Dans notre exemple, x n'est donc dfinie qu' l'intrieur de la procdure BoutonAffecterClick et nulle part ailleurs.
Exemple 3 (fichier : Local1/ProjetLocal1.lpi)
Voici prsent une version lgrement modifie du programme prcdent, dans laquelle la variable x est dclare
au dbut du programme ainsi qu' l'intrieur de la procdure BoutonAffecterClick :
var
Form1: TForm1;
x : integer;
implementation
procedure TForm1.BoutonAffecterClick(Sender: TObject);
var x : integer;
begin
x := 1961;
end;
procedure TForm1.BoutonAfficherClick(Sender: TObject);
begin
AfficherEntier (x, ZoneTexteX);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
x := 1935;
AfficherEntier (x, ZoneTexteX);
end;
Cet exemple ne provoque aucun message d'erreur.
Vous vous demandez peut-tre comment une telle chose est possible, car a priori une variable ne peut pas tre
dclare deux fois. On devrait avoir un message d'erreur. Or il n'en est rien !
En ralit, il y a deux variables distinctes : la variable x dclare en global et celle dclare en local dans la procdure
BoutonAffecterClick.
Bien qu'elles portent le mme nom, ces deux variables sont totalement indpendantes.
Mais si Lazarus rencontre une instruction utilisant x, comment peut-il savoir de quelle variable il s'agit ?
Il s'en sort de la manire suivante :
l'affectation x := 1961, dans BoutonAffecterClick doit agir sur la variable locale x car x est dfini dans cette
procdure ;
par contre, l'instruction AfficherEntier(x, ZoneTexteX) dans BoutonAfficherClick agit sur la variable globale
x car cette procdure ne contient aucune dclaration de la variable x ;
de mme, les instructions x := 1935 et AfficherEntier (x, ZoneTexteX) dans FormCreate agissent sur la
variable globale.
De manire gnrale :
La dclaration locale est prioritaire sur la dclaration globale.
Les bases de la programmation par Eric Thirion
- 67 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Autrement dit, si une variable globale est redclare l'intrieur de certains sous-programmes alors :
l'intrieur de ces sous-programmes, c'est la dclaration locale qui l'emporte ;
l'intrieur d'un sous-programme dans laquelle cette variable n'est pas redclare, c'est la dclaration
globale qui est prise en compte.
prsent, faites l'exprience suivante :
1 lancez le programme. Il affiche la valeur 1935 pour x ;
2 cliquez sur le bouton Affecter la valeur 1961 X, puis sur Afficher X. Rsultat : la variable x n'a pas t
modifie !
Comment expliquer ceci ?
Lorsque vous lancez le programme, Lazarus excute tout d'abord la procdure FormCreate. Celle-ci affecte la valeur
1935 la variable x dclare en globale, puis affiche la valeur de cette mme variable.
Lorsque vous cliquez sur le bouton Affecter la valeur 1961 X, il excute la procdure BoutonAffecterClick, dans
laquelle x est dclare en local. Cette mme procdure affecte la valeur 1961 x. Mais comme x est dclare dans
cette procdure, cette affectation agit sur la variable x dclare dans cette procdure et non pas sur la variable x
dclare en global.
Enfin, lorsque vous cliquez sur le bouton Afficher X, il excute la procdure BoutonAfficherClick, dans laquelle
ne figure aucune dclaration locale de la variable x. Cette procdure affiche donc la valeur de la variable globale x
qui est toujours gale 1935.
Exemple 4 (fichier : Local2/ProjetLocal2.lpi)
Cette fois-ci, nous dclarons x en local dans toutes les procdures, mais pas en global :
var
Form1: TForm1;
implementation
procedure TForm1.BoutonAffecterClick(Sender: TObject);
var x : integer;
begin
x := 1961;
end;
procedure TForm1.BoutonAfficherClick(Sender: TObject);
var x : integer;
begin
AfficherEntier (x, ZoneTexteX);
end;
procedure TForm1.FormCreate(Sender: TObject);
var x : integer;
begin
x := 1935;
AfficherEntier (x, ZoneTexteX);
end;
Nous avons en ralit ici trois variables locales x indpendantes : celle de la procdure BoutonAffecterClick, celle
de la procdure BoutonAfficherClick et celle de la procdure FormCreate.
Mme exprience qu'avant :
Les bases de la programmation par Eric Thirion
- 68 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
1 lancez le programme. Il affiche la valeur 1935 pour x ;
2 cliquez sur le bouton Affecter la valeur 1961 X, puis sur Afficher X. La valeur affiche est (trs trs
probablement) diffrente de 1961.
Explications :
Lorsque vous lancez le programme, Lazarus excute FormCreate. Ce sous-programme affecte la valeur 1935 la
variable locale x, puis affiche la valeur de cette mme variable.
Lorsque vous cliquez sur le bouton Affecter la valeur 1961 X, il excute le sous-programme BoutonAffecterClick,
qui affecte la valeur 1961 la variable locale x de cette procdure.
Enfin, lorsque vous cliquez sur le bouton Afficher X, il excute le sous-programme BoutonAfficherClick, qui affiche
la valeur de la variable locale x de cette procdure. Comme aucune valeur n'est affecte x dans cette procdure,
cette variable a donc une valeur indfinie.
Synthse
Voil en rsum ce qu'il faut retenir sur les variables locales et globales :
Dfinition
Par dfinition, une variable est locale si elle est dclare l'intrieur d'un sous-programme.
Elle est globale dans le cas contraire.
Porte
Une variable globale est utilisable par tous les sous-programmes contenus dans le fichier o
elle est dclare.
Une variable locale, au contraire, n'est utilisable qu' l'intrieur du sous-programme dans lequel
elle est dclare.
Dure de vie
La dure de vie d'une variable globale est gale celle du programme. La zone mmoire
alloue pour cette variable lui reste alloue tant que le programme s'excute.
La dure de vie d'une variable locale est celle d'une excution du sous-programme dans lequel
elle est dclare. Elle peut donc avoir plusieurs vies : elle renat chaque fois que le sous-
programme s'excute et meurt chaque fois qu'il se termine.
Dclarations locales multiples
Si une mme variable est dclare dans plusieurs sous-programmes, tout se passe comme
si on avait donn des noms de variables distincts pour ces diffrentes dclarations. Autrement
dit, chaque dclaration engendre une variable totalement indpendante des autres.
Les bases de la programmation par Eric Thirion
- 69 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Dclaration simultane en local et en global
Si une mme variable est dclare en local et en global :
dans les sous-programmes o cette variable n'est pas dclare, c'est la dclaration
globale qui est prise en compte ;
l'intrieur des sous-programmes o cette variable est dclare, c'est la dclaration locale
qui est prise en compte.
Exemple d'utilisation de sous-programmes
Utilisation des procdures
Exemple 1
Concevoir un programme l'aide de sous-programmes signifie dcouper un traitement en sous-traitements
spcifiques. Pour illustrer ceci, reprenons le projet Peinture du cours Premires notions.
Rappelons que ce programme permet de calculer la surface peindre d'une pice rectangulaire, connaissant les
dimensions de la pice (longueur, largeur), le nombre de fentres et le nombres de portes.
Cet exemple nous avait justement servi illustrer le principe du dcoupage d'un traitement en sous-traitements.
Lorsqu'un calcul est trop complexe, on a intrt le dcouper en plusieurs calculs intermdiaires et sauvegarder les
rsultats intermdiaires dans des variables.
Cela nous avait donn le code suivant pour le bouton Calculer :
Les bases de la programmation par Eric Thirion
- 70 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Nous avons ici un exemple de code qui peut trs facilement se rcrire l'aide de sous-programmes. Associons un
appel de procdure chaque traitement, cela nous donne :
Comparez ce code celui de la version prcdente : il est devenu plus court et plus lisible.
crivons prsent le code des procdures de calcul. Ce code doit tre crit avant la procdure vnementielle
BT_CalculClick. Il suffit d'crire une entte pour chaque procdure, puis de copier en-dessous l'affectation
correspondante enrobe de begin end. On obtient :
Les bases de la programmation par Eric Thirion
- 71 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Programmation descendante
Remarquez que l'on aurait pu procder ainsi ds le dpart : notre problme est de calculer la surface peindre. Ce
problme peut tre dcompos en quatre sous-problmes : calculer la surface des murs, la surface des fentres, la
surface des portes et finalement la surface peindre.
On associe chaque problme une procdure, ce qui nous permet d'crire le code du programme sans nous occuper
des dtails, c'est--dire avant mme d'avoir rsolu les sous-problmes.
Cette manire de procder est appele la programmation descendante.
Retour d'un sous-programme
Lorsqu'une procdure vnementielle a fini de s'excuter, le programme retourne automatiquement un tat d'attente
d'vnement.
Dans le cas d'un sous-programme non vnementiel, c'est un peu diffrent : l'ordinateur revient l'instruction qui suit
l'appel. Dans le cas du projet Peinture, on obtient ceci :
Les bases de la programmation par Eric Thirion
- 72 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Exemple 2
Dans le premier exemple d'utilisation des procdures, nous avons rcrit le projet Peinture l'aide de procdures
sans paramtres.
L'exemple prsent ici introduit les procdures avec paramtres. Il s'agit d'un programme (sans intrt autre que
pdagogique !) qui permet d'afficher le mail d'une personne de nom et prnom donns :
Le bouton SFR affiche le mail chez SFR, alors que le bouton FREE affiche le mail chez Free. Voici le code de la
procdure vnementielle associe au bouton FREE :
Les bases de la programmation par Eric Thirion
- 73 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
On constate que le code des deux procdures vnementielles associes aux boutons SFR et FREE se ressemble
normment. La seule chose qui change est le nom de l'oprateur.
Pour transformer ces deux traitements quasiment identiques en un seul traitement, on peut utiliser un sous-
programme paramtr par le nom de l'oprateur. Voici le code de ce sous-programme :
procedure AfficherLeMailChez (operateur : string);
var prenom, nom : string;
begin
Lire (prenom, Form1.ZT_Prenom);
Lire (nom, Form1.ZT_Nom);
Afficher (prenom+'.'+nom+'@'+operateur+'.fr', Form1.ZT_Mail);
end;
Le code des deux procdures vnementielles se rsume alors l'appel de cette procdure avec deux valeurs de
paramtres diffrents :
procedure TForm1.BT_SFRClick(Sender: TObject);
begin
AfficherLeMailChez ('sfr');
end;
procedure TForm1.BT_FREEClick(Sender: TObject);
begin
AfficherLeMailChez ('free');
end;
Les valeurs des paramtres l'appel ('sfr' et 'free' dans notre exemple) sont les paramtres effectifs ne pas
confondre avec les paramtres formels : ce sont les paramtres dclars dans l'entte de la procdure. Dans notre
exemple, il n'y a qu'un seul paramtre formel (operateur de type string).
Dtail technique
Un petit dtail technique pour terminer la prsentation de cet exemple. Vous remarquerez que dans le code de la
procdure AfficherLeMailChez, les zones de texte sont toutes prfixes par Form1 :
procedure AfficherLeMailChez (operateur : string);
var prenom, nom : string;
begin
Lire (prenom, Form1.ZT_Prenom);
Lire (nom, Form1.ZT_Nom);
Afficher (prenom+'.'+nom+'@'+operateur+'.fr', Form1.ZT_Mail);
end;
De manire gnrale, pour accder aux composants d'une interface graphique depuis un sous-programme non
vnementiel, il est ncessaire de prfixer les noms de ces composants par le nom du formulaire.
Les bases de la programmation par Eric Thirion
- 74 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
ce stade, nous ne pouvons pas expliquer pourquoi cela est ncessaire car l'explication fait appel des notions
de programmation objet.
Exemple d'utilisation de fonctions
L'exemple prsent ici reprend le projet Peinture en l'crivant avec des fonctions. Ce nouvel exemple se trouve
dans le rpertoire Exemple-Sous-Programme/PeintureAvecFonctions, que vous pouvez tlcharger sur le site
de l'auteur.
Rappelons que le projet Peinture permet de calculer la surface peindre d'une pice rectangulaire, connaissant les
dimensions de la pice (longueur, largeur), le nombre de fentres et le nombre de portes.
Les dimensions des fentres, des portes et la hauteur des murs sont des constantes (LargeurFenetre=1,4 ;
HauteurFenetre=1,2 ; LargeurPorte=0,9 ; HauteurPorte=2,1 ; HauteurMur=2,5).
Ancienne version du projet
La dernire version (rpertoire Exemple-Sous-Programme/Peinture) nous avait servi introduire les procdures.
Nous n'avions alors aucune notion de variables locales, ni de paramtres. Cette version du projet avait donc t
crite en utilisant uniquement des variables globales et des procdures sans paramtre.
Pour calculer la surface peindre l'aide de procdures, nous avions procd par programmation descendante en
dcoupant le problme en quatre sous-problmes :
1 calcul de la surface des murs ;
2 calcul de la surface des fentres ;
3 calcul de la surface des portes ;
4 calcul de la surface peindre.
Nous avions associ une procdure chacun de ces traitements. Voici le code de ces procdures :
Les bases de la programmation par Eric Thirion
- 75 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
et voici l'appel de ces procdures dans la procdure vnementielle associe au bouton Calculer :
Nouvelle version : appel des fonctions
La nouvelle version que nous allons prsenter ici n'utilise au contraire aucune variable globale et effectue des calculs
par l'intermdiaire de fonctions.
Voici le code de cette mme procdure vnementielle dans la nouvelle version :
procedure TForm1.BT_CalculClick(Sender: TObject);
var LargeurPiece, LongueurPiece, Surface_A_Peindre : double;
NFenetre, NPorte : Integer;
begin
LireNombre (LargeurPiece, ZT_Largeur);
LireNombre (LongueurPiece, ZT_Longueur);
LireEntier (NFenetre, ZT_NF);
LireEntier (NPorte, ZT_NP);
Surface_A_Peindre :=
SurfaceDesMurs(LargeurPiece,LongueurPiece)
- SurfaceDesFenetres(NFenetre)
- SurfaceDesPortes(Nporte);
AfficherNombre (Surface_A_Peindre,ZT_SP);
end;
Les bases de la programmation par Eric Thirion
- 76 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Le calcul de la surface peindre se fait prsent en une seule affectation. Plus prcisment, il est reprsent par
l'expression qui appelle trois fonctions :
1 SurfaceDesMurs : cette fonction calcule la surface des murs partir des dimensions de la pice ;
2 SurfaceDesFenetres : elle calcule la surface des fentres partir du nombre de fentres ;
3 SurfaceDesPortes : idem pour les portes partir du nombre de portes.
Nouvelle version : dclaration des fonctions
Voici le code de ces trois fonctions :
L'entte d'une fonction commence ncessairement par le mot cl function. Ce dernier est suivi du nom de la fonction
puis, optionnellement, de la liste des paramtres. Enfin, l'entte se termine par le type du rsultat produit par la
fonction. Dans notre cas, il s'agit du type double, car le rsultat produit est un nombre a priori non entier.
Une fonction se distingue d'une procdure par le fait qu'elle retourne un rsultat. Pour comprendre ce que signifie
retourner un rsultat , il faut voir comment l'ordinateur excute une expression contenant des appels de fonctions.
Nous reviendrons l-dessus un peu plus loin.
Dans notre exemple, chaque fonction ne contient qu'une seule instruction. Ce n'est pas vrai en gnral. Le corps
d'une fonction peut contenir plusieurs instructions. Comment savoir alors quel est le rsultat de la fonction ? En
Pascal, le rsultat d'une fonction est dtermine par la dernire excution d'une affectation de la forme :
Nom de la fonction := expression ;
Il faut donc ncessairement qu'une affectation de ce type soit prsente dans le corps de la fonction afin que le rsultat
retourn par celle-ci soit dfini.
Vous constaterez que, dans notre exemple, chaque fonction contient bien une instruction de ce type.
Retour du rsultat
Voyons maintenant ce que signifie retourner un rsultat . Pour cela, nous allons voir comment est value
l'expression contenant les appels de fonctions :
SurfaceDesMurs(LargeurPiece,LongueurPiece)
- SurfaceDesFenetres(NFenetre)
- SurfaceDesPortes(Nporte);
Les bases de la programmation par Eric Thirion
- 77 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
L'expression est value de gauche droite. L'ordinateur va donc commencer par valuer l'appel de la fonction
SurfaceDesMurs. Supposons que LargeurPiece = 3,6 et LongueurPiece = 4,3.
Comme dans les appels de procdures, les paramtres formels sont remplacs par les paramtres effectifs. Donc
ici, LaP va prendre la valeur 3,6 et LoP, la valeur 4,3. Puis le corps de la fonction est excut avec ces valeurs. La
fonction effectue donc le calcul suivant :
SurfaceDesMurs := 2 * (3,6 + 4,3) * HauteurMur;
Avec une hauteur de mur de 2,50 m, cela fait 39,5 m
2
.
la fin de l'excution de la fonction, ce rsultat va retourner dans l'expression qui l'a appele. Tout se passe
comme si la valeur 39,5 remplaait prsent l'appel de fonction dans cette expression. c'est--dire qu'il faut prsent
valuer l'expression :
39,5 - SurfaceDesFenetres(NFenetre)
- SurfaceDesPortes(Nporte);
Mais l'valuation de l'expression n'est pas termine. L'ordinateur va prsent excuter l'appel de la fonction
SurfaceDesFenetres. Supposons que le nombre de fentres soit gal trois ; nf, le paramtre formel de cette
fonction, va donc prendre la valeur 3 et la fonction va faire le calcul suivant :
SurfaceDesFenetres := 3 * LargeurFenetre * HauteurFenetre;
Avec une largeur de fentre de 1,4 m et une hauteur de fentre de 1,2 m, cela donne 5,04 m
2
.
Celle valeur retourne dans l'expression d'appel et nous obtenons :
39,5 - 5,04 - SurfaceDesPortes(Nporte);
Ici, l'ordinateur va d'abord effectuer la diffrence 39,5 - 5,04. Cela fait 34,46. Nous nous retrouvons donc avec
l'expression :
34,46 - SurfaceDesPortes(Nporte);
Il reste donc valuer l'appel de la fonction SurfaceDesPortes. Supposons deux portes ; le paramtre formel np
prend la valeur 2 et la fonction effectue le calcul suivant :
SurfaceDesPortes := 2 * LargeurPorte * HauteurPorte;
Avec une largeur de porte de 0,9 m et une hauteur de porte de 2,1 m, cela fait 3,78 m
2
. En ramenant ce rsultat
dans l'expression de dpart nous obtenons :
34,46 - 3,78;
Ce qui fait 30,68 m
2
. Vous pouvez vrifier que c'est bien le rsultat affich par le programme :
Les bases de la programmation par Eric Thirion
- 78 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Principes gnraux et complments
Dclaration et appel de procdures
Dclaration d'une procdure
procedure NomDeLaProcdure (liste des paramtres);
Dclaration des variables locales
begin
Instructions
end;
La premire ligne est l'entte de la procdure, forme du mot-cl procedure suivi du nom de la procdure et d'une
liste optionnelle de paramtres entre parenthses.
La partie entre begin et end est le corps de la procdure.
Entte
Sous sa forme la moins compacte, la liste des paramtres s'crit :
paramtre1 : type1,...., paramtreN : typeN
On peut obtenir une criture plus concise en regroupant les paramtres conscutifs de mme type, mais dans ce cas
chaque groupe de paramtres doit tre spar du suivant par un point virgule, sachant qu'un groupe de paramtres
s'crit :
paramtre1,...., paramtreN : type
Les bases de la programmation par Eric Thirion
- 79 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Variables locales
Toute procdure n'utilise pas ncessairement des variables locales, mais si c'est le cas, elles doivent tre dclares
entre l'entte et le premier begin.
criture d'un appel de procdure
L'appel d'une procdure est form du nom de cette procdure suivi d'une liste de paramtres
effectifs entre parenthses.
NomDeLaProcdure (liste des paramtres effectifs);
Dans l'exemple que nous avons prsent, les paramtres effectifs taient des chanes de caractres. De manire
gnrale, la liste des paramtres effectifs est constitue d'expressions quelconques spares par des virgules :
expression1,...., expressionN
Pour que l'appel de procdure soit compilable (et excutable !), le type de ces expressions doit tre compatible avec
celui des paramtres formels :
il doit y avoir autant de paramtres effectifs que de paramtres formels ;
le type d'un paramtre effectif quelconque doit tre compatible avec celui du paramtre formel de mme
position.
Voici par exemple une procdure qui possde trois paramtres formels (p, n ,o) de type chane de caractres :
procedure FormerMail (p, n , o : string);
begin
mail := p+'.'+n+'@'+o+'.fr';
end;
En supposant que Prenom1, Prenom2 et Nom soient des variables de type chane de caractres, elle pourrait tre
appele de la manire suivante :
FormerMail (Prenom1 + '-' + Prenom2, Nom, 'free');
Le premier paramtre effectif est une expression de type chane de caractres, le deuxime une variable de type
chane de caractres et le troisime, un littral de type chane de caractres. Ces trois paramtres effectifs sont donc
compatibles avec les paramtres formels.
Par contre, elle ne pourra tre appele d'aucune des manires suivantes :
FormerMail (Prenom1, Nom);
FormerMail (Prenom1, Nom, 9);
En effet, dans le premier appel, le nombre de paramtres effectifs n'est pas gal au nombre de paramtres formels et
dans le deuxime, le type du troisime paramtre effectif (numrique) n'est pas compatible avec le type du troisime
paramtre formel.
Les bases de la programmation par Eric Thirion
- 80 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Excution d'un appel de procdure
Principe du retour la procdure appelante
Un appel de procdure est toujours contenu dans une autre procdure, que nous appellerons la procdure
appelante.
Lorsqu'un appel de procdure est excut, le processeur interrompt momentanment
l'excution de la procdure appelante pour aller excuter la procdure appele. Aprs avoir
excut les instructions de cette procdure, il reprend l'excution de la procdure appelante
partir de l'instruction qui suivait l'appel.
Passage des paramtres et excution de l'appel
Les paramtres formels d'un sous-programme peuvent tre considrs comme des variables locales.
L'excution d'un appel de procdure consiste :
valuer chacun des paramtres effectifs ;
allouer de la mmoire pour les paramtres formels ;
affecter chaque paramtre formel la valeur du paramtre effectif correspondant ;
excuter le code de la procdure avec ces valeurs de paramtres ;
librer l'espace mmoire allou aux paramtres formels.
Reprenons l'exemple de la procdure FormerMail appele de la manire suivante :
FormerMail (Prenom1+'-'+Prenom2, Nom, 'free');
Les bases de la programmation par Eric Thirion
- 81 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
En supposant que les variables Prenom1, Prenom2 et Nom aient respectivement pour valeur 'Jean', 'Sebastien' et
'Bach', cet appel donnerait lieu aux oprations suivantes :
valuation des paramtres effectifs :
valeur de l'expression Prenom1 + '-' + Prenom2 : 'Jean-Sebastien' ;
valeur de l'expression Nom : 'Bach' ;
valeur de l'expression 'Free' : 'Free'.
allocation mmoire : de la mmoire est alloue aux trois paramtres formels p, n et o ;
affectation des valeurs aux paramtres formels :
la valeur 'Jean-Sebastien' est affecte au paramtre p ;
la valeur 'Bach' est affecte au paramtre n ;
la valeur 'Free' est affecte au paramtre o.
excution du code de la procdure : l'instruction
mail := p + '.' + n + '@' + o + '.fr';
est excute avec ces valeurs de paramtres ;
libration de place mmoire : la place mmoire alloue aux paramtres p, n et o est libre.
Dclaration et appel de fonctions
Dclaration d'une fonction
function NomDeLaFonction (liste des paramtres) : type;
Dclaration des variables locales
begin
Instructions (dont une instruction de retour)
end;
Diffrences avec la dclaration d'une procdure :
l'entte commence par le mot-cl function :
l'entte se termine par le type du rsultat retourn par la fonction ;
parmi les instructions contenues dans le corps de la fonction doit figurer une instruction permettant de
retourner le rsultat. En Pascal, cette instruction s'crit :
NomDeLaFonction := expression;
Appel de fonction
Un appel de fonction s'crit :
NomDeLaFonction (liste des paramtres effectifs)
Les bases de la programmation par Eric Thirion
- 82 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Comme pour les procdures, le nombre de paramtres effectifs doit tre gal au nombre de paramtres formels et
le type d'un paramtre effectif quelconque doit tre compatible avec celui du paramtre formel de mme position.
Diffrences avec un appel de procdure
Un appel de fonction est une expression dont la valeur est celle retourne par la fonction. Un appel de procdure, au
contraire, n'est pas une expression mais une instruction. L'excution d'une procdure ne retourne aucune valeur.
Une appel de fonction figure en gnral l'intrieur d'une instruction ou d'une expression. Par exemple, si Moyenne
est une fonction calculant la moyenne de deux nombres, on peut crire :
m:= Moyenne (A,B);
AfficherNombre (Moyenne (A,B), ZT_Moy)
(Moyenne(A,B) + Moyenne(C,D)) / 2
Un appel de procdure, au contraire, ne peut pas figurer l'intrieur d'une instruction, ni d'une expression.
Les fonctions prdfinies
Comme tous les langages, le Pascal offre une multitude de fonctions prdfinies. Ces fonctions ralisent en gnral
des oprations trs frquemment utilises afin de faciliter la tche du programmeur. On y trouve en particulier les
fonctions mathmatiques ( exemples) et les fonctions de manipulation de chane de caractres ( exemples).
En Pascal, elles sont rparties dans diffrentes units de code. Pour pouvoir les utiliser dans une unit d'un projet,
le nom de ces units doit figurer dans la liste des units importes, c'est--dire aprs uses.
Par dfaut, Lazarus importe huit units dans une unit associe un formulaire :
Les bases de la programmation par Eric Thirion
- 83 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Comme toutes les fonctions prdfinies ne figurent pas dans ces huit units, il faut dans certains cas tendre la liste
des units importes.
Prenons par exemple la fonction floor. Cette fonction retourne la partie entire d'un nombre. Elle figure dans l'unit
Math.pas (fonctions mathmatiques). Pour pouvoir utiliser floor dans une unit, il faut donc ajouter Math dans la
liste des units importes par celle-ci :
Les bases de la programmation par Eric Thirion
- 84 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Expressions et appels de fonctions
Comme nous l'avons dj dit, un appel de fonction est une expression dont la valeur est celle retourne par la fonction.
Cela nous permet d'largir la notion d'expression valide aborde dans le premier cours.
Pour cela, il nous suffit de rajouter la rgle suivante :
Un appel de fonction est une expression valide de type T, si les paramtres effectifs sont
compatibles avec les paramtres formels de la fonction et que cette fonction retourne un rsultat
de type T.
Cette nouvelle rgle, en conjonction avec les rgles dj vues, nous permet de construire des expressions faisant
intervenir des fonctions. Voici quelques exemples utilisant les fonctions prdfinies :
Expression Type Valeur
10+Random(2) Integer 10, 11 ou 12
'Age:' + IntToStr(51) String 'Age : 51'
LeftStr('Thirion',Length('Thirion')-1) String 'Thirio'
Exercices
Retrouvez diffrents exercices sur le site de l'auteur :
Les bases de la programmation par Eric Thirion
- 85 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
noncs ;
Pour obtenir les corrigs, rendez-vous au bas de la page.
La conditionnelle
La programmation n'aurait que trs peu d'intrt si elle ne permettait pas aux ordinateurs de ragir diffremment
selon diffrentes conditions.
Une machine programmable doit pouvoir effectuer des traitements diffrents selon les donnes qu'elle doit traiter.
Cela est possible grce l'existence des structures de contrle dans les langages de programmation : la
conditionnelle et les boucles.
L'objet de ce chapitre est d'expliquer le fonctionnement d'une conditionnelle.
Le If
La conditionnelle If existe en deux variantes : le If ... Then et le If Then Else.
Le If Then
La structure de contrle If Then s'crit de la manire suivante :
If condition Then
Begin
Les bases de la programmation par Eric Thirion
- 100 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Instructions excuter
si la condition est vraie
End;
La condition n'est rien d'autre qu'une expression logique.
Les instructions entre begin et end ne seront excutes que si la condition est vraie.
S'il n'y a qu'une seule instruction excuter, on peut omettre les mots-cls begin et end :
If condition Then Instruction excuter;
Prenons un exemple :
If n > 0 Then n := n - 1;
Si, par exemple, n vaut 5 juste avant l'excution du If Then, la condition n > 0 est vrifie. L'ordinateur va donc
excuter l'affectation n := n - 1. n vaudra donc 4 la sortie de la conditionnelle.
Si n vaut -1, par contre, la condition n > 0 n'est pas vrifie. L'affectation ne sera pas excute et n vaudra toujours
-1 la sortie de la conditionnelle.
Le If Then Else
Le If Then Else est une autre forme de conditionnelle.
Elle permet d'excuter certaines instructions si une condition est vraie, et d'autres si elle est fausse.
Voil sa syntaxe :
If condition Then
begin
Instructions excuter
si la condition est vraie
End
Else
begin
Instructions excuter
si la condition est fausse
End;
De mme, les begin et end ne sont pas ncessaires s'il n'y a qu'une seule instruction.
Prenons un exemple :
If n > 0 Then
n := n - 1
Else
n := n + 1;
Remarquez que nous n'avons pas mis de point-virgule aprs la premire affectation. Si nous l'avions fait, le
compilateur aurait gnr une erreur de syntaxe, car il aurait interprt ceci comme un if then simple suivi du
mot-cl else, qui n'aurait rien voir ici dans ce cas.
Par contre, le point-virgule est ncessaire aprs la deuxime affectation pour marquer la fin de la conditionnelle.
Que se passe-t-il lors de l'excution de cette conditionnelle ?
Les bases de la programmation par Eric Thirion
- 101 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Supposons, par exemple, que n vaut 5 juste avant l'excution du If Then Else. La condition n > 0 est vrifie.
L'ordinateur va donc excuter l'affectation n := n - 1. Par contre, l'affectation n := n + 1 ne sera pas excute. n
vaudra donc 4 la sortie de la conditionnelle.
Si n vaut -1, par contre, la condition n > 0 n'est pas vrifie. L'affectation n := n - 1 n'est donc pas excute. Mais
comme la condition est fausse, l'affectation n := n + 1 sera excute. n vaudra donc 0 la sortie de la conditionnelle.
If imbriqus
Les instructions l'intrieur d'un If ne sont pas forcment des affectations comme dans les exemples prcdents.
On peut galement y mettre d'autres structures de contrle et, en particulier, d'autres If.
Exemple :
If n > 0 Then
n := n - 1
Else
If n >= -3 Then
n := n + 1
Else
n := 2 * n;
Pour n = 5, l'instruction excute est n := n - 1. n vaudra donc 4 la sortie de la conditionnelle.
Pour n = -1, l'instruction excute est n := n + 1. n vaudra donc 0 la sortie de la conditionnelle.
Pour n = -4, l'instruction excute est n := 2 * n. n vaudra donc -8 la sortie de la conditionnelle.
Dans l'exemple prcdent, on a deux niveaux d'imbrication. Mais on peut avoir autant de niveaux d'imbrication qu'on
le souhaite.
L'instruction Exit
L'imbrication de If peut conduire des programmes plus rapides (voir l'exercice Min-Max-Med), mais elle peut
galement compliquer l'criture du code, notamment dans la protection d'un programme contre les erreurs.
Prenons par exemple un programme utilisant une date dfinie par un jour (nombre entier entre 1 et 31), un mois
(nombre entier entre 1 et 12) et une anne de ce sicle (nombre entier suprieur 2000). Ces trois donnes sont
lues depuis trois zones de texte (respectivement ZT_Jour, ZT_Mois et ZT_Annee) dans des variables entires,
respectivement Jour, Mois, Annee. Ce traitement est effectu par la procdure vnementielle associe au bouton
BT_GererDate.
Pour tester la validit de ces donnes avec des If imbriqus, on crirait le code suivant :
procedure TForm1.BT_GererDateClick(Sender: TObject)
var Jour,Mois,Annee: integer;
begin
LireEntier (Jour, ZT_Jour);
If ( Jour < 1) or (Jour > 31) Then
ShowMessage ('Numro du jour non valide!')
Else
begin
LireEntier (Mois, ZT_Mois);
If (Mois < 1) or (Mois > 12) Then
ShowMessage('Numro du mois non valide!')
Else
Begin
Les bases de la programmation par Eric Thirion
- 102 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
LireEntier(Annee,ZT_Annee);
If Annee < 2000 Then
ShowMessage ('Anne non valide!')
Else
Begin
Traitement de la date
End
End
End
End;
Pour raccourcir ce genre d'criture, on peut utiliser l'instruction Exit, qui permet de forcer la fin de l'excution du sous-
programme qui la contient. Avec cette instruction, l'exemple prcdent peut tre crit sans aucune imbrication de If :
procedure TForm1.BT_GererDateClick(Sender: TObject)
var Jour,Mois,Annee: integer;
begin
LireEntier (Jour, ZT_Jour);
If ( Jour < 1) or (Jour > 31) Then
Begin ShowMessage ('Numro du jour non valide!'); Exit End;
LireEntier (Mois, ZT_Mois);
If (Mois < 1) or (Mois > 12) Then
Begin ShowMessage('Numro du mois non valide!'); Exit End;
LireEntier(Annee,ZT_Annee);
If Annee < 2000 Then
Begin ShowMessage ('Anne non valide!'); Exit End;
Traitement de la date
End;
Case
La conditionnelle Case est utilise lorsque l'on veut effectuer diffrents traitements selon la valeur d'une expression
quelconque.
Voici sa syntaxe :
Case Expression Of
V1 :
Instructions excuter lorsque
l'expression vaut V1 ;
V2 :
Instructions excuter lorsque
l'expression vaut V2 ;
.
.
VN :
Instructions excuter lorsque
l'expression vaut VN ;
Else
Instructions excuter dans les autres cas ;
End;
La partie Else est optionnelle.
Voici, par exemple, comment dterminer le nom d'un mois en fonction de son numro avec une instruction Case :
Case NumeroMois Of
1 : NomMois :='janvier';
2 : NomMois :='fvrier';
.
Les bases de la programmation par Eric Thirion
- 103 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
.
12 : NomMois :='dcembre';
Else
ShowMessage ('Numro de mois inexistant!')
End;
Exercices
noncs ;
Pour obtenir les corrigs, voyez ci-dessous.
Corrigs des exercices
Pour obtenir les corrigs, le tlchargement n'est possible que via un login et un mot de passe, que vous pouvez
obtenir en envoyant un mail l'adresse suivante :
en prcisant un peu qui vous tes et les raisons pour lesquelles ce cours vous intresse.
Les bases de la programmation par Eric Thirion
- 107 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Les types structurs
Introduction
Dans le cours sur les tableaux, nous avons vu un premier moyen de mmoriser un ensemble de donnes dans
une variable. Cette manire de procder est toutefois limite des donnes de mme type. Les types structurs
que nous allons prsenter dans ce cours permettent de lever cette limitation.
Une autre limitation importante des tableaux est qu'ils sont de dimension fixe. On est donc souvent contraint de les
surdimensionner, afin de s'assurer qu'ils pourront stocker toutes les donnes traiter. Dans ce cours, nous allons
voir comment stocker des ensembles de donnes de taille variable sous formes de listes. Avec cette nouvelle
reprsentation, il sera possible d'utiliser une place mmoire proportionnelle au nombre de donnes mmoriser.
Les types structurs
Gnralits indpendantes du langage de programmation
Les concepts manipuls par l'tre humain peuvent souvent tre dcrits par des attributs : un rectangle est caractris
par sa largeur et sa longueur ; un livre peut tre dcrit par son titre, son auteur, son anne de publication ; une voiture
par sa marque, sa couleur, son kilomtrage, sa puissance, etc.
Pour pouvoir reprsenter informatiquement de tels concepts, les langages de programmation permettent de dfinir
des types structurs. Contrairement un type prdfini du langage (entier, rel, boolen, etc.), le nom d'un type
structur est dfini par le programmeur. Il pourra par exemple dfinir un type Livre , puis dclarer ensuite des
variables de ce type.
Dclaration
Dclaration d'un type structur
Prenons l'exemple du concept Livre . Pour reprsenter informatiquement un livre dans un programme Pascal, on
pourra dfinir un nouveau type de la manire suivante :
Type Livre =
record
Titre : String;
Auteur : String;
AnneePublication : Integer;
end ;
On a ainsi dfini un nouveau type de variable nomm Livre . Titre , Auteur et AnneePublication sont
les champs de ce type.
Les champs reprsentent les attributs du concept que l'on veut dfinir. Chaque champ est dfini par son type. Dans
notre exemple, Titre et Auteur sont des chanes de caractres et AnneePublication est un entier.
Dclaration de variables de type structur
partir du moment o un nouveau type a t dfini, il est possible de dclarer des variables de ce type. Une variable
de type structur est appele une structure ou un enregistrement. Cette dclaration se fait comme pour un type
prdfini.
Les bases de la programmation par Eric Thirion
- 108 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Par exemple, pour dclarer deux variables l1, l2 de type Livre, on crira :
Var l1, l2 : Livre;
Manipulation des champs d'une structure
Pour accder aux champs d'une structure, on utilise l'oprateur . .
Par exemple, pour affecter la valeur Visual Basic 6 Le Guide du programmeur au titre du livre l1, on crira :
l1.Titre := 'Visual Basic 6 - Le Guide du programmeur';
Un champ se manipule exactement comme une variable du mme type. Par exemple, l1.AnneePublication se
manipule exactement comme un entier. Pour obtenir l'ge du livre l1, on peut trs bien crire :
Var Age : Integer;
Age := AnneeActuelle - l1.AnneePublication;
Dfinition de types complexes par combinaison
Il est possible de dfinir des types complexes en combinant tableaux et structures, ou bien en combinant les types
structurs entre eux. Donnons quelques exemples.
Tableaux de structures : les tables
Le type des lments d'un tableau peut tre quelconque. On peut donc dfinir un tableau dont les lments sont des
types structurs, ou autrement dit un tableau de structures.
Les tableaux de structures sont galement appels tables. Ils jouent un rle important en informatique, puisqu'on les
retrouve dans les bases de donnes. Nous verrons ultrieurement qu'une base de donnes n'est rien d'autre qu'un
ensemble de tables stockes dans des fichiers.
Pour reprsenter l'ensemble des livres prsents dans une bibliothque, on peut par exemple utiliser un tableau dont
les lments sont de type Livre :
Var Bibliotheque : array [1..M] of Livre;
La variable Bibliotheque est donc un tableau de structures. La notation
Bibliotheque[6].Auteur
reprsente alors l'auteur du 6e livre.
Structure avec champs de type structur
Enrichissons un peu notre reprsentation d'un livre. Pour la gestion d'une bibliothque, il serait intressant d'associer
une date d'emprunt chaque livre :
Type Livre =
record
Titre : String;
Auteur : String;
AnneePublication : Integer;
DateEmprunt : TDate;
Les bases de la programmation par Eric Thirion
- 109 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
end;
Le type TDate tant lui-mme un type structur dfini par :
Type TDate =
record
Jour : Integer;
Mois : Integer;
Annee : Integer;
end;
Supposons que L soit une variable de type Livre. Pour dfinir la date d'emprunt de L, comme le 27 janvier 2009,
on crira :
L.DateEmprunt.Jour := 27;
L.DateEmprunt.Mois := 1;
L.DateEmprunt.Annee := 2009;
Les pointeurs
Dclaration d'un pointeur
Un pointeur est une variable contenant une adresse.
Rappelons (cf. le chapitre sur les premires notions) qu'une adresse est un entier qui reprsente la position d'un
octet en mmoire. Cet entier permet donc en particulier de reprer la position, ou autrement dit l'adresse, d'une plage
mmoire :
En Pascal, un pointeur se dclare de la manire suivante :
Var NomDuPointeur : ^Type;
o Type reprsente le type de donne dont le pointeur contiendra l'adresse.
Exemple :
Type Ville =
record
Nom : String;
CodePostal : Integer;
End;
Var PVille : ^Ville;
Dans cet exemple, la variable PVille est un pointeur sur une donne de type Ville.
Les bases de la programmation par Eric Thirion
- 110 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Une autre manire de dclarer un pointeur est de dfinir tout d'abord un type pointeur de la manire suivante :
Type PointeurSurType = ^Type;
et de dclarer ensuite le pointeur comme une variable de ce type :
Var NomDuPointeur : PointeurSurType;
Avec l'exemple prcdent cela donnerait :
Type Ville =
record
Nom : String;
CodePostal : Integer;
End;
PointeurSurVille = ^Ville;
Var PVille : PointeurSurVille;
Allocation dynamique de mmoire
Un pointeur permet de crer une variable sans nom, repre uniquement par l'adresse qu'il contient.
Cette variable est cre par un mcanisme d'allocation dynamique de mmoire, que nous allons dcrire prsent.
Les variables gnres dynamiquement sont stockes dans une zone spciale de la mmoire appele le tas (heap
en anglais).
En Pascal, l'allocation dynamique de mmoire se fait grce l'oprateur new.
Si p est un pointeur sur un type T, new(p) va allouer de la place mmoire dans le tas pour une variable de ce type
et affecter p l'adresse de cette variable.
Avec notre exemple prcdent, new(p) rserverait de la place pour une structure de type Ville et affecterait l'adresse
de cette structure p. Par exemple, si la plage mmoire rserve pour la structure commence l'adresse 1961, p
contiendra cette adresse :
Une fois que la variable est cre, il est possible d'y accder par l'oprateur ^. Si p est un pointeur, p^ reprsente
la variable pointe par p.
Avec notre exemple, pour affecter Strasbourg au nom de la ville point par p, on crirait :
Les bases de la programmation par Eric Thirion
- 111 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
p^.Nom := 'Strasbourg';
Tout se passe donc comme si p^ tait une variable de type Ville.
Listes simplement chanes
Pour l'instant, le seul moyen dont vous disposez pour reprsenter un ensemble de donnes est le tableau. Dans un
tableau, chaque donne (de mme type) possde un indice dfinissant sa position dans le tableau.
Les listes sont une autre manire de reprsenter un ensemble de donnes n'utilisant pas d'indice et base sur les
pointeurs.
Reprsentation
Une liste simplement chane se reprsente par un ensemble de structures de mme type
possdant un champ contenant l'adresse de l'lment suivant.
Il serait assez difficile et peu pdagogique de prsenter les listes chanes dans un cas gnral abstrait. Nous allons
donc baser toutes nos explications sur un exemple qui sera facile gnraliser : une liste de structures de type Ville
dont voici la dclaration :
Type
PVille = ^Ville;
Ville = record
Nom : String;
CodePostal : String;
Suivant : PVille;
end;
Le champ Suivant sert mmoriser l'adresse de l'lment suivant de la liste. Dans le cas gnral, il peut porter
n'importe quel nom, mais il doit exister un champ jouant ce rle.
La liste, quant elle, est galement un pointeur qui contient l'adresse de son premier lment.
Dans notre exemple, on pourrait donc reprsenter une liste de villes par une variable L de type PVille.
Voici par exemple une liste simplement chane contenant quatre villes :
L contient l'adresse de la premire ville (Ribeauvill). Le champ Suivant de la premire ville contient l'adresse de
la seconde (Kingersheim), etc.
Le dernier lment de la liste (Nancy) n'a pas d'lment suivant. Son champ Suivant contient la valeur NIL, qui
reprsente en Pascal une adresse inexistante.
Une liste vide se reprsente simplement par un pointeur de liste gal NIL (L = NIL dans notre
exemple).
Les bases de la programmation par Eric Thirion
- 112 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Parcours
Pour effectuer un traitement sur chaque lment d'une liste, il est ncessaire de savoir parcourir ses lments. On
utilisera pour cela un pointeur, qui prendra successivement la valeur des adresses de chaque lment de la liste.
Voici par exemple comment parcourir une liste de villes dont l'adresse est contenue dans le pointeur L :
Var p : Pville;
p := L;
While p <> NIL Do
begin
{ Traitement de l'lment point par p }
p := p^.Suivant;
end;
Adjonction d'un lment
Considrons le problme suivant : on dispose d'une liste de villes L et d'une structure de type Ville pointe par un
pointeur p. Comment procder pour ajouter cette structure dans la liste ?
En dbut de liste
Pour ajouter l'lment p^ au dbut de la liste L, il suffit de faire :
p^.Suivant := L;
L := p;
La premire affectation accroche la structure la liste et la deuxime met jour l'adresse de la liste, qui devient
celle de p.
Cette mthode fonctionne galement avec une liste vide. En effet, dans ce cas L vaut NIL
avant l'adjonction. Aprs l'adjonction, on aura bien une liste d'un lment (p^) avec L = p et
p^.Suivant = NIL.
La figure suivante illustre l'adjonction en dbut de liste de la ville Ribeauvill :
Avant l'adjonction :
la liste L contient les trois villes Kingersheim, Strasbourg et Nancy ;
L contient l'adresse de la structure reprsentant Kingersheim.
Les bases de la programmation par Eric Thirion
- 113 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Aprs l'adjonction :
le champ Suivant de la structure reprsentant Ribeauvill contient l'adresse de la structure reprsentant
Kingersheim ;
L contient l'adresse de la structure reprsentant Ribeauvill ;
L contient donc prsent les quatre villes Ribeauvill, Kingersheim, Strasbourg et Nancy.
Insertion aprs un lment
Supposons prsent que la liste n'est pas vide et que l'on souhaite insrer un lment aprs un certain lment
de la liste.
Soit p l'adresse du nouvel lment que l'on souhaite insrer, et Curseur l'adresse de l'lment aprs lequel on
souhaite insrer p^. Les instructions suivantes permettent d'obtenir ce que l'on souhaite :
p^.Suivant := Curseur^.Suivant;
Curseur^.Suivant := p;
La figure suivante illustre l'insertion d'une structure reprsentant Strasbourg, aprs la structure reprsentant
Kingersheim :
Suppression d'un lment
Suppression du premier lment
Pour supprimer le premier lment d'une liste simplement chane, il suffit de remplacer l'adresse de la liste par
l'adresse de l'lment qui suit le premier.
Avec notre exemple, cela se traduit par l'instruction suivante :
L := L^.Suivant;
Si la liste ne contient qu'un seul lment, ce dernier n'a pas d'lment suivant, mais l'instruction
prcdente convient galement, car, dans ce cas, L^.Suivant contient NIL et la liste devient
par consquent vide.
La figure suivante illustre la suppression du premier lment dans une liste de villes :
Les bases de la programmation par Eric Thirion
- 114 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Avant la suppression, L pointe sur Ribeauvill et la liste contient quatre villes.
Aprs la suppression, L pointe sur la ville qui suivait Ribeauvill, c'est--dire Kingersheim. De ce fait, elle ne contient
plus que les trois villes Kingersheim, Strasbourg et Nancy.
Suppression du suivant
Supposons prsent que l'on souhaite supprimer l'lment qui suit un certain lment de la liste d'adresses donne.
Appelons Curseur l'adresse de cet lment. L'instruction suivante permet de supprimer l'lment qui suit Curseur^ :
Curseur^.Suivant := Curseur^.Suivant^.Suivant;
La figure suivante illustre ce mcanisme. On supprime ici la ville Strasbourg, en faisant pointer la ville prcdente
(Kingersheim) sur la ville qui suit Strasbourg (Nancy). De ce fait, Strasbourg n'existe plus dans la liste.
Listes doublement chanes
Dans une liste doublement chane, chaque lment est li non seulement au suivant, mais galement au prcdent.
Cela facilite la suppression d'un lment, puisqu'il faut pour cela avoir l'adresse du prcdent. Il devient galement
plus simple d'insrer un lment avant un lment donn.
Reprsentation
Reprenons notre exemple de liste de villes. Voici comment la reprsenter avec un chanage double :
Type Ville =
record
Nom : String;
CodePostal : String;
Suivant : PVille;
Les bases de la programmation par Eric Thirion
- 115 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2014 Eric Thirion. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://lazarus.developpez.com/cours/eric-thirion/bases-programmation/
Precedent : Pville;
end;
PVille = ^Ville;
Voici un exemple de liste doublement chane :
Adjonction d'un lment
En dbut de liste
L'adjonction d'un lment en dbut de liste ncessite deux instructions supplmentaires, puisqu'il faut mmoriser le
fait que cet lment n'a pas d'lment prcdent et qu'il devient prsent le prcdent du premier lment de la
liste (avant l'adjonction).
p^.Suivant := L ;
p^.Precedent := NIL;
L^.Precedent := p;
L := p;
Insertion aprs un lment
If Curseur^.Suivant <> NIL then
Curseur^.Suivant^.Precedent := p;
p^.Precedent := Curseur;
p^.Suivant := Curseur^.Suivant;
Curseur^.Suivant := p;
Exercices
Tlchargez :
Exo-Fichiers-Pascal.pdf
Pour obtenir les corrigs, le tlchargement n'est possible que via un login et un mot de passe, que vous pouvez
obtenir en envoyant un mail l'adresse suivante :
en prcisant un peu qui vous tes et les raisons pour lesquelles ce cours vous intresse.