Enregistrements▲
Dans un tableau, tous les constituants doivent être semblables. Ce n'est pas le cas des enregistrements, qui sont des variables composées de plusieurs variables (ou champs) de types différents.
Déclarations▲
Structure d'une déclaration d'enregistrement :
VAR
nom_variable : RECORD
champ1 : type
;
champ2 : type
;
...
END
;
{ ou }
TYPE
nom_type = RECORD
champ1 : type
;
champ2 : type
;
...
END
;
Exemple :
TYPE
date = RECORD
jour : 1
..31
;
mois : 1
..12
;
an : 1980
..1999
END
;
facture = RECORD
reference : integer
;
jour : date; {enregistrement d'enregistrement}
client : string
[100
];
total_HT : real
END
;
VAR
date1, date2 : date;
comptes : array
[1
..100
] of
facture;
fact : facture;
Dans un enregistrement, chaque champ doit avoir un nom différent. Mais pour des enregistrements différents on peut réutiliser le même nom de champ (ici jour).
Utilisation des enregistrements▲
Comme l'affectation fonctionne toujours pour des variables de même type, on peut écrire DATE1 := DATE2.
On accède à un champ par NOM_VARIABLE.NOM_CHAMP :
writeln('Référence de la facture ? '
);
readln(fact.reference);
writeln('Mois de la facture ? '
);
readln(fact.jour.mois);
writeln('Jour de la facture ? '
);
readln(fact.jour.jour);
for
i := 1
to
nb_fact do
writeln(comptes[i].prix
Un champ d'enregistrement s'utilise comme une variable du même type (avec les mêmes possibilités mais aussi les mêmes limitations).
La structure WITH - DO (avec - faire)▲
Structure :
WITH
nom_enregistrement DO
instruction
Elle permet d'omettre le nom_enregistrement dans l'instruction.
FOR
I := 1
TO
nb_fact DO
WITH
comptes[i] DO
begin
reference := i; { c.a.d comptes[i].reference }
writeln('Nom du client de la facture ndeg.'
,i,' ?'
);
readln(client);
end
Dans un WITH, on peut évidement accéder à d'autres enregistrements, il suffit de préciser le nom_enregistrement.champ. Si l'on utilise des WITH imbriqués, en cas d'ambiguïté des noms de champs on se réfère au WITH le plus proche (intérieur).
WITH
fact DO
begin
WITH
date1 DO
begin
mois := 12
; { date1.mois }
reference := 1
; { fact.reference car date1.reference n'existe pas }
jour := 15
; { date1.jour car WITH DATE1 le plus à l'intérieur }
fact.jour := date2 { fact.jour puisqu'on le précise }
end
end
Enregistrements avec variantes▲
Certains champs d'un enregistrement peuvent être différents suivant la valeur d'un des champs en utilisant la structure CASE OF dans la déclaration de l'enregistrement.
TYPE
statut = (celibataire,marie,divorce,veuf);
perso = RECORD
nom : string
[20
];
CASE
situation : statut OF
celibataire : ();
marie : (enfants : 0
..10
);
divorce, veuf : (enfants : 0
..10
; remarie : boolean
)
END
;
Il ne peut y avoir qu'unCASE par enregistrement.
Celui-ci doit se placer en dernier, après les champs communs (si il y en a).
Mais dans ce CASE on peut avoir un autre CASE imbriqué (et ainsi de suite).
Les cas où il n'y a pas de champ variant doivent être précisés (ici celibataire).
Le champ discriminant (situation) s'utilise comme un autre champ commun.
R
Exemples d'instructions possibles (x déclaré comme perso) :
x.situation := marie;
if
x.situation = veuf then
writeln(x.enfants)
Exercicetel :
A l'aide d'un tableau de personnes (nom, prénom, numéro dans la rue, rue, département, ville, numéro de téléphone), faire un programme de recherche automatique de toutes les informations sur les personnes répondant à une valeur d'une rubrique donnée (tous les PATRICK , tous ceux de Saverne, etc...).
Voir la correction