• Aucun résultat trouvé

Comment représenter les jours de la semaine par exemple? Jusqu’à présent, la seule façon de faire était de déclarer sept constantes de la manière suivante:

Lundi : constant := 0; Mardi : constant := 1; Mercredi : constant := 2;

etc.

Ceci peut conduire à des erreurs ou être fastidieux à déclarer. Un type énumératif va avantageusement résoudre ce genre de problèmes.

5.2.2 Généralités

Les types énumératifs (enumeration types) permettent de déclarer des valeurs en les énumérant sous la forme d’une suite de noms. Il est ainsi possible d’écrire:

type T_Jours_De_La_Semaine is ( Lundi, Mardi, Mercredi, Jeudi,

Vendredi, Samedi, Dimanche );

Cette déclaration permet l’utilisation du type T_Jours_De_La_Semaine formé des valeurs Lundi, Mardi... Dimanche. L’exemple 5.3 présente deux autres types énumératifs.

Exemple 5.3 Deux exemples traditionnels de types énumératifs.

type T_Couleurs_Arc_En_Ciel is ( Rouge, Orange, Jaune, Vert, Bleu, Indigo, Violet );

type T_Mois_De_L_Annee is ( Janvier, Fevrier, Mars, Avril, Mai, Juin, Juillet, Aout, Septembre, Octobre, Novembre, Decembre );

Les constantes d’un type énumératif sont par définition les identificateurs énumérés entre les parenthèses.

Les opérations possibles (en plus de l’affectation et du passage en paramètre) sur les valeurs d’un type énumératif sont les comparaisons =/=<=< >=>. En effet les valeurs d’un type énumératif sont ordonnées, codées selon leur ordre de déclaration. A chaque valeur énumérée correspond un numéro d’ordre (nombre entier). La première valeur porte le numéro 0, la seconde le numéro 1, etc. Dans l’exemple du type T_Jours_De_La_Semaine, Lundi porte le numéro 0, Mardi porte le numéro 1, etc. Donc:

Lundi < Mardi < Mercredi < Jeudi < Vendredi < Samedi < Dimanche

TYPES ÉNUMÉRATIFS 120

applicables aux valeurs du type énumératif considéré. Finalement, les types énumératifs font partie des types discrets (discrete types, [ARM 3.2]).

5.2.3 Affectation

L’affectation se fait de manière habituelle, comme dans l’exemple 5.4. Exemple 5.4 Affectation de valeurs d’un type énumératif.

-- ...

procedure Exemple_5_4 is

type T_Jours_De_La_Semaine is ( Lundi, Mardi, Mercredi, Jeudi,

Vendredi, Samedi, Dimanche ); Demain : T_Jours_De_La_Semaine; -- Trois variables de ce type Hier : T_Jours_De_La_Semaine;

Jour : T_Jours_De_La_Semaine := Lundi;

begin -- Exemple_5_4

Demain := Jour; -- Affecte la valeur Lundi a Demain

Jour := Jeudi; -- Affecte la valeur Jeudi a Jour

Demain := T_Jours_De_La_Semaine'Succ ( Jour );-- § 5.2.4 Hier := T_Jours_De_La_Semaine'Pred ( Jour );-- § 5.2.4 ...

5.2.4 Attributs First, Last, Succ, Pred, Pos et Val

Les attributs First, Last, Succ et Pred sont applicables aux valeurs d’un type énumératif, ce qui permet maintenant de préciser que ces attributs sont en fait applicables aux valeurs de n’importe quel type discret (discrete type, [ARM 3.2]). Comme pour les caractères, les attributs Pos et Val permettent de travailler avec les numéros d’ordre des valeurs énumérées. Mais les cas sont rares où une telle manipulation est indispensable! Quelques cas d’utilisation de ces attributs sont présentés dans l’exemple 5.5.

Exemple 5.5 Utilisation des attributs First, Last, Succ, Pred, Pos et Val.

T_Jours_De_La_Semaine'First donne la première valeur, à savoir Lundi;

T_Jours_De_La_Semaine'Lastdonne Dimanche;

T_Jours_De_La_Semaine'Pred (Mardi)donne Lundi;

T_Jours_De_La_Semaine'Succ (Mardi)donne Mercredi;

T_Jours_De_La_Semaine'Pos (Lundi)donne 0, le numéro d’ordre de la

valeur Lundi;

T_Jours_De_La_Semaine'Val (6)donne Dimanche;

TYPES ÉNUMÉRATIFS 121

T_Jours_De_La_Semaine'Val (Nombre)provoque une erreur à l’exécution si Nombre > 6.

5.2.5 Entrées-sorties

Comme pour tous les types simples, Ada offre la possibilité d’effectuer des entrées-sorties sur des valeurs énumérées. Sans en décrire ni expliquer le méca- nisme utilisé (sect. 17.4), ces entrées-sorties sont disponibles, utilisables comme pour les booléens (§ 3.4.5) après avoir effectué la déclaration suivante:

package ES_Jours is new

Ada.Text_IO.Enumeration_IO ( T_Jours_De_La_Semaine );

Exemple 5.6 Entrées-sorties de valeurs énumérées.

with Ada.Text_IO; use Ada.Text_IO; -- ...

procedure Exemple_5_6 is

type T_Jours_De_La_Semaine is ( Lundi, Mardi, Mercredi, Jeudi,

Vendredi, Samedi, Dimanche );

Jour : T_Jours_De_La_Semaine; -- Une variable de ce type

package ES_Jours is new Enumeration_IO(T_Jours_De_La_Semaine);

use ES_Jours; -- § 2.6.9

begin -- Exemple_5_6

Put_Line (" Cet exemple..." );

Get (Jour); -- Lit un jour de la semaine

Put (Jour); -- Affiche en majuscules la valeur

lue

Put (Mardi); -- Affiche MARDI

Put (T_Jours_De_La_Semaine'Val(6)); -- Affiche DIMANCHE

...

Comme suggéré dans l’exemple 5.6, les valeurs énumérées sont affichées en majuscules sur le nombre minimum de positions. Il est cependant possible de modifier ces aspects d’affichage [ARM A.10.10], à savoir le nombre de positions et la casse.

5.2.6 Types énumératifs, types Boolean et Character Le type Boolean est en fait un type énumératif prédéfini: type Boolean is (False, True);

TYPES ÉNUMÉRATIFS 122

mais permet simplement de préciser que tout ce qui s’applique aux types énumératifs est également valable pour le type Boolean.

Le type prédéfini Character fait aussi partie des types énumératifs car il est possible de déclarer des caractères entre apostrophes comme valeurs énumérées. Cette dernière notion n’est cependant pas présentée dans cet ouvrage car, exception faite du type Character (et parfois Wide_Character, sect. 19.3), elle est peu utilisée dans la pratique.

5.2.7 Types énumératifs et instruction for

Un type énumératif peut être utilisé pour donner l’intervalle de variation d’une boucle for (§ 3.5.2). En utilisant le type T_Jours_De_La_Semaine ces trois formes

sont équivalentes:

for Jour in Lundi..Dimanche loop ... end loop;

for Jour in T_Jours_De_La_Semaine'First..Dimanche loop • ...

end loop;

for Jour in T_Jours_De_La_Semaine loop ... end loop;

Cette dernière forme utilise le nom du type comme intervalle, ce qui signifie que l’intervalle comporte toutes les valeurs, de la première à la dernière. Cette forme d’intervalle (§ 6.1.1) permet d’assurer, même en cas de modification du type T_Jours_De_La_Semaine, que l’intention du programmeur est respectée ipso facto, c’est-à-dire que la variable de boucle prendra toujours toutes les valeurs du type énumératif.

INSTRUCTION CASE 123

5.3 INSTRUCTION CASE