Université des Sciences et Technologies de Lille
Licence Miage - Programmation 1
Cours 2 : les types discrets
Les entiers, les caractères et les booléens ont en commun d'être
ordonnés de telle sorte que chaque élément a un
successeur et un prédécesseur.
-2 < -1 < 0 < 1 < 2
'a' < 'b' < 'c' < 'd'
On les appelle des types
discrets.
1 Les attributs
Les types discrets sont munis d'attributs, qui sont des
fonctions exprimant les propriétés courantes du type. La syntaxe
est T'nom_attribut, où T est un type discret.
- T'FIRST
-
Borne inférieure du type T.
- T'LAST
-
Borne supérieure du type T.
Integer'FIRST = -2147483648
Integer'LAST = 2147483647
- T'POS(X)
-
X est une valeur de type T et T'POS(X)
renvoie la position de X dans le type T.
Integer'POS(2) = 2
Integer'POS(Integer'FIRST) = -2147483648
Character'POS(Character'FIRST) = 0
Character'POS(Character'LAST) = 255
- T'VAL(N)
-
N est de type entier et T'VAL(N) est
l'élément de position N dans le type T.
T'VAL(T'POS(X)) = X
T'POS(T'VAL(N)) = N
- T'SUCC(X)
-
X est de type T et T'SUCC(X) est le successeur de
X dans T, c'est-à-dire T'SUCC(X)=
T'VAL(T'POS(X)+1).
Si X est le dernier élément de T, l'appel
provoque l'activation de l'exception CONSTRAINT_ERROR à la
compilation si l'argument est statique et à l'exécution sinon.
- T'PREC(X)
-
X est de type T et T'PREC(X) est le
prédecesseur de X dans T, c'est-à-dire T'SUCC(X)= T'VAL(T'POS(X)-1). Si X est le premier élément de T, l'appel
provoque l'activation de l'exception CONSTRAINT_ERROR.
- T'IMAGE(X)
-
X est de type T et T'IMAGE(X) est une chaîne de
caractères qui contient l'image de X.
BOOLEAN'IMAGE(FALSE) = "FALSE"
INTEGER'IMAGE(456) = " 456"
INTEGER'IMAGE(-67) = "-67"
- T'WIDTH
-
Le nombre maximal de caractères pour une image d'une valeur de T.
Integer'WIDTH = 11
Character'WIDTH = 12
WIDTH est également un champs facultatif de la procédure
Put pour l'affichage d'entiers. Par défaut, ce champs vaut
Integer'WIDTH. On peut le modifier avec
la syntaxe suivante.
Put(N, WIDTH => 2); -- affichage sur 2 colonnes
- T'VALUE(CH)
-
CH est une chaîne de caractères qui est l'image d'un
élément de type T et T'VALUE(CH) est cet
élément. Dans le cas où CH n'est pas correct, l'exception
CONSTRAINT_ERROR est activée à l'exécution.
T'VALUE (T'IMAGE (X)) = X
BOOLEAN'VALUE ("tRuE") = TRUE
INTEGER'VALUE("-4366") = -4366
INTEGER'VALUE("-4366+1") -- CONSTRAINT_ERROR
2 Les types énumérés
Il est possible de définir un type énuméré, qui est un type discret
fini (comme le type booléen).
type Couleur is (jaune, vert, bleu, rose);
L'ordre d'énumération des éléments n'est pas indifférent:
il définit l'ordre sous-jacent associé à tout type discret.
jaune < vert < bleu < rose
Les types énumérés
bénéficient également des attributs présentés au-dessus.
Couleur'Pos(vert) = 1
Couleur'Val(2) = BLEU
Couleur'Succ(bleu) = ROSE
Couleur'Image(bleu) = "BLEU"
Couleur'Succ(rose) -- erreur a la compilation :
-- Succ of type'Last
-- static expression raises "Constraint_Error"
NB: les majuscules et les minuscules sont interchangeables dans
le nom des éléments du type énuméré. Lors du calcul de
l'image, toutes les lettres sont en majuscules.
3 Les sous-types
Un sous-type est défini comme la restriction d'un type parent discret.
subtype nom_sous_type is nom_type range val1
.. val2;
où val1 et val2 sont deux éléments de type
nom_type tels que val1 < val2. . Par exemple,
subtype Chiffre is Integer range 0..9;
subtype Alphabet is Character range 'a'..'z';
Il existe dans le paquetage STANDARD deux sous-types
prédéfinis de type parent INTEGER.
subtype NATURAL is INTEGER range 0 .. INTEGER'LAST ;
subtype POSITIVE is INTEGER range 1 .. INTEGER'LAST ;
Les sous-types peuvent être utilisés comme des ensembles pour la
construction d'un booléen, l'intervalle d'une boucle ou dans un Case.
If i in Chiffre then ... End if;
For i in Chiffre loop ... End loop;
Case c is
when minuscule => ... ;
when majuscule => ... ;
when others => ... ;
end case;
Un sous-type est compatible avec le type à partir duquel il a été
défini : on peut lui appliquer les fonctions prévues pour son type
parent, à condition de veiller à ce que le résultat reste dans
l'intervalle, tout de même.
j : Integer := 3;
i : Chiffre;
i:=j;
i:=i+4; -- ok
i:= i*2; -- constraint_error
Comment les sous-types se comportent-ils vis-à-vis des attributs de
type ?
Certains attributs sont sensibles à la définition du
sous-type. C'est le cas de FIRST et LAST qui renvoient la borne
inférieure et la borne supérieure du sous-type.
Alphabet'First='a'
Alphabet'Last='z'
C'est également le cas de WIDTH.
Integer'WIDTH = 11
Chiffre'WIDTH = 2
Put(I, WIDTH => Chiffre'WIDTH);
Mais les autres
attributs se comportent comme s'ils étaient appliqués au type de
base.
Character'Pos('b') = 98;
Alphabet'Pos('b') = 98;
Alphabet'Succ('z') = '{';
Character'Val(34) = '"';
Alphabet'Val(34) = '"';
Hélène Touzet - octobre 2000
This document was translated from LATEX by
HEVEA.