Vous êtes sur la page 1sur 8

K.

Zabo Type structurs et enregistrements Centre Universitaire Professionnalis

Les types structurs et les enregistrements

Introduction
Contrairement aux tableaux qui sont des structures de donnes dont tous les lments sont de mme type, les enregistrements
sont des structures de donnes dont les lments peuvent tre de type diffrent et qui se rapportent la mme entit
smantique (analogie avec Merise).Les lments qui composent un enregistrement sont appels champs.

Avant de dclarer une variable enregistrement, il faut avoir au pralable dfinit 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)

Pralable: dclaration d'un type structur


Jusqu' prsent, nous n'avons utilis que des types primitifs (caractres, entiers, rels, chanes) et des tableaux de types
primitifs. Mais il est possible de crer nos propres types puis de dclarer des variables ou des tableaux d'lments de ce
type.

Pour ce faire, il faut dclarer un nouveau type, fond sur d'autres types existants. Aprs lavoir dfini, on peut ds lors utiliser
ce type structur tout autre type normal en dclarant une ou plusieurs variables de ce type. Les variables de type structur
sont appeles enregistrements.

La dclaration des types structurs se fait dans une section spciale des algorithmes appele Type, qui prcde la section des
variables (et succde la section des constantes). Si lalgorithme comporte des sous-programmes, les types et les constantes
sont dclares en dehors du programme.
Syntaxes :
Type
Structure nom_type
nom_champ1: type_champ1

nom_champN: type_champN

FinStruct Exemple:

Type
Structure tpersonne
nom : chane
prnom : chane
ge : entier
FinStruct

I. Dclaration d'un enregistrement partir d'un type structur

Une fois qu'on a dfini un type structur, on peut dclarer des variables enregistrements exactement de la mme
faon que l'on dclare des variables d'un type primitif.

L3-M1-M2-INFORMATIQUE-TELECOMS
K. Zabo Type structurs et enregistrements Centre Universitaire Professionnalis

Syntaxe Var nom_var


: nom_type

Exemple:
Var
pers1, pers2, pers3 : tpersonne

Reprsentation:
les enregistrements sont composs de plusieurs zones de donnes, correspondant aux champs
pers1.nom pers1.age
pers1

pers2.nom pers2.age

pers2

Il est naturel de faire une analogie avec la notion de table du modle relationnel, ou d'entit du modle entit-
association (MCD)

Soit l'entit suivante: lgende:


PRODUIT
code: code alphanumrique du produit
code lib: libll
lib paht: prix d'achat hors taxes
pvht: prix de vente hors taxes
paht txtva: taux de TVA applicable
pvht
txtva

Voici comment dclarer deux occurrences (variables enregistrements) du type structur correspondant
cette entit.
// Il faut d'abord dfinir le type structur correspondant:
Type
Structure produit
code: chane
lib: chane
paht: rel
pvht: rel
txtva: rel
FinStruct

// Ensuite il est possible de dclarer 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 proprits ne possdent pas un statut quivalent. Ainsi,
il existe des identifiants, cest dire des proprits possdant une valeur unique par occurrence, et ceci est
spcifi logiquement lors du passage au modle relationnel. Ici, il ny a pas de possibilit de prciser quel
champ est identifiant du type structur. Si on ny prend pas garde, nous pouvons ds lors crer des

2
K. Zabo Type structurs et enregistrements Centre Universitaire Professionnalis

occurrences possdant la mme valeur pour la proprit Code, ce qui peut poser problme au niveau de
notre application.

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 mme type (ou le passer en paramtre). Par exemple, pour afficher un enregistrement il faut afficher
tous ses champs un par un.

A. Accs aux champs d'un enregistrement

Alors que les lments d'un tableau sont par lintermdiaire de leur indice, les champs d'un enregistrement
sont accessibles travers leur nom, grce l'oprateur '.'

nom_enregistrement . nom_champ reprsente la valeur mmorise


dans le champ de l'enregistrement

Par exemple, pour accder 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 prcd 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 lments d'un tableau, sont des variables qui on peut
faire subir les mmes oprations (affectation, saisie, affichage,).
Exemple 1:
Programme de saisie des donnes concernant les personnes pers1 et pers2, puis affichage de la diffrence
d'ge entre ces deux personnes

Programme Exemple
Type
Structure tpersonne
nom : chane prnom :
chane ge : entier
FinStruct

Var
pers1, pers2 : tpersonne

Dbut
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 diffrence 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

3
K. Zabo Type structurs et enregistrements Centre Universitaire Professionnalis

Rappel : il est possible d'affecter un enregistrement un autre de mme type. L, il serait correct d'crire
pers1 pers2
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 compose de trois variables (jour, mois, anne) indissociables1. Une date correspond donc
une entit du monde rel qu'on doit reprsenter par un type enregistrement 3 champs.
Si on dclare le type date au pralable, on peut l'utiliser dans la dclaration 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: chane
anne: entier
FinStuct

Structure personne
nom: chane
ddn: date
FinStruct

Pour accder l'anne de naissance d'une personne, il faut utiliser deux fois l'oprateur '.'
pers1.ddn.anne

Il faut lire une telle variable de droite gauche : l'anne de la date de naissance de la personne 1.

Exemple Complet
Un produit (cf. ex prcdents) est livr par un seul fournisseur. Un fournisseur est caractris par son code, sa raison
sociale et son numro de tlphone.

Structure fournisseur
code_frs : chaine
raison_sociale: chaine
tel: chaine
FinStruct

Structure Produit
code: chane
lib: chane
paht: rel
pvht: rel
txtva: rel
frs: fournisseur
FinStruct

Var
p: produit

Voil l'instruction qui permet d'afficher le numro de tlphone du fournisseur du produit p.frs.tel
Aff "tlphone du fournisseur de ", p.lib, " : ", p.frs.tel
Fournisseur, qui est en dpendance fonctionnelle sur Produit, est un champ de la structure produit.

Voil le MCD correspondant.

1 En supposant que le type Date n'existe pas.


4
K. Zabo Type structurs et enregistrements Centre Universitaire Professionnalis

PRODUIT
FOURNISSEUR
code
lib 1,1
paht code_frs
pvht raison_sociale
txtva tel

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 mmorisant des critres gographiques de villes (altitude, type de climat, ).
Certains de ces critres pourraient pertinemment tre mmoriss pour chaque mois de l'anne (par exemple
temprature moyenne, prcipitations moyennes, )

Structure Ville
Nom : chane
Alt : entier //Altitude moyenne
Climat : Chane //type de climat
Temp : tableau[1..12] de rel //temprature moyenne par mois
Prcip : tableau[1..12] de rel //prcipitations moyennes par mois
FinStruct

Ensuite, on peut videmment dclarer 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 tempratures moyennes sur les 12 mois"
//on utilise une boucle pour remplir le tableau des tempratures
Pour i de 1 jusqu' 12 Faire
Aff "mois ", i
Saisir MaVille.Temp[i] FinPour
//idem pour les prcipitations

Si on voulait afficher par exemple la temprature 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 crer autant de variables du type personne quil
y a de personnes. On va crer 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 donne. Les colonnes sont appeles champs et les lignes
enregistrements.
5
K. Zabo Type structurs et enregistrements Centre Universitaire Professionnalis

Exemple page suivante


Const NP = 20 // nombre de personnes du groupe

Type
Structure
personne nom:
chane age: entier
FinStruct

Var
groupe: tableau[1..NP] de personnes

Chaque lment du tableau est un enregistrement, contenant plusieurs variables de type diffrent. On accde
un enregistrement par son indice dans le tableau.
groupe[2] reprsente la deuxime personne du groupe
groupe[2].nom reprsente le nom de la deuxime personne du groupe

nom ge nom des champs


1

3 enregistrements
4

indices du tableau

Attention! groupe.nom[3] n'est pas


valide.
Pour accder au nom de la troisime personne du tableau, il faut crire groupe[3].nom

Une table comme champ de structure

Les tableaux d'enregistrements peuvent aussi tre eux mme servir de type dans un autre type structur

Exemple
Contexte : Dans un comit d'entreprise, on veut pouvoir connatre les enfants des employs 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


: chane
Prnom : chane
Journaiss : entier
Moisnaiss : entier
Anneenaiss :entier
FinStructure

Structure Employ
Nom : chane
Prnom : Chane

Nbenf : entier //nombre d'enfants
6
K. Zabo Type structurs et enregistrements Centre Universitaire Professionnalis

Progniture : tableau[1..10] d'Enfant


FinStruct

Et videmment, on pourrait dclarer un tableau d'Employ. Ce qui ferait des tableaux imbriqus 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).

Si TabEmp[i].NbEnf ? 0 //on vrifie d'abord que l'employ a des enfants


Alors
Pour j de 1 jusqu' TabEmp[i].NbEnf Faire
Aff TabEmp[i].Progniture[j].Prnom
Aff "anniversaire le ", TabEmp[i].Progniture[j].journaiss, TabEmp[i].Progniture[j].moisnaiss
FinPour
Sinon Aff "l'employ ", TabEmp[i].Nom, " n'a pas d'enfant"
FinSi

IV Les enregistrements comme paramtres


Comme c'est le cas avec les tableaux, il est possible de passer un enregistrement en paramtre
d'une fonction ou d'une procdure (on n'est pas oblig de passer tous les champs uns uns, ce
qui permet de diminuer le nombre de paramtres 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 dclares en global

Fonction nbsec(time : hms) : entier


Var nbsec : entier Dbut
nbsec time.heure* 3600 + time.minute * 60 + time.seconde
Retourne nbsec
FinProcdure

Procdure converthms(E nbsec :entier


S time : hms)
Dbut
time.heure nbsec DIV 3600
reste nbsec MOD 3600
time.minute reste DIV 60
time.seconde nbsec MOD 60
FinProcdure

7
K. Zabo Type structurs et enregistrements Centre Universitaire Professionnalis

Du coup, la procdure converthms n'a plus qu'un seul paramtre rsultat et peut tre transforme en fonction

Fonction converthms(nbsec :entier) : hms


Var
time : hms
Dbut
time.heure nbsec DIV 3600
reste nbsec MOD 3600
time.minute reste DIV 60
time.seconde nbsec MOD 60
retourne time
FinProcdure

Exemples d'appels

Appel de la fonction converthms :

Var duresec : entier


dureh : hms
Dbut
Saisir duresec
dureh converthms(duresec)
Aff "dure correspondante: ", dure.heure, "h ", dure.minute, "m ", dure.seconde, "s"
Fin

Appel de la fonction nbsec dans une autre fonction dure :

Fonction dure (h1 : hms, h2: hms) : hms


Var
d : hms
sec : entier Dbut
sec nbsec(h2) nbsec(h1)
d converthms(sec) retourne converthms(nbsec(h2) nbsec(h1))
retourne d
FinFonction

Remarque :
Lors de l'appel d'un sous-programme, un paramtre peut-tre reprsent par un ou plusieurs champ d'un
enregistrement (tout comme on peut passer la valeur d'une seule case d'un tableau en paramtre)