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;

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.