S. Laporte
Type structur s et enregistrements
DAIGL
Les types structur s et les enregistrements
Introduction
Contrairement aux tableaux qui sont des structures de donn es dont tous les l ments sont de m me type, les
enregistrements sont des structures de donn es dont les l ments peuvent tre de type diff rent et qui se rapportent
la m me entit s mantique (analogie avec Merise).Les l ments qui composent un enregistrement sont appel s
champs.
Avant de d clarer une variable enregistrement, il faut avoir au pr alable d finit son type, c'est dire le nom et le type
des champs qui le compose. Le type d'un enregistrement est appel type structur . (Les enregistrements sont parfois
appel structures, en analogie avec le langage C)
Pr alable: d claration d'un type structur
Jusqu' pr sent, nous n'avons utilis que des types primitifs (caract res, entiers, r els, cha nes) et des tableaux de types
primitifs. Mais il est possible de cr er nos propres types puis de d clarer des variables ou des tableaux d' l ments de ce
type.
Pour ce faire, il faut d clarer un nouveau type, fond sur d'autres types existants. Apr s lavoir d fini, on peut d s lors
utiliser ce type structur tout autre type normal en d clarant une ou plusieurs variables de ce type. Les variables de type
structur sont appel es enregistrements.
La d claration des types structur s se fait dans une section sp ciale des algorithmes appel e Type, qui pr c de la section
des variables (et succ de la section des constantes). Si lalgorithme comporte des sous-programmes, les types et les
constantes sont d clar es en dehors du programme.
Syntaxes :
Type
Structure nom_type
nom_champ1: type_champ1
&
nom_champN: type_champN
Exemple:
FinStruct
Type
Structure tpersonne
nom : cha ne
pr nom : cha ne
ge : entier
FinStruct
I. D claration d'un enregistrement partir d'un type structur
Une fois qu'on a d fini un type structur , on peut d clarer des variables enregistrements exactement de la
m me fa on que l'on d clare des variables d'un type primitif.
1
S. Laporte
Type structur s et enregistrements
DAIGL
Syntaxe
Var
nom_var : nom_type
Exemple:
Var
pers1, pers2, pers3 : tpersonne
Repr sentation:
les enregistrements sont compos s de plusieurs zones de donn es, correspondant aux champs
pers1.nom
pers1.age
pers1
pers2
pers2.nom
pers2.age
Il est naturel de faire une analogie avec la notion de table du mod le relationnel, ou d'entit du mod le
entit -association (MCD)
Soit l'entit suivante:
PRODUIT
l gende:
code
lib
paht
pvht
txtva
code: code alphanum rique du produit
lib: lib ll
paht: prix d'achat hors taxes
pvht: prix de vente hors taxes
txtva: taux de TVA applicable
Voici comment d clarer deux occurrences (variables enregistrements) du type structur correspondant
cette entit .
// Il faut d'abord d finir le type structur correspondant:
Type
Structure produit
Publicité
code: cha ne
lib: cha ne
paht: r el
pvht: r el
txtva: r el
FinStruct
// Ensuite il est possible de d clarer deux variables de ce type
Var
prod1, prod2 : produit
On peut donc dire que prod1 et prod2 sont deux occurrences de lentit Produit. Cependant, lanalogie
se limite ici. En particulier, dans une entit , toutes les propri t s ne poss dent pas un statut quivalent.
Ainsi, il existe des identifiants, cest dire des propri t s poss dant une valeur unique par occurrence,
et ceci est sp cifi logiquement lors du passage au mod le relationnel. Ici, il ny a pas de possibilit de
pr ciser quel champ est identifiant du type structur . Si on ny prend pas garde, nous pouvons d s lors
cr er des occurrences poss dant la m me valeur pour la propri t Code, ce qui peut poser probl me au
niveau de notre application.
2
S. Laporte
Type structur s et enregistrements
DAIGL
II. Manipulation d'un enregistrement
La manipulation d'un enregistrement se fait au travers de ses champs. Comme pour les tableaux,
il n'est pas possible de manipuler un enregistrement globalement, sauf pour affecter un enregistrement
un autre de m me type (ou le passer en param tre). Par exemple, pour afficher un enregistrement il
faut afficher tous ses champs un par un.
A. Acc s aux champs d'un enregistrement
Alors que les l ments d'un tableau sont par linterm diaire de leur indice, les champs d'un
enregistrement sont accessibles travers leur nom, gr ce l'op rateur '.'
nom_enregistrement . nom_champ
repr sente la valeur m moris e dans le champ de l'enregistrement
Par exemple, pour acc der l' ge de la variable pers2, on utilise l'expression:
pers2. ge
Remarque : la lecture d'une telle expression se fait de droit gauche : l' ge de la personne2.
? Attention : le nom d'un champ est TOUJOURS pr c d du nom de l'enregistrement auquel il
appartient. On ne peut pas trouver un nom de champ tout seul, sans indication de l'enregistrement.
Les champs d'un enregistrement, tout comme les l ments d'un tableau, sont des variables qui on
peut faire subir les m mes op rations (affectation, saisie, affichage,&).
Exemple 1:
Programme de saisie des donn es concernant les personnes pers1 et pers2, puis affichage de la
diff rence d' ge entre ces deux personnes
Programme Exemple
Type
Structure tpersonne
nom : cha ne
pr nom : cha ne
ge : entier
FinStruct
Var
pers1, pers2 : tpersonne
D but
Aff "Entrez le nom puis l'age de la personne 1"
Saisir pers1.nom, pers1.age // il est impossible d' crire Saisir pers1
Aff "Entrez le nom puis l' ge de la personne 2"
Saisir pers2.nom, pers2.age
Aff "La diff rence d' ge entre ", pers1.nom, " et ", pers2.nom, " est de "
Si pers1.age > pers2.age
Alors Aff pers1.age pers2.age, " ans "
Sinon Aff pers2.age pers1.age, " ans "
FinSi
Fin
Rappel : il est possible d'affecter un enregistrement un autre de m me type. L , il serait correct
d' crire
pers1 ? pers2
3
S. Laporte
Type structur s et enregistrements
DAIGL
B. un enregistrement comme champ d'une structure
Supposons que dans le type personne, nous ne voulions plus l' ge de la personne, mais sa date de
naissance. Une date est compos e de trois variables (jour, mois, ann e) indissociables1. Une date
correspond donc une entit du monde r el qu'on doit repr senter par un type enregistrement 3
champs.
Si on d clare le type date au pr alable, on peut l'utiliser dans la d claration du type personne pour le
type de la date de naissance.
Un type structur peut tre utilis comme type pour des champs d'un autre type structur
TYPE
Structure date
Publicité
jour: entier
mois: cha ne
ann e: entier
FinStuct
Structure personne
nom: cha ne
ddn: date
FinStruct
Pour acc der l'ann e de naissance d'une personne, il faut utiliser deux fois l'op rateur '.'
pers1.ddn.ann e
Il faut lire une telle variable de droite gauche : l'ann e de la date de naissance de la personne 1.
Exemple Complet
Un produit (cf. ex pr c dents) est livr par un seul fournisseur. Un fournisseur est caract ris par son code, sa
raison sociale et son num ro de t l phone.
Structure fournisseur
code_frs : chaine
raison_sociale: chaine
tel: chaine
FinStruct
Structure Produit
code: cha ne
lib: cha ne
paht: r el
pvht: r el
txtva: r el
frs: fournisseur
FinStruct
Var
p: produit
Voil l'instruction qui permet d'afficher le num ro de t l phone du fournisseur du produit p.frs.tel
Aff "t l phone du fournisseur de ", p.lib, " : ", p.frs.tel
Fournisseur, qui est en d pendance fonctionnelle sur Produit, est un champ de la structure produit.
1 En supposant que le type Date n'existe pas.
4
S. Laporte
Type structur s et enregistrements
DAIGL
Voil le MCD correspondant.
1,1
est livr par
FOURNISSEUR
1,n
code_frs
raison_sociale
tel
PRODUIT
code
lib
paht
pvht
txtva
C. Un tableau comme champ de structure
Il est possible aussi qu'un champ de type structur soit de type tableau, voire tableau structur !
Exemple d'un type structur contenant un tableau simple
Imaginons une structure m morisant des crit res g ographiques de villes (altitude, type de climat, &).
Certains de ces crit res pourraient pertinemment tre m moris s pour chaque mois de l'ann e (par
exemple temp rature moyenne, pr cipitations moyennes, &)
Structure Ville
Nom : cha ne
Alt : entier
Climat : Cha ne
Temp : tableau[1..12] de r el
Pr cip : tableau[1..12] de r el
FinStruct
//Altitude moyenne
//type de climat
//temp rature moyenne par mois
//pr cipitations moyennes par mois
Ensuite, on peut videmment d clarer une ville :
MaVille : Ville
Voil comment on pourrait initialiser cette ville
Afficher "Nom de la ville?"
Saisir MaVille.Nom
//idem pour l'altitude et le climat
Afficher "Veuillez entrer successivement les temp ratures moyennes sur les 12 mois"
//on utilise une boucle pour remplir le tableau des temp ratures
Pour i de 1 jusqu' 12 Faire
Publicité
Aff "mois ", i
Saisir MaVille.Temp
FinPour
//idem pour les pr cipitations
Si on voulait afficher par exemple la temp rature moyenne au mois de juillet de MaVille, on crirait
tout simplement :
Aff MaVille.Temp[7]
// vu que le tableau commence 1, 7 est l'indice de juillet
III. Les tableaux d'enregistrements (ou tables)
Il arrive souvent que lon veuille traiter non pas un seul enregistrement mais plusieurs. Par exemple,
on veut pouvoir traiter un groupe de personne. On ne va donc pas cr er autant de variables du type
personne quil y a de personnes. On va cr er un tableau regroupant toutes les personnes du groupe. Il
sagit alors dun tableau denregistrements, autrement appel table . Une table en algorithmique a
beaucoup de points communs avec une table dune base de donn e. Les colonnes sont appel es
champs et les lignes enregistrements.
5
S. Laporte
Type structur s et enregistrements
DAIGL
// nombre de personnes du groupe
Exemple page suivante
Const
NP = 20
Type
Structure personne
nom: cha ne
age: entier
FinStruct
Var
groupe: tableau[1..NP] de personnes
Chaque l ment du tableau est un enregistrement, contenant plusieurs variables de type diff rent. On
acc de un enregistrement par son indice dans le tableau.
groupe[2] repr sente la deuxi me personne du groupe
groupe[2].nom repr sente le nom de la deuxi me personne du groupe
nom
ge
nom des champs
1
2
3
4
5
indices du tableau
? Attention!
enregistrements
groupe.nom[3] n'est pas valide.
Pour acc der au nom de la troisi me personne du tableau, il faut crire groupe[3].nom
Une table comme champ de structure
Les tableaux d'enregistrements peuvent aussi tre eux m me servir de type dans un autre type structur
Exemple
Contexte : Dans un comit d'entreprise, on veut pouvoir conna tre les enfants des employ s et leur date
de naissance (pour le petit cadeau!). On suppose que le nombre d'enfant maxi d'un employ est de 10.
Structure Enfant
Nom : cha ne
Pr nom : cha ne
Journaiss : entier
Moisnaiss : entier
Anneenaiss :entier
FinStructure
Structure Employ
Nom : cha ne
Pr nom : Cha ne
&
Nbenf : entier
Prog niture : tableau[1..10] d'Enfant
//nombre d'enfants
6
S. Laporte
FinStruct
Type structur s et enregistrements
DAIGL
Et videmment, on pourrait d clarer un tableau d'Employ . Ce qui ferait des tableaux imbriqu s les
uns dans les autres&
Var
TabEmp : tableau[1..MAX] d'Employ
Pour afficher par exemple les anniversaires de tous les enfants de l'employ d'indice i, il faudrait
parcourir le tableau de ses enfants (avec un autre indice que i).
Publicité
Si TabEmp .NbEnf ? 0 //on v rifie d'abord que l'employ a des enfants
Alors
Pour j de 1 jusqu' TabEmp .NbEnf Faire
Aff TabEmp .Prog niture .Pr nom
Aff "anniversaire le ", TabEmp .Prog niture .journaiss, TabEmp .Prog niture .moisnaiss
FinPour
Sinon Aff "l'employ ", TabEmp .Nom, " n'a pas d'enfant"
FinSi
IV Les enregistrements comme param tres
Comme c'est le cas avec les tableaux, il est possible de passer un enregistrement en
param tre d'une fonction ou d'une proc dure (on n'est pas oblig de passer tous les champs
uns uns, ce qui permet de diminuer le nombre de param tres passer). On peut aussi
avoir un enregistrement comme valeur de retour d'une fonction
Exemple
Struct hms
heure : entier
minute : entier
seconde : entier
FinStruct
Remarque : Les types structures sont d clar es en global
Fonction nbsec(time : hms) : entier
Var
D but
nbsec : entier
nbsec ? time.heure 3600 + time.minute 60 + time.seconde
Retourne nbsec
FinProc dure
Proc dure converthms(E nbsec :entier
S time : hms)
D but
time.heure ? nbsec DIV 3600
reste ? nbsec MOD 3600
time.minute ? reste DIV 60
time.seconde ? nbsec MOD 60
FinProc dure
Du coup, la proc dure converthms n'a plus qu'un seul param tre r sultat et peut tre transform e en
fonction
7
S. Laporte
Type structur s et enregistrements
DAIGL
Fonction converthms(nbsec :entier) : hms
Var
time : hms
D but
time.heure ? nbsec DIV 3600
reste ? nbsec MOD 3600
time.minute ? reste DIV 60
time.seconde ? nbsec MOD 60
retourne time
FinProc dure
Exemples d'appels
Appel de la fonction converthms :
Var dur esec : entier
dur eh : hms
D but
Saisir dur esec
dur eh ? converthms(dur esec)
Aff "dur e correspondante: ", dur e.heure, "h ", dur e.minute, "m ", dur e.seconde, "s"
Fin
Appel de la fonction nbsec dans une autre fonction dur e :
Fonction dur e (h1 : hms, h2: hms) : hms
Var
d : hms
sec : entier
D but
sec ? nbsec(h2) nbsec(h1)
d ? converthms(sec)
retourne d
FinFonction
retourne converthms(nbsec(h2) nbsec(h1))
Remarque :
Lors de l'appel d'un sous-programme, un param tre peut- tre repr sent par un ou plusieurs champ
d'un enregistrement (tout comme on peut passer la valeur d'une seule case d'un tableau en param tre)
8