Toute donnée manipulée par un programme PASCAL est typée. Le but de ce chapitre est de décrire les types disponibles, á savoir :
Pour chacun de ces types, on trouvera dans ce qui suit :
Les valeurs de tout type simple sont appelées des scalaires. Par exemple, les entiers, les réels et les booléens sont des scalaires. Par contre, chaque valeur d'un type structuré est ellemême une collection de valeurs (par exemple un vecteur ou une matrice).
-2147483648 et 2147483647(cfr Ch 3.2).
résultat entier : * multiplication div division entière mod reste de la division entière (le signe du résultat est le signe du 2e opérande) + addition - soustraction résultat booléen : tous les opérateurs relationnels = < > <= >= <> résultat réel : / division
pred : x pred(x) = x - 1 succ : x succ(x) = x + 1 ord : x ord(x) = x abs : x abs(x) = |2| , la valeur absolue de x sqr : x sqr(x) = x odd : x odd(x) vaut vrai, si x est impair, et faux sinon.Si x est de type entier positif,
sqrt : x ->sqrt(x) = Vx, la racine carrée de x. sqrt(x) est de type réel.
'a' : le caractère a minuscule '5' : le caractère cinq '''' : le caractère apostrophe
'0' < '1' < '2' .... < '9' 'A' < 'B' < 'C' .... < 'Z' 'a' < 'b' < 'c' .... < 'z'En ASCII, on a, de plus, '9' < 'A' et 'Z' < 'a'.
= < > <= >= <>
pred : x pred(x) = le caractère précédant x dans le code succ : x succ(x) = le caractère suivant x dans le code ord : x ord(x) = la position du caractère x dans le code (résultat entier non négatif) chr : n chr(n) = le caractère dont la position dans le code est n.
and : et logique or : ou logique not : négationLes opérateurs relationnels = , < , > , <= , >= et <> peuvent être appliqués aux opérandes booléens; les booléens sont définis de telle manière que faux < vrai; de plus, <> peut être interprété comme l'opérateur ou exclusif et <= comme l'opérateur d'implication logique (A <= B signifie A B). Le résultat de toute opération sur des booléens est un booléen.
ord : x ord(x) est défini et a une valeur telle que ord(x) < ord (y) si x a la valeur faux et y a la valeur vrai; pred : x pred(x) n'est défini que si x est vrai et vaut alors faux; succ : x succ(x) n'est défini que si x est faux et vaut alors vrai.
+13e-5 -141.4e31 +1.3 0.17E-5 -3.5 -1.0 1.5Mais
.257 368.sont illégaux.
résultat réel : les opérateurs arithmétiques + - * / résultat booléen : tous les opérateurs relationnels = < > <= >= <>
abs : x abs(x) = |2| , la valeur absolue de x sqr : x sqr(x) = x sqrt : x sqrt(x) = x, la racine carrée positive de x, avec x>=0 sin : x sin(x), le sinus de x radians cos : x cos(x), le cosinus de x radians arctan : x arctan(x), l'arc tangente, en radians, de x ln : x ln(x), avecx > 0 exp : x exp(x) = e trunc : x trunc(x) = la partie entière de x ( x si x>0, et x si x > 0) round : x round(x) = l'entier le plus proche de x ( trunc(x - 0.5) si x 0, trunc(x + 0.5) si x > 0 ).
Un littéral du type ainsi défini est alors l'un des identificateurs qui apparaissent dans la définition. Ces identificateurs ne peuvent pas avoir été déclarés auparavant (dans une déclaration de constante) et ne peuvent plus être utilisés pour désigner des littéraux d'un autre type énuméré.
Attention ! En PASCAL, on n'utilise pas les accolades pour définir l'ensemble des valeurs.
Exemples(lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche) (blanc, jaune, orange, rouge, vert, bleu, indigo) Des exemples de littéraux sont les suivants : mardi jaune bleu samedi
Dans les exemples cidessus, on a donc : lundi < mardi < mercredi < jeudi < vendredi < samedi < dimanche blanc < jaune < orange < rouge < vert < bleu < indigo
= < > <= >= <>
pred : x pred(x) = la valeur précédant x dans la liste d'énumération de la définition; la fonction n'est pas définie pour le premier élément de la liste; succ : x succ(x) = la valeur suivant x dans l'ordre d'énumération; la fonction n'est pas définie pour le dernier élément de la liste; ord : x ord(x) = la position de x dans la liste des valeurs énumérées dans la définition; la première position est l'entier 0.Exemples
succ(blanc) a pour valeur jaune pred(samedi) a pour valeur vendredi ord(mardi) a pour valeur 1, ord(blanc) a pour valeur 0, ord(indigo) a pour valeur 6.
integer, Boolean, char ou type énuméré.Lorsqu'on définit un type intervalle, le type des éléments de l'intervalle est appelé le type de base.
Un littéral de type intervalle est un des littéraux du type de base dont la valeur est comprise entre la valeur minimale et la valeur maximale de la définition (bornes comprises).
Avec les exemples précédents, on peut définir les types intervalles suivants : mardi..vendredi jaune..bleu blanc..indigo On peut aussi définir les types suivants : 1..10 'a'..'z'
La section précédente montre qu'un type simple se définit entre
autres par un ensemble de valeurs et que chaque valeur de type
simple est un scalaire.
La valeur d'un type structuré, par contre, n'est pas un scalaire
: chaque valeur est ellemême une collection de valeurs.
L'objet de cette section est de présenter les différents types
structurés.
Exemples
array[1..10] of integer;
array[-2..5] of char;
array[Boolean] of real;
array['a'..'z'] of integer;
array[1..10,Boolean] of real;
array[index] of Boolean; { où index est un type
intervalle défini préalablement }
packed array [1..N] of char(avec N une constante 1) définit un tableau de N caractères encore appelé une chaîne de N caractères ou string.
'abcd' 'ceci est une chaine de caracteres de longueur superieure a 34' ' ' (chaîne vide) 'Braine l''Alleud' (on redouble l'apostrophe pour l'inclure dans une chaîne de caractères)
'abcd' < 'abce' < 'acde' < 'bcde'
Remarque
Un tableau multidimensionnel á k indices peut être vu comme un
tableau de tableaux de k-1 indices. Par exemple, une matrice M×N
peut être vue comme un vecteur de M valeurs, chaque valeur étant
ellemême un vecteur de N éléments.
Comme le type des valeurs d'un tableau en PASCAL peut être quelconque,
on peut définir les tableaux multidimensionnels comme des
tableaux de tableaux.
Exemples
Les deux tableaux définis cidessus auraient pu l'être comme suit :
Remarque
La déclaration
array [1..1000, 1..1000] of integerdéfinit une matrice d' un million de nombres entiers ! Beaucoup d'ordinateurs imposent des limites quant au nombre total d'objets représentables simultanément en mémoire (sans oublier que les constructions d'un programme prennent également de la place !). Un million de nombres entiers occupent une place qui dépasse l'espace disponible dans un grand nombre d'ordinateurs de petite ou moyenne taille.
Un type record (on dit encore structure ou enregistrement) est un type structuré permettant de définir une collection finie de valeurs pouvant être de types différents. Chaque valeur est appelé un champ de la structure. A chaque champ est associé un nom; ce nom (ou identificateur) permet de désigner la valeur dans les expressions (cfr Ch 7). Il est clair que tous les champs d'une structure doivent avoir des noms différents. Pour définir complètement un type record, il faut spécifier
Exemples
record jour,mois,annee : integer end; record nom,prenom : packed array [1..20] of char; noma : integer; end; record annee : 1900..2000; couleur : (rouge,brun,noir,bleu,blanc); marque : packed array [1..20] of char end;
Cas particulier : les enregistrements á champs variants
On a vu dans le paragraphe précédent que pour définir
complètement un type record, il faut spécifier le nom de chaque
champ et le type de chaque champ.
Il existe des applications où la valeur d'un champ influence la
signification d'autres champs. Par exemple, supposons qu'une
administration communale belge souhaite répertorier ses
habitants; s'il s'agit de Belges, on souhaite connaître leur régime
linguistique; s'il s'agit d'étrangers, on souhaite connaître leur
nationalité.
Un record á champs variants permet de rendre l'existence d'un
champ dépendant de la valeur d'une autre champ de la structure.
record nom : string ; prenom : char ; case etranger : Boolean of true : (nationalite : pays) ; false : (regimelinguistique : langue) end ;Selon la valeur du champ etranger, le record comprendra un champ nationalite ou un champ regimelinguistique.
On notera que la partie variante du record doit être la dernière partie de la définition du record. L'utilisation de ce type de record est expliqué en Ch 8.2.4
Le set correspond partiellement au concept mathémathique d'ensemble, c'estádire une collection d'éléments tous du même type, sans répétition. En PASCAL, le type des éléments contenus dans l'ensemble doit être un type énuméré, un type intervalle, le type Boolean ou le type char; ce type peut être donné explicitement ou par un identificateur de type (cfr Ch 4).
set of 0..9 set of (lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche) set of char
[1,2,5,8] [lundi..mercredi,dimanche] [´0´..´9´,´a´..´z´,´A´..´Z´]
Les opérateurs binaires + : union * : intersection - : différence sur deux opérandes (cfr Ch 7) de même type set fournissent un résultat du même type. Les opérateurs binaires = : égalité <> : inégalité <= : inclusion du premier opérande dans le second opérande >= : inclusion du second opérande dans le premier opérande sur deux opérandes de même type set fournissent un résultat booléen. L'opérateur in : appartenance d'un élément á un ensemble fournit un résultat booléen (vrai si l'élément appartient á l'ensemble).
A tout identificateur de type T (cfr Ch 4) peut être associé un type ``pointeur vers un élément de type T'', dont les valeurs sont soit des ``adresses'' d'éléments de type T, soit une valeur conventionnelle appelée valeurnil, et qui n'est l'adresse d'aucun élément (cfr Ch 9).
^integer ^complexe avec (cfr Ch 4) complexe = record re,im : real end;