Sie sind auf Seite 1von 8

S.

Laporte

Type structurs et enregistrements

DAIGL

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 l avoir 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 l algorithme comporte des sous-programmes, les types et les constantes sont dclares en dehors du programme.

Syntaxes :

Exemple:

Type Structure nom_type nom_champ1: type_champ1 nom_champN: type_champN FinStruct

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.

S. Laporte

Type structurs et enregistrements

DAIGL

Var

Syntaxe 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: PRODUIT code lib paht pvht txtva lgende:
code: code alphanumrique du produit lib: libll paht: prix d'achat hors taxes pvht: prix de vente hors taxes txtva: taux de TVA applicable

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 l entit Produit. Cependant, l analogie se limite ici. En particulier, dans une entit, toutes les proprits ne possdent pas un statut quivalent. Ainsi, il existe des identifiants, c dire des proprits possdant une valeur unique par occurrence, est et ceci est spcifi logiquement lors du passage au modle relationnel. Ici, il n a pas de possibilit de y prciser quel champ est identifiant du type structur. Si on n prend pas garde, nous pouvons ds lors y crer des occurrences possdant la mme valeur pour la proprit Code, ce qui peut poser problme au niveau de notre application.

S. Laporte

Type structurs 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 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 l intermdiaire 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 Rappel : il est possible d'affecter un enregistrement un autre de mme type. L, il serait correct d'crire pers1 ? pers2
3

S. Laporte

Type structurs 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 compose de trois variables (jour, mois, anne) indissociables 1. 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.

En supposant que le type Date n'existe pas.

S. Laporte

Type structurs et enregistrements

DAIGL

Voil le MCD correspondant.


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

1,n

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 Climat : Chane Temp : tableau[1..12] de rel Prcip : tableau[1..12] de rel FinStruct

//Altitude moyenne //type de climat //temprature moyenne par mois //prcipitations moyennes par mois

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 l veuille traiter non pas un seul enregistrement mais plusieurs. Par exemple, on on veut pouvoir traiter un groupe de personne. On ne va donc pas crer autant de variables du type personne qu y a de personnes. On va crer un tableau regroupant toutes les personnes du groupe. Il il s agit alors d tableau d un enregistrements, autrement appel table . Une table en algorithmique a beaucoup de points communs avec une table d une base de donne. Les colonnes sont appeles champs et les lignes enregistrements.
5

S. Laporte

Type structurs et enregistrements

DAIGL

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
1 2 3 4 5

ge

nom des champs

enregistrements

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 Progniture : tableau[1..10] d'Enfant
6

S. Laporte

Type structurs et enregistrements

DAIGL

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 Du coup, la procdure converthms n'a plus qu'un seul paramtre rsultat et peut tre transforme en fonction

S. Laporte

Type structurs et enregistrements

DAIGL

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 d FinFonction
Remarque :

retourne converthms(nbsec(h2) nbsec(h1))

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)

Das könnte Ihnen auch gefallen