Aller au contenu principal

Module 08 · Leçon 2

Vecteurs d'enregistrements

180 minanalyse · pascal
Affichage du code

Ce que vous saurez faire

  • Déclarer un tableau d'enregistrements
  • Saisir et afficher un vecteur d'enregistrements
  • Trier un vecteur d'enregistrements selon un champ

Avant de commencer

Vous avez 20 élèves à gérer. Vous n'allez pas créer 20 variables eleve1, eleve2, …. La solution : un tableau d'enregistrements.


1. Déclaration

T.D.N.T
─────────────────────────────────────
Type
  ELEVE = Enregistrement
    Nom : chaîne[30]
    Moy : réel
  Fin ELEVE
  Tab = Tableau de 50 ELEVE
─────────────────────────────────────

T.D.O
─────────────────────────────────
T : variable Tab
n : variable entier   { taille utile }
─────────────────────────────────

2. Accès : double indexation

L'accès se fait par T[i].champ :

T[1].Nom := 'Ali';
T[1].Moy := 14.5;

T[2].Nom := 'Sara';
T[2].Moy := 16.0;

Writeln(T[1].Nom, ' : ', T[1].Moy:5:2);

Avec WITH :

WITH T[1] DO
BEGIN
  Nom := 'Ali';
  Moy := 14.5;
END;

3. Parcours

Saisie

Write('Nombre d''élèves : ');
Readln(n);
FOR i := 1 TO n DO
BEGIN
  Write('Élève ', i, ' — Nom : ');
  Readln(T[i].Nom);
  Write('Moy : ');
  Readln(T[i].Moy);
END;

Recherche du meilleur

imax := 1;
FOR i := 2 TO n DO
  IF T[i].Moy > T[imax].Moy THEN
    imax := i;
Writeln('Meilleur : ', T[imax].Nom, ' (', T[imax].Moy:5:2, ')');

4. Tri par sélection sur un champ

PROCEDURE TrierParMoy(VAR T : Tab; n : integer);
VAR
  i, j, imax : integer;
  temp : Eleve;
BEGIN
  FOR i := 1 TO n - 1 DO
  BEGIN
    imax := i;
    FOR j := i + 1 TO n DO
      IF T[j].Moy > T[imax].Moy THEN
        imax := j;
    { Échange du record entier }
    temp := T[i];
    T[i] := T[imax];
    T[imax] := temp;
  END;
END;

5. Exercices

Exercice 1facile
Moyenne de classe

Écrire une fonction MoyenneClasse(T : Tab; n : entier) : réel qui calcule la moyenne arithmétique des moyennes individuelles.

Voir le corrigé
FUNCTION MoyenneClasse(T : Tab; n : integer) : real;
VAR
  i : integer;
  s : real;
BEGIN
  s := 0;
  FOR i := 1 TO n DO
    s := s + T[i].Moy;
  MoyenneClasse := s / n;
END;
Exercice 2moyen
Filtrer les admis (type bac courant)

Écrire une procédure Admis(T : Tab; n : integer) qui affiche les élèves dont la moyenne est >= 10.

Voir le corrigé
PROCEDURE Admis(T : Tab; n : integer);
VAR i : integer;
BEGIN
  Writeln('Élèves admis :');
  FOR i := 1 TO n DO
    IF T[i].Moy >= 10 THEN
      WITH T[i] DO
        Writeln('  ', Nom, ' — ', Moy:5:2);
END;
Exercice 3difficile
Bilan complet (hors bac, bonus)

Étant donné T (tableau d'élèves), écrire un programme qui :

  1. Saisit les données.
  2. Affiche la moyenne de classe.
  3. Affiche le meilleur, le moins bon, et le médian.
  4. Trie et affiche le classement.
Voir le corrigé

(structure : programme principal qui appelle des sous-programmes)

PROGRAM Bilan;
{ ... types Eleve, Tab comme précédemment ... }

PROCEDURE Saisir(VAR T : Tab; VAR n : integer);
{ ... }

FUNCTION Moyenne(T : Tab; n : integer) : real;
{ ... }

PROCEDURE Trier(VAR T : Tab; n : integer);
{ ... tri par sélection sur .Moy décroissant ... }

PROCEDURE Afficher(T : Tab; n : integer);
VAR i : integer;
BEGIN
  FOR i := 1 TO n DO
    Writeln(i, '. ', T[i].Nom, ' — ', T[i].Moy:5:2);
END;

VAR T : Tab; n : integer;
BEGIN
  Saisir(T, n);
  Writeln('Moyenne de classe : ', Moyenne(T, n):5:2);
  Trier(T, n);
  Writeln('Classement :');
  Afficher(T, n);
  Writeln('Meilleur : ', T[1].Nom);
  Writeln('Moins bon : ', T[n].Nom);
  Writeln('Médian : ', T[(n + 1) DIV 2].Nom);
END.

6. Erreurs fréquentes au bac

  • Inverser l'ordre : T.Nom[1] au lieu de T[1].Nom.
  • Comparer deux records entiers (T[i] = T[j]) — interdit en Pascal standard. Comparer champ par champ.
  • Oublier d'échanger le record entier lors du tri (temp := T[i].Moy est faux : il faut temp := T[i]).

7. Quiz

Quiz (5 questions)

1

Pour accéder à la moyenne du 3ème élève :

2

Trier un tableau d'élèves par moyenne : on compare :

3

Échanger deux élèves dans le tableau :

4

Un vecteur d'enregistrements est équivalent à :

5

WITH T[1] DO Nom := 'A'; équivaut à :

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