Beruflich Dokumente
Kultur Dokumente
Laporte
DAIGL
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)
Syntaxes :
Exemple:
S. Laporte
DAIGL
Var
Exemple:
Var
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
DAIGL
S. Laporte
DAIGL
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.
S. Laporte
DAIGL
1,n
//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
S. Laporte
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
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
S. Laporte
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
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
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 :
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)