Forum INFOMATH
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
-40%
Le deal à ne pas rater :
-40% sur le Pack Gaming Mario PDP Manette filaire + Casque filaire ...
29.99 € 49.99 €
Voir le deal

Page de cours sur les enresgitrements

Aller en bas

Page de cours sur les enresgitrements Empty Page de cours sur les enresgitrements

Message par methodiX Lun 26 Avr - 3:49

Chapitre 6

Les types Enregistrement

Parmi les types structurés dont dispose Pascal, nous avons déjà étudié le type tableau. Celui-ci nous permettait de réunir, au sein d'une même structure, des éléments de même type ayant un certain rapport entre eux; cela nous autorisait, au bout du compte, soit à manipuler globalement l'ensemble du tableau (dans des affectations), soit à appliquer un même traitement à chacun de ses éléments (grâce à la notion d'indice).
Mais, on peut également souhaiter regrouper au sein d'une même structure des informations n'ayant
pas nécessairement toutes le même type; par exemple, les différentes informations (nom, prénom,
sexe, nombre d'enfants...) relatives à un employé d'une entreprise.
En Pascal, le type enregistrement va nous permettre d'y parvenir. Ses différents éléments, nommés
alors champs, pourront être de type quelconque; par exemple, un enregistrement correspondant à un
employé pourra comporter les informations suivantes:
- nom, de type string[30],
- prénom, de type string[20]],
- sexe, de type boolean,
- nombre d'enfants, de type 0..50.
Comme les tableaux, les enregistrements pourront être manipulés soit globalement, soit élément par élément. En revanche, nous ne retrouverons pas la possibilité qu'offrait le tableau de répéter un même traitement sur les différents champs (celle-ci n'aurait d'ailleurs en général aucun sens, à partir du moment où les champs sont de nature différente).
Comme nous le verrons dans le prochain chapitre, le type enregistrement est fréquemment associé aux fichiers. Néanmoins, ce n'est pas là une règle générale: il existe des variables de type enregistrement n'ayant pas de rapport avec des fichiers et il existe des fichiers ne faisant pas appel à 26 un type enregistrement. C'est pour cette raison que nous vous proposons d'étudier ici la notion d'enregistrement indépendamment de la notion de fichier.

1 - EXEMPLES INTRODUCTIFS
Voyez ces déclarations:

Code:
type personne = record
nom : string [30] ;
prénom : string [20] ;
masculin : boolean ;
nbenfants : 0..50
end ;
var employe, courant : personne
Elles correspondent à l'exemple évoqué en introduction. Elles définissent tout d'abord un type nommé personne comme étant formé de 4 champs nommés nom, prénom, masculin et nb_enfants et ayant le type spécifié. Ensuite de quoi elles déclarent deux variables nommées employe et courant comme étant de ce type personne.
Ces variables pourront être manipulées champ par champ, de la même manière que n'importe quelle information ayant le type du champ correspondant. Pour ce faire, un champ d'une variable de type enregistrement est désigné par le nom de la variable, suivi d'un point et du nom du champ concerné. Par exemple:
employe.nom désigne le champ nom de l'enregistrement employe (il s'agit donc d'une information de type string[30])), courant.masculin désigne le champ masculin de l'enregistrement courant (il s'agit donc d'une information de type boolean). Voici quelques exemples d'instructions faisant référence à certains champs de nos enregistrements. personne et courant:
readln (employe.nom)
employe.nbenfants := 3
if courant.masculin then ...
Par ailleurs, les variables employe et courant pourront être manipulées globalement; ainsi:
courant := employe
recopie toutes les valeurs des différents champs de emplaye dans les champs correspondants de
courant. Elle remplace (avantageusement) les 4 affectations:
courant.nom := employe.nom
courant.prenom := employe.prenom
courant.masculin := employe.masculin
courant.nbenfants := employe.nbenfants
Notez que, comme pour les tableaux, ces affectations globales ne seront possibles que pour des enregistrements déclarés explicitement du même type.

27
II - LA SYNTAXE DE LA DECLARATION D'UN TYPE ENREGISTREMENT
Au sein d'une déclaration type ou var, la définition d'un type enregistrement peut se faire comme suit:
record
liste_d identificateurs 1 : description_de type 1
liste_d_identificateurs_2 : description de type_2
liste d_identificateurs_n : description_de_type n
end
Avec:
Le type enregistrement (sans variante)
liste d_identificateurs: un ou plusieurs identificateurs séparés par des virgules.
Notez que le mot end termine la description de l'enregistrement; celle-ci est comparable au contenu d'une instruction var avec ses listes d'identificateurs et ses descriptions de types; ces derniers pouvant être aussi bien des identificateurs de type que des descriptions effectives.
Jusqu'ici, nous avons vu qu'un même identificateur ne pouvait être défini qu'une seule fois. Le type enregistrement apporte en quelque sorte une exception (logique) à cette règle car il est possible de donner le même nom à des champs de deux types enregistrement différents; en effet, dans un tel cas, Pascal est en mesure de lever l'ambiguïté grâce au "préfixe" (nom d'enregistrement) précédant ce nom de champ. Néanmoins, pour des raisons de clarté des programmes, il est conseillé de ne pas abuser de cette possibilité (laquelle peut, au demeurant, entraîner quelques ambiguïtés en cas d'utilisation d'instructions with multiples. Aucun restriction n'est apportée à la nature des différents champs qui peuvent être à leur tour, de type structuré, de sorte que l'on peut très bien définir des enregistrements comportant eux-mêmes des enregistrements ou des tableaux. Nous avions déjà fait une remarque analogue à propos des tableaux; maintenant, vous voyez que l'on peut aussi définir des tableaux d'enregistrements. Examinons dès maintenant un exemple d'enregistrements d'enregistrements. Nous rencontrerons ultérieurement un exemple de tableaux d'enregistrements.

III EXEMPLES D'ENREGISTREMENTS D'ENREGISTREMENTS
Supposons qu'à l'intérieur de nos enregistrements de type personne, nous ayons besoin d'introduire deux dates: la date d'embauche (date embauche) et la date d'entrée dans le dernier poste occupé (date poste); ces dates étant elles-mêmes formées de plusieurs champs:
jour_s (jour de la semaine)
jour (quantième du mois)
mois
annee.
Nous pourrions effectuer les déclarations suivantes:
28
type date = record
jour_s : (lun, mar, mer, jeu, ven, sam, dim) ;
jour : 1..31 ;
mois : 1..12 ;
annee : 0..99
end ;
type personne = record
nom : string [30]
prenom : string [20]
masculin : boolean ;
date_embauche : date ;
date_poste : date ;
nbenfants : 0..50
end ;
var employe, courant : personne ;
Voici quelques exemples de références à des champs de la variable employe: employe.date_embauche.annee désigne l'année d'embauche de l'enregistrement employe (cette information est de type 0..99), employe.date_embauche désigne la date d'embauche de l'enregistrement employe (il s'agit cette fois
d'une information de type date)
L'instruction:
if employe.date embauche.jour_s = lun
permet de tester si un employé a été embauché un lundi.

IV - L'INSTRUCTION WITH
4.1 Exemples
La manipulation globale d'enregistrements n'est possible que dans le cas d'affectations (et à condition
que l'on manipule tous les champs en même temps). Supposons que l'on souhaite écrire les informations de l'enregistrement employe. Nous pourrions procéder ainsi (en supposant que c est de type char):
writeln ('nom : ', employe.nom) ;
writeln ('prenom : ', employe.prenom) ;
if employe.masculin then c := 'M'
else c := 'F' ;
writeln ('sexe : ', c, ' nbre enfants' , employe.nbenfants) ;
En fait, I'instruction with nous permet de simplifier les choses:
with employe do begin
writeln ('nom : ', nom);
writeln ('prenom : ', prenom) ;
if masculin then c := 'M' else c := 'F';
writeln ('sexe : '. c, ' nbre enfants' , nbenfants);
end;

29
Vous constatez que nous avons pu omettre le nom d'enregistrement à l'intérieur de:
with employe do begin
end
L'instruction with employe demande en fait au compilateur de "préfixer" par employe tous les
idenficateurs qui correspondent à un nom de champ de l'enregistrement employe. Sa portée est
naturellement limitée à l'instruction (souvent composée) mentionnée à la suite du do. Bien entendu,
un identificateur ne correspondant pas à un nom de champ de l'enregistrement employe, n'est pas
affecté par cette instruction.
4.2 Imbrication des instructions with
Avec les déclarations des types date et personne et la variable courant du paragraphe précédent,
nous pourrions écrire ces instructions utilisant deux with imbriqués:
with courant do begin
nom := ...
prenom :=
with date_embauche do begin
jour_s := ...
jour := ...
mois := ...
annee := ...
end ;
end ;
On obtiendrait le même résultat avec:
with courant do
with date embauche do begin
nom := ...
prenom := ...
jour_s := ...
jour := ...
mois := ...
annee := ...
...
end ;
En effet, les noms de champ appartenant à date_embauche (et seulement ceux-là) seront préfixés par
date_embauche. Puis, les champs appartenant à courant (y compris ceux éventuellement préfixés par
date_embauche) seront préfixés par courant.
Il faut cependant noter que ce mécanisme d'imbrication des with risque d'entraîner quelques
ambiguïtés lorsque des noms de champ identiques sont définis au sein d'enregistrements différents.
En fait dans ce cas, Pascal, qui se trouve confronté à deux préfixes possibles pour un nom de champ,
choisit celui qui a été cité en dernier (donc celui de niveau le plus imbriqué). Nous vous conseillons
d'éviter ce genre de situation, bien compromettante pour la compréhension du programme.
30
Signalons enfin une troisième possibilité, équivalente aux deux précèdentes:
with courant, date embauche do begin
nom := ...
prenom := ...
jour s := ...
jour := ...
mois := ...
annee := ...
. . .
end;
V Exercices.
1) Ecrire un programme créant un annuaire de 10 personnes à trier par ordre alphabétique du nom.
methodiX
methodiX
Admin
Admin

Masculin
Nombre de messages : 1260
Localisation : Le couloir de l'école polytechnique de Tunis
Réputation : 68
Points : 7049
Date d'inscription : 22/03/2007

Feuille de personnage
Capacité linguistique:
Page de cours sur les enresgitrements Left_bar_bleue1000/1000Page de cours sur les enresgitrements Empty_bar_bleue  (1000/1000)

Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum