Module 01 · Leçon 2
Types énumérés et types utilisateurs
Ce que vous saurez faire
- Déclarer un type énuméré dans le T.D.N.T
- Utiliser un type intervalle pour borner une valeur
- Définir un type utilisateur pour structurer le code
Avant de commencer
Imaginez stocker la mention d'un élève au bac. Avec un type chaîne,
on peut écrire "passable", "Passable", "PASSABLE", "passabl" …
autant de bugs en attente. Comment le langage peut-il nous forcer à
n'utiliser que des valeurs valides ?
1. Le type énuméré
Exemple : les mentions du bac
T.D.N.T
─────────────────────────────────────────────
Type
Mention = (Passable, AssezBien, Bien, TresBien)
─────────────────────────────────────────────
T.D.O
─────────────────────────────────
m : variable Mention
─────────────────────────────────
Début
m ← Bien
Ecrire(m) { affiche : Bien }
Fin
T.D.N.T
─────────────────────────────────────────────
Type
Mention = (Passable, AssezBien, Bien, TresBien)
─────────────────────────────────────────────
T.D.O
─────────────────────────────────
m : variable Mention
─────────────────────────────────
Début
m ← Bien
Ecrire(m) { affiche : Bien }
Fin
PROGRAM ExempleMention;
TYPE
Mention = (Passable, AssezBien, Bien, TresBien);
VAR
m : Mention;
BEGIN
m := Bien;
{ Pascal n'affiche pas directement un énuméré : il faut une
fonction de conversion. On peut tester avec une comparaison. }
IF m > AssezBien THEN
Writeln('Au moins Bien');
END.
Fonctions sur les énumérés
| Algorithme | Pascal | Rôle |
|---|---|---|
ord(v) | Ord(v) | Retourne le rang (0, 1, 2, …) |
succ(v) | Succ(v) | Valeur suivante |
pred(v) | Pred(v) | Valeur précédente |
succ(Passable) vaut AssezBien. pred(TresBien) vaut Bien. Attention :
succ(TresBien) provoque une erreur — il n'y a pas de suivant.
2. Le type intervalle
Exemple : un mois de l'année
T.D.N.T
─────────────────────────────────────
Type
Mois = 1..12
Lettre = 'A'..'Z'
─────────────────────────────────────
T.D.O
─────────────────────────────────
m : variable Mois
c : variable Lettre
─────────────────────────────────
Début
m ← 12 { OK }
m ← 13 { Erreur : hors intervalle }
c ← 'B' { OK }
c ← 'a' { Erreur : pas dans A..Z }
Fin
T.D.N.T
─────────────────────────────────────
Type
Mois = 1..12
Lettre = 'A'..'Z'
─────────────────────────────────────
T.D.O
─────────────────────────────────
m : variable Mois
c : variable Lettre
─────────────────────────────────
Début
m ← 12 { OK }
m ← 13 { Erreur : hors intervalle }
c ← 'B' { OK }
c ← 'a' { Erreur : pas dans A..Z }
Fin
PROGRAM ExempleIntervalle;
TYPE
Mois = 1..12;
Lettre = 'A'..'Z';
VAR
m : Mois;
c : Lettre;
BEGIN
m := 12;
c := 'B';
{ m := 13; ← provoque une erreur d'exécution }
END.
3. Pourquoi les types utilisateurs ?
| Sans type utilisateur | Avec type utilisateur |
|---|---|
mention : chaîne | mention : Mention |
| Fautes possibles | Compilation refusée |
| Comparaisons textuelles | Comparaisons d'ordre |
| Documentation absente | T.D.N.T = doc auto |
C'est l'un des outils les plus puissants de Pascal pour prévenir les bugs dès la compilation.
4. Exercices
Déclarer en T.D.N.T un type Couleur qui ne peut prendre que les valeurs
Rouge, Vert, Bleu. Déclarer une variable c de ce type, l'affecter
à Vert, puis afficher son rang (ord(c)).
Voir le corrigé
TYPE
Couleur = (Rouge, Vert, Bleu);
VAR
c : Couleur;
BEGIN
c := Vert;
Writeln('Rang de Vert : ', Ord(c)); { affiche 1 }
END.
Déclarer un type intervalle Note qui n'accepte que les entiers entre 0
et 20. Écrire un programme Pascal qui demande une note et :
- affiche
"Recalé"si elle est strictement inférieure à 10, - affiche
"Reçu"sinon.
Ne pas utiliser de constantes pour les bornes (elles sont dans le type).
Voir le corrigé
PROGRAM Bareme;
TYPE
Note = 0..20;
VAR
n : Note;
BEGIN
Write('Note : ');
Readln(n);
IF n < 10 THEN
Writeln('Recalé')
ELSE
Writeln('Reçu');
END.
Si l'élève entre 25, l'exécution échoue avec Range check error —
c'est exactement ce qu'on veut : l'erreur est attrapée tout de suite.
Déclarer un type Jour = (Lun, Mar, Mer, Jeu, Ven, Sam, Dim). Écrire
une fonction EstWeekend(j : Jour) : booléen qui renvoie Vrai si j
est Sam ou Dim. Écrire un programme qui teste la fonction pour les
7 jours et affiche "WE" ou "semaine".
Voir le corrigé
PROGRAM TestWeekend;
TYPE
Jour = (Lun, Mar, Mer, Jeu, Ven, Sam, Dim);
VAR
j : Jour;
FUNCTION EstWeekend(j : Jour) : boolean;
BEGIN
EstWeekend := (j = Sam) OR (j = Dim);
END;
BEGIN
FOR j := Lun TO Dim DO
BEGIN
Write('Jour ', Ord(j), ' : ');
IF EstWeekend(j) THEN
Writeln('WE')
ELSE
Writeln('semaine');
END;
END.
5. Erreurs fréquentes au bac
- Mélanger T.D.N.T et T.D.O : les types vont en T.D.N.T, les variables en T.D.O.
- Oublier qu'on ne peut pas faire
Writeln(m)directement sur un énuméré. - Comparer un type intervalle à une valeur hors plage → erreur d'exécution.
6. Quiz
Quiz (5 questions)
Quelle est la valeur de `Ord(Bien)` dans le type `(Passable, AssezBien, Bien, TresBien)` ?
Une variable de type `1..12` peut prendre la valeur :
Dans quel tableau déclare-t-on un type énuméré ?
Que retourne `Succ(Mardi)` si `Jour = (Lundi, Mardi, Mercredi, ...)` ?
Quel est l'avantage principal d'un type énuméré sur une chaîne ?