0% ont trouvé ce document utile (0 vote)
27 vues41 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.

Transféré par

juniorepale24
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
27 vues41 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.

Transféré par

juniorepale24
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF ou lisez en ligne sur Scribd
ALGORITHMES ET PROGRAMMATION EN PASCAL Cours Algorithmes 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 24 Cours 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 43 Algorithmes 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 7 Cours 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 = << >= > | relation u 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 principal Cours 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 I 28 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 écrire Cours 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 37 38 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