Module 08 · Leçon 1
Les enregistrements (records)
Ce que vous saurez faire
- Déclarer un type enregistrement
- Accéder aux champs d'une variable enregistrement
- Utiliser la structure Avec…Faire
Avant de commencer
Pour décrire un élève, vous avez besoin de plusieurs informations liées : nom (chaîne), âge (entier), moyenne (réel)… Vous pourriez déclarer trois variables séparées, mais elles seraient isolées. Comment les regrouper en une seule entité ?
1. Définition
2. Déclaration
T.D.N.T
─────────────────────────────────────
Type
ELEVE = Enregistrement
Nom : chaîne[30]
Prenom : chaîne[20]
Sexe : caractère
Moy : réel
Fin ELEVE
─────────────────────────────────────
T.D.O
─────────────────────────────────
E1 : variable ELEVE
─────────────────────────────────
T.D.N.T
─────────────────────────────────────
Type
ELEVE = Enregistrement
Nom : chaîne[30]
Prenom : chaîne[20]
Sexe : caractère
Moy : réel
Fin ELEVE
─────────────────────────────────────
T.D.O
─────────────────────────────────
E1 : variable ELEVE
─────────────────────────────────
PROGRAM ExempleEleve;
TYPE
Eleve = RECORD
Nom : string[30];
Prenom : string[20];
Sexe : char;
Moy : real;
END;
VAR
E1 : Eleve;
BEGIN
{ ... }
END.
3. Accès aux champs
L'accès se fait par notation pointée : variable.champ.
E1.Nom := 'Trabelsi';
E1.Prenom := 'Amine';
E1.Sexe := 'M';
E1.Moy := 14.75;
Writeln(E1.Nom, ' ', E1.Prenom, ' — ', E1.Moy:5:2);
Affectation entière
On peut copier un enregistrement complet :
VAR E1, E2 : Eleve;
BEGIN
E2 := E1; { copie tous les champs }
END.
4. La structure Avec…Faire
Quand on accède plusieurs fois aux mêmes champs, Avec (Pascal With)
évite la répétition.
Avec E1 Faire
Ecrire(Nom, " ", Prenom, " ", Sexe, " ", Moy)
Fin Avec
Avec E1 Faire
Ecrire(Nom, " ", Prenom, " ", Sexe, " ", Moy)
Fin Avec
WITH E1 DO
BEGIN
Writeln(Nom, ' ', Prenom, ' ', Sexe, ' ', Moy:5:2);
END;
À l'intérieur du With, Nom désigne E1.Nom, Prenom désigne
E1.Prenom, etc.
5. Lecture / écriture
{ Lecture : on lit champ par champ }
WITH E1 DO
BEGIN
Write('Nom : '); Readln(Nom);
Write('Prénom : '); Readln(Prenom);
Write('Sexe : '); Readln(Sexe);
Write('Moy : '); Readln(Moy);
END;
{ Écriture }
WITH E1 DO
Writeln(Nom, ' ', Prenom, ' (', Sexe, ') ', Moy:5:2);
Readln(E1) (le record entier) n'existe pas : lecture champ par champ
obligatoire.
6. Exercices
Déclarer un type Livre avec : titre (chaîne), auteur (chaîne), année
(entier), prix (réel). Déclarer une variable L, initialiser ses
champs et l'afficher.
Voir le corrigé
TYPE
Livre = RECORD
Titre : string[50];
Auteur : string[30];
Annee : integer;
Prix : real;
END;
VAR L : Livre;
BEGIN
L.Titre := 'Les Misérables';
L.Auteur := 'Hugo';
L.Annee := 1862;
L.Prix := 25.00;
WITH L DO
Writeln(Titre, ' — ', Auteur, ' (', Annee, ') ', Prix:5:2);
END.
Écrire une fonction MeilleurEleve(E1, E2 : Eleve) : Eleve ? Non, Pascal
interdit. Écrire plutôt une procédure MeilleurEleve(E1, E2 : Eleve; VAR M : Eleve) qui retourne l'élève de meilleure moyenne.
Voir le corrigé
PROCEDURE MeilleurEleve(E1, E2 : Eleve; VAR M : Eleve);
BEGIN
IF E1.Moy >= E2.Moy THEN
M := E1
ELSE
M := E2;
END;
L'affectation entière M := E1 copie tous les champs. C'est l'astuce
qui fait gagner du temps.
Déclarer un type Date (jour, mois, année). Puis un type Personne
qui contient un champ date_naissance : Date. Écrire une fonction qui
calcule l'âge d'une personne en 2026.
Voir le corrigé
TYPE
Date = RECORD
jour, mois, annee : integer;
END;
Personne = RECORD
nom : string;
date_naissance : Date;
END;
FUNCTION Age(p : Personne) : integer;
BEGIN
Age := 2026 - p.date_naissance.annee;
END;
L'accès se chaîne : p.date_naissance.annee.
7. Erreurs fréquentes au bac
- Tenter
Readln(E1)pour lire tout d'un coup : impossible. - Tenter
FUNCTION F(...) : Eleve: Pascal standard refuse. - Oublier les
;entre champs dans la déclarationRECORD. - Confondre
WITHetWHILE(leHse ressemble vite).
8. Quiz
Quiz (5 questions)
Un enregistrement permet de grouper :
L'accès au champ `Moy` de la variable `E1` se note :
Une fonction Pascal peut-elle retourner un enregistrement ?
Le bloc `WITH E1 DO BEGIN Nom := ... END;` :
On peut affecter un record entier avec :