0 évaluation 0% ont trouvé ce document utile (0 vote) 27 vues 41 pages Cours PASCA
Le document présente un cours sur les algorithmes et la programmation en Pascal, couvrant des sujets tels que les variables, les types de données, les procédures, les fonctions et les structures de contrôle. Il détaille également la syntaxe, les déclarations, les expressions et les tableaux en Pascal. Ce cours est structuré pour aider les apprenants à comprendre les concepts fondamentaux de la programmation dans ce langage.
Titre et description améliorés par l'IA
Copyright
© © All Rights Reserved
Formats disponibles
Téléchargez aux formats PDF ou lisez en ligne sur Scribd
Accéder aux éléments précédents Accéder aux éléments suivants
Enregistrer cours_PASCA pour plus tard
ALGORITHMES ET PROGRAMMATION
EN PASCAL
CoursAlgorithmes ct programmation en P:
Table des matiéres
I Les variables en Pascal 6
1 Premiers programmes 6
1.1 Le programme bonjour 6
1.2 Commentaires dans un programme 6
1.3. Utilisation d’une variable entibre 6
1.4 Trace et tableau de sortie 7
1.5. Lecture au clavier d'une valeur 7
2 Identificateur 7
3. Types prédéfinis 8
3.1 Type enticr : integer 8
3.2. Type réel : real 8
3.3. Type caractére : char 9
3.4 Type booléen : boolean 10
4 Déclarations u
4.1 Constantes u
4.2 Variables ot affectation : u
5 Expressions 12
5.1 Syntaxe 12
5.2 Type des expressions bien formées 13
5.3 Regles d'évaluation . 13
6 Nouveaux types 4
6.1 Type intervalle uM
6.2 Type énuméré 15
6.3 Déclarer un type 16
6.4 Type enregistrement 7
Il Procédures 18
1 Procédure sans paramétre 18
1.1 Principe 18
12 Appels 9
1.3. Variables locales 19
14 Portée des variables . 20
1.5. Bffet de bord 20
2 Procédure paramétrée 20
2.1 Pseudo-passage de paramétres 20
2.2 Paramétrage 2
2.3 Comment ga marche 22
24 Bons réflexes . 23
IIIf Les instructions en Pascal 24Cours
Iv
1 Instruction composée
2 Les branchements
2.1 Le test booléen if
2.2 Sélection de cas avec case
3 Les boucles
3.1 La boucle while
3.2 La boucle repeat
3.3. La boucle for
3.4 Choix de la boucle
Fonctions
1 Fonction sans parametre
1.1 Principe
1.2 Appel
1.3. Variables locales
2 Fonction avec paramétres
2.1 Procédure vs fonction
2.2 Passage de types enregistrement
3 Fonction avec plusieurs résultats
4 Gestion d’erreurs
Tableaux
1 Le type array
1.1 Principe
1.2. Contréle des bornes
1.3. Recopie
2 Super tableaux
2.1 Tableaux A plusieurs dimensions
2.2 Tableaux de record
3 Le type string
3.1 Principe
3.2 Opérateurs sur les strings
24
24
25
26
27
aT
28
29
31
32
32
32
32
33
33
34
34
36
38
38
38
39
40
40
40
ai
42
42
43Algorithmes ct programmation en Pascal
Les variables en Pascal
1 Premiers programmes
1.1 Le programme bonjour
Un programme est une suite dinstructions, certaines étant des mots clés.
Co programme affiche la chaine de caractires « Bonjour » & I’écran
PROGRAM bonjour;
BEGIN
writeln (’Bonjour’);
END,
Le compilatour est un logiciel qui lit (analyse) un programme ct Ie traduit en
code machine, directement exécutable par le processeur de ordinateur.
1.2. Commentaires dans un programme
On place un {commentaire} dans un programme au-dessus ou & coté d'une ins-
truction.
Le commentaire n'est pas pris en compte a la compilation. Il sert & rendre le
programme plus clair & la lecture, & noter des remarques, ete
{ Edouard Thiel - 21/01/2003 }
PROGRAM bonjour;
BEGIN
{ Affiche Bonjour & 1’écran }
writeln (’Bonjour’);
END,
1.3. Utilisation d’une variable entiére
Une variable est une zone dans la mémoire vive de l’ordinateur, dotée d’un nom et
d'un type, Le nom de la variable permet d’accéder au contenu de la zone mémoire ;
le type spécifie la nature de ce qui peut étre stocké dans la zone mémoire (entier,
récl, caractire, etc)
On a coutume de représenter une variable par une boite; dessous on met le nom,
au dessus le type, et dans la boite le contenu,
Exemple avec une variable de nom a et de type entier
PROGRAM var_entiere;
VAR
a: integer; { Déclaration }
BEGIN
a { Affectation }
writeln (valeur de a=’, a); { Affichage: a=5 }
END.Cours
La structure de ce programme est en 3 parties : le nom du programme, la partie
déclarations, ot le corps du programme, qui est une suite d’instructions.
La partie déclaration ¢ les variables (les boites) ; leur contenu est indéterminé
(on met un"? dans chaque boite). La taille de la zone mémoire de chaque variable
est adaptée au type (par exemple 1 0 re, 4 octets pour un entier,
ote)
pour un caract
1.4 Trace et tableau de sortie
La trace d’un programme est obtenue en plagant des writeln pour que le pro-
gramme affiche les valeurs des variables & l’exécution, Cela sert pour mettre au point
un programme en TP.
Le tableau de sortie d'un programme est un tableau avec une colonne par va-
tt Pévolution des variables pendant le déroulement du programme.
Demandé en TD et examen.
riable, ot l'on.
1.5 Lecture au clavier d’une valeur
PROGRAM lit_ecrit;
VAR
a: integer;
BEGIN
write (Entrez un entier : ’); { pas de retour chariot }
readla (a); { Lecture }
writeln (valeur de a=’, a);
END.
2 Identificateur
Sert A donner un nom & un objet
Syntaxe
‘On appelle lettre un carac
On appelle digit un caracttre de "0" ..’9
Un identificateur Pascal est une suite de lettres ou de
par une lettre
dre de ’a?..’2? ou?
ou?
igit accolés, commencant
Exemples
S, yf, jour, mois, annee, NeCouleurs, longueur_ligne
Remarques
& Iln’y a pas de différence entre minuscules et majuscules
> Onna pas le droit de mettre d’accents, ni de caractires de ponctuation.
> Un identificateur doit étre différent des mots clés (begin, write, real, ...)
On se sert des identificateurs pour ; le nom du programme, les noms de variables,
les noms de constantes, les noms de types.8 Algorithmes ct programmation en Pascal
3 Types prédéfini
Un type décrit um ensemble de valeurs et un ensemble d’ opérateurs sur ces valeurs
3.1 Type entier : integer
Entier signé en complément & deux sur 16 ou 32 bits, selon machine et compila-
teur : 16 pour Turbo Pascal, 32 pour Delphi
Sur 16 b 768 ... + 32767 (-2" ... +2" - 1)
Sur 32 bits, & valeur dans —2 147 483 648 ... + 2147483647 (—2" ... +25? -1)
a valeur dans —
© Opérateurs sur les entiers
abs(x) valeur absolue de
pred(x) 2-1
suce(x) x41
odd(x) true six est impair, false sinon
sqr(x) le carré de =.
+x identité
-x signe opposé.
x+y addition.
x - y _ soustraction.
x *y multiplication.
x / y division, fournissant un résultat de type réel.
x div y dividende de la division entiére de x par y.
x mod y_ reste de la division entire, avec y non nul
Remarques
© Attention, les opérateurs /, div et mod, produisent une erreur A V'exécution si
y est mul.
> Lorsqu’une valeur (ou un résultat intermédiaire) dépasse les bornes au cours
de Vexécution, on a une erreur appelée débordement arithmétique.
3.2. Type réel : real
Leur domaine de définition dépend de la machine et du compilateur utilisés
On code un réel avec une certaine précision, et les opérations fournissent une
valour approchée du résultat dit « juste ». Il faut donc se méfier
Sous Delphi, weiteln (0.3); affiche 0.299999. .. Ce n’est pas un bug; simple-
ment, 0.3 n'est pas représentable en base 2. En effet, en base 2 il s’écrit 0, 0T0
base 10] 0,3 0,6 1,2 0,4 0,8 16
base2 fo, 0 1 0 0 7Cours 9
Exemples de real
0.0; -21.4E3 (= —21,4 x 10° = —21400
)); 1.234E-2 (= 1,234 x 10-2)
© Opérateurs sur un argument x récl : abs(x), sqr(x), +x, -x
nts est réel, le résultat es
© Si l'un au moins des 2 argu réel pour: x - yx # y,
xy.
* Résultat réel que argument soit entier ou réel : x /y (y doit étre non nul);
fonctions sin(x), cos (x), exp(x), In(x), sqrt (x) (square root, racine carrée)
« Fonctions prenant un argument réel et fournissant un résultat entier : trunc (x)
(partic entire), round(x) (entier le plus proche). Si le résultat n'est pas représen-
table sur un integer, il y a débordement.
3.3. Type caractére : char
Le jeux des caractires comportant les lettres, les digits, l'espa
ete, est codé sur un octet non signé.
e, les ponctuations,
Le choix et Yordre des 256 caract®
langue. Sur PC, on utilise le code ASCII, o& A’ est codé par 65, ’B’ par 66, ’a’
par 97,’ ? par 32, *{? par 123, ete.
Le code ascii est organisé comme suit : de 0 & 31, sont codés les caractéres
de contréle (7 pour le signal sonore, 13 pour le saut de ligne, ete). De 32 & 127,
sont codés les caractéres et ponctuations standards et internationaux. Enfin de 128
& 255, sont codés les caractéres accentués propres a la langue, et des caractéres
iiques.
es possible dépend de la machine et de la
semi-gr
Les opérateurs sur les chars sont
ord(c) numéro d’ordre dans le codage; ici « code ascii ».
chr(a) le résultat est le caractére dont le code ascii est a.
succ(c) caractére suivant c dans l’ordre ascii <> chr (ord(c)+1)
prec(c) caractire précédent c dans l’ordre ascii.
Remarque Il y a erreur A Vexécution si le caractére n'existe pas.
Exomple
PROGRAN caracteres;
VAR
c,d: char;
a): integer;
BEGIN
crs Fy
a ord(c); { 70 }
writeln ("Le code ascii de *, c, ’ est ’, a);
2 i= 122;
c := chr(a); t?z}
writeln (’Le caractere de code ascii ’, a, ’ est ’, c);
a i= succ(e); {7x}
writeln ("Le caractere suivant ’, c, ’ est ’, d);
END.10 Algorithmes ct programmation en Pascal
Exercice Afficher les caractéres de code ascii de 32 a 255 (—> sur écran et sur
imprimante, les résultats sont parfois différents)
Divers
— On peut remplacer chr (32) par #32, mais pas chr (i) par #i
— Le caractire apostrophe se note???
Une suite de caractéres telle que T1 y a? est une chaine de caractéres; il s’agit
d'un objet de type string, que l'on verra plus loin,
3.4 Type booléen : boolean
Utilisé pour les expressions logiques.
Deux valeurs : false (faux) et true (vrai)
# Opérateurs booléens : not (négation), and (et), or (ou)
Exemple
{ Declaration }
petit, moyen, grand : boolean;
{ Instructions }
petit := false;
moyen := true;
grand := not (petit or moyen);
Table de vénité de ces opérateurs
x y__|not x x andy xory
true true |false true true
true false|false false true
false true | true false true
false false| true false false
* Opérateurs de comparaison (entre 2 entiers, 2 réels, 1 entier et 1 réel, 2 chars, 2
booléens)
<>
(6gali
, , A ne pas co:
ndre avec attribution :=), <> (différent)
Le resultat d'une comparaison est un booléen.
On peut comparer 2 booléens entre eux, avec la relation d’ordre false < true.
« En mémoire, les booléens sont codés sur 1 bit, avec 0 pour false et 1 pour
true, De la les relations d’ordre. Les opérateurs booléens not, and, or s’apparentent
approximativement & (I — 2), x, +Cours 1
4 Déclarations
4.1 Constantes
Une constante est désignée par un identificateur et une valeur, qui sont fixés en
début de programme, entre les mots clés CONST et VAR
La valeur ne peut pas étre modifiée, et ne peut pas étre une expression,
Syntaxe
Tdentificateur = valeur_constante;
ou
identificateur : type = valeur_constante;
Dans la premiére forme, le type
sinon un entier; si il y a des quot
t sous-entendu (si il y a un point, c'est un réel,
, c'est un caractére (un seul) ou unc chaine de
caractéres (plusieurs)
Exemple
PROGRAM constantes;
const
faux = false;
entier = 14; { constantes NOMMEES }
reel = 0.0;
chaine = "hop’;
pourcent : real = 33.3; { seconde forme avec type }
VAR
{ variables }
BEGIN
{ instructions }
END
4.2 Variables et affectation
Une variable repr
identificatcur. Toutes les variables doivent étre déclarées apr
ente un objet d'un certain type; cet objet est désigné par un
s le VAR.
yntaxe
Tdentificateur : type;
On peut d
par des virgules (voir exemple ci-dessous)
A la déclaration, les variables ont une valeur indéterminée. On initialise les
variables juste aprts le BEGIN (on ne peut pas le faire dans la déclaration)
Utiliser la valeur d'une variable non initialisée est une erreur grave!
Jarer plusieurs variables de méme type en méme temps, en les séparant
Exemple
VAR
a,b, ¢ : integer;
BEGIN
{ Partie initialisation }12 Algorithmes ct programmation en Pascal
b= 55
{ Partie principale }
ac=b4+c; (ERREUR, c n’est pas affecte’ }
END.
Liopération identificateur := expression; est une affectation. On n’a pas
le droit d’éerire id := id2 := expr , ni expr := id ni expri == expr2
5 Expressions
Une expression désigne une valeur, exprimée par composition d’opérateurs appli-
qués A des opérandes, qui sont : des valeurs, des constantes, des variables, des appels
8 fonction ou des sous-expressions.
Exemple . Etant donné une variable x, une constante max et une fonction cos(),
Thaque Tigne contient. une expression
5
x+ 3.14
2 * cos(x)
(x < max) or (cos(x-1) > 2 * (x+1))
5.1 Syntaxe
Certains opérateurs agissent sur 2 opérandes
operandel operateur_binaire operande2
et autres agissent sur 1 opérande
operateur_unaire operande
# Les opérateurs binaires sont
— opérateurs de relation © << >>8
— opératours additits +- or
— opératours multiplicatifs * / div mod and
‘© Les opérateurs unaires sont
— opérateurs de signe +e
— opérateur de négation not
# Les parenthises sont un opérateur primaire, elles peuvent eucadrer tout opérande
Une fonction est aussi un opératour primaire, elle agit sur l'opérande placé entre
parenthises & sa droite, Certaines fonctions ont plusieurs paramétres, séparés par
des virgules.Cours 3
5.2 Type des expressions bien formées
rsa Va
Une expression doit étre « bien formée » pour que l'on puisse trow
leur. Par exemple, 3 * ’a’ - true n’est pas bien formée, et la compilation Pascal
échouera,
Dans la partie 3, Types prédéfinis, on a déja dit quels opérateurs sont applicables
sur quels types. Mais il y a encore d’autres régles, dont le simple bon-sens!
bel
es d’évaluation de l'ex-
L’expression bien formée a un type, qui dépend des
pression,
Exemple
Soitr un réel, i un entier, e une constante entire, ¢ un caractére, L’expression
(round(r+1) > (i/e)) or (¢ < 'a’)
est bien formée, et sont type est booléen comme on le montre ici
booléen
réel booléen
—
enter entier entier car. ear
(round(T+ TD) > (ED OX) or (E> < Ta)
Remarque
Te fait qu'une expression est bien formée n’implique pas que son évaluation est
sans erreur, ce qui peut étre le cas ici sie est nul
5.3 Régles d’évaluation
L'expression a + b * c est évaluée a + (b * c) et non pas (a + b) * ¢: ceci
parce que le * est prioritaire par rapport A +.
On classe les différents opérateurs par ordre de priorité, les opérateurs de plus
forte priorité étant réalisés avant coux de plus faible priorité
Lorsque deux opérateurs sont de priorité égale, on évalue de gauche & droite. Par
exemple a + b ~ c est évalué (a + b) ~ ¢, et non pas a + (b ~ c)
Voici la table des priorités classées par ordre décroissant, les opérateurs sur une
nt une priorité égale.
méme ligne aya
0 fonction() | primaire
+ - not unaire
* / div nod and | multiplicatif
+> or additif
= << >= > | relationu Algorithmes ct programmation en Pascal
Remarque
Est-ce que expression a Il faut impérativement que le type hote soit codé sur un entier (signé ou non,
sur un nombre de bits quelconque). On dit alors que ce type hate est un type
ordinal
> Ainsi les types integer, char et boolean sont des types ordinaux.
© Soul un type ordinal adi
1 les opérateurs pred, suce et ord (le précédent, le
successeur et le numéro d’ordre dans le codage).
> Par contre le type real n’est pas ordinal, et done on ne pas eréer un type
intervalle avec des récls, il n'y a pas de notion de « récls consécutifs >
© Un autre cas de type non ordinal est le type string pour les chaines de carae-
tres, qui n'est pas codé sur un mais sur plusieurs entiers. On ne peut done pas
déclarer aaa’. .'222‘ours 5
Bomne habitude Utiliser des constantes nommées pour borner les intervalles : de la
sorte on pourra consulter ces valours pendant le programme, et ces bornes ne seront
écrites qu’une scule fois.
100;
pourcentage : PMin .. PMax;
BEGIN
writeln (’L’*intervalle est ’, PMin, ’ .. ’, PMax);
END.
6.2 Type énuméré
IL est {réquent en programmation que Don aie A distinguer plusieurs cas, et que
Von cherche & coder le cas & l'aide d’une variable.
Exemple
VAR
feux : 0..3; { rouge, orange, vert, clignotant }
BEGIN
{i
if feux = 0
then Arreter
else if feux = 1
then Ralentir
else if feux = 2
Lid
END.
Ceci est trés pratique mais dans un programme un peu long cela devient rapide-
ment difficile & comprendre, car il faut se souvenir de la signification du code.
D’oa Vintérét dutiliser un type énuméré, qui permet de donner un nom aux
valeurs de cod
VAR
feux : (Rouge, Orange, Vert, Clignotant);
BEGIN
{... 3
if feux = Rouge
then Arreter
else if feux = Orange
then Ralentir
else if feux = Vert
t..3
END.
© En écrivant cette ligne, on déclare en méme temps
=a variable feux, de type énuméré (toujours codée sur un entier),
—et les constantes nommées Rouge, Orange, Vert et Clignotant.16 Algorithmes ct programmation en Pascal
Aces constantes sont attribuées les valeurs 0, 1, 2, 3 (la premitre constante prend
toujours la valeur 0)
— On ne peut pas choisir ces valeurs soi-méme, et ces identificate
pas déja exister.
— Linté
rs ne doivent
ét n’est pas de connaitre ces valeurs, mais d’avoir des noms explicites
© Le type énuméré tant codé sur un entier, il s’agit d’un type ordinal et on pout
— utiliser les opérateurs pred, suc ot ord (exemple : pred(Orange) est Rouge,
succ (Orange) est Vert, ord (Orange) est 1)
— déclarer un type intervalle A partir d’un type énuméré (exemple : Rouge. . Vert).
6.3 Déclarer un type
Créer un type, c'est bien, mais le nommer, c'est micux. On déclare les noms de
types entre les mots clés TYPE et VAR.
Syntaxe
non_du_type = type;
Exemple
TYPE
couleurs feux.t = (Rouge, Orange, Vert, Clignotant);
VAR
feux : couleurs_feux_t;
De la sorte couleurs_feux_t est un nom de type au méme titre que integer ou
char.
Excmple complet,
PROGRAM portrait;
const
TailleMin = 50; { en cm}
TailleMax = 250;
TYPE
taillet = TailleMin .. TailleMax;
couleurs_t = (Blond, Brun, Roux, Bleu, Marron, Noir, Vert);
cheveux_t = Blond |. Roux;
yeux_t Bleu .. Vert;
VAR
taille_bob, tailleluc : taille_t;
cheveux_bob, cheveux_luc : cheveux_t;
yeux bob, yeux_lue yeux_t;
BEGIN
taille bob := 180;
cheveux_bob := Brun;
yeux_bob Noir;
END.
Remarque Observex bien les conventions d’écriture différentes que j’ai employées
pour distinguer les constantes des types et des variables; cela aussi aide & la lecture.Cours 17
6.4 Type enregistrement
Il s'agit simplement de regrouper des variables V1, V2, ... de différents types Tt,
72, ... dans une variable « & tiroirs ».
Syntaxe
Record
Vi: TH;
v2: 12}
{..3
End;
Soit r une variable de ce type; on accéde aux différents
r.v2,
der par r.V4,
Reprenons l’exemple du programme portrait.
{...
TYPE
{0d
personne_t = Record
taille : taille.t;
cheveux : cheveux_t;
yeux : yeux.t;
End;
VAR
bob, luc : personne_t;
BEGIN
bob.taille := 180;
bob. cheveux := Brun;
bob. youx Noir}
lue '= bob;
END.
Remarque La seule opération globale sur un enregistrement est : recopier le contenu
We r2 dans ri en écrivant : 12 := r1;
Ceci est équivalent (ct plus efficace) que de copier champ & champ; en plus on ne
risque pas d'oublier un champ.
ILy a ume condition : les 2 variables doivent étre exactement du méme type.
Intérét_de ce type
Trpermet de structurer trés proprement. des informations qui vont ensemble, de les,
recopier facilement et de les passer en paramétres A des procédures (on y reviendra)
Lorsquon erée un type 72 & partir d'un type Ti, ce type Ti doit déja exister;
done Tt doit étre déclaré avant T2.18 Algorithmes ct programmation en Pascal
II. Procédures
Une procédure est un sous-programme. Ecrire des procédures permet de déco
un programme en plusieurs morceaux
Chaque procédure définit une nouvelle instruction, que ’on peut appeler en tout
endroit du programme. On peut ainsi réutiliser le code d’un sous-programme.
Lorsqu’on découpe un probléme en terme de procédures, puis qu’on implémente
ces procédures, on fait ce qu’on appelle une analyse descendante : on va du plus
général au détail
1 Procédure sans paramétre
1.1 Principe
Tl s‘agit simplement de donner un nom 4 un groupe d’instructions.
Ensuite, l’'appel de ce nom 4 divers endroits du programme provoque 4 chaque
fois Vexécution de ce groupe d'instructions.
Exemple
PROGRAM exemplet ;
VAR x, y, t : integer;
{ Declaration de la procedure Echange_xy }
PROCEDURE Echange_xy;
BEGIN
{ Corps de 1a procedure }
tisxpxcsyiy rst
END;
BEGIN
{ Progranne principal }
xs3; y 24;
writeln Gx, ?', yds
Echange_xy; {ter appel de 1a procedure }
writeln (x, ?’, y);
Echange_xy; {/2eme appel de la procedure }
writeln (x, * ', y);
END,
34
Ce programme affiche | 43
34
Remarques
> Le nom de la procédure est un indentificateur
© On déclare toute procédure avant le BEGIN du programme principalCours 19
1.2 Appels
On pout trés bien appeler une procédure P1 depuis une procédure P2, mais il faut
que la procédure PA aie été déclarée avant la procédure P2
Exemple donnant le méme résultat.
PROGRAM exemple2;
VAR x, y, t : integer;
PROCEDURE Affiche xy;
BEGIN
uriteln (x, ', ys
END;
PROCEDURE Echange_xy;
BEGIN
osx x
Atfiche xy;
END;
BEGIN
x y
Aftiche_xy;
Echange_xy;
Echange_xy;
END.
Remarque
‘On peut aussi appeler une procédure depuis elle-méme : eest la récurs
Ton n'étudiera pas dans ce module.
1.3. Variables locales
Les objets du programme qui ne sont utiles que dans la procédure peuvent dtre
définis dans les déclarations locales de la procédure.
Excmple Reprenons exemple ct changeons t
PROGRAM exenple3;
VAR x, y : intege:
PROCEDURE Echange_xy;
VAR t : integer; { Declaration locale }
BEGIN
t x y
END;
BEGIN
Lid
END.
— Une variable déclarée localement n’existe que pendant l'exécution de la procédure,
et ne sert que A cette procédure.
= Le programme principal n’a jamais ac
— Une procédure n'a jamais accés § une variable locale d'une autre procédure
— Améliore la lisibilité du programme
bs A une variable locale de procédure.20 Algorithmes ct programmation en Pascal
1.4 Portée des variables
Les variables déclarées dans le VAR du programme principal sont appelées variables
globales. Blles existent. pendant toute la durée du programme et sont accessible de
partout.
Une variable locale & une procédure P, portant le méme nom x qu'une variable
globale, masque la variable globale pendant V'exécution de P.
Exemple
PROGRAM exempleé;
VAR x : integer;
PROCEDURE Toto;
VAR x : integer;
BECTN
uriteln (toto x= 7, x);
END;
PECIN
x= 25
Uriteln (glob x=, x05
Toto:
uriteln (glob x= 7, x);
END.
Webs —o
Ce programme affiche | toto x =4
glob x =2
1.5 Effet de bord
Voici le seénario catastrophe
On est dans une procédure P et on veut modifier une variable x locale & P.
Il existe déjA une variable globale ayant le méme nom x.
On oublie de décla
A la compilation tout va bien!
er la variable locale x au niveau de P.
voy
> A Vexécution, P modifie le x global alors que le programmeur ne l'avait pas
voulu.
0
Conséquence : le programme ne fait pas ce qu'on voulait, le x global a lair de
changer de valeur tout seul!
— Erreur trds difficile & a Aire trés rigoureux et prudent !
tecter
2 Procédure paramétrée
2.1 Pseudo-passage de paramiétres
rivons une procédure Produit qui caleule z = ry.Cours 21
PROGRAM exemple5;
VAR x, y, 2, a, b, ¢, d= real;
PROCEDURE Produit;
BEGIN
zisxty;
END;
On veut se servir de Produit pour caleuler
ab et d= (a~1)(6+1)
BEGIN
write (ab? '); readin (a, b);
{ donnees }
{ resultat }
{ donnees }
{ resultat }
END.
Remarques
> L¥criture est un peu lourde.
© Il faut savoir que la procédure « communique » avec les variables x, y, z
© Cela interdit de se servir de x, y, z pour autre chose que de communiquer avec
la procédure ; sinon gare aux effets de bord!
© Deux sortes de paramétres : données et résultats.
2.2 Paramétrage
La solution élégante consiste & déclarer des paramétres & la procédure
[ Dire que c'est équiv & 2.1; mettre les progs cdte A cote
PROGRAM exenpleSbis;
VAR a, b, c,d: rei
PROCEDURE Produit (x, y : real; var 2: real); { paranetres }
BEGIN
zisxty;
END;
BEGIN
write (ab? ’); readin (a, 6);
Produit (a, b, ©); { passage de }
Produit (a“1,'b+1, a; { parametres }
writeln ('c =’, c, ’d=?, d);
END.22 Algorithmes ct programmation en Pascal
2.3 Comment ca marche
+ A Vappel, on donne des paramitres dans les parenthéses, séparés par des virgules,
et dans um certain ordre (ici a puis b puis c)
L'exécution de la procédure commence; la procédure recoit les paramétres et
identifie chaque paramétre 4 une variable dans le méme ordre (ici x puis y puis 2).
| Dessiner des fléches a x, b — y,e 2]
© Les types doivent correspondre ; ceci est vérifié A la compilation.
# Ilya deux sorte de passage de paramitres : le passage par valeur et le passage
par référence.
© Passage par valeur : A Yappel, le parambtre est une variable on une expression.
C'est la valeur qui est transmis nte
dans la procédure (ici x est initial
., elle sert & initialiser la variable correspon
sé Ala valour de a et y & la valeur de b)
© Passage par référence : A V'appel, le paramétre est une variable uniquement
(jamais une expression). C’est l'adresse mémoire (la référence) de la variable
qui est transmise, non sa valeur. La variable utilisée dans la procédure est en fait
la variable de l'appel, mais sous un autre nom (ici z désigne la méme variable
(zone mémoire) que a)
Crest le mot-clé var qui dit si le passage se fait par valeur (pas de var) ou par
référence (présence du var)
Pas de var = donnée; présence du var = donnée/résultat. | dessiner une double
fleche ¢ —> 2}
Enreurs classique
© Mettre un var quand il nen faut pas : on ne pourra pas passer une expression
en paramétre.
© Oublier le var quand il en faut un : la valeur calculée ne pourra pas « sortir >
de la procédure
(acl, bt, @;
xemples derreurs 4 Pappel de Produ:
PROCEDURE Produit (var x : real; y : real; var z : real);
ne compile pas cause du param@tre 1, oft une variable est attendue et c'est une
expression qui est passée.
PROCEDURE Produit (x, y, z : real);
tion : d ne recoit jamais le résultat z car il s'agit de 2
produit une erreur & Vexécu
variables distinctes.
Portée des variables
dans ExempleSbis, les paramétres x, y, z de la procédure Produit sont des va-
riables locales & Produit.Cours 23
Leur nom n'est done pas visible de lextérieur de la procédure
Attention : redéclarer un paramitre comme variable locale —> erreur & la com
pilation. Exemple
PROCEDURE Produit (x, y : real; var z : real);
VAR
ts real; { déclaration d’une var locale : permis }
x: real; { redéclaration d’un paramétre : interdit }
BEGIN
zisxny;
END;
2.4 Bons réflexes
Le seul moyen pour une procédure de communiquer avec extérieur, c'est & dire
avec le reste du programme, ce sont les variables globales ot les paramétres.
11 faut toujours éviter soigneusement les effets de bords. Le meilleur moyen est de
paramétrer complétement les procédures, et d’éviter la communication par variables
globales,
Les variables de travail tels que compteur, somme partielle, ete doivent étre locales
A la procédure, surtout pas globale
Prendre Vhabitude de prendre des noms de variables différents entre le pro-
gramme principal et les procédures : on détecte plus facilement & la compilation
les effets de bords
Chague fois que Yon appelle une procédure, on vérifie particulidrement le bon
ordre des parambtres ot la correspondance des types. La compilation est trés poin-
tilleuse sur les types, mais par contre elle ne détecte pas les inversions de parambtres
de méme type.24 Algorithmes ct programmation en Pascal
III. Les instructions en Pascal
1 Instruction composée
Une instruction spécifie une opération ou un enchainement d’opérations & exécuter
sur des objets.
Les instructions sont séparées par des ; ct sont exécutées séquentiellement, c'est-
a-dire l'une aprés autre, depuis le BEGIN jusqu’au END. fina
Instruction dgja vue
~aie8 affectation
=writeln (Bonjour’) affichage
readin (x) lecture
—ma_procedure (parametres) appel procédure
Plus généralement Soient I1, 12, ete, des instructions,
© On fabrique dans la suite de nouvelles instructions
if expr then It
while test do Tl
—ete
© Ilest possible de regrouper l’enchainement
unique en Pencadrant entre un begin et un end
begin I1; 12; 13; end
On ve
faire 11 puis 12 dans un if.
————
— ———=
_— aS
if Bthen 11 ;12; if B then begin Il ;I2 end
(on met des accolades sur les instructions).
» Dans la 1° forme, 12 ne fait pas partie du if, dans la 2" oui.
2 Les branchements
Fant donné une expression et plusieurs instructions, la valeur de expression va
déterminer laquelle de ces instructions exécuter.
En Pascal il y a2 types de branchements, le if et le case.‘ours 25
2.1 Le test booléen if
Liinstruction ci-dessous prend 2 formes, elle signifie si... alors ... sinon.
if B then 11;
if B then I1 else 12;
B est une expression booléenne,
et 12 sont des instructions
sion B est évaluée; si elle est vraie, alors I1 est exécutée, sinon 12 est,
Remarque On peut se passer de else en n'employant que des if then, mais c'est
Toins efficace, et on peut facilement se tromper : I’exemple suivant ne donne pas les,
mémes résultats!
{ sans else }
ifa=1thena
if a1 thena
{ avec else }
if a= 1 then a:
else a
= 3;
On peut imbriquer des if then else de différentes manitres
{ forme 1} { forme 2}
if Bt if BL
then It then if B2
else if B2 ‘then Ia
then 12 else Ib
else if B3 else if BS
then 13 then Te
else Tautre; else Id;
Ragles
> In'y a jamais de ; avant le else
© Le else se rapporte toujours au dernier then rencontré
Probléme Dans la deuxieme forme, comment supprimer l'instruction Ib?
On ne peut pas simplement supprimer la ligne else Ib, car alors le else if B3
se rapporterait & then Ta.
On ne pent pas non plus rajouter un ; car il y a un else aprés,
La solution consiste 4 « protéger > if B2 then Ta; dans un begin end
if BL
then begin
if B2
then Ia;
end
else if BS
then Ie
else 1d;26 Algorithmes ct programmation en Pascal
Remargue Il faut faire trés attention aux tests multiples, imbriqués ou non, et étre
Tats rigowteux dans I'écriture. La rdgle est d’indiquer entre {} le cas précis dans
Tequel on se trow
{ forme 1) { forme 2}
if BL if BL
then { B1 > then if B2
then { B1 et B2 }
else Ia
then et B2 } else { B1 et 'B2 }
To
else else if B3
then et 1B2 et B3 } then { !B1 et B3 }
Ie
else { 'Bi et 'B2 et 1B3 } else { !B1 et !B3 }
Tautre; Ta;
2.2 Sélection de
aS avec case
Syntaxe
ease E of
CL: Ia;
2: Tb;
C3, C4! Ic; { liste }
CS:.C6: Id; { intervalle }
fo.
else autre; { en option }
end;
Cotte instruction signifiant choix selon permet d’exécuter l'une des instructions
Ix selon le cas E.
E est une expression ordinale (dont le type est un entier, un caractére, un booléen,
ou un énuméré, mais pas un réel ni une chaine de caracttres). Le
) Cx sont des
constantes ordinales du méme type que E.
Comment ga marche E est évalué. Ensuite, est recherchée parmi les valeurs possibles
Gx, laquelle est Ggale & E. L’instruction correspondante Ix est alors exécutée. Sinon,
Vinstruction aprés le else (s'il y en a un) est exécutée.
‘© On peut donner une liste de constantes, ou des intervalles de constantes.
Attention, chaque sible ne doit étre représentée qu'une fois au plus
(sinon il ya erreur & Ja compilation). Par exemple, on ne peut pas faire des intervalles
se chevauchant, comme 3..6 et 5. .10, les cas § et 6 tant représentés 2 fois.
leur p
© exemple donné ci-dessus est équivalent & une forme en if then else imbriqués.
V r= E; { evalue’ une seule fois au debut }
af V='C1 then Ia
else if V = C2 then Ib
else if (V = C3) or (V = C4) then Ic
else if (V >= C5) and (V <= C6) then Id
else lautre;Cours 27
— On préfire la forme avec le case, qui est plus lisible et plus efficace.
Exerci
Re
e Fexemple sur les feux du §1.6.2, (Type énuméré) avec un case.
Exemple comp!
Ecrire un programme qui lit un caractire, puis classe ce caractdre comme espace,
lettre, digit ou autre.
PROGRAM caractere;
TYPE
nat_t = (Espace, Lettre, Digit, Autre);
VAR
nat : matt; {nature }
©: char;
BEGIN
write (’Rentrez un caractere :’);
readla(c);
{ analyse de ¢ }
case ¢ of
Yah 2), AOD, 11: nat r= Lettre;
1999 nat := Digit;
on nat := Espace;
else nat := Autre;
end; { case ¢ }
{ affichage de nat }
case nat of
Espace : writeln (’Espace’);
Lettre : writeln (’Levtre’);
Digit : writen (’Digit’);
Autre : writeln (’Autre’);
else { case nat }
writeln (’Erreur case nat : ’, ord(nat), ? non prevu’);
end; { case nat }
END.
Bonnes habitudes
> Apras le else et le end, marquer en commentaire qu’ils se rapportent au case.
> Faire afficher un message d’errour apris le else : aide A la mise au point du
programme.
3 Les boucles
3.1 La boucle while
Cette instruction signifie fant que, Elle permet de répéter lexécution dune ins-
truction de boucle I28 Algorithmes ct programmation en Pascal
(*) B est évaluée. Si B est vraie, alors I est exécutée, et on recommence depuis
Remarques
© Les variables de l’expression B doivent étre initialisées avant le while, pour que
au premier passage B puisse étre évalué.
> Le while continue de boucler tant que B n’est pas faux. Pour éviter une boucle
infinie, qui « plante » le programme, il faut obligatoirement que dans I il y
aie une sous-instruction rendant B faux A un moment donné.
Excmple Programme calculant la somme des nombres de 1 A 100.
PROGRAM Sonme;
VAR
5, k : integer;
BEGIN
© On se sert souvent d’un booléen dans une boucle while
continuer := true;
while (k <= 100) and continuer do
begin
C...3
if (... ) then continuer := false;
end;
3.2 La boucle repeat
Cotte instruction signifie répéter ... jusqu’é . Elle permet comme le while de
répéter l'exécution d'une instruction de boucle I
yntaxe
repeat I; until B;
B est une expression booléenne.
(x) Lest exécutée, puis B est évaluée, Si B est vraie, alors on s’arréte, sinon on
(+)
recommence de]Cours 29
Différences avec while
© Liinstruction I est exécutée au moins une fois
> Le test B étant évalué aprés T, B peut tre allecté dans T. Pour le while il faut
avoir initialisé B avant.
© Pas besoin d’encadrer un groupe d'instructions par un begin end, le repeat
until joue déja ce réle.
Exemple Le while de Somme s'écrit avec un repeat
8 := 0; k
repeats
k i= k + 1; until k > 100;
Traduction d'une boucle while B do I; avec un repeat
if B then
repeat
Tj
until not By
‘© On se sert souvent dun booléen dans une boucle repeat
repeat
{..}
arreter :=
until (k > 100) or arreter;
3.3 La boucle for
Cette instruction signifie pour. Elle permet de répéter Vexécution d'une instruc-
tion de boucle
:= El to E2 do I;
k est le compteur de boucle, E1 et E2 sont les bornes inférieures et supérieures.
E1 et E2 sont des expressions ordinales, du méme type que la variable k.
E1 et E2 sont d’abord évaluées, puis k prend la valeur E1. (+) Sik <= E2, alors I
émenté de 1, et on recommence depuis (+)
est, exéeutée, puis k est inci
© Pour avoir une boucle décroissante, on écrit,
for « := E2 downto El do I;
© On peut écrire une boucle for k := El to E2 do I; avec un while
1; { init de k }
m:= £2; { on evalue &:
while k <= m do
begin
une fois pour toutes }
end;30 Algorithmes ct programmation en Pascal
© On en déduit lécriture d'une boucle for k := E1 to E2 do I; avec un repeat
x { iit de k }
5 } (on evalue £2 une fois pour toutes }
if k <='m then
repeat
T;
kis ket;
until k > m
Remarqu
© Liinstruction de boucle I n'est pas exéeutée du tout si E1 > E2
> Modifier pendant la boucle la valeur de E1 ou E2 n’a pas effet.
© Mest totalement interdit de modifier la valeur du compteur k dans le corps de
la boucle
> L'inerément de 1 n'est pas modifiable (contrairement au Basic avec step)
> Ala fin de Pexécution de la boucle, la variable k redevient indéterminée : elle
a une valeur qui dépend du compilateur. Par exemple sous Delphi, elle vaut
E241, et sous Turbo Pascal 7.0, elle vaut £2
xemple d’application des régles : dire la valeur affichée [c'est 10240 ]
ais 5)
for i != a to ati0 do a := a42;
writein(a);
Exemple Le while de Somme s'écrit avec un for
for k '= 1 to 100 dos =e + kj
© On peut bien entendu imbriquer des boucles
PROGRAM table_multiplication;
VAR
i, js integer;
BEGIN
for i := 1 to 10 do
begin
for j := 1 to 10 do write (isj : 3);
writeln;
end;
END.
begin
write Cis} : 3);
if j = 10 then writeln;
end;Cours 31
3.4 Choix de la boucle
La régle est
aple (I'apprendre par caxur)
Si le nombre d'itérations est connu a priori, alors on utilise un for.
Sinon : on utilise le repeat (quand il y a toujours at moins une itération), ow le
while (quand le nombre d’itérations peut étre nul)32 Algorithmes ct programmation en Pascal
IV. Fonctions
Une fonction est une procédure qui renvoie un résultat, de manire & ce qu’on
puisse l'appeler dans une expression.
Exemples y := cos(x) + 1; ¢ := chr(x + ord(’0’));
1 Fonction sans paramétre
1.1 Principe
Syntaxe
‘FUNCTION nom_fonction : type_resultat;
BEGIN
{ ... corps de 1a fonction ... }
{ Résultat de la fonction, du type type_resultat }
nom_fonction := expression;
END;
La nouveauté par rapport & une procédure est que l'on « sort » le résultat de la
fonction nom_fonction en écrivant une affectation sur son nom,
Attention
© nom_fonction n’est pas une variable, et A V’intérieur de la fonction il ne faut
surtout pas I'utiliser dans une expression, car ccla provoquerait un appel récursif
© Une fonction doit toujours avoir un résultat (i.e on ne peut pas le laisser indéter-
miné)
1.2 Appel
PROGRAM ext;
VAR x : type_resultat;
{ ici déclaration de 1a fonction }
BEGIN
{ appel fonction et stockage du résultat dans x }
x 1= nom fonction;
END.
1.3. Variables locales
FUNCTION nom_fonction : type_resultat;
VAR locales : types_locales;
BEGIN
{2.3
nom_fonction := expression; { du type type_resultat }
END;Cours 33
Bonne habitude
Passer par une variable locale res ; on fait ce qu’on vout de res dans la fonction,
et a la fin de la fonction on écrit nom_fonction := res;
FUNCTION nom_fonction : type_resultat;
VAR res : type_resultat;
BEGIN
{ ... dans le corps, on fait ce qu’on veut de res ...}
{ on dit que le résultat est res }
2 Fonction avec paramétres
Syntaxe
FUNCTION nom_fonction ( parametres : types_parans ) : type_resultat;
VAR locales : types_locales;
res : type_resultat;
BEGIN
Tout ce que Yon a dit sur le paramétrage des pro
fonctions.
édures reste valable pour les
2.1 Procédure vs fonction
xemple du produit
PROGRAM exempleSter;
VAR a, b, c, d: real;
PROCEDURE Produit (x, y : real;
FUNCTION Produit (x, y : real) : real;
var 2: real);
VAR res : real;
1
i
BEGIN | BEGIN
Zisx*y; 1 res :
END; i Produit
| END;
BEGIN
write (ab? '); readin (a, b);
Produit (a, b, c); 1 ¢ i= Produit (a, b);
Produit (a“1, b+, d); i @ i= Produit (a1, b+);
writeln Ce =
END.34 Algorithmes ct programmation en Pascal
2.2 Passage de types enregistrement
Exemple On veut savoir si un couple d’amis est assorti. On fixe les régles suivantes
Te couple est assorti si ils ont moins de 10 ans d’écart, ou si le mari est agé et riche.
PROGRAM assorti;
TYPE
humain_t = Record
age, taille ; integer;
riche boolean;
End;
couple_t = Record
homme, ferme : humain_t;
nb_enfant integer;
End;
FUNCTION difference_age (h, f : humain_t) : integer;
VAR res : integer;
BEGIN
res := abs (h.age - f.age);
difference_age := res;
END;
FUNCTION couple_assorti (c : couple_t) : boolean;
VAR res : boolean;
BEGIN
res := false;
if difference_age (c.honme, c.femme) < 10 then res := true;
if (c.honme.age > 75) and ¢.honme.riche then res := true;
couple_assorti := res;
END;
VAR amis : couplet;
BEGIN
{2.3
write (Ce couple avec °, amis.nb_enfant, ’ enfant(s) est ');
if couple_assorti (amis) then writeln (’assorti.’)
else writeln (non assorti.’);
END.
3 Fonction avec plusieurs résultats
Tl est fréquent que l'on écrive une fonction qui renvoie un booléen qui dit si tout
s'est bien passé, tandis que les vrais résultats sont. passés dans les parambtres.
Exemple Une fonction qui prend une lettre, la met en majuscule ou renvoie une
‘trrour si le caractére n’est pas une lettre.
FUNCTION majlettre (lettre : char;
var maj: char) : boolean;
VAR res : boolean;
BEGIN
{ init }
naj := lettre;
res := true; { pas d’erreur }Cours 35
case lettre of
’a?.. 72? : maj r= chr(ord(lettre) - ord(’a’) + ord(?A’));
ma lar ss Crien F
else res := false;
end; { case lettre }
maj_lettre := res;
END:
L'appel de cette fonction
VAR c, m : char;
BEGIN
readln (c);
if maj_lettre (c,m)
then writeln (’La majuscule de’, ¢, ’ est ’, m)
else writeln (’Le caractére ’, c, ’'n’’est pas une lettre’);
END.
Autre avantage : on fait tous les afficl
fonction.
L messages (erreur en dehors de la
Exemple [non vu en cours faute de temps ]
On veut caleuler 7'=% =k or il risque d’y avoir des divisions par 0.
On éerit @abord une fonction cale qui renvoie un booléen qui dit si le caleul de
ziy
satep @ pu se faire, tandis que le résultat numérique est passé en parambtre z
FUNCTION cale ( x : integer;
y i real;
var 2: real’ ) : boolean;
VAR ok : boolean;
@ : real;
BEGIN
ok := true; { init pas d’erreur }
4 2 cos (xy):
ita = 0.0
then ok
else z=
false { division par 0 }
Gey) / 4; { resultat numerique }
calc := ok;
END:
On écrit ensuite une fonction sonme qui appelle calc.
FUNCTION somme (a, b : integer;
x real) : real;
VAR res, f : real;
i : integer;
BEGIN
res := 0.0; { init somme a 0 }36 Algorithmes ct programmation en Pascal
for i := ato b do
if calc G, k, 1)
then res := res + ¢;
END; : :
L’appel de cette fonction
VAR ga, gb : integer;
gk, gs : real;
BEGIN
readin (ga, gb, gk:
gs := sonme (ga, gb, gk);
writeln (gs);
END.
Exercice
— Modifier la fonction sonme pour que elle renvoie un booléen disant que tous les
calculs de la somme ont pu se faire, tandis que le résultat numérique est passé en
paramétre.
— Adapter le programme principal appelant somme
4 Gestion d’erreurs
[non vu en cours, tombe un peu & plat .. ]
On veut généraliser usage de fonctions renvoyant un code d’erreur, et dont les
résultats sont passés en parame
0s,
— Soient F1, F2, ete, de telles fonctions renvoyant un booléen.
= Soit ok un booléen,
‘oient I1, 12, ete, des instructions
Considérons la séquence d’instruction suivante
On veut exéeuter co traitement, mais l'interrompre dés qu'il y a une erreur
On devrait normalement écrireCours
Thy
if'Fi(...)
then begin
12;
if F2 (2.2)
then begin
13;
if F3 (2. )
then begin
14;
{i..}
end;
end;
C'est lourd, on se perd rapidement dans tous ces begin end,
Il est beaucoup simple d’éerire
Th;
ok':= Fi (...)
af ok then
begin
12;
ok i= F2 (2.5
end;
if ok then
begin
13;
ok i= F3.( ... 5
end;
Af ok then
begin
14;
Ci..3
end;
aucun bloc suivant n'est exéeuté
Dés que ok est faux, plus
3738 Algorithmes ct programmation en Pascal
V. Tableaux
Les tableaux permettent de manipuler plusieurs informations de méme type, de
leur mettre un indice : la 1 info, la 2°” info, ..., la i#”* info,
Tls sont stockés en mémoire centrale comme les autres variables, contrairement
aux fichiers qui sont stockés sur le disque
Une propriété importante direct aux don-
nées, grace & indice
es tableaux est de permettre un ac
On appelle souvent vecteur un tableau en une dimension
1 Le type array
1.1 Principe
array (I ] of T
I étant un type intervalle, et T un type quelconque.
Ce type définit un tableau comportant un certain nombre de cases de type T,
chaque case est repérée par un indice de type I
Exem
TYPE vec_t = array [1
VAR v : vec_t;
10] of integer;
v est un tableau de 10 entiers, indieés de 1 & 10.
indice 12 34 6 7 8 9 10
> Ala déclaration, le contenu du tableau est indéterminé, comme toute variable.
> On accéde a la case indice 1 par v(i] (et non v(i))
> Pour mettre to
for i
Remarque L'intervalle du array peut étre de tout type intervalle, par exemple 1. .10,
’a’..?’z’, false. .true, ou encore un intervalle d’énumérés Lundi . . Vendredi.
On aurait pu déclarer vecteur comme ceci (peu d’intérét)
TYPE interv
1..10 ; vec.t = array [ interv ] of integer;Cours 39
1.2 Contréle des bornes
ILest en général conseillé de repérer les bornes de l'intervalle avec des constantes
nommées : si on décide de changer une borne, cela est fait A un seul endroit dans le
programme.
Liécriture préconisée est done
CONST vec_min = 1; vec_max = 10;
TYPE vec_t = array [vec_min..vec.max] of integer;
Régle 1
I est totalement interdit d’utiliser un indice en dehors de l'intervalle de déclara-
tion, sinon on a une erreur A Pexécution.
I faut done étre trés rigoureux dans le programme, et ne pas hésiter A tester si
un indice i est correct avant de se servir de v(i]
une valeur dans le ve
Exemple Programme demandant rentr
CONST vec_min = 1; vec.max = 10;
TYPE vec_t = array [vec_min,.vec_max] of integer;
VAR v ; vect_t; i : integer;
BEGIN
write (i? *); readin(i);
if (i >= vec_min) and (i <= vec_max)
then begin
write ('v[’, i, ’] 7 '); readin(w[i]);
end
else writeln (’Erreur, i hors intervalle ’,
vec_min, » vec_max) ;
END.
le 2 Le test d'un indice i et de la valeur en cet indice v{i] dans la méme
‘cxpression sont interdits.
Exemple
if (4 >= vee.min) and (i <= vec_max) and (v[i] © -1) then
else 1.3
done si (4 <= vec_max), le
alors méme que l'on sort du vecteur!
Une expression est toujours évaluée on intégralité
test (v[i] <> -1) sera quand méme effectué,
Solution : séparer expression en 2
if (i >= vec_min) and (i <= vec_max)
then if (v[i] © -1) then
else
else ... { erreur hors bornes } ;40 Algorithmes ct programmation en Pascal
1.3 Recopie
En Pascal, la seule opération globale sur un tableau est : recopier le contemu d'un
tableau vi dans un tableau v2 en écrivant : v2 := v1;
Ceci est équivalent (et plus efficace) que
for i := vec_min to vec_max do v2[i] := vila];
eaux doivent étre ezactement de méni
ILy a une condition : les 2 t
issus de la méme déclaration,
typ
TYPE
veck = array [1..10] of char;
vecB = array [1..10] of char;
VAR
vi: vech; v2 : vech; v3 : vecB;
BEGIN
v2 := v1; { legal car meme type vecA }
v3 := vi} { illegal, objets de types <> vecA et vecB }
2 Super tableaux
Quelques types un peu plus complexes & base de tableaux, et de combinaisons
entre types,
2.1 Tableaux a plusieurs dimensions
Exemple : dimension 1 = vecteur; dimension 2 = feuille excel; dimension 3 =
classeur excel | faire petit schéma |
On peut eréer des tableaux & plusieurs dimensions de plusieurs manidres
Faire des schémas
evi: array [1..10] of array [1..20] of real
— Tableau de 10 éléments, chaque élément étant un tableau de 20 réels.
On accdde & Pélément d'indice i dans 1..10 et j dans 1..20 par v1 [4] (5)
© v2: array [1..10, 1..20] of real
—+ Tableau de 10 x 20 réels.
On accéde 4 l’élément d'indice i dans 1..10 et j dans
20 par vali, j)
Exemple Mise A 0 du tableau v2.
VAR
v2: array [1..10, 1..20] of real;
i, jt integer;
BEGIN
for i := 1 to 10 do
for 1 to 20 do
v2li,j] 1= 0.0;
END.Cours al
2.2 Tableaux de record
On peut créer des tableaux d’enregistrements, ot des enregistrements qui contiennent
des tableaux.
PROGRAM Ecole;
const
MaxEleves = 35;
MaxNotes = 10;
TYPE
note_t = array [1..MaxNotes] of real;
eleve_t = Record
age, nb_notes : integer;
notes : note_t;
moyenne : real;
End;
classe_t = array [1..MaxEleves] of eleve_t;
VAR
c: classe.t;
nb_eleves, i, j : integer;
BEGIN
{2.3
for i := 1 to nb_eleves do
begin
writeln (’Eleve n.’, i);
writeln (° age :'*, cli] age);
write (notes =’);
for j := 1 to cli] .nblnotes do write (? ’, cli] notes{j]);
writeln;
writeln (° moy : ’, c[il-moyenne);
end;
END.
© On a comme d’habitude le droit de faire une copie globale entres variables du
mime type
VAR cl, c2 : classe_t;
@ :elevet; i, j : integer;
BEGIN
{ copie globale de type classe_t }
e2 := ct;
{ échange global de type eleve_t }
e:= citi}; cifid s= et fj]; ctfj) v=
END.
# Exemple de passages de paramitres : on écrit une procédure affichant. un eleve_t
PROCEDURE affi_eleve (e : eleve_t);
VAR j : integer;
BEGIN
writeln (? age: ?, e.age);
write (’ notes : *);
for j := 1 to e.nb_notes do write (e.notes[j]);
writeln;
writeln ( moy
END;
>, e.moyenne) ;42 Algorithmes ct programmation en Pascal
BEGIN
{2.2}
for i := 1 to nbeleves do
begin
writeln (’Eleve n.’, i);
-eleve (cli]);
affi_eleve(e) ne connait pas le numéro de V’éléve; 'appelant, lui, connait le
numéro, et laffiche avant Papel
On peut encore écrire une procédure affi_classe
PROCEDURE affi_classe (c : classe_t ; nb : integer);
VAR i: integer;
BEGIN
for i := 1 to mb do
begin
writeln (’Eleve n.’, i);
affi_eleve (cli]);
end;
END;
BEGIN
{od
affi_classe (c, nb_eleves);
END.
3 Le type string
On code une chaine de caractéxe telle que "bonjour? dans un objet de type
string.
3.1. Principe
xe string [n]
OUm est une constante entire donnant le nombre maximum de caractéres pouvant
étre mémorisés. Exemple
VARs : string[80];
BECIN
5 := Le ciel est bleu.’;
writeln (s);
END.
Codage
‘Ayant déclaré s : string[80], comment sont codés les caractires?
En interne, Pascal réserve un array [0..80] of char.
Le premier caractére est s[1], le deuxitme est s [2], ete
La longueur courante de la chaine est codé dans la case 0 (—+ ord(s{0]))Cours 43
Remarque
“J Affecter une chaine plus longue que lespace réservé A la déclaration est une
erreur
— Comme la longueur courante est codée sur un char, elle est limitée A 255,
3.2 Opérateurs sur les strings
a Chaine vide (longueur 0)
a Recopie de b dans a
a Concaténation en une seule chaine. ¢ et d de types
string ou char ; le résultat est un string
length(a) Longueur courante de a, résultat entier.
CONST Slogan = ‘lire 1a doc’;
VAR) st, 82: string(100) ;
af antege:
BEGIN
si *veuillez ’;
82 := si + Slogan}
writeln (s2 ="), 82, 117);
wriveln (*Longueur courante de s2 : °, lengch(s2) );
write (Indices des ’’1’’ dans s2 : ');
for i := 1 to length(s2) do
if s2[i] = '1’ then write(i, ’ ’);
writela;
END
Comparaison entre 2 string : les opérateurs =, <>, <, >, <=, >=, sont utilisables, et
La comparaison se fait selon Vordre lexicographique du code ASCIL
Soit b un booléen; b est-il vrai ou faux?
Exemp!
OA la vanille’ < ’Zut?; { vrai }
*bijou’ < 'bidon’; { faux, c’est > car °j’ > ’d’ }
*Bonjour’ = ‘bonjour’; { faux, c’est < car °B < 'b’ }
* zim boum’ > ’attends 1°; { faux, c'est < car?’ < ’a’ }
Exercice On considére le type LongString suivant.
CONST longStringMax = 4096;
TYPE LongString = record
¢ : array [1..LongStringMax] of char;
1: interer; { longueur courante }
end;
Ecrire les procédure ct fonctions suivantes
FUNCTION longueur (si : LongString ) : integer;
FUNCTION est_inferieur (st, 2 : LongString ) : boolean;
FUNCTION est_egal (si, 2 : LongString ) : boolean;
PROCEDURE concatene (st, s2 : LongString ; var s3 : LongString);
Vous aimerez peut-être aussi