Les variables tableaux
Il peut arriver que dans un programme, vous souhaitiez utiliser des listes de nombres ou de chaînes de caractères pour diverses utilisations : notes d'élèves, tailles de personnes, production annuelle de tonnes de blé, noms de personnes dans une rue etc... Comme il s'agit de données de même types et de même nature, et qu'on ne connait pas leur nombre... Il est compliqué de devoir créer une variable par valeur. C'est pourquoi il existe un type composé appelé "Tableau".
Exemple
Vous voulez gérer un ensemble de notes d'une classe d'élèves, pour, par exemple, déterminer la moyenne des notes pour un devoir. Vous souhaitez également avoir un tableau des noms de ces élèves. Pour simplifier, on va considérer une classe de 10 élèves avec des prénoms tous différents avec le programme suivant :
Program Notes_eleves_01;
CONST
NB_ELEVES = 10;
nom_eleve : array [1..NB_ELEVES] of string = ('Julien', 'Sarah', 'Noémie',
'Fred', 'Chandler', 'Ross', 'Phoebe', 'Charles', 'Angus',
'Barbara');
note_eleve : array [1..NB_ELEVES] of single = (8.5, 12, 18, 13, 14.25, 9,
17, 11.5, 13, 9.5);
Var
average, total, note_max, note_min : single;
i, imax, imin :byte;
Begin
note_min :=21; note_max:=-1; total:=0; imax:=1 ; imin:=1;
for i:=1 to NB_ELEVES do
begin
total := total+note_eleve[i];
if note_eleve[i] > note_max then
begin
note_max:=note_eleve[i];
imax:=i;
end;
if note_eleve[i] < note_min then
begin
note_min:=note_eleve[i];
imin:=i;
end;
end;
writeln('La moyenne est de : ', total / NB_ELEVES : 5:2);
writeln('La note la plus basse (', note_min : 5:2,
' par : ', nom_eleve[imin], ')');
writeln('La note la plus forte (', note_max : 5:2,
' par : ', nom_eleve[imax], ')');
readln;
End.
Ce programme initialise 2 tableaux de 10 valeurs chacun par les constantes typées. Les constantes typées n'existent qu'à partir de turbo pascal 7 et pure pascal 1.1.Dans le programme principal, la boucle for sur un entier de type byte (puisqu'on n'aura jamais plus de 255 élèves dans une classe), on fait la somme des notes des élèves, on teste si une note est inférieure à la note minimale précédente, ou supérieure à la note maximale précédente et change leurs valeurs respectives si c'est le cas. Puisque la note maximale est de 20, on initie note_min à 21 pour pouvoir diminuer à partir de la note 20. On initie note_max à -1 pour les mêmes raisons.
Enfin, on affiche les résultats de la moyenne (formaté avec 2 chiffres avant et après la virgule), la note la plus faible (ainsi que le nom de l'élève l'ayant obtenu), et la note la plus élevée (ainsi que l'élève l'ayant obtenu).
Description d'un type tableau
La déclaration d'un type tableau est très simple : "array [valdebut...valfin] of type". En savoir plus sur les types tableau en Pascal.Les index des tableaux peuvent avoir n'importe quel type ordinal!! Tous les types entiers, les caractères, les énumérations, booléens ou interval sont acceptés.
Les éléments de tableaux, quant à eux, peuvent être composés de n'importe quel type simple (Entiers, réels, booléens,chaîne de caractères...), tableau, enregistrement ou objet! Essayez le programme suivant :
type
Date = record
Annee : Integer;
Mois : 1..12;
Jour : 1..31;
end;
Var
tab_date : Array[byte] of Date;
Begin
tab_date[1].Annee := 2025;
tab_date[1].Jour := 25;
tab_date[1].mois := 12;
Writeln(' Jour/mois/Annee = ',
tab_date[1].Jour,'/',
tab_date[1].Mois,'/',
tab_date[1].Annee);
readln;
End.
Ce programme se compilera sans problème et, à l'exécution, affichera bien la date du "25/12/2025"!Remarques
- Nous n'avons pas encore abordé le type "record" (enregistrement), un type composé permettant toute liberté quant au contenu de chaque type (et sont l'essence même des bases de données). Un chapitre leur sera consacré plus loin dans les tutoriels.
- Les éléments d'un tableau se suivent tous en RAM : Si on a un tableau de words (16 bits soit 2 octets), et l'élément 0 est en emplacement hexadécimal 6000, l'élément 1 sera en $6002 (on ajoute 2 octets pour un word), l'élément 2 en $6004 etc
Exercices
- Reprenez le programme Notes_eleves_01 précédent avec les notes des élèves et sortez les statistiques suivantes:
- Ecart-type
- Médiane
- Premier décile et dernier décile
- Avec ce même programme, créez un nouveau tableau "mentions" contenant les 6 éléments "très bien" (entre 16 inclus et 20 inclus), "bien" (entre 14 inclus et 16 exclus), "Assez bien" (entre 12 inclus et 14 exclus), "passable" (entre 10 inclus et 12 exclus) et "insuffisant" (en dessous de 10) et dans lequel vous comptabiliserez le nombre d'élèves de chaque mention.
- A partir de cette page, cherchez combien d'octets prend une variable de type Single. En déduire combien d'octets sont réservés pour notre tableau de notes d'élèves.
- Quels avantages y-a-t-il a déclarer une constante Nb_Eleves dès le départ ? Quelles valeurs pouvez vous lui donner ?
Tableau multidimentionnel
Dans un programme,il peut être nécessaire d'avoir un tableau à plusieurs dimensions pour des variables orthogonales. Par exemple, pour les notes d'élèves d'une classe, on peut avoir plusieurs contrôles à des dates différentes :
Program Notes_eleves_02;
CONST
NB_ELEVES = 10;
dates_controles : array [1..3] of String = ('2025-10-10', '2025-11-3', '2025-12-15');
nom_eleve : array [1..NB_ELEVES] of string = ('Julien', 'Sarah', 'Noémie',
'Fred', 'Chandler', 'Ross', 'Phoebe', 'Charles', 'Angus',
'Barbara');
note_eleve : array [1..3 ,1..NB_ELEVES] of single =
(
(8.5, 12, 18, 13, 14.25 ,9, 17, 11.5, 13 ,9.5),
(11, 11 ,14 ,8 ,7 ,12 ,16 ,10 ,14 ,10.5),
(12 , 13 ,13, 10 ,11.5 ,11 ,8 ,7 ,11 ,11)
);
Var
total : Array [1..NB_ELEVES] of real;
i, j :byte;
Begin
for i:=1 to NB_ELEVES do
total[i] := 0;
for i:=1 to NB_ELEVES do
for j:=1 to 3 do
total[i] := total[i]+note_eleve[j,i];
for i:=1 to NB_ELEVES do
writeln('La moyenne de ',nom_eleve[i],' est : ', total[i] / 3 : 5:2);
readln;
End.
Dans ce programme, on initialise, par des CONSTANTES TYPEES, des tableaux à 1 dimenson (date_controle, nom_eleve) et à 2 dimensions (note_eleve). Vous remarquerez la syntaxe pour initialiser un tableau à 2 dimensions, qui est une double parenthèse. Dans la RAM, les données sont empilées tels qu'elles apparaissent dans le tableau à 2 dimensions.Après la déclaration de variables, le programme initialise le total de chaque élève à 0 puis effectue la somme des 3 notes pour chaque élève.
Enfin, le programme affiche la moyenne (avec 2 chiffres après la virgule) pour chaque élève.
Comme vous le voyez, dans ce programme, la déclaration d'un tableau à 2 dimensions et son initialisation est relativement simple en Pascal. Chacun des éléments de ce tableau étant accédé par note_eleve[i,j]. On procèderait de même pour un tableau à 3 dimensions etc.... Mais ATTENTION, plus un tableau a de dimensions, moins vous pouvez mettre d'indices par dimension.
Exercices
- Créez un programme initialisant un tableau à 2 dimensions pour un jeu d'échecs où chaque case est nommées par un couple "Lettre-Chiffre", les lettres allant de 'A' à 'H' et les chiffres de '1' à '8'. Pour cela, déclarez une variable tableau à 2 dimensions dont chaque élément est une chaine de 2 caractères. Pour la boucle FOR, n'oubliez pas qu'en Pascal, vous pouvez faire des boucles avec des caractères (en l'occurence de 'A' à 'Z' et de '1' à '8'). Ici les chiffres sont des caractères.
- Reprenez le programme Notes_eleves_02 ci-dessus et donnez pour chaque controle, la moyenne, la note maximale et la note minimale. Cela suppose de créer au moins 3 autres variables tableau.
Notions vues dans ce cours
- Initialistaion rapide de tableaux à une dimension avec les constantes typées
- Déclaration d'une variable de type tableau
- Déclaration d'une variable tableau d'enregistrements
- Initialistaion rapide de tableaux à plusieurs dimensions avec les constantes typées
- Accéder à un élément de tableau (à 1 ouplusieurs dimensions