Types Structurés et Enregistrements

Page 1 sur 8Lecteur de document UniversityLib

Types Structurés et Enregistrements

Algorithmic Structures · notes

Browse all programmation documents

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

Advertisement

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

Advertisement

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

Advertisement

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).

Advertisement

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