2.1. Langage de description.
a- Instructions
Dans les algorithmes décrivant des calculs sur les quantités
numériques, seront utilisées essentiellement les
instructions que nous avons déjà étudiées.
1° les instructions de lecture (d'entrée) notées:
indiquant la saisie des données
exemples:
exemple:
indiquant l'affichage d'un message et/ou du contenu d'une variable
(ou du résultat d'un calcul)
exemples:
écrire " Introduisez la somme initiale (en francs): "
écrire " L'intérêt fourni est de " , intérêt
écrire intérêt
écrire a, b, (a+b)/2
3° les instructions d'assignation (d'affectation) représentées
par
Les variables y sont représentées par un
identificateur (un nom) comme en algèbre et les
constantes sont des nombres écrits en chiffres. Nous utiliserons la convention anglo-saxonne utilisée
par la plupart des ordinateurs (et des calculatrices) et qui consiste
à employer le point (".") pour
séparer la partie entière de la partie décimale
d'un nombre.
Les opérations sur des nombres sont représentées
par +, -, * (pour ne pas confondre le symbole de multiplication
avec la lettre "x" ou avec le point décimal),
/.
D'autres fonctions mathématiques usuelles sont couramment utilisées: ln x, sin x, arctg x, [x] (signifie prendre la partie entière de x), a mod b (fournit le reste de la division de a par b), xy, loga x , ...
Mais l'ordinateur peut également manipuler des variables
contenant des chaînes de caractères alphanumériques
(alphabétiques et/ou numériques et/ou spéciaux)
pour les modifier, en extraire des sous-chaînes, ... Ces
chaînes de caractères sont placées entre guillemets
pour les distinguer des noms de variables. L'opération
de concaténation (juxtaposition de 2 chaînes
pour en former une nouvelle) est symbolisée par //
séparant les 2 chaînes originelles. La fonction
qui permet d'extraire une sous-chaîne est représentée
par le nom de la variable avec en indice les positions des lettres
à extraire. Ainsi la sous-chaîne formée des
caractères occupant les positions 2, 3, 4 dans la variable
prénom sera symbolisée par: prénom2<--4
Enfin, la fonction qui fournit la longueur (le nombre de
caractères) de la chaîne contenue dans la variable
prénom est symbolisée par |prénom|
b- Exemples
1- Exprimer un nombre de secondes sous forme d'heures, minutes,
secondes. La seule donnée est le nombre total de secondes
que nous appellerons nsec; les résultats consistent en
3 nombres h, m, s.
2- Transformer un prénom et un nom en une chaîne
contenant l'initiale du prénom séparée du
nom par un point
c-Déclaratives
Il est aussi nécessaire de préciser ce que les variables
utilisées contiendront comme type de données. Il
peut s'agir de nombres entiers, de nombres réels, de chaînes
de caractères, ... Il faut faire précéder
la description de l'algorithme par une partie dite déclarative
où l'on regroupe les caractéristiques des variables
manipulées.
La partie déclarative est placée en tête de
l'algorithme et regroupe une ou plusieurs indications de la forme:
L'algorithme complété de l'exemple 1 devient:
Et l'algorithme de l'exemple 2:
2.2. Exercices
Pour voir les exercices et les solutions, cliquez ici.
lire variables
lire somme_initiale
lire taux
écrire expression
variable <-- expression
intérêt <-- somme-initiale * taux / 100
a <-- 0
i <-- i + 1
écrire " Introduisez le nombre de secondes"
lire nsec
s <-- nsec mod 60
m <-- (nsec \ 60) mod 60
h <-- nsec \ 3600
écrire nsec, "valent: ", h, "heure(s) ", m, "minute(s) et", s, "seconde(s)"
écrire "Quel est votre prénom?"
lire prénom
écrire "et votre nom?"
lire nom
pr <-- prénom1
lpr <-- |prénom|
ident <-- pr // "." // nom
écrire "Votre prénom de", lpr, "lettres a été abrégé
et votre identification est : ", ident
entier variables
ou
réel variables
entier nsec, h, m, s
écrire "Introduisez le nombre de secondes:"
lire nsec
s <-- nsec mod 60
m <-- (nsec \ 60) mod 60
h <-- nsec \ 3600
écrire nsec, "valent: ", h, "heure(s)", m, "minute(s) et", s, "seconde(s)"
entier lpr
chaîne prénom, nom, ident
écrire "Quel est votre prénom?"
lire prénom
écrire "et votre nom?"
lire nom
pr <-- prénom1
lpr <-- |prénom|
ident <-- pr // "." // nom
écrire "Votre prénom de",lpr,"lettres a été abrégé
et votre identification est : ",ident
|
|
Pour l'échange de données entre le programme et l'utilisateur (ou le disque du PC), 2 mots sont utilisés: (1) lire pour recevoir de l'info du monde extérieur: lire N où N est le nom de la variable qui va recevoir l'information fournie par l'utilisateur lire N sur Fichier où N est le nom de la variable qui va recevoir l'information récupérée dans le fichier Fichier (2) écrire pour fournir de l'info au monde extérieur: écrire "Bonjour tout le monde." où la partie entre guillemet est le message à afficher à l'écran écrire N où N est le nom de la variable qui contient l'information à écrire écrire N sur Fichier où N est le nom de la variable qui contient l'information à écrire sur le fichier Fichier Lorsque le programme travaille dans sa tête, on utilise l'assignation <-- pour symboliser la mémorisation dans une variable. N <-- N+2 x <-- 2*3+5/2 St <-- "Hello" |
|
Généralités
Examinons les programmes complets correspondant aux algorithmes décrits en LDA.
entier nsec, h, m, s
écrire "Introduisez le nombre de secondes:"
lire nsec
s <-- nsec mod 60
m <-- (nsec \ 60) mod 60
h <-- nsec \ 3600
écrire nsec, "valent: ", h, "heures",m, "minutes et", s, "secondes"
deviendra en Pascal:
PROGRAM secondes;
VAR nsec, h, m, s : INTEGER;
BEGIN
WRITE('Introduisez le nombre de secondes: ');
READLN (nsec) ;
s:=nsec MOD 60 ;
m:=nsec DIV 60 MOD 60 ;
h:=nsec DIV 3600 ;
WRITELN (nsec, 'valent: ', h, 'heures', m, 'minutes et', s, 'secondes')
END.
Les règles de base.
Dans ces exemples, nous retrouvons déjà dix règles de base:
1° Un programme Pascal se compose de trois parties:
un en-tête, caractérisé par le mot PROGRAM
une section déclarative introduite ici par le mot VAR
une section instruction ou corps du programme, délimitée par les mots BEGIN et END.
Attention: Le programme se termine par un point.
2° L'en tête (facultative) sert à donner un nom au programme selon la forme:
PROGRAM identificateur;
3° Un identificateur en Pascal doit débuter par une lettre suivie par un nombre quelconque de lettres, chiffres ou de "_" (caractère souligné). Les identificateurs ne peuvent contenir d'espacement (caractère "blanc") ou de caractères tels que %, ?, *, ., - ,... mais peuvent être aussi longs que l'on veut.
4° Les variables doivent faire l'objet d'une déclaration de type de la forme:
VAR liste des variables : type;
5° Des points-virgules sont obligatoires pour séparer les trois parties et pour séparer les instructions
6° Les instructions de lecture et d'écriture se traduisent respectivement par READLN et WRITE (ou WRITELN) suivis d'une liste de variables ou d'expressions placées entre parenthèses et séparées par des virgules.
L'ajout de LN après WRITE (WRITELN) force le passage à la ligne lors de l'affichage suivant à l'écran.
7° L'assignation se représente par ":="
8° Les opérateurs arithmétiques sont identiques à ceux du langage de description d'algorithme (LDA). Toutefois, nsec\3600 est traduit par nsec DIV 3600. En effet, outre les quatres opérations + - * / , Pascal utilise deux opérateurs supplémentaires:
DIV fournissant la partie entière du quotient de deux nombres entiers
MOD fournissant le reste de la division de deux nombres entiers
Ainsi, 13 / 5 fournit la valeur 2.6
13 DIV 5 fournit 2
et 13 MOD 5 fournit 3.
9° Les mots PROGRAM, VAR, BEGIN, END, DIV, MOD, ... ont un sens précis dans le langage: ce sont des mots réservés qui ne peuvent être choisis comme identificateurs par le programmeur.
Dans un programme en LDA, les mots réservés sont soulignés.
Un certain nombre de mots tels que INTEGER, READLN, WRITE, ... ont une signification prédéfinie. Pour éviter toute erreur, on s'abstiendra de les choisir comme identificateur.
10° Les mots du langage et les identificateurs doivent être séparés les uns des autres par un ou plusieurs blancs.
Lecture.
Les lectures sont symbolisées par le mot READLN. C'est la procédure READLN qui transfère les nombres ou chaînes de caractères du clavier vers la mémoire centrale. Ceux-ci doivent respecter la forme des constantes de Pascal et doivent être séparés par un blanc au moins.
Le type de la constante donnée et celui de la variable d'accueil doivent correspondre selon la règle des assignations.
Pascal admet aussi la procédure READ (qui a le même effet que READLN sans passage à la ligne pour le prochain affichage) mais il s'est révélé à l'usage, que celle-ci était parfois source de problème et il est préférable de l'éviter.
Ecriture.
Les écritures se font de façon semblable aux lectures, à l'aide de la procédure WRITE. Les valeurs à afficher apparaîtront sur l'écran à la queue-leu-leu sur une seule ligne, parfois sans espacement entre elles.
Pour améliorer la lisibilité, on peut:
utiliser la procédure WRITELN qui force le passage à la ligne suivante pour le prochain affichage
faire usage des formats d'édition qui précisent le nombre de caractères à utiliser pour afficher chacun des résultats:
WRITE(valeur_entière : n) affiche la valeur entière sur n positions (insertion d'espacement à gauche du nombre si il y a trop peu de chiffres et ajustement automatique, si n est insuffisant)
WRITE(valeur_réelle) affiche le nombre en notation scientifique (x.xxxxxE+x précédé d'un espacement)
WRITE(valeur_réelle : n) affiche le nombre en notation scientifique sur n positions
WRITE(valeur_réelle : n1 : n2) affiche le nombre sur n1 positions avec n2 décimales (avec ajustement).
WRITE(chaîne : n) affiche la chaîne de caractère sur n positions (insertion d'espacement à gauche de la chaîne si il y a trop peu de caractères et ajustement automatique, si n est insuffisant)
Exemples:
Si la variable entière x contient 12345, (^ symbolise l'espacement)
WRITE(x) affiche 12345
WRITE(x:8) affiche ^^^12345
WRITE(x:2) affiche 12345
Si la variable réelle x contient 123.4567, (^ symbolise l'espacement)
WRITE(x) affiche ^1.23456E+2
WRITE(x:7) affiche ^1.2E+2
WRITE(x:8:2) affiche ^^123.46
WRITE(x:2) affiche 1.2E+2
Si la variable du type chaîne x contient 'AZERTY', (^ symbolise l'espacement)
WRITE(x) affiche AZERTY
WRITE(x:8) affiche ^^AZERTY
WRITE (x:3) affiche AZERTY
Manipulation de nombres.
Si la mathématique distingue plusieurs types de nombres directement manipulables par les langages informatiques, Pascal n'en reconnaît que deux: les types entier et réel.
Le type entier.
En LDA, nous placerons dans la déclaration des variables une ligne telle que:
entier age, note_de_français
Mais Pascal a subdivisé les entiers en 5 types pour mieux adapter le type aux valeurs que peuvent prendre une variable, et ce pour optimiser l'occupation de la mémoire.
Type | Valeurs autorisées | Occupation en mémoire | |||
---|---|---|---|---|---|
SHORTINT | de -128 à +127 | 1 octet | |||
BYTE | de 0 à 255 | 1 octet | |||
INTEGER | de -32768 à +32767 | 2 octets | |||
WORD | de 0 à 65535 | 2 octets | |||
LONGINT | de -2147483648 à 2147483647 | 4 octets | |||
Le type réel.
En LDA, nous placerons dans la déclaration des variables une ligne telle que:
réel taux_de_TVA, note_moyenne
Mais Pascal a subdivisé les réels en 4 types pour mieux adapter le type aux valeurs que peuvent prendre une variable, et ce pour optimiser l'occupation de la mémoire.
Type | Valeurs autorisées | Nombre de chiffres significatifs | Occupation en mémoire | ||||||
---|---|---|---|---|---|---|---|---|---|
SINGLE | de -1038 à 9,8 1038 | 7 chiffres | 4 octets | ||||||
REAL | de -1038 à 9,8 1038 | 11 chiffres | 6 octets | ||||||
DOUBLE | de -10308 à 10308 | 15 chiffres | 8 octets | ||||||
EXTENDED | de -104932 à 9,8 104932 | 19 chiffres | 10 octets | ||||||
Il existe aussi le type COMP stocké sur 8 octets et offrant une gamme de nombres allant de -9,8 1018 à 9,8 1018 mais ne conservant que la partie entière du nombre.
Assignation.
Dans une assignation, le type de l'expression doit correspondre au type de variable de destination. Cette règle admet une seule exception: une variable réelle peut recevoir une valeur entière.
Evaluation des expressions arithmétiques.
Pascal respecte la même convention de priorité que l'arithmétique: les multiplications et les divisions (opérateurs * / DIV et MOD) sont effectuées en premier lieu, puis les additions et les soustractions (opérateurs + et -); lorsqu'une expression contient plusieurs opérateurs de même priorité, les opérations sont effectuées de gauche à droite. Pour modifier cet ordre, il suffit d'introduire des parenthèses.
Exemple: WRITELN(1/2*3) n'affichera pas la valeur de 1/6 mais bien de 3/2 car la division se fera avant la multiplication.
Type des opérandes et du résultat.
Les opérateurs +, - et * peuvent agir sur des opérandes réels ou entiers et le résultat est réel sauf si les deux opérandes sont entiers. L'opérateur / peut agir sur des entiers et des réels mais le résultat est toujours réel. Les opérateurs DIV et MOD ne peuvent être utilisés qu'avec des opérandes entiers et fournissent un résultat entier.
Constantes numériques.
Le type d'une variable est défini dans la partie déclarative du programme. C'est la forme d'écriture qui détermine le type d'une constante. Ainsi 50 est une constante entière, tandis que 3.1416 et 50.0 sont des constantes réelles car elles contiennent une partie fractionnaire.
Les constantes entières ne peuvent contenir que des chiffres décimaux (0 à 9) précédés éventuellement d'un signe + ou -.
Les constantes réelles doivent contenir en plus:
soit par une partie fractionnaire d'au moins un chiffre, séparée de la partie entière par un point:
+1.2 -56 0.01 0.0soit une partie exposant sous forme d'une constante entière précédée par un E indiquant la puissance de 10 par laquelle il faut multiplier la valeur qui précède la lettre E :
1E4 vaut 1 * 104 = 10000.0 6E-2 vaut 6 * 10-2 = 0.06soit les deux:
3.14E+4 vaut 3.14 * 104 = 31400.0Dans ce cas et si il n'y a qu'un seul chiffre non nul dans la partie entière, on parle de notation scientifique.
Fonctions mathématiques.
Notation mathématique | Fonction Pascal | Type de x | Type du résultat | Signification | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|x| | ABS(x) | Entier ou réel | Type de x | Valeur absolue de x | ||||||||||
x2 | SQR(x) | Entier ou réel | Type de x | Carré de x | ||||||||||
x1/2 | SQRT(x) | Entier ou réel | Réel | Racine carré de x | ||||||||||
sin x | SIN(x) | Entier ou réel | Réel | sin de x (x en radians) | ||||||||||
cos x | COS(x) | Entier ou réel | Réel | cos de x (x en radians) | ||||||||||
arctg x | ARCTAN(x) | Entier ou réel | Réel | Angle (en radians) dont la tangente vaut x | ||||||||||
ex | EXP(x) | Réel | Réel | Exponentielle de x | ||||||||||
ln x | LN(x) | Réel | Réel | Logarithme népérien de x | ||||||||||
[x] | TRUNC(x) | Réel | Entier | Partie entière de x | ||||||||||
[x] | INT(x) | Réel | Réel | Partie entière de x | ||||||||||
arrondi de x | ROUND(x) | Réel | Entier | Entier le plus proche de x | ||||||||||
décimal de x | FRAC(x) | Réel | Réel | Partie décimale de x | ||||||||||
On notera l'absence des fonctions tg x et xy qui se traduiront, en employant les formules de mathématique adéquates, respectivement par SIN(x)/COS(x) et EXP(y*LN(x)).
Manipulation de chaînes de caractères.
Nous avons déjà vu précédemment un exemple de ce type de problème et il est évidemment nécessaire dans la vie professionnelle de manipuler des données autres que numériques (noms de clients, d'articles vendus, ...). Celles-ci sont alors dites du type alphabétique. Lorsqu'elles contiennent en plus des chiffres, des symboles tels que (+, =, §, &, ...), nous parlerons de données alphanumériques.
Si la manière de coder en binaire des nombres entiers ou réels se fait d'une manière assez naturelle par un changement de base de numération, par contre la manière de stocker des caractères en binaire est totalement arbitraire. Ainsi, l'ANSI (American National Standard Institute) a défini un codage des caractères sur deux octets (ou bytes). Ce code porte le nom de code ASCII (American Standard Code for Information Interchange) et respecte, entre autres, l'ordre alphabétique. Comme deux octets permettent de stocker 256 valeurs différtentes, nous disposerons de 256 caractères différents.
Il existe deux types de variables alphanumériques: les caractère et chaîne.
Le type caractère.
Le type caractère est réservé aux variables contenant un seul caractère (lettre, symbole, ponctuation, ...) et il est possible d'en déterminer les successeur/prédécesseur/position dans la liste des codes ASCII. Ainsi le successeur de "B" est "C", son prédécesseur "A" et son code ASCII 66.
En LDA, nous placerons dans la déclaration des variables une ligne telle que:
caractère lettre, initiale
qui se traduira en Pascal par:
VAR lettre, initiale: CHAR;
Le type chaîne.
Les variables du type chaîne peuvent contenir
soit une suite de caractères (un mot, une phrase, ...),
soit un caractère (mais dont, par exemple, il est impossible de déterminer le suivant),
soit aucun caractère (on parle alors de chaîne vide).
En LDA, nous placerons dans la déclaration des variables une ligne telle que:
chaîne nom, adresse
qui se traduira en Pascal par:
VAR nom, adresse: STRING;
Cependant, Pascal permet aussi de préciser la taille maximale (25 dans l'exemple ci-dessous) que pourra avoir la chaîne qui sera affectée à la variable:
VAR nom, adresse: STRING[25];
En l'absence de précision de longueur, Pascal réserve automatiquement la taille maximale, à savoir 255 caractères.
Assignation.
Dans une assignation, le type de l'expression doit correspondre au type de variable de destination. C'est ainsi que les assignations suivantes sont illégales:
initiale <-- "Einstein"avec la variable initiale déclarée du type caractère.initiale <-- ""
Par contre, si cette variable a été déclarée du type chaîne, celles-ci sont tout à fait légales.
Les fonctions alphanumériques.
Notation en LDA | Fonction Pascal | Type du résultat | Signification | ||||||
---|---|---|---|---|---|---|---|---|---|
|Ch| | LENGTH(Ch) | Entier | Nombre de caractères dans Ch | ||||||
Ch1 // Ch2 | CONCAT(Ch1,Ch2) Ch1 + Ch2 |
Chaîne | Concaténation (juxtaposition) de Ch1 et Ch2 | ||||||
Chi<--j | COPY(Ch, i, j-i+1) | Chaîne | Extraction, dans Ch, des caractères de la postion i à la position j | ||||||
Chi | COPY(Ch, i, 1) Ch[i] |
Chaîne Caractère |
Extraction, dans Ch, du caractère à la postion i | ||||||