Sie sind auf Seite 1von 33

Tableau Enregistrement Type procédure et fonction

Tableau, enregistrement et type procédure et fonction


I3 Algorithmique

Nicolas Delestre

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 1 / 33


Tableau Enregistrement Type procédure et fonction

Plan

1 Tableau
Tableau à une dimension
Tableau à n dimensions

2 Enregistrement (structure)
Instruction with. . .do
Enregistrement conditionnel

3 Type procédure et fonction

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 2 / 33


Tableau Enregistrement Type procédure et fonction

Tableau

Les tableaux en Pascal sont statiques


La taille des tableaux est fixée à la compilation
La taille des tableaux est déterminée en spécifiant un intervalle
Par défaut, l’utilisation d’un indice de tableau en dehors de cet
intervalle n’est pas vérifié :
cela peut provoquer un Runtime error si la zone mémoire n’appartient
pas au processus (non compatible avec le concept de tests unitaires)
le mieux est d’ajouter une directive de compilation
({$RANGECHECKS ON}) qui va ajouter du code automatiquement
pour vérifier que l’indice est entre les bornes de définition
On utilise rarement directement les types tableaux :
Le Pascal « n’accepte pas » directement des paramètres de type
tableau, mais il accepte des paramètres dont le type est basé sur le
type tableau
On crée de nouveau type qui sont des tableaux
Type NouveauType = ... ; as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 3 / 33


Tableau Enregistrement Type procédure et fonction

Tableau à une dimension 1 / 3

Définition/Déclaration

a r r a y [ indiceDebut .. indiceFin ] o f TypeDesElements


avec :
indiceDebut et indiceFin sont des constantes de type scalaire

Exemple
const
MAX = 100;
P RE MI ER E _L ET TR E = ’a ’;
D ER NI ER E _L ET TR E = ’z ’;

type
Lettre = P RE MI E RE _L ET T RE .. DE R NI ER E_ L ET TR E ;
Entiers = a r r a y [1.. MAX ] o f I n t e g e r ;
NbOccurences = a r r a y [ Lettre ] o f I n t e g e r ;
as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 4 / 33


Tableau Enregistrement Type procédure et fonction

Tableau à une dimension 2 / 3

Utilisation
On utilise une case du tableau en spécifiant l’indice de cette case
entre crochet

Exemple

p r o c e d u r e initiali se rE nt ie rs ( v a r t : Entiers ;
val : I n t e g e r ) ;
var i : Integer ;
begin
f o r i :=1 t o MAX do
t [ i ]:= val
end ;

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 5 / 33


Tableau Enregistrement Type procédure et fonction

Tableau à une dimension 3 / 3


Affectation
On peut affecter le contenu d’un tableau dans un autre tableau s’ils
sont de même type

Exemple
f u n c t i o n c o m p t e r O c c u r e n c e s ( c h a i n e D e L e t t r e s M i n u s c u l e s : String ) :
NbOccurences ;
var i : Integer ;
resultat : NbOccurences ;
uneLettre : Lettre ;
begin
i n i t i a l i s e r N b O c c u r r e n c e s ( resultat ) ;
f o r i :=1 t o length ( c h a i n e D e L e t t r e s M i n u s c u l e s ) do
begin
uneLettre := c h a i n e D e L e t t r e s M i n u s c u l e s [ i ];
resultat [ uneLettre ]:= resultat [ uneLettre ]+1;
end ;
co m p t e r O c c u r e n c e s := resultat
end ; as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 6 / 33


Tableau Enregistrement Type procédure et fonction

Tableau à 2 dimensions

Définition/Déclaration
Il y a deux façon de déclarer des tableaux à deux dimensions :
1 en considérant que l’on a un tableau de tableau
a r r a y [ indiceDebut1 .. indiceFin1 ] o f a r r a y [ indiceDebut2 ..
indiceFin2 ]
o f T yp eD es E le me nt s

2 en spécifiant directement deux intervalles séparés par une , :


a r r a y [ indiceDebut1 .. indiceFin1 , indiceDebut2 .. indiceFin2 ]
o f T yp eD es E le me nt s

Utilisation
On utilise une case du tableau en spécifiant entre crochet les deux
indices de cette case séparés par un ,
as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 7 / 33


Tableau Enregistrement Type procédure et fonction

Tableau à n dimensions 1 / 2

Extension
Par extension on peut définir et utiliser des tableaux à n dimensions

Exemple à 3 dimensions
const
LARGEUR = 4;
HAUTEUR = 4;
PROFONDEUR = 4;

type
Contenu = ( Vide , PionBlanc , PionNoir ) ;
Plateau = a r r a y [1.. LARGEUR ,
1.. PROFONDEUR ,
1.. HAUTEUR ] o f Contenu ;

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 8 / 33


Tableau Enregistrement Type procédure et fonction

Tableau à n dimensions 2 / 2

Utilisation
p r o c e d u r e i n t i a l i s e r P l a t e a u ( v a r p : Plateau ) ;
v a r i ,j , k : I n t e g e r ;
begin
f o r i :=1 t o LARGEUR do
f o r j :=1 t o PROFONDEUR do
f o r k :=1 t o HAUTEUR do
p [i ,j , k ]:= Vide
end ;

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 9 / 33


Tableau Enregistrement Type procédure et fonction

Enregistrement 1 / 4

Les enregistrements (record) Pascal correspondent aux structures en


algorithmique

Définition/Déclaration
Tout comme pour les Syntaxe :
tableaux, on utilise rarement record
champ1 : Type1
des variable de type champ2 : Type2
enregistrement, on définit ...
plutôt des types end ;

Exemple
type
Complexe = r e c o r d
re : R e a l ;

end ;
im : R e a l ;
as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 10 / 33


Tableau Enregistrement Type procédure et fonction

Enregistrement 2 / 4

Utilisation
On accède au champ c d’une variable v de type enregistrement en
faisant suivre la variable v d’un . puis du champ c (v .c)
si le champ c est aussi de type enregistrement, on peut accéder à ses
champs (par exemple c1) depuis v suivant le même principe (v .c.c1)

Exemple
f u n c t i o n creerComplexe ( partieReel , p a r t i eI m a g i n a i r e : R e a l ) :
Complexe ;
v a r resultat : Complexe ;
begin
resultat . re := partieReel ;
resultat . im := p a r t i e I m a g i n a i r e ;
creerComplexe := resultat
end ; { c r e e r C o m p l e x e }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 11 / 33


Tableau Enregistrement Type procédure et fonction

Enregistrement 3 / 4

Encapsulation
Afin d’être facilement réutilisable, les utilisateurs ne doivent pas
accéder directement aux champs de l’enregistrement

Exemple
f u n c t i o n partieReelle ( c : Complexe ) : R e a l ;
begin
partieReelle := c . re
end ; { p a r t i e R e e l l e }

f u n c t i o n p a r t i e I m a g i n a ir e ( c : Complexe ) : R e a l ;
begin
p a r t i e I m a g i n a i r e := c . im
end ; { p a r t i e I m a g i n a i r e }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 12 / 33


Tableau Enregistrement Type procédure et fonction

Enregistrement 4 / 4

Enregistrement vers chaı̂ne de caractères


Comme pour les tableaux, on ne peut pas afficher directement un
enregistrement
On utilise souvent une fonction qui créé une chaı̂ne de caractères à
partir de l’enregistrement

Exemple
f u n c t i o n c o m p l e x e E n C h a in e ( c : Complexe ) : String ;
v a r re , im : String ;
begin
str ( partieReelle ( c ) , re ) ;
str ( p a r t i e I m a g i n a i r e ( c ) , im ) ;
c o m p l e x e E n C h a i n e := re + ’+ ’+ im + ’i ’
end ; { c o m p l e x e E n C h a i n e }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 13 / 33


Tableau Enregistrement Type procédure et fonction

with . . .do

L’instruction with permet d’omettre le nom de la variable de type


enregistrement, et donc accéder localement directement à ses
champs

Exemple
f u n c t i o n creerComplexe ( partieReelle , p a r t i e I m a g i n a i r e : R e a l ) :
Complexe ;
v a r resultat : Complexe ;
begin
w i t h resultat do
begin
re := partieReelle ;
im := p a r t i e I m a g i n a i r e ;
end ;
creerComplexe := resultat
end ; { c r e e r C o m p l e x e }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 14 / 33


Tableau Enregistrement Type procédure et fonction

Champ conditionnel 1 / 2

La vue (facette) d’une partie d’un enregistrement peut être


conditionnée par la valeur d’un champ

Exemple
Un nombre est soit :
un entier
un réel
un complexe

Attention
Seul le dernier champ d’un enregistrement peut être conditionnel
Le end du case termine le record
as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 15 / 33


Tableau Enregistrement Type procédure et fonction

Champ conditionnel 2 / 2

Syntaxe
record
champ1 : Type1
champ2 : Type2
...
c a s e champn : Type Denombrable o f
valeur1 : ( champn1 : Typen1 );
valeur2 : ( champn2 : Typen2 );
...
end ;

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 16 / 33


Tableau Enregistrement Type procédure et fonction

Un exemple : le type Nombre 1 / 10

Concepteur : Le type Nombre


type
TNombre = ( nombreEntier , nombreReel , no mbreCom plexe ) ;
Nombre = r e c o r d
c a s e leType : TNombre o f
nombreEntier : ( lEntier : I n t e g e r ) ;
nombreReel : ( leReel : R e a l ) ;
nombr eComple xe : ( leComplexe : Complexe )
end ; { case }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 17 / 33


Tableau Enregistrement Type procédure et fonction

Un exemple : le type Nombre 2 / 10

Concepteur : fonctions de création d’un Nombre


f u n c t i o n enti erEnNomb re ( unEntier : I n t e g e r ) : Nombre ;
begin
entie rEnNomb re . leType := nombreEntier ;
entie rEnNomb re . lEntier := unEntier
end ; { e n t i e r E n N o m b r e }

f u n c t i o n reelEnNombre ( unReel : R e a l ) : Nombre ;


begin
reelEnNombre . leType := nombreReel ;
reelEnNombre . leReel := unReel
end ; { r e e l E n N o m b r e }

f u n c t i o n c o m p l e x e E n N o m br e ( unComplexe : Complexe ) : Nombre ;


begin
c o m p l e x e E n N o m b r e . leType := nombreC omplexe ;
c o m p l e x e E n N o m b r e . leComplexe := unComplexe
end ; { c o m p l e x e E n N o m b r e }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 18 / 33


Tableau Enregistrement Type procédure et fonction

Un exemple : le type Nombre 3 / 10

Concepteur : fonctions de tests


f u n c t i o n estUnEntier ( unNombre : Nombre ) : Boolean ;
begin
estUnEntier := unNombre . leType = nombreEntier ;
end ; { e s t U n E n t i e r }

f u n c t i o n estUnReel ( unNombre : Nombre ) : Boolean ;


begin
estUnReel := unNombre . leType = nombreReel
end ; { e s t U n R e e l }

f u n c t i o n estUnComplexe ( unNombre : Nombre ) : Boolean ;


begin
estUnComplexe := unNombre . leType = nom breCompl exe
end ; { e s t U n C o m p l e x e }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 19 / 33


Tableau Enregistrement Type procédure et fonction

Un exemple : le type Nombre 4 / 10

Concepteur : fonctions de transtypage


f u n c t i o n nomb reEnEnti er ( unNombre : Nombre ) : I n t e g e r ;
begin
nombr eEnEnti er := unNombre . lEntier
end ; { n o m b r e E n E n t i e r }

f u n c t i o n nombreEnReel ( unNombre : Nombre ) : R e a l ;


begin
nombreEnReel := unNombre . leReel
end ; { n o m b r e E n R e e l }

f u n c t i o n n o m b r e E n C o m p l ex e ( unNombre : Nombre ) : Complexe ;


begin
n o m b r e E n C o m p l e x e := unNombre . leComplexe
end ; { n o m b r e E n C o m p l e x e }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 20 / 33


Tableau Enregistrement Type procédure et fonction

Un exemple : le type Nombre 5 / 10

Utilisateur : fonctions de transtypes en chaı̂ne


f u n c t i o n nomb reEnChai ne ( unNombre : Nombre ) : String ;
begin
i f estUnEntier ( unNombre ) t h e n
str ( no mbreEnEn tier ( unNombre ) , nombreE nChaine )
else
i f estUnReel ( unNombre ) t h e n
str ( nombreEnReel ( unNombre ) , no mbreEnCh aine )
else
nomb reEnChai ne := c o m p l e x e E n C h a i n e ( n o m b r e E n C o m p le x e (
unNombre ) )
end ; { n o m b r e E n C h a i n e }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 21 / 33


Tableau Enregistrement Type procédure et fonction

Un exemple : le type Nombre 6 / 10

Utilisateur : fonctions d’addition


f u n c t i o n a d d i t i o n n e r N o m b r e E n t i e r ( unNombre : Nombre ; unEntier : I n t e g e r ) : Nombre ;
begin
i f estUnEntier ( unNombre ) t h e n
a d d i t i o n n e r N o m b r e E n t i e r := entierEnNombre ( nombreEnEntier ( unNombre ) + unEntier )
else
i f estUnReel ( unNombre ) t h e n
a d d i t i o n n e r N o m b r e E n t i e r := reelEnNombre ( nombreEnReel ( unNombre ) + r e a l ( unEntier ) )
else
a d d i t i o n n e r N o m b r e E n t i e r := complexeEnNombre ( creerComplexe (
partieReelle ( nombreEnComplexe (
unNombre ) ) + r e a l ( unEntier ) ,
partieImaginaire ( nombreEnComplexe (
unNombre ) ) ) )
end ; { a d d i t i o n n e r N o m b r e E n t i e r }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 22 / 33


Tableau Enregistrement Type procédure et fonction

Un exemple : le type Nombre 7 / 10

Utilisateur : fonctions d’addition


f u n c t i o n a d d i t i o n n e r N o m b r e R e e l ( unNombre : Nombre ; unReel : R e a l ) : Nombre ;
begin
i f estUnEntier ( unNombre ) t h e n
a d d i t i o n n e r N o m b r e R e e l := reelEnNombre ( r e a l ( nombreEnEntier ( unNombre ) ) + unReel )
else
i f estUnReel ( unNombre ) t h e n
a d d i t i o n n e r N o m b r e R e e l := reelEnNombre ( nombreEnReel ( unNombre ) + unReel )
else
a d d i t i o n n e r N o m b r e R e e l := complexeEnNombre ( creerComplexe (
partieReelle ( nombreEnComplexe (
unNombre ) ) + r e a l ( unReel ) ,
partieImaginaire ( nombreEnComplexe (
unNombre ) ) ) )
end ; { a d d i t i o n n e r N o m b r e R e e l }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 23 / 33


Tableau Enregistrement Type procédure et fonction

Un exemple : le type Nombre 8 / 10

Utilisateur : fonctions d’addition


f u n c t i o n a d d i t i o n n e r N o m b r e C o m p l e x e ( unNombre : Nombre ; unComplexe : Complexe ) : Nombre ;
begin
i f estUnEntier ( unNombre ) t h e n
a d d i t i o n n e r N o m b r e C o m p l e x e := complexeEnNombre ( creerComplexe (
r e a l ( nombreEnEntier ( unNombre ) ) +
partieReelle ( unComplexe ) ,
partieImaginaire ( unComplexe ) ) )
else
i f estUnReel ( unNombre ) t h e n
a d d i t i o n n e r N o m b r e C o m p l e x e := complexeEnNombre ( creerComplexe (
nombreEnReel ( unNombre ) +
partieReelle ( unComplexe ) ,
partieImaginaire ( unComplexe ) ) )
else
a d d i t i o n n e r N o m b r e C o m p l e x e := complexeEnNombre ( creerComplexe (
partieReelle ( nombreEnComplexe ( unNombre
) ) + partieReelle ( unComplexe ) ,
partieImaginaire ( nombreEnComplexe (
unNombre ) ) + partieImaginaire (
unComplexe ) ) )
end ; { a d d i t i o n n e r N o m b r e C o m p l e x e }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 24 / 33


Tableau Enregistrement Type procédure et fonction

Un exemple : le type Nombre 9 / 10

Utilisateur : fonctions d’addition


f u n c t i o n a d d i t i o n n e r D e u x N o m b r e s ( n1 , n2 : Nombre ) : Nombre ;
begin
i f estUnEntier ( n1 ) t h e n
a d d i t i o n n e r D e u x N o m b r e s := a d d i t i o n n e r N o m b r e E n t i e r ( n2 ,
nomb reEnEnti er ( n1 ) )
else
i f estUnReel ( n1 ) t h e n
a d d i t i o n n e r D e u x N o m b r e s := a d d i t i o n n e r N o m b r e R e e l ( n2 ,
nombreEnReel ( n1 ) )
else
a d d i t i o n n e r D e u x N o m b r e s := a d d i t i o n n e r N o m b r e C o m p l e x e ( n2 ,
n o m b r e E n C o m p l e xe ( n1 ) )
end ; { a d d i t i o n n e r D e u x N o m b r e s }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 25 / 33


Tableau Enregistrement Type procédure et fonction

Un exemple : le type Nombre 10 / 10

Utilisateur : exemple de programme


v a r n , a : Nombre ;
begin
n := c o m p l e x e E n N o m b r e ( creerComplexe (3.0 ,4.0) ) ;
a := reelEnNombre (3.0) ;
w r i t e l n ( no mbreEnCh aine ( a d d i t i o n n e r D e u x N o m b r e s (n , a ) ) )
end .

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 26 / 33


Tableau Enregistrement Type procédure et fonction

Type procédure et fonction 1 / 7


Constat
Quelque fois du code est presque dupliqué pour avoir un
comportement légèrement différent alors que l’algorithme reste le
même

Exemple : Tri en ordre croissant


Lorsque l’on veut faire un tri en ordre croissant avec un tri par
sélection, on sélectionne l’élément le plus petit :
f u n c t i o n i nd ic eD u Mi ni mu m ( t : Entiers ; debut , fin : I n t e g e r ) :
Integer ;
var
i : Integer ;
begin
i nd ic eD u Mi ni m um := debut ;
f o r i := debut +1 t o fin do
i f t [ i ] < t [ i nd ic eD u Mi ni mu m ] t h e n
i nd ic eD u Mi ni mu m := i
end ; { i n d i c e D u M i n i m u m } as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 27 / 33


Tableau Enregistrement Type procédure et fonction

Type procédure et fonction 2 / 7

Exemple : Tri en ordre décroissant


Lorsque l’on veut faire un tri en ordre croissant avec un tri par
sélection, on sélectionne l’élément le plus grand :
f u n c t i o n i nd ic eD u Ma xi mu m ( t : Entiers ; debut , fin : I n t e g e r ) :
Integer ;
var
i : Integer ;
begin
i nd ic e Du Ma xi m um := debut ;
f o r i := debut +1 t o fin do
i f t [ i ] > t [ i nd ic eD u Ma xi mu m ] t h e n
i nd ic eD u Ma xi mu m := i
end ; { i n d i c e D u M a x i m u m }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 28 / 33


Tableau Enregistrement Type procédure et fonction

Type procédure et fonction 3 / 7

Le Pascal, comme beaucoup de langage, permet de déclarer des types de procédure et


des types de fonction :
on peut alors utiliser des variables qui sont des procédures ou des fonctions
on peut utiliser des fonctions ou des procédures comme paramètre d’autres
fonctions ou procédures
seul un passage par valeur n’est alors possible

Déclaration du type
type
N om Ty pe F on ct io n = f u n c t i o n ( p11 , p12 ,.. : Type1 ;
p21 , ... : Type2 ; ...) : TypeRetour ;
N o m T y p e P r o c e d u r e = p r o c e d u r e ([ v a r ] p11 , p12 ,.. : Type1 ;
[ v a r ] p21 , ... : Type2 ; ...);

Utilisation
On utilise une procédure ou fonction comme argument en précédent son nom du
symbole @ (propre au FreePascal) as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 29 / 33


Tableau Enregistrement Type procédure et fonction

Type procédure et fonction 4 / 7

Une fonction de comparaison


type
Entiers = a r r a y [1.. MAX ] o f I n t e g e r ;
Comparateur = f u n c t i o n (a , b : I n t e g e r ) : Boolean ;

Une fonction sélectionnant un entier


f u n c t i o n obtenirIndice ( t : Entiers ; debut , fin : I n t e g e r ; precede
: Comparateur ) : I n t e g e r ;
var
i : Integer ;
begin
obtenirIndice := debut ;
f o r i := debut +1 t o fin do
i f precede ( t [ i ] , t [ obtenirIndice ]) t h e n
obtenirIndice := i
end ; { o b t e n i r I n d i c e }
as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 30 / 33


Tableau Enregistrement Type procédure et fonction

Type procédure et fonction 5 / 7

La procédure de tri
p r o c e d u r e t r i e r P a r S e l e c t i o n ( v a r t : Entiers ; nbEntiers : I n t e g e r ;
precede : Comparateur ) ;
var
i,j : I n t e g e r ;
begin
f o r i :=1 t o nbEntiers -1 do
begin
j := obtenirIndice (t ,i , nbEntiers , precede ) ;
echa ngerEnti er ( t [ i ] , t [ j ])
end
end ; { t r i e r P a r S e l e c t i o n }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 31 / 33


Tableau Enregistrement Type procédure et fonction

Type procédure et fonction 6 / 7

Deux fonctions de comparaison


f u n c t i o n p lu sP et i tO uE ga l (a , b : I n t e g e r ) : Boolean ;
begin
p lu sP et i tO uE ga l := a <= b
end ; { p l u s P e t i t O u E g a l }

f u n c t i o n p lu sG ra n dO uE ga l (a , b : I n t e g e r ) : Boolean ;
begin
p lu sG ra n dO uE ga l := b <= a
end ; { p l u s G r a n d O u E g a l }

as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 32 / 33


Tableau Enregistrement Type procédure et fonction

Type procédure et fonction 7 / 7

Un exemple de programme
begin
initialiser (t , MAX ) ;
afficher (t , MAX ) ;
t1 := t ;
tr i e r P a r S e l e c t i o n ( t1 , MAX , @ p l u s P e t i t O u E g a l ) ;
afficher ( t1 , MAX ) ;
t1 := t ;
tr i e r P a r S e l e c t i o n ( t1 , MAX , @ p l u s G r a n d O u E g a l ) ;
afficher ( t1 , MAX )
end .

Résultat
$ ./tri
5 5 7 8 6 8 5 8 4 6
4 5 5 5 6 6 7 8 8 8
8 8 8 7 6 6 5 5 5 4 as
Architecture des Systèmes d’Information

Tableau, etc. v1.1 33 / 33