Principes de base de la conception de programmes THINK Pascal
Le THINK Pascal permet d'effectuer de faire la conception de la manière suivante :
- Utilisation de structure dans le programme : séquençage, boucle, décisions et sous-programmes.
- Utilisation des instructions d'affectation complexes
- Utilisation des expressions arithmétiques et conditionnelles complexes
- Utilisation de plusieurs des procédures et fonctions prédéfinies de THINK Pascal dans vos programmes
- Définir vos propres procédures et fonctions
- Améliorer le format de la sortie de votre programme, à la fois à l'écran et à l'imprimante
- Utilisation des structures de décision plus complexes dans vos programmes
- Effectuer des tests plus approfondis de vos programmes
Instruction de déclaration
Le THINK Pascal offre la possibilité d'effectuer des affectations de valeurs à des variables. La syntaxe de la déclaration est la suivante :
variable := expression |
où variable représente n'importe quel nom de variable THINK Pascal, et expression représente une combinaison de variables, constantes et opérations. Le := est appelé l'opérateur d'affectation. (Bien que composé de deux symboles, ":" et "=", il est traité comme s'il s'agissait d'un seul symbole.) Le but d'une instruction d'affectation est de donner une nouvelle valeur à une variable. Chaque variable a une place particulière dans la mémoire de l'ordinateur où sa valeur est entreposée, de sorte qu'une instruction d'affectation a pour effet de entreposer une nouvelle valeur dans cet emplacement de mémoire. Nous disons que la nouvelle valeur est «affectée à la variable». Lorsque l'instruction d'affectation est exécutée, deux événements majeurs se produisent, dans cet ordre :
- L'expression à droite de l'opérateur d'affectation est évaluée. Parce que l'expression peut être compliquée, le processus d'évaluation peut impliquer plusieurs variables et sous-expressions. La valeur actuelle de toutes les variables est utilisée pour calculer la valeur représentée par l'expression.
- La valeur obtenue en évaluant l'expression sur le côté droit de l'opérateur d'affectation est affectée (placée dans) la variable sur le côté gauche de l'opérateur d'affectation.
Déclarations d'affectation numérique
Une instruction d'affectation numérique est une instruction pour laquelle la valeur sur le côté droit de l'opérateur d'affectation est un nombre et la variable sur le côté gauche de l'opérateur d'affectation est un type numérique. Par exemple, voici des instructions d'affectation numériques (toutes les variables sont réelles) :
TaxRate := 0.06;
Balance :=- Balance + 345.68;
x := y;
Price := 1.5 * Cost;
Le premier exemple donne à la variable TaxRate une valeur de 0,06. La seconde modifie la variable Balance en ajoutant 345,68 à la valeur précédente de «Balance». Le troisième copie la valeur de la variable «Y» dans la variable «X», et le quatrième donne à la variable «Prix» le produit de la variable «Coût» multiplié par 1,5. La variable «Y» dans le troisième exemple et la variable «Cost» dans le quatrième exemple ne sont pas modifiées par l'exécution des instructions d'affectation. Seules les variables sur le côté gauche ont leurs valeurs modifiées.
Noter. L'opérateur d'affectation ":=" évoque une flèche orientée vers la gauche, ce qui nous rappelle que les valeurs circulent de droite à gauche. Il n'y a pas d'espace entre les deux points et le signe égal. Priorité. Comme vous l'avez peut-être remarqué, l'instruction d'affectation ressemble un peu à une formule algébrique. Par exemple, la formule :
d = rt |
nous dit comment calculer la distance pour une valeur donnée de r (taux) et t (temps). Dans une formule comme celle-ci, tout comme dans une déclaration d'affectation, la quantité à gauche est la quantité que nous souhaitons calculer, en utilisant la formule ou l'expression à droite. Notre rendu THINK Pascal de cette formule pourrait être :
D := R * T
ou, plus clairement :
Distance := Rate * Time
Les formules impliquent généralement des combinaisons de variables et de constantes utilisant des opérateurs tels que l'addition, la soustraction, la multiplication et la division. Par exemple, la formule familière :
F = (9/5)C + 32 |
(pour déterminer la température Fahrenheit correspondant à une lecture Celsius donnée) implique la division (9 divisé par 5), la multiplication et l'addition. La formule inverse est :
C = (5/9) (F - 32) |
implique la division, la soustraction et la multiplication. Les formules introduisent également des parenthèses pour contrôler l'ordre dans lequel les opérations doivent être effectuées. (Dans le dernier cas, ils s'assurent que la quantité "F - 32" est évaluée avant d'être multipliée par "5/9".) Les règles suivantes sont couramment utilisées comme conventions pour déterminer l'ordre des opérations dans les formules algébriques.
- Un moins unaire (comme dans "-5 + 6") est évalué en agissant sur le groupe constant, variable ou entre parenthèses qui suit immédiatement à droite du signe moins.
- La multiplication et la division sont effectuées avant l'addition et la soustraction, à moins que les parenthèses ne forcent une autre séquence d'évaluation. Lorsque des multiplications ou des divisions se produisent dans une ligne, elles sont évaluées de gauche à droite.
- L'addition et la soustraction sont ensuite effectuées, à nouveau de gauche à droite.
- Dans une expression entre parenthèses, l'évaluation se fait selon ces règles (y compris celle-ci).
Voici un ensemble d'exemples illustrant ces règles :
3+4 · 7 est 31 |
(La multiplication a priorité sur l'addition.)
(3 + 4)7 est 49 |
(Les parenthèses forcent d'abord l'évaluation de l'addition.)
-5 + 9 est 4 |
(Le moins unaire agit en premier.)
8/4 · 2 est 4 |
(La division et la multiplication vont de gauche à droite.)
8/(4 · 2) est 1 |
(Les parenthèses forcent d'abord l'évaluation de la multiplication.)
7-4-2 est 1 |
(Les soustractions vont de gauche à droite.)
7-(4-2) est 5 |
(Les parenthèses forcent d'abord l'évaluation de la soustraction à droite.)
6 · (5 - (2 + 1)) est 12 |
(Les parenthèses les plus intimes sont évaluées en premier.)
Les symboles THINK Pascal pour les opérateurs arithmétiques sont :
Opérateur | Description |
---|---|
+ | Ajouter |
- | Soustraction (et moins unaire) |
* | Multiplication |
/ | Division |
Il n'y a pas d'opérateur THINK Pascal pour l'exponentielle. En algèbre, vous vous en souvenez peut-être, un point indique une multiplication, comme dans la formule suivante :
y=a · b |
Plus tard, vous avez été autorisé à laisser tomber le point, en écrivant :
y=ab |
Considérez, cependant, l'instruction d'affectation THINK Pascal correspondante :
Y := AB
Parce que les noms de variables THINK Pascal peuvent être (et sont encouragés à être) de plus d'une lettre, nous ne pouvons pas être sûrs si le côté droit se réfère à une seule variable "AB" ou à la variable "A" multipliée par la variable "B". Pour clarifier la situation, nous devons toujours inclure un symbole de multiplication. Pour des raisons historiques, le symbole astérisque a été choisi pour représenter l'opérateur de multiplication en THINK Pascal. En algèbre, nous sommes habitués à voir des fractions ayant des expressions à la fois pour le numérateur et le dénominateur; par exemple :
a+2b ____ c-3d |
En THINK Pascal, nous utilisons le symbole barre oblique (/) pour l'opérateur de division. Notez qu'une traduction naïve de la dernière formule dans l'instruction d'affectation THINK Pascal ressemble à ceci :
Z := A + 2 * B / C - 3 * D
donne un résultat erroné. La traduction correcte en THINK Pascal est :
Z := (A + 2 * B) / (C - 3 * D)
La raison pour laquelle la première déclaration est incorrecte est que, sans les parenthèses, la sous-expression 2 * B / C est calculée avant l'addition et la soustraction. Par exemple, supposons que les variables A, B, C et D contiennent respectivement les valeurs 4, 6, 8 et 2. La valeur correcte pour z est :
(4 + 2 * 6) / (8 - 3 * 2) = (4 + 12) / (8 - 6) = 16 / 2 = 8 |
L'instruction d'affectation incorrecte donne :
4 + 2 * 6 / 8 - 3 * 2 = 4 + 12/ 8 - 6 = 4 + 1.5 - 6 = 5.5-6 = -0.5 |
Les règles de précédence des opérateurs arithmétiques de THINK Pascal coïncident avec les règles algébriques :
- Unaire moins (-) en premier
- * et moi ensuite, de gauche à droite
- + et - suivant, de gauche à droite
- Les parenthèses peuvent être utilisées pour regrouper les opérations
Parce que les règles de précédence en THINK Pascal sont les mêmes que celles des formules algébriques, la plupart des formules algébriques peuvent être réécrites comme des instructions d'affectation THINK Pascal avec peu de difficulté. Nous devons cependant nous rappeler d'utiliser l'astérisque (*) pour la multiplication et la barre oblique (/) pour la division, et de regrouper les expressions du numérateur et du dénominateur entre parenthèses. Ce qui suit illustre la correspondance entre les formules algébriques et les instructions d'affectation THINK Pascal :
Formule algébrique | Déclaration d'affectation THINK Pascal |
---|---|
y = x+t | - Y := X + T |
x=2y | - X := 2 * Y |
x = y/z + r | - X := Y/Z + R |
y = ax+b | - Y := A * X + B |
a =x(t + w) | - A := X * (T+W) |
Il est permis d'ajouter des parenthèses supplémentaires à une expression afin de souligner la signification des sous-expressions. Par exemple, nous pouvons écrire :
Y := (B * A) / C
au lieu de l'équivalent
Y := B * A / C
si l'on veut souligner que la multiplication précède la division. De même, on peut écrire :
Y := (40 * R) + (1.5 * R * T)
Si nous le souhaitons, bien qu'aucune parenthèse ne soit nécessaire pour obtenir la priorité souhaitée.
Expressions réelles et entières
Dans les exemples que nous venons de donner, nous supposons généralement que toutes les variables sont réelles. Comme mentionné précédemment, THINK Pascal fait une distinction entre les quantités entières et réelles. Cependant, une brève discussion s'impose ici. Heureusement, la manière dont THINK Pascal gère les expressions est ce à quoi nous nous attendrions normalement. Par exemple :
2.5 + 7 est 9.5 |
(L'ajout d'un réel à un entier est autorisé.)
5 * 6.43 est 32.15 |
(La multiplication (et la division ou la soustraction) est également autorisée.)
5 / 2 est 2.5 |
(La division de deux entiers donne exactement ce que nous attendons ici.)
4 / 2 est 2.0 |
(La réponse de l'opérateur de division "/" est toujours réelle.)
Seul le dernier exemple peut être quelque peu inattendu. En général, nous pouvons donc rédiger nos déclarations d'affectation de manière tout à fait naturelle. Par exemple, si le prix d'un élément est un réel et la quantité achetée est un entier, une affectation :
Totalcost := Price * Quantity
est acceptable (TotalCost est réel). Il y a une restriction importante à noter. Nous ne pouvons pas affecter une expression réelle à une variable entière. Par exemple, supposons que nous sachions qu'un nombre réel R est divisible par 10. Si N est un entier, une affectation telle que :
N := R / 10
générerait toujours une erreur de compilation de type incompatible car "/" renvoie toujours un résultat réel.
Pour la plupart, les instructions d'affectation en THINK Pascal sont simples. Si nous savons quelle formule ou expression est nécessaire pour calculer une nouvelle valeur pour une variable, nous plaçons l'expression à droite de l'opérateur d'affectation et la variable à gauche. Il y a cependant sept points méritant une attention particulière :
- Le point principal à retenir est que l'opérateur d'affectation s'écrit ":=". Une erreur courante commise par les novices de THINK Pascal est d'utiliser le "=" seul comme opérateur d'affectation. Une autre erreur courante est de mettre un espace entre les deux points et le signe égal. Heureusement, le compilateur THINK Pascal détecte et signale une telle utilisation de symbole erronée.
- La multiplication ne peut pas être implicite dans une expression; il doit toujours être rendu explicite par l'utilisation du symbole "*". Le compilateur détecte généralement cette erreur, mais il peut donner un message d'erreur trompeur. Par exemple, si nous écrivons :
- Des parenthèses supplémentaires peuvent être nécessaires pour regrouper les numérateurs et les dénominateurs lorsque vous utilisez le symbole de division "/". Le compilateur ne détecte pas un échec de le faire et le programme donne des résultats incorrects.
- L'utilisation de "/" pour diviser donne toujours une valeur réelle et une valeur réelle ne peut pas être affectée à une variable entière.
- Bien que l'instruction d'affectation soit similaire à une formule algébrique, elle n'est pas du tout similaire à une équation algébrique. Par exemple, une instruction d'affectation similaire à :
- Une variable ne doit jamais apparaître sur le côté droit d'une instruction d'affectation tant qu'une valeur ne lui a pas été attribuée. Par exemple, si la variable K n'a pas encore reçu de valeur dans un programme THINK Pascal, alors l'instruction :
- Veillez à éviter les affectations entraînant un dépassement numérique, c'est-à-dire ne jamais laisser la valeur à affecter dans la variable de gauche être plus grande que le type de variable le permet. Ce problème peut se produire avec n'importe quel type numérique, mais il est plus courant avec les entiers. Les nombres entiers de THINK Pascal sont compris entre -32768 et +32767. Supposons que nous ayons cette série d'instructions d'affectation (où I est un entier) :
Y := AB
à la place de
Y := A * B
le message d'erreur indique que l'identifiant AB est inconnu (car non déclaré).
K := K + 1
est couramment utilisé dans les programmes THINK Pascal. La signification de la déclaration est une évaluation du côté droit en prenant la valeur actuelle de la variable K et en y ajoutant 1. Remplacez la valeur de la variable K par la valeur obtenue sur le côté droit. Si nous traduisons la déclaration d'affectation dans l'équation algébrique :
k = k + 1 |
nous obtenons une équation insoluble et une égalité surprenante si nous essayons de la résoudre (0 = 1).
K := K + 1
aura un résultat imprévisible. La valeur résultante de K ne sera pas sous le contrôle du programmeur ou du programme. Lorsque vous lisez votre code THINK Pascal pour vérifier son exactitude, demandez vous pour chaque instance d'une variable apparaissant sur le côté droit d'une instruction d'affectation : «Comment cette variable a-t-elle reçu sa valeur ?» En particulier, regardez pour voir que la variable a reçu une valeur via une instruction Readln antérieure, ou en étant sur le côté gauche d'une instruction d'affectation précédente.
I := 100;
I := I * I;
I := I * 5;
Après la première affectation, il contiendrai 100; après le second, 10 000; et après le troisième, je n'en contient pas 50 000. Étant donné que la dernière affectation entraîne un nombre trop grand pour être entreposé sous forme d'entier, un débordement d'entier se produit. I contient la valeur -15 536! Notez qu'aucune erreur d'exécution n'est générée; THINK Pascal prend joyeusement la valeur qu'il trouve en I après le débordement et l'utilise comme si rien d'inhabituel ne s'était produit. Heureusement, vous pouvez demander à THINK Pascal de vérifier si votre programme ne déborde pas pendant les opérations arithmétiques impliquant des entiers; pour ce faire, vous devez activer l'option "overflow". Une façon de faire est de cliquer sur le V à côté du nom de votre programme dans la fenêtre du projet. (Bien sûr, vous devez ajouter votre programme au projet pour que son nom apparaisse dans la fenêtre du projet.) Une boîte apparaîtra autour du V, indiquant que la vérification du dépassement de capacité est activée pour ce programme. Pour désactiver la vérification du débordement, il suffit de cliquer à nouveau sur le V; la boîte disparaîtra. L'activation de la vérification de dépassement indique au compilateur THINK Pascal de placer du code supplémentaire dans votre programme afin que, lorsqu'un débordement se produit, le programme s'arrête avec une erreur d'exécution. Ce code supplémentaire entraîne un ralentissement de l'exécution du programme, de sorte que la plupart des programmeurs activent la vérification de débordement pendant le débogage du programme et la désactivent lorsque le programme est prêt à être utilisé. Le V du "Boxing" active la vérification de débordement pour l'ensemble du programme, ce que nous voulons généralement. Parfois, cependant, nous voulons vérifier juste une partie d'un programme. Si notre programme ne fait que de l'arithmétique entière dans une section, nous pourrions vouloir vérifier le débordement uniquement dans cette section. Une façon de vérifier le débordement dans une partie d'un programme est de placer la directive du compilateur {$V+} dans le programme au point où la vérification du débordement doit commencer et la directive {$V-} au point où elle doit se terminer. (Vous pouvez réactiver la vérification plus tard dans le programme en émettant une autre directive {$V+}.) Les directives du compilateur sont des chaînes de caractères spécifiques placées entre accolades donnant des instructions à THINK Pascal lors de la compilation du programme. Le THINK Pascal sait que ces chaînes de caractères spécifiques ne sont pas des commentaires à cause du symbole «$» les commençant. Chacun doit être placé sur sa propre ligne du programme. (Vous pouvez effectuer une vérification de débordement pour l'ensemble du programme en émettant {$V+} au début du programme et {$V-} à sa fin. Cette utilisation des directives $V équivaut au V de l'option "Boxer" du programme sur la fenêtre du projet.)
Nous vous recommandons fortement d'activer la vérification du dépassement d'entier dans tout programme incluant l'arithmétique d'entiers. Nous supposerons que l'option V a été activée dans tous les programmes d'exemple que nous donnons contenant l'arithmétique des entiers.
Déclarations d'attribution de caractère
Une variable de type char peut avoir comme valeur n'importe quel caractère unique. Certains de ces caractères correspondent aux caractères pouvant être générés sur le clavier et imprimés sur une imprimante. Les deux méthodes les plus courantes pour affecter des valeurs à une variable char sont l'utilisation d'un littéral char ou l'utilisation de la fonction intégrée Chr. Si X et Y sont des variables char, nous pouvons également affecter la valeur de Y à X en utilisant l'instruction :
X := Y
Un littéral char se compose d'exactement un caractère entre des apostrophes. Par exemple, l'instruction :
Letter := 'C'
affecte à la variable "Letter" la valeur de la majuscule "C". De la même manière, mais de manière moins évidente, la déclaration :
Blank := ' '
affecte à la variable Blank un seul espace vide. Notez que la déclaration :
Blank := ''
n'a pas l'effet souhaité car il n'y a pas d'espace vide entre les apostrophes. En fait, cela génère une erreur de compilation. Si vous souhaitez représenter l'apostrophe sous forme de variable char, saisissez-la deux fois de suite comme dans l'instruction :
Apostrophe:= '''';
La fonction standard Pascal Chr génère une valeur char à partir de l'un des nombres de 0 à 255. L'ensemble de caractères utilisé sur l'ordinateur détermine la signification de toute instance particulière de cette fonction; le Macintosh utilise l'ensemble de caractères ASCII (American Standard Code for Information Interchange) (comme le font la plupart des micro-ordinateurs et de nombreux autres types d'ordinateurs). Par exemple, la valeur de Chr(67) est la lettre majuscule "C" car "C" a le code ASCII de 67. L'instruction d'affectation :
Letter := Chr(67)
affecte le caractère «C» à la variable Lettre.