Aller au contenu principal

Module 08 · Leçon 1

Les enregistrements (records)

180 minanalyse · pascal
Affichage du code

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
─────────────────────────────────

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

À 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

Exercice 1facile
Déclaration Livre

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.
Exercice 2moyen
Comparer deux élèves (type bac courant)

É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.

Exercice 3difficile
Enregistrements imbriqués (hors bac, bonus)

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éclaration RECORD.
  • Confondre WITH et WHILE (le H se ressemble vite).

8. Quiz

Quiz (5 questions)

1

Un enregistrement permet de grouper :

2

L'accès au champ `Moy` de la variable `E1` se note :

3

Une fonction Pascal peut-elle retourner un enregistrement ?

4

Le bloc `WITH E1 DO BEGIN Nom := ... END;` :

5

On peut affecter un record entier avec :

Bravo d'être arrivé jusqu'ici. Marquez la leçon terminée pour ancrer le progrès.