Module 08 · Leçon 2
Vecteurs d'enregistrements
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 }
─────────────────────────────────
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 }
─────────────────────────────────
PROGRAM Classe;
CONST MAX = 50;
TYPE
Eleve = RECORD
Nom : string[30];
Moy : real;
END;
Tab = ARRAY[1..MAX] OF Eleve;
VAR
T : Tab;
n : integer;
BEGIN
{ ... }
END.
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
É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;
É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;
Étant donné T (tableau d'élèves), écrire un programme qui :
- Saisit les données.
- Affiche la moyenne de classe.
- Affiche le meilleur, le moins bon, et le médian.
- 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 deT[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].Moyest faux : il fauttemp := T[i]).
7. Quiz
Quiz (5 questions)
Pour accéder à la moyenne du 3ème élève :
Trier un tableau d'élèves par moyenne : on compare :
Échanger deux élèves dans le tableau :
Un vecteur d'enregistrements est équivalent à :
WITH T[1] DO Nom := 'A'; équivaut à :