Chapitre : 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 .
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 nous pouvons cr er nos propres types puis d clarer des variables ou des tableaux d' l ments de ce type.
Pour cr er des enregistrements, il faut d clarer un nouveau type, bas sur d'autres types existants, qu'on appelle type structur Apr s avoir d fini un type structur , on peut l'utiliser comme un 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).
Syntaxes :
(notation inspir e du Pascal)
Type
nom\_type = enregistrement
nom\_champ1: type\_champ1
&
nom\_champn: type\_champn
finenreg
(notation inspir e du C)
Type
Structure nom\_type
nom\_champ1: type\_champ1
&
nom\_champN: type\_champN
FinStruct
Exemple:
-Pascal
Type
tpersonne = enregistrement
nom : cha ne
pr nom : chaine
ge : entier
finenreg
-en C
Publicité
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.
Syntaxe
Var
nom\_var : nom\_type
Exemple:
Var
pers1, pers2, pers3 : tpersonne
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. Par exemple, pour afficher un enregistrement il faut afficher tous ses champs uns par uns.
A. Acc s aux champs d'un enregistrement
Alors que les l ments d'un tableau sont accessibles au travers 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
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
Publicité
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
B. Passage d'un enregistrement en param tre d'un sous-programme
Il est possible de passer tout 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), exactement comme pour les tableaux.
Exemple :
Voil une fonction qui renvoie la diff rence d'age entre deux personnes
Fonction diff rence (p1, p2 : tpersonne)
D but
Si pers1.age > pers2.age
Alors Retourne ( pers1.age pers2.age )
Sinon Retourne ( pers2.age pers1.age )
FinSi
FinFonct
Exemple 2 :
Voil une proc dure qui permet de modifier le prix de vente hors taxes d'un produit pass en param tre. Cette proc dure commence par afficher le libell et l'ancien prix de vente hors taxes du produit puis saisit le nouveau prix de vente entr par l'utilisateur.
Proc dure majpv (E/S x: produit)
D but
Aff "produit: ", x.lib
Aff "prix de vente hors taxe actuel: ", x.pvht
Aff "Entrez le nouveau prix de vente: "
Publicité
Saisir x.pvht
Aff "le nouveau prix de vente est: ", x.pvht
FinProc
B. L'imbrication d'enregistrements
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) indissociables. 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
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.
Type
Structure adresse
num : entier
rue: cha ne
cp: cha ne
ville: cha ne
FinStruct
Structure fournisseur
code\_frs : chaine
raison\_sociale: chaine
ad\_frs: adresse
tel: chaine
Publicité
FinStruct
Structure Produit
code: cha ne
lib: cha ne
paht: r el
pvht: r el
txtva: r el
frs: fournisseur
FinStruc
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
III. Les tableaux d'enregistrement
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.
Const
NP = 20 // nombre de personnes du groupe
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
Attention!
groupe.nom[3] n'est pas valide.
Pour acc der au nom de la troisi me personne du tableau, il faut crire g roupe[3].nom