Section courante

A propos

Section administrative du site

Données et types de données

Les données sont le nom donné aux informations que votre programme utilise pour résoudre une tâche particulière. Par exemple, un programme conçu pour afficher une simple liste de diffusion peut traiter des éléments de données tels que des noms et des codes postaux. Un coup d'oeil à la sortie du programme devrait suffire pour vous dire que la liste est affichée sous forme d'étiquettes d'adresse.

Malheureusement, alors que vous pouvez reconnaître l'utilisation prévue des noms et des codes postaux à partir de leur contexte, l'ordinateur ne voit qu'une longue série de uns et de zéros. Par lui-même, l'ordinateur ne peut pas déterminer combien de bits doivent être combinés dans un seul champ. Il est également incapable de déterminer comment le champ doit être interprété et utilisé. Par exemple, il faut dire à l'ordinateur si le champ est un nombre ou un caractère : vous ne voudriez pas que le programme de liste de diffusion prenne la racine carrée d'un nom de famille ou qu'il mette en majuscule un code postal. Le type d'un élément de données détermine comment les données peuvent être utilisées.

Types de données numériques

Les nombres sont un territoire familier pour la plupart des gens. Nous pouvons généralement reconnaître un nombre - toute combinaison valide de chiffres, de signes plus et moins et de points décimaux - lorsque nous en voyons un. Dans notre expérience quotidienne, cependant, nous faisons des distinctions subtiles entre différents nombres en fonction de la façon dont ils sont le plus souvent appliqués. L'une des différences les plus fondamentales se situe entre les nombres entiers et les nombres contenant des décimales.

Le QuickPascal reflète ces catégories en offrant deux types de données numériques, les types de données entiers représentent des nombres entiers et peuvent être positifs, négatifs ou zéro. Les types de données Real (réels) sont utilisés pour tous les nombres contenant une virgule décimale. Une valeur entière est exacte alors qu'une valeur réelle est approximative. (En fait, un nombre réel peut être exact, bien que le type de données Real puisse ne pas le représenter exactement.) Des nombres tels que 1776, 29028 et -1 sont des nombres entiers ; 3,14159, 98,6 et -459,7, sont des réels. Vous pouvez effectuer des opérations mathématiques avec les deux catégories de nombres.

Entiers

Le mot entier fait référence à la fois à une catégorie de types de données et à un type de données spécifique. Le microprocesseur de la famille 8086 gère les informations via ses registres 16 bits et son bus de données (32 bits pour le 80386). Cela signifie que chaque fois qu'un élément de données est lu (ou écrit dans) la mémoire, il est déplacé par morceaux de 16 bits. Par conséquent, si un nombre peut être représenté sur 16 bits ou moins, il peut être accédé et manipulé plus rapidement par le microprocesseur.

Le QuickPascal offre une variété de types de données entiers entreposant des informations dans des formats 8, 16 et 32 bits (chaque bit correspond à un chiffre dans un nombre binaire). Il existe cinq types d'entiers : Byte, ShortInt, Integer, Word et LongInt. Comme le montre le tableau suivant, chaque type peut accueillir un intervalle unique de valeurs dans 1, 2 ou 4 octets d'entreposage :

Type Taille Intervalle de valeurs autorisées
Byte 1 octet 0 à +255
ShortInt 1 octet -128 à +127
Integer 2 octets -32 768 à +32 767
Word 2 octets 0 à +65 535
LongInt 4 octets -2 147 483 648 à +2 147 483 647

Le type de données le plus approprié à utiliser pour votre application dépend de l'intervalle de valeurs possible dans une variable particulière. En général, sélectionnez le type de données ayant utilisé la plus petite quantité d'entreposage pour une intervalle de valeurs donnée.

En raison de sa plus grande taille, LongInt peut sembler être le type entier idéal pour toutes les situations. Cependant, travailler avec son format à 4 octets nécessite un temps de traitement plus long sur une machine typique de 8 ou 16 bits. Vous ne devez donc utiliser LongInt que lorsqu'aucun des autres types d'entiers ne convient.

Écriture de valeurs entières

La façon la plus courante d'écrire un nombre entier est une série de chiffres éventuellement précédés d'un signe plus ou moins. Utilise un signe moins si le nombre est négatif ; sinon, le QuickKPascal suppose que le nombre est positif. N'incluez pas de virgules et d'espaces avec le nombre.

Vous pouvez également écrire des nombres entiers au format hexadécimal en utilisant le signe dollar en tête. Par exemple, $10 hexadécimaux est équivalent à 16 décimales, mais 10 est simplement 10 décimal. Les lettres A, B, C, D, E et F (ou a, b, c, d, e et f) correspondent respectivement aux nombres décimaux 10, 11, 12, 13, 14 et 15.

Dans QuickPascal, les hexadécimaux sont toujours supposés représenter des entiers positifs plutôt que les modèles de bits sous-jacents. Par exemple, la valeur $FF (égale à la décimale 255) peut être affectée à une variable déclarée comme un Byte, mais ne peut pas être affectée à un ShortInt. Les hexadécimaux sont absolument équivalents à leurs homologues décimaux et peuvent être utilisés partout où les valeurs décimales sont autorisées.

Affichage des nombres entiers

Bien que d'habitude on utilise qu'un seul paramètre dans une instruction Write ou WriteLn, il est possible d'en mettre plusieurs. Ainsi, cela fonctionne bien lorsque vous voulez plusieurs nombres les uns à côté des autres. Le programme suivant affiche 6 entiers :

  1. Program OutInt;
  2.  
  3. BEGIN
  4.  WriteLn(2,4,6,8,10,12);
  5. END.

Le programme du programme OUTINT produit le groupe de chiffres suivant :

24681012

Évidemment, un peu de formatage serait bénéfique dans cette situation. Heureusement, Write et WriteLn permettent de spécifier le formatage en ajoutant : W (largeur) à la fin de chaque paramètre, où W représente le minimum autorisé pour afficher la donnée. Nous pouvons alors réécrire l'exemple en tant que programme OUTINT2 (en utilisant 3 comme valeur pour :W) :

  1. Program OutInt2;
  2.  
  3. BEGIN
  4.  WriteLn(2:3,4:3,6:3,8:3,10:3,12:3);
  5. END.

La sortie formatée de OUTINT2 est la suivante :

2  4  6  8 10 12

Les procédures Write et WriteLn ne tronqueront jamais un paramètre numérique. Si un paramètre nécessite plus d'espace que spécifié par la valeur de W, W est remplacé et l'ensemble des paramètres est affiché dans le format par défaut.

Le signe utilisé avec :W est également significatif. Lorsque :W est positif, le champ est justifié à droite ; lorsqu'il est négatif, le champ est cadré à gauche, comme le montre le programme suivant :

  1. Program NForme;
  2.  
  3. Const
  4.  A:Integer=100;      { Initialise A avec la valeur 100 }
  5. BEGIN
  6.  WriteLn('1234567890'); { Ligne de référence }
  7.  WriteLn(A:+10);        { Justifié à droite }
  8.  WriteLn('1234567890'); { Ligne de référence }
  9.  WriteLn(A:-10);        { Justifié à gauche }
  10. END.

Lorsque NForme s'exécute, il produit la sortie suivante :

1234567890
       100
1234567890
100

Utilisation d'entiers signés et non signés

Les types de données ShortInt et Integer sont appelés les formes signées de Byte et Word, respectivement, car chacun utilise son bit de poids fort pour indiquer le signe du nombre. Le bit est mis à 1 pour les nombres négatifs et à 0 pour les nombres positifs.

Étant donné que le bit de poids fort n'est pas considéré comme faisant partie du nombre lui-même, les nombres signés ont une plage positive plus petite que leurs homologues non signés. Plus précisément, les modèles de bits correspondant à 128 à 255 dans un nombre signé 8 bits et à 32 768 à 65 535 dans un nombre signé 16 bits sont interprétés par le compilateur comme des valeurs négatives. Par conséquent, le modèle binaire correspondant à +156 pour une variable déclarée comme un Byte est interprété comme -100 si la variable est un ShortInt, comme indiqué ici :

  1. Program ShowNeg;
  2. Var
  3.  A:Byte;
  4.  B:ShortInt;
  5.  
  6. BEGIN
  7.  A:=+156;
  8.  B:=A;
  9.  WriteLn('Version Byte : ',A);
  10.  WriteLn('Version ShortInt : ',B);
  11. END.

Dans le programme ShowNeg, Byte et ShortInt reçoivent la valeur +156. Chaque variable entrepose le modèle binaire identique (10011100) mais interprète différemment la signification de la valeur. Voici le résultat du programme :

Version Byte : 156
Version ShorInt : -100

En d'autres termes, vous devez éviter de mélanger des valeurs signées et non signées dans la même expression.

Détermination des valeurs entières maximales

Bien qu'un octet soit toujours défini comme ayant une longueur de 8 bits, un mot correspond en fait à la taille des registres de l'ordinateur. Par conséquent, tous les ordinateurs n'ont pas la même longueur de mot. Sur tous les compatibles IBM PC, cependant, un mot est considéré comme étant de 16 bits.

À l'origine, un type de données Integer était simplement le plus grand ensemble de nombres entiers pouvant tenir dans le mot de l'ordinateur hôte. Dans QuickPascal, par exemple, un entier Integer est défini comme ayant une longueur de 16 bits. La valeur maximale d'un entier Integer de QuickPascal est donc de +32 767. D'autres ordinateurs - et d'autres compilateurs - peuvent avoir des intervalles assez différentes.

Sur la plupart des compilateurs Pascal, y compris le QuickPascal, vous pouvez connaître la plus grande valeur Integer prise en charge en examinant la constante prédéfinie MaxLongInt, contenant la plus grande valeur LongInt.

Le programme BigInt suivant montre comment ces valeurs peuvent être lues :

  1. Program BigInt;
  2.  
  3. BEGIN
  4.  WriteLn('MaxInt = ',MaxInt);
  5.  WriteLn('MaxLongInt = ',MaxLongInt);
  6. END.

Lorsque BigInt s'exécute, il produit la sortie suivante :

MaxInt = 32767
MaxLongInt = 2147483647

Nombres réels

Tous les nombres ne peuvent pas être représentés de manière adéquate avec des types de données entiers. Bien qu'un LongInt puisse confortablement contenir un nombre supérieur à deux milliards, il n'a toujours pas l'intervalle pour contenir la valeur actuelle de la dette nationale. De même, aucun nombre entier n'a la précision à deux décimales pour représenter avec précision la valeur nette (en dollars et en cents) de la tirelire d'un enfant.

Heureusement, les types de données réels de QuickPascal sont spécifiquement conçus pour gérer des nombres très grands, très petits ou très précis. Étant donné qu'un nombre réel est un nombre contenant une virgule décimale, des valeurs telles que 2.0, π et la racine carrée de 2 sont toutes des nombres réels, parfois appelés nombres à virgule flottante.

Les types de données réels pris en charge par QuickPascal sont résumés dans le tableau suivant. Chaque type de données offre une combinaison unique de taille d'entreposage, d'intervalle et de nombre de chiffres significatifs :

Type Taille d'entreposage Intervalles de valeurs autorisés Chiffre significatif avec {$N-} Chiffre significatif avec {$N+}
Real 6 octets 2,9x10-39 à 1,7x1038 11 ou 12 11 ou 12
Single 4 octets 1,5x10-45 à 3,4x1038 7 ou 8 7 ou 8
Double 8 octets 5,0x10-324 à 1,7x10308 15 ou 16 15 ou 16
Extended 10 octets 3,4x10-4951 à 1,1x104932 15 ou 16 19 ou 20
Comp 8 octets 9,2x1018 à 9,2x1018 15 ou 16 19 ou 20

Notez que la précision de chaque nombre réel dépend de l'activation ou non de la directive du compilateur $N.

Écrire des valeurs réels

Étant donné que les types de données réels sont conçus pour accueillir des nombres avec des valeurs fractionnaires, un nombre réel est généralement écrit avec un point décimal, devant apparaître entre deux chiffres. Par conséquent, les valeurs 54,40, 90,44 et 0,25 sont des nombres réels, mais 0, 4, 63 et 999 ne le sont pas.

Un nombre réel peut inclure un exposant positif ou négatif pour indiquer où le point décimal doit être déplacé. Ce format est similaire à la notation scientifique, sauf que la lettre "E" (ou "e") est utilisée à la place du symbole x10 (x 10 à la puissance de). Par conséquent, le nombre 7.6x104 peut être écrit 7.6E4, 7.6e4, 76.0E3 ou 0.76e5. De même, le nombre 3.4x10-4 peut être écrit sous la forme 3.4E-4, 3.4e-4, 34.0E-5 ou 0.34e-3.

Affichage des nombres réels

Par défaut, le QuickPascal affiche les nombres réels en notation scientifique, comme illustré dans le programme suivant :

  1. Program RawStyle;
  2. Const
  3.  R_Type:Real=12345; { Assigne la valeur 12345.0 }
  4.  S_Type:Single=-43e5;
  5.  D_Type:Double=-43e-5;
  6.  E_Type:Extended=0.000000000000001;
  7.  C_Type:Comp=765.0;
  8.  
  9. BEGIN
  10.  WriteLn(R_Type);
  11.  WriteLn(S_Type);
  12.  WriteLn(D_Type);
  13.  WriteLn(E_Type);
  14.  WriteLn(C_Type);
  15. END.

Le programme RawStyle produit la sortie suivante :

 1.23450000000000E+0004
-4.30000000000000E+0006
-4.30000000000000E-0004
 1.00000000000000E-0015
 7.65000000000000E+0002

Heureusement, les procédures Write et WriteLn vous permettent de générer un affichage plus agréable en ajoutant le code de formatage :W:D à n'importe quelle valeur réelle. Comme précédemment, le champ W spécifie la largeur de sortie minimale souhaitée, y compris les décimales ; D spécifie le nombre réel de décimales que vous souhaitez afficher. W peut être positif ou négatif pour indiquer une justification à droite ou à gauche, respectivement.

Comme pour les éléments de données entiers, les procédures Write et WriteLn ne tronquent jamais une valeur réelle. Si le nombre à afficher est plus large que la largeur spécifiée, la valeur de W sera remplacée. Cependant, le nombre spécifié de décimales apparaîtra toujours, bien que la valeur puisse être arrondie au cours du processus. Le programme NewStyle démontre ces fonctionnalités :

  1. Program NewStyle;
  2. Const
  3.  R_Type:Real=12345; { Assigne la valeur 12345.0 }
  4.  S_Type:Single=-43e5;
  5.  D_Type:Double=-43e-5;
  6.  E_Type:Extended=0.000000000000001;
  7.  C_Type:Comp=765.0;
  8.  
  9. BEGIN
  10.  WriteLn('123467890');
  11.  WriteLn(R_Type:-10:2);
  12.  WriteLn(S_Type:10:7);
  13.  WriteLn(D_Type:10:7);
  14.  WriteLn(E_Type:10:1);
  15.  WriteLn(C_Type:0:0);
  16. END.

Le programme NewStyle produit la sortie suivante :

1234567890
12345.00
-4300000.0000000
-0.0004300
       0.0
765

Ne vous inquiétez pas trop si vous ne pouvez pas prédire la taille finale d'un nombre que vous souhaitez afficher. Les paramètres de format par défaut sont idéaux dans de telles situations. Par exemple, :0:D affiche n'importe quelle valeur réelle avec D décimales mais sans espaces de début. De même, :W:0 affiche toute valeur réelle sous forme de nombre entier.

Entreposer des nombres réels

La plupart des programmeurs n'ont jamais besoin de connaître le format de données interne d'un nombre réel. Cependant, une connaissance générale de la disposition d'un nombre réel peut vous aider à comprendre comment, où, quand et pourquoi les nombres réels sont utilisés dans une application particulière.

Une comparaison rapide des deux tableaux précédents (entier et réel) montre que les types de données réels nécessitent plus d'espace d'entreposage que les entiers. C'est principalement parce que chaque élément de données réel contient en fait deux nombres : un nombre : une valeur numérique (communément appelée la mantisse) et un exposant. Un autre bit est réservé pour indiquer le signe de la mantisse. Par exemple, les trois composantes du nombre +2,5x108 sont constituées de la mantisse (2,5), de l'exposant (8) et du bit de signe (ici, 0 pour indiquer un nombre positif).

Les intervalles particulières indiquées dans le tableau de réels sont dues au fait que la mantisse et l'exposant sont entreposés sous forme binaire. En fait, la valeur entreposée comme mantisse est en fait le logarithme de la valeur numérique. Ainsi, pour le nombre +2,5x108, la mantisse est entreposée sous forme de logarithme de 2,5.

Parce que les éléments de données réels sont entreposés sous forme de logarithmes. le QuickPascal peut considérablement accélérer la multiplication et la division de nombres réels. (Rappelez-vous que les nombres peuvent être multipliés en ajoutant - et divisés en soustrayant - leurs logarithmes.) D'un autre côté, chaque fois que des nombres réels sont directement ajoutés ou soustraits, les valeurs individuelles doivent être converties sous forme décimale avant que l'addition ou la soustraction puisse se produire ; le résultat doit ensuite être reconverti en entreposage sous forme logarithmique.

Le logarithme de presque tous les nombres est une valeur irrationnelle. En d'autres termes, l'écriture de la valeur logarithmique exacte d'un nombre nécessite plus de chiffres que n'importe quel type de données de nombre réel est conçu pour contenir, comme le montre le programme suivant :

  1. Program Precis;
  2.  
  3. Const
  4.  Test1:Real=12345.6789;
  5.  Test2:Real=9999999999.99;
  6.  
  7. BEGIN 
  8.  WriteLn(Test1);
  9.  WriteLn(Test2:20:2);
  10. END.

Lorsque le programme Precis s'exécute, il affiche les valeurs suivantes :

 1.23456789000034E+0004
      10000000000.00

Notez comment Test1 contient des chiffres supplémentaires produits par le processus d'arrondi. Notez également comment la valeur de Test2 est arrondie, même si le format sélectionné était suffisamment grand pour gérer confortablement sa valeur assignée. Les différences dans ces exemples sont minimes et, dans la plupart des cas, il est hautement improbable que des erreurs significatives se produisent.

En bref, bien que les nombres réels puissent être très précis dans un nombre spécifié de chiffres significatifs, un nombre réel n'est qu'une approximation. Lorsque vous devez travailler avec des quantités exactes, concevez votre programme pour qu'il utilise plutôt des nombres entiers.

L'intervalle des nombres réels

Le tableau de nombre réel précédent montre que la valeur entreposée dans un type de données Real peut aller de 2,9x10-39 à 1,7x1038. Sous forme décimale, la limite inférieure de cette intervalle, 2,9x10-39, est 

 0.0000000000000000000000000000000000000029

Le nombre est peut-être petit, mais il est toujours positif. L'exposant négatif indique seulement que le nombre est un nombre décimal - pas que le nombre est inférieur à zéro.

N'oubliez pas que les types de données réels entreposent les valeurs sous forme de logarithmes. Étant donné que les logarithmes sont définis pour les nombres positifs uniquement, la mantisse entreposée est en fait le logarithme de la valeur absolue du nombre. La valeur du bit de signe indique le signe du nombre dans son ensemble. Vous devez interpréter les intervalles Real, Single, Double et Extended présentées dans le tableau réel précédent comme les valeurs absolues les plus petites à plus grandes pouvant être représentées par ces types. L'intervalle réelle du type Real est donc de -1,7x1038 à +1,7x1038. Le nombre 2.9x10-39 est simplement la plus petite valeur absolue non nulle qu'un Real peut contenir. (Bien que le logarithme de zéro ne soit pas défini, le QuickPascal peut entreposer un zéro en plaçant un zéro dans chaque octet de l'élément de données.)

La précision des nombres réels

En entreposant la mantisse et l'exposant en tant que valeurs séparées, le QuickPascal fournit un nombre réel avec un intervalle considérablement plus grande que n'importe quel entier. Une valeur Extended, par exemple, peut être aussi grande que 104932 (un 1 suivi de 4933 zéros).

De toute évidence, peu d'applications nécessiteraient une valeur aussi élevée. Encore moins vous obligeraient à entreposer et à manipuler deux nombres à 4933 chiffres. En fait, puisqu'il n'y a qu'environ 1080 atomes dans l'univers connu, il est difficile d'imaginer une application qui pourrait repousser les limites d'une valeur Extended.

Dans la plupart des applications impliquant de grands nombres, seules des valeurs approximatives sont requises. Par exemple, la distance moyenne entre la Terre et le Soleil en 93 millions de miles. Bien qu'il soit possible de déterminer cette distance au millimètre près, cette précision n'est probablement pas nécessaire pour la plupart des applications.

Le tableau de réel précédent résume la précision de chaque type de données réel en tant que nombre de chiffres significatifs d'exactitude garantie. Tous les chiffres supplémentaires seront perdus. Tant que vos calculs maintiennent l'exposant dans l'intervalle appropriée, l'élément de données aura toujours le bon ordre de grandeur.

Utiliser un coprocesseur mathématique

Chaque type de données réel nécessite plus d'espace d'entreposage que les registres de la taille d'un mot d'un ordinateur personnel ne peuvent en gérer à la fois. Par conséquent, chaque opération impliquant des nombres réels - des simples comparaisons aux calculs logarithmiques complexes - doit être décomposée en morceaux plus petits et effectuée en plusieurs étapes. En conséquence, même des instructions aussi courantes que l'addition et la multiplication prennent considérablement plus de temps pour les types de données réels que des processus similaires exécutés avec des nombres entiers.

Ce processus consistant à décomposer les types de données réels en plusieurs morceaux, à effectuer des opérations sur les composantes individuels, puis à combiner les valeurs intermédiaires pour produire un résultat final est appelé émulation logicielle. De même, lorsqu'on travaille avec des nombres réels, on dit que le microprocesseur émule une machine beaucoup plus grande.

La plus grande machine peut être n'importe quel membre de la famille 80x87 de puces de coprocesseur mathématiques, étant spécialement conçues pour gérer des opérations impliquant des types de données réels. Comme le registre d'un coprocesseur fait 10 octets, il peut traiter confortablement même des types de données Extended de 10 octets en une seule opération.

En plus d'améliorer la vitesse d'exécution, le coprocesseur offre une plus grande précision lorsque vous utilisez les types de données Comp et Extended. L'appel de l'option Numeric Processing augmente la précision garantie des éléments de données Comp et Extended de quatre chiffres significatifs :

Si vous envisagez de développer des applications reposant fortement sur des calculs à virgule flottante, vous devriez envisager d'investir dans un coprocesseur numérique. Cependant, même si un coprocesseur mathématique est installé sur votre ordinateur, le QuickPascal ne générera pas automatiquement le code machine nécessaire à son utilisation. Pour profiter d'un coprocesseur, le programme doit être compilé avec l'option Numeric Processing {$N+} activée. Le fichier exécutable résultant (.EXE) essaiera d'appeler le coprocesseur chaque fois qu'il rencontrera une instruction impliquant un ou plusieurs nombres réels. Si aucun coprocesseur n'est disponible, le programme se terminera avec un message d'erreur indiquant qu'un coprocesseur est requis.

Dans QuickPascal, l'émulation logicielle et le traitement numérique sont des options s'excluant mutuellement. Il n'est pas prévu qu'un programme d'exécution détecte la présence d'un coprocesseur et sélectionne automatiquement la routine la plus efficace. Vous ne devez activer l'option de traitement numérique que lorsque vous êtes certain que le programme s'exécutera toujours sur un ordinateur sur lequel un coprocesseur est installé.

Utilisation du type Comp

Le type de données Comp à 8 octets est un hybride d'entiers et de réels. Un élément de données Comp entrepose des valeurs entières exactes dans l'intervalle -263+1 à +263-1. En notation scientifique, cette intervalle correspond approximativement à -9,2E+18 à 9,2E+18 - ±9 223 372 036  854 775 808 - soit environ 9,2 quintillions.

Parce qu'elles sont capables d'entreposer des entiers aussi volumineux, les variables Comp peuvent entreposer des valeurs monétaires. Ne vous inquiétez pas de l'absence de décimales. Mettez simplement à l'échelle vos variables afin que des valeurs telles que 1234,56 $ soient entreposées sous la forme 123 456.

Les variables Comp sont toujours manipulées avec une émulation logicielle, garantissant cependant une précision de seulement 15 ou 16 chiffres significatifs. Vous devez utiliser un coprocesseur mathématique pour assurer une précision totale sur toute l'intervalle. Une valeur Comp sera affichée comme n'importe quel autre type de données réel. Vous devez utiliser la fonction de formatage :W:0 dans les instructions Write et WriteLn pour empêcher la valeur de s'afficher en notation scientifique.

Types de données caractère et chaîne de caractères

Le QuickPascal propose trois façons d'entreposer des caractères ASCII. Un seul caractère peut être entreposé dans une variable déclarée en tant que type de données Char. Les types de variables déclarés STRING ou CSTRING peuvent contenir chacun des chaînes de caractères d'une longueur maximale de 255 caractères. (N'oubliez pas qu'une chaîne de caractères est une série de caractères ASCII.)

Caractères

D'une manière générale, un type de données Char peut être affecté à n'importe quel caractère pris en charge par votre ordinateur. Sur les compatibles IBM PC, un type de données Char peut contenir n'importe lequel des caractères ASCII étendus répertoriés dans la table ASCII. Les lettres majuscules sont entreposées sous les nombres 65 à 90, les lettres minuscules sont entreposées sous les nombres 97 à 122 et les chiffres 0 à 9 sont entreposés sous les nombres 48 à 57. Les caractères étrangers et graphiques sont entreposés sous entre les nombres 128 à 255.

Ne laissez pas le terme «caractère» vous tromper. Dans la conversation de tous les jours, nous avons tendance à considérer un caractère comme une lettre majuscule ou minuscule. Dans le QuickPascal, un caractère peut être une lettre, un chiffre, un signe de ponctuation, un symbole scientifique, une lettre étrangère, un symbole graphique ou un caractère de contrôle - en bref, tout symbole intégré pouvant être affiché sur votre écran d'ordinateur.

Le QuickPascal alloue 1 octet pour entreposer un caractère. Étant donné que chaque octet a 8 bits, vous pouvez avoir au plus 256 (28) valeurs de caractères. Chaque symbole est associé à l'un de ces nombres. Par exemple, A est le code ASCII 65, B est 66, C est 67, et ainsi de suite.

Écriture des caractères

Vous pouvez saisir un caractère en l'écrivant directement, en le ressaisissant à partir du clavier, en l'écrivant sous forme de valeur numérique ou en l'écrivant sous forme de caractère de contrôle.

Écriture directe des caractères

Pour les caractères de votre clavier (lettres, chiffres et signes de ponctuation), saisissez simplement le caractère lui-même, entre guillemets simples. Si vous voulez représenter le guillemet lui-même, vous devez l'écrire deux fois (n'utilisez pas le guillemet double). Notez que les lettres majuscules et minuscules sont considérées comme différentes. L'exemple suivant montre comment les caractères lisibles sont utilisés dans les instructions QuickPascal :

  1. If(Reponse='O')or(Reponse='o')THen ProcessusDonnees;
  2. Apostrophe:=''''; { Associe un simple guillemet }
  3. Case ChoixMenu of
  4.  'A','a':AjoutNouveauEnreg;
  5.  'M','m':ModifieEnregExistant;
  6.  'D','d':SupprimeEnregExistant;
  7. End;

Saisie de caractères à partir du pavé numérique

Vous pouvez saisir n'importe quel caractère ASCII à l'aide du pavé numérique. Par exemple, la lettre majuscule L est répertoriée dans la table ASCII en tant qu'ASCII 76. Maintenez la touche Alt enfoncée, entrez 7, 6 sur le clavier (pas la rangée supérieure de chiffres) et relâchez la touche Alt. La lettre L apparaîtra à l'emplacement du curseur, comme si vous l'aviez tapée directement. Vous pouvez ainsi utiliser le clavier pour saisir des graphiques et des caractères étrangers que vous ne trouvez pas sur votre clavier. N'oubliez pas que chaque caractère saisi au clavier doit être mis entre guillemets simples (saisis avant d'appuyer sur et après avoir relâché Alt).

Écriture de caractères sous forme de valeurs numériques

Il existe une autre technique que vous pouvez utiliser lorsque vous travaillez avec des symboles graphiques. Vous pouvez représenter directement n'importe quel caractère ASCII en faisant précéder sa valeur numérique d'un signe dièse (#). Vous pouvez ainsi représenter la lettre majuscule L comme #76. (Étant donné que le nombre décimal 76 équivaut à la valeur hexadécimale $4C, vous pouvez également représenter L par #$4C.) Le QuickPascal traite les trois symboles - #76 - comme un seul caractère ASCII. Étant donné que les guillemets ne sont pas requis lorsque vous représentez des caractères ASCII avec cette méthode, l'affectation :

  1. LaLettreL:='L';

est équivalant à l'affectation :

  1. LaLettreL:=#76;

Notez que le signe dièse doit être suivi d'un nombre décimal ou hexadécimal : Vous ne pouvez pas utiliser les constantes du programme QuickPascal, les constantes typées et les variables.

Écriture des caractères de contrôle

Les valeurs ASCII de 0 à 31 sont appelées caractères de contrôle car elles sont utilisées comme codes de contrôle sur l'équipement Teletype. Par exemple, ASCII 4 (#4) est noté EOT (End of Transmission). De même, #5 est un ENQuiry, #6 est un ACKnownledgement, et ainsi de suite. Chacun de ces codes est conçu pour déclencher une réponse spécifique lorsqu'il est transmis à un autre terminal. Comme aucun d'entre eux ne correspond à un caractère imprimé, les codes de contrôle sont fréquemment appelés caractères non imprimables.

Étant donné que votre ordinateur dispose d'un autre moyen de contrôler l'imprimante et l'écran, la plupart des codes de contrôle ne sont que des curiosités. Quelques-uns d'entre eux, cependant, sont toujours utilisés : #7 produit le son de cloche familier, #8 est un retour arrière, #10 est un saut de ligne, #12 est un saut de page et #13 est un retour chariot.

Les codes de contrôle de #1 à #26 peuvent être représentés par le symbole caret (^) suivi d'une lettre de contrôle correspondante de A à Z. (C'est pourquoi de nombreux textes de programmation font encore référence au son de la cloche comme le caractère ^G ou Ctrl+G). Étant donné que le saut de formulaire est #12 et que L est la douzième lettre de l'alphabet, tous les codes suivants sont équivalents :

^L #12 #$C

Notez que les guillemets ne sont pas requis lorsque vous écrivez des caractères de contrôle avec des carets.

Affichage des caractères

À part un caractère de contrôle valide, tout élément de données Char que vous sortez avec Write ou WriteLn s'affiche par défaut dans un seul espace.

Vous pouvez formater un paramètre en ajoutant le spécificateur de largeur :W pour la largeur d'affichage minimale. Comme pour les entiers et les réels, le signe de W détermine si le caractère apparaît contre le côté gauche ou droit de l'espace. Par exemple, si Ch est déclaré comme variable de type Char, les instructions :

  1. Ch := '+';
  2. WriteLn('1234567890');
  3. WriteLn(Ch:-10);
  4. WriteLn(Ch:+10);
  5. WriteLn('1234567890');

produira la sortie suivante :

1234567890
+
         +
1234567890

Les éléments de données Char seront toujours affichés, ce qui signifie que la commande de formatage :0 sera ignorée.

Inévitablement, la configuration de votre ordinateur sera sensible à un ensemble particulier de caractères de contrôle. Utilisés de manière appropriée, ces caractères peuvent considérablement améliorer la qualité de votre sortie. Cependant, lorsqu'ils sont utilisés de manière inappropriée, les caractères de contrôle sont une source fréquente de confusion. Par exemple, la déclaration :

  1. Write(#7) ; { #7 est un son de cloche }

sonnera toujours la cloche de l'ordinateur. Cependant, le caractère de saut de page (#12) provoquera une éjection de page uniquement lorsqu'il est dirigé vers l'imprimante. La sortie de la procédure Write s'affiche par défaut à l'écran. D'où l'énoncé :

  1. Write(#12);  { #12 est un saut de page }

affichera un caractère spécial, mais - en lui-même - n'aura aucun effet sur votre imprimante.

Chaîne de caractères

Une chaîne de caractères est une séquence de caractères ASCII contenus dans une seule ligne de programme et placés entre guillemets simples (ou apostrophes). Une chaîne de caractères vide (c'est-à-dire une chaîne de caractères sans caractères entre les guillemets) est appelée une chaîne de caractères nulle. Les exemples suivants sont des chaînes de caractères valides :

  1. 'Imprimante sans papier'
  2. 'J''ai pas trouvé'
  3. ''
  4. 'Utilise { au début d''un commentaires; utilise } à la fin d''un commentaire'

Le QuickPascal traite tout ce qui se trouve entre guillemets comme un seul élément de données. Par conséquent, dans la quatrième chaîne de caractères, le point-virgule et les accolades étaient considérés comme faisant partie de la chaîne de caractères plutôt que des symboles de ponctuation indépendants.

Étant donné que les chaînes de caractères sont le plus souvent utilisées pour contenir les messages des utilisateurs, elles se composent principalement de lettres, de chiffres et de signes de ponctuation. Cependant, vous pouvez inclure n'importe quel caractère ASCII. Vous pouvez utiliser le signe dièse (#) ou le caret (^) pour représenter tout caractère ASCII non standard, mais vous devez le placer en dehors des guillemets. Si vous ne voulez pas placer le caractère au milieu d'une chaîne de caractères, vous devez d'abord fermer la chaîne de caractères et la rouvrir après le caractère. Les chaînes de caractères suivantes contiennent des caractères non imprimables :

  1. 'Fin de page courante'#12'Haut de la prochaine page'
  2. 'Fin de la ligne courante'#13#10'Début de la prochaine ligne'
  3. 'Heure '#7' à '^G' réveillez '#7'vous!'
  4. 'Maintenant tu le vois'#8#8#8#8#8#8#8#8#8#8#8#8'tu le vois pas'

Dans le QuickPascal, les deux types de données STRING et CSTRING sont spécifiquement conçus pour gérer les variables de chaîne de caractères.

Le type de données STRING

Une variable déclarée en tant que type de données STRING peut contenir n'importe quelle séquence de caractères jusqu'à la taille maximale de la chaîne de caractères. Par exemple, l'instruction VAR suivante déclare une chaîne de caractères nommée UserMsg :

  1. Var UserMsg:String;

Ici, UserMsg est défini sur la taille de chaîne de caractères par défaut de 255 caractères. Cela signifie que UserMsg peut contenir une chaîne de caractères de n'importe quelle taille, tant qu'elle ne dépasse pas 255 caractères. Par conséquent, toutes les déclarations d'affectation suivantes sont valides :

  1. UserMsg:='Continuer ? (O/N)';
  2. UserMsg:='';
  3. UserMsg:=#7'Mauvaise réponse. SVP recommencer.';

Vous pouvez déclarer des variables de chaîne de caractères plus petites en spécifiant explicitement une taille de chaîne de caractères maximale, comme suit :

  1. Var StrVar:String[MaxStringSize];

La déclaration :

  1. Var _Hi:String[5];

crée une variable nommée _Hi pouvant contenir une chaîne de caractères de cinq caractères maximum. Si vous essayez d'affecter une chaîne de caractères plus longue qu'une variable n'a été déclarée, la chaîne de caractères sera tronquée. Par exemple, puisque _Hi a été déclaré comme une chaîne de caractères cinq caractères, les instructions :

  1. _Hi:='Bonjour Gladir.com!';
  2. WriteLn(_Hi);

produira le message à cinq caractères suivant :

Bonjo

Dans la mémoire de l'ordinateur, chaque STRING occupe autant d'octets que sa longueur déclarée, plus un. L'octet zéro contient la longueur de travail (également appelée longueur dynamique) de la chaîne de caractères, et les octets suivants contiennent chacun de ses caractères composantes.

Vous pouvez accéder aux caractères individuels d'une STRING avec des indices, étant indiqués entre crochets ([]). La valeur d'un indice peut aller de 0 (l'emplacement de l'octet de longueur de la chaîne de caractères) à L, où L est la longueur déclarée de la chaîne de caractères. Par exemple, si vous déclarez une chaîne de 30 caractères nommée Title, comme suit :

  1. Var Title:String[30];

alors Title[5] fait référence au cinquième caractère de la chaîne de caractères. Supposons que vous fassiez l'affectation suivante :

  1. Title:='Charges salariales';

Étant donné que la chaîne de caractères 'Charges salariales' comporte 18 caractères, Title[0] contient #18. De même, Titre[1] contient C, Titre[2] contient h, Titre[3] contient a, et ainsi de suite.

En déclarant Title comme STRING[30], le QuickPascal a réservé 31 octets pour la chaîne de caractères elle-même. Après l'affectation précédente, Title est traité exactement comme s'il contenait physiquement 18 caractères. Le QuickPascal ignore simplement les 12 caractères restants.

Le type de données CSTRING

Contrairement à Pascal, le langage de programmation C n'a pas de type de données de chaîne de caractères intégré. Au lieu de cela, une chaîne de caractères C est définie comme une séquence de types de données Char dont l'octet final est un zéro ASCII (#0) ou un caractère nul (le caractère nul n'est pas considéré comme faisant partie de la chaîne de caractères elle-même). Ce type de chaîne de caractères est communément appelé chaîne de caractères ASCII zéro (ou ASCIIZ).

Le QuickPascal vous permet d'accéder aux chaînes de caractères ASCIIZ en déclarant une variable en tant que type de données CSTRING. Les variables CSTRING sont déclarées comme le sont les types de données STRING de QuickPascal. Par exemple :

  1. Var
  2.  EnvStr:CString;
  3.  Message:CString[40];

définit EnvStr comme une chaîne de 255 caractères (la taille par défaut) entreposée dans 256 octets de mémoire. La variable Message est une chaîne de 40 caractères nécessitant 41 octets d'entreposage.

Vous pouvez accéder à des caractères individuels dans un CSTRING avec des indices. La valeur d'un indice peut aller de 1 à L+1, où L est la longueur déclarée de la chaîne de caractères. Comme pour une STRING, les index sont indiqués entre crochets.

Utilisation des données STRING et CSTRING

Le QuickPascal vous permet d'utiliser les variables STRING et CSTRING de manière interchangeable. Le programme suivant affiche deux ensembles de caractères alphabétiques :

  1. Program Alphabet;
  2.  
  3. Var
  4.  Alpha:String;
  5.  Beta:CString;
  6.  
  7. BEGIN
  8.  Alpha:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  9.  Beta:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  10.  WriteLn(Alpha);
  11.  WriteLn(Beta);
  12. END.

Bien que chacune des chaînes de caractères soit entreposée dans son propre format (comme l'indique l'image suivante), les chaînes de caractères Alpha et Beta sont opérationnellement indiscernables et les deux lignes de sortie produites par le programme sont identiques. Alpha, la variable STRING, utilise l'octet zéro pour entreposer sa longueur dynamique. Les lettres individuelles de l'alphabet se trouvent dans les positions 1 à 26. Beta, la variable CSTRING, entrepose également ses lettres dans les positions 1 à 26. Cependant, Beta n'a pas d'octet zéro ; à la place, il marque la fin de la chaîne de caractères en entreposant le caractère nul #0 dans l'élément numéro 27 :

Affichage des chaînes de caractères

Vous pouvez utiliser Write et WriteLn pour afficher la partie active des éléments de données STRING et CSTRING. Par défaut, les chaînes de caractères apparaîtront justifiées à gauche, sans espaces intermédiaires. La déclaration suivante :

  1. WriteLn('ABCDEF','ghiklmnop');

affiche ainsi le seul bloc de caractères suivant :

ABCDEFghiklmnop

Les procédures Write et WriteLn vous permettent de formater la sortie de chaîne de caractères en ajoutant :W à n'importe quel paramètre et en utilisant des signes plus et moins pour indiquer une justification à droite et à gauche. Étant donné que Write et WriteLn ne tronquent jamais le contenu d'une chaîne de caractères, une chaîne de caractères plus large que la largeur spécifiée remplacera la valeur de W. Le programme suivant illustre la sortie de chaîne de caractères :

  1. Program ShowStrs;
  2.  
  3. Const
  4.  Str1:String='C''est une chaîne extrêmement longue';
  5.  Str2:String='C''est une courte';
  6.  
  7. BEGIN
  8.  WriteLn('1234567890123456789012345');
  9.  WriteLn(Str1:-25);
  10.  WriteLn(Str1:25);
  11.  WriteLn;
  12.  WriteLn(Str2:-25);
  13.  WriteLn(Str2:25);
  14.  WriteLn('1234567890123456789012345');
  15.  WriteLn('1234567890123456789012345');
  16. END.

Lorsque SHOWSTRS s'exécute, il produit cette sortie :

1234567890123456789012345
C'est une chaîne extrêmement longue
C'est une chaîne extrêmement longue

C'est une courte
         C'est une courte
1234567890123456789012345
1234567890123456789012345

Notez que Write et WriteLn afficheront toujours les éléments de données STRING et CSTRING de la même manière.

Type de données booléen

Les programmeurs ont souvent besoin de tester si certaines conditions sont remplies. Par exemple, un programmeur BASIC peut écrire :

  1. EndOfFile=0

au début d'un programme pour indiquer que des enregistrements attendent d'être lus à partir d'un fichier. EndOfFile serait réinitialisé à 1 uniquement après la lecture du dernier enregistrement et la fermeture du fichier. Par conséquent, tout au long de l'exécution du programme, la valeur de EndOfFile reflète l'état du fichier.

Le QuickPascal fournit une alternative plus directe en permettant à une variable d'être définie comme un type de données Boolean. Une variable Boolean ne peut se voir attribuer qu'une des deux valeurs constantes TRUE et FALSE.

Les variables Boolean sont fréquemment utilisées dans les instructions conditionnelles et en boucle pour contrôler le déroulement du programme. Par exemple, étant donné la déclaration :

  1. Var
  2.  EndOfFile:Boolean;

EndOfFile peut être initialisé comme :

  1. EndOfFile:=False;

Étant donné que les valeurs Boolean correspondent étroitement aux significations anglaises ordinaires de TRUE et FALSE, EndOFFile peut être utilisé dans les instructions QuickPascal tout comme les conditions ordinaires, comme indiqué ici :

  1. Repeat
  2.  FileProcessingRoutines;
  3. Until EndOfFile; 

Une variable booléenne ne nécessite que 1 octet d'entreposage. En interne, les valeurs vraies et fausses sont en fait entreposées comme un et zéro, respectivement. Seuls les identificateurs standards TRUE et FALSE peuvent être affectés à une variable Boolean ; une variable Boolean ne peut pas être utilisée dans une expression arithmétique.

Afficher les données booléennes

Lorsque vous utilisez Write ou WriteLn pour sortir un élément de données Boolean, une valeur vraie sera affichée comme chaîne de caractères de quatre caractères TRUE, et une valeur fausse sera affichée comme FALSE à cinq caractères.

Vous pouvez formater la sortie Boolean de Write et WriteLn en ajoutant le spécificateur de largeur :W à n'importe quel paramètre. Les règles de base du formatage des chaînes de caractères s'appliquent et la chaîne de caractères entière sera affichée, avec sa justification déterminée par le signe de W.

  1. Program ShowBool;
  2.  
  3. Const
  4.  Bool1:Boolean=TRUE;
  5.  Bool2:Boolean=FALSE;
  6.  
  7. BEGIN
  8.  WriteLn('1234567890');
  9.  WriteLn(Bool1:-10);
  10.  WriteLn(Bool2:-10);
  11. END.

La sortie du programme SHOWBOOL est :

1234567890
TRUE
     FALSE

Types de données ordinales

Dans le QuickPascal, un type de données est considéré comme ordinal si ses valeurs consistent en un ensemble fini et ordonné. Finie signifie que le nombre de valeurs possibles doit être limité. Un Byte est fini puisqu'il ne peut contenir que 256 valeurs possibles. Inversement, un Real peut prendre un nombre infini de valeurs. Pour cette raison, les nombres réels ne sont pas ordinaux.

Ordonné signifie que les valeurs doivent avoir une séquence naturelle. Un Char va de #0 à #255, la prochaine valeur séquentielle après #46 est #47. Cependant, une chaîne peut prendre diverses valeurs et tailles. (Quelle valeur vient après 'z3w1d7f3' ?) Les chaînes de caractères n'ont pas de séquence naturelle ; ils ne sont pas ordinaux. Pour l'instant, nous pouvons simplement définir un type ordinal comme n'importe quel type de données Integer, Char ou Boolean.



Dernière mise à jour : Vendredi, le 7 janvier 2022