© 1996 JMy

LA SEQUENCE.


2. LA SEQUENCE.

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:

lire variables

indiquant la saisie des données

exemples:

lire somme_initiale
lire taux

2° les instructions d'écriture (de sortie) de la forme:

exemple:

écrire expression

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

variable <-- expression

exemple:

intérêt <-- somme-initiale * taux / 100
a <-- 0
i <-- i + 1

Les expressions sont des formules mathématiques symbolisant des opérations sur des variables et/ou des constantes numériques.

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.

é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)"

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

é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

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:

entier variables
ou
réel variables

L'algorithme complété de l'exemple 1 devient:

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)"

Et l'algorithme de l'exemple 2:

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

2.2. Exercices

Pour voir les exercices et les solutions, cliquez ici.

Résumé:
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"


2.3. Traduction en Pascal.

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.0
soit 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.06
soit les deux:
   3.14E+4 vaut 3.14 * 104 = 31400.0
Dans 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"

initiale <-- ""

avec la variable initiale déclarée du type caractère.

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

Page précédente.