Aller au contenu principal

Module 01 · Leçon 2

Types énumérés et types utilisateurs

180 minanalyse · pascal
Affichage du code

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

Fonctions sur les énumérés

AlgorithmePascalRô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

3. Pourquoi les types utilisateurs ?

Sans type utilisateurAvec type utilisateur
mention : chaînemention : Mention
Fautes possiblesCompilation refusée
Comparaisons textuellesComparaisons d'ordre
Documentation absenteT.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

Exercice 1facile
Type Couleur

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.
Exercice 2moyen
Note bornée (type bac courant)

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.

Exercice 3difficile
Jour de la semaine (hors bac, bonus)

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)

1

Quelle est la valeur de `Ord(Bien)` dans le type `(Passable, AssezBien, Bien, TresBien)` ?

2

Une variable de type `1..12` peut prendre la valeur :

3

Dans quel tableau déclare-t-on un type énuméré ?

4

Que retourne `Succ(Mardi)` si `Jour = (Lundi, Mardi, Mercredi, ...)` ?

5

Quel est l'avantage principal d'un type énuméré sur une chaîne ?

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