INTRODUCTION À LA PROGRAMMATION INF 1200
Transcription
INTRODUCTION À LA PROGRAMMATION INF 1200
INTRODUCTION À LA PROGRAMMATION INF 1200 COMPLÉMENT D’INFORMATION Dernière mise à jour : 12 décembre 2002 Le « Complément d’information » contient des informations supplémentaires sur le langage de programmation PASCAL/DELPHI 3. Principalement, ces informations supplémentaires portent sur les notions de base, sur les types de données, sur les opérateurs, sur les instructions de lecture et d’écriture, sur les tableaux et les enregistrements, sur les structures itératives, sur les procédures, sur les fonctions et sur les unités du langage PASCAL. Télé-université 2000 TABLE DES MATIÈRES 1. Structure d’un programme........................................................................................................1 1.1 PROGRAM.....................................................................................................................1 1.2 USES...............................................................................................................................1 1.3 LABEL............................................................................................................................2 1.4 CONST............................................................................................................................2 1.5 TYPE...............................................................................................................................2 1.6 VAR ................................................................................................................................3 1.7 Sous-programme .............................................................................................................3 1.8 BEGIN.............................................................................................................................3 1.9 Instructions du programme principal ..............................................................................4 1.10 END ................................................................................................................................4 1.11 Point-virgule....................................................................................................................4 1.12 Commentaires .................................................................................................................5 2. TYPES DE DONNÉES DU LANGAGE PASCAL.................................................................6 2.1 Type Entier......................................................................................................................6 2.2 Type Réel ........................................................................................................................7 2.3 Type Caractère ................................................................................................................8 2.4 Type Booléen ..................................................................................................................9 2.5 Type Énuméré .................................................................................................................9 2.6 Type Intervalle ..............................................................................................................10 2.7 Type Ensemble..............................................................................................................11 2.8 Chaîne de caractères......................................................................................................12 2.9 Variables .......................................................................................................................13 2.10 Constantes .....................................................................................................................14 3. OPÉRATEURS ......................................................................................................................16 3.1 Opérateurs arithmétiques ...............................................................................................16 3.2 Opérateurs relationnels ..................................................................................................17 3.3 Opérateurs booléens.......................................................................................................18 3.4 Opérateurs des ensembles..............................................................................................19 3.5 Expression .....................................................................................................................21 3.6 Instruction d’affectation.................................................................................................23 3.7 Manipulation des chaînes ..............................................................................................24 4. LES INSTRUCTIONS DE LECTURE ET D’ÉCRITURE....................................................27 4.1 Lecture ...........................................................................................................................27 4.2 Remède pour les lectures impossibles ...........................................................................28 4.3 Écriture ..........................................................................................................................29 © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION ii 5. LES TABLEAUX ET LES ENREGISTREMENTS..............................................................36 5.1 Les tableaux ...................................................................................................................36 5.2 Les enregistrements .......................................................................................................38 5.3 Les pointeurs..................................................................................................................39 6. LES STRUCTURES de contrôle............................................................................................40 6.1 Instruction IF. . THEN . . . ELSE..................................................................................40 6.2 Instruction CASE .. OF .................................................................................................43 6.3 Boucle WHILE .. DO....................................................................................................43 6.4 Instruction WHILE NOT EOF(fichier) DO ..................................................................47 6.5 Boucle REPEAT. . UNTIL ...........................................................................................48 6.6 Boucles FOR .................................................................................................................51 7. LES PROCÉDURES ..............................................................................................................53 7.1 Variables globales .........................................................................................................54 7.2 Variables locales ...........................................................................................................54 7.3 Appel de procédure .......................................................................................................54 7.4 Transmission de paramètres..........................................................................................54 8. LES FONCTIONS..................................................................................................................58 8.1 Variables globales .........................................................................................................59 8.2 Variables locales ...........................................................................................................59 8.3 Appel des fonctions.......................................................................................................59 9. UNITÉS ..................................................................................................................................60 Bibliographie .................................................................................................................................63 © Télé-université, 2003 Introduction à la programmation INF 1200 1. STRUCTURE D’UN PROGRAMME Tout programme en PASCAL possède la structure suivante : PROGRAM Nom_Programme; USES LABEL CONST TYPE VAR En-tête du programme Liste_Unites; Liste_Etiquettes; Liste_Constantes; Liste_Types; Liste_Variables; Partie de la déclaration du programme Partie de déclarations des SOUS-PROGRAMMES (Procédures et fonctions) BEGIN Bloc principal du programme Instructions du PROGRAMME PRINCIPAL END. 1.1 PROGRAM L’en-tête du programme comprend un mot réservé et le nom du programme. Voyons un exemple : PROGRAM Nom_Programme; PROGRAM : Mot réservé du langage. Nom_Programme : Nom du programme choisi par le programmeur. Le programmeur pourrait choisir : PROGRAM Structure_Programme; 1.2 USES Cette instruction indique au compilateur quelles sont les bibliothèques de fonctions et de procédures qui doivent être compilées dans le programme final; l’environnement DELPHI 3 en inclut certaines automatiquement. Si vous écrivez votre propre programme, vous devez inclure leur nom lorsque vous avez besoin des fonctions qu’elles contiennent. USES Liste_Unites; Exemple : © Télé-université, 2003 USES FORMS; ... Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 1.3 2 LABEL LABEL est une suite de chiffres, dans l’intervalle 0 à 9999. Les zéros non significatifs sont ignorés. Les labels sont utilisés avec l’instruction GOTO. LABEL Liste_Etiquettes; EXEMPLE 1.1 PROGRAM Exercice1; USES FORMS; {$R *.RES} VAR Division : char; LABEL ICI; BEGIN ICI : WRITELN ('Bonjour'); WRITELN ('Voulez-vous exécuter une autre fois?'); READLN (Division); IF (Division = 'o') THEN GOTO ICI; READLN END. Les instructions GOTO et LABEL ne sont pas obligatoires et sont très peu utilisées dans un programme PASCAL. 1.4 CONST Cette instruction permet de définir les constantes utilisées dans le programme. CONST Liste_Constantes; Exemple : CONST Pi = 3.14159; Cette instruction est optionnelle dans un programme PASCAL. 1.5 TYPE Le mot clé sert à déclarer les nouveaux types inventés par le programmeur. TYPE Liste_Types; Exemple : TYPE Inter = 1 . . 10; Réponse = (Oui, Non); Cette instruction est optionnelle dans un programme PASCAL. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 1.6 3 VAR Les variables sont des noms donnés à une adresse en mémoire, permettant ainsi de consulter ou de modifier le contenu de cette dernière. VAR Liste_Variables; Exemple : VAR Valeur : INTEGER; Fin, Début : BOOLEAN; Cette instruction est optionnelle dans un programme PASCAL. 1.7 Sous-programme Cette partie se trouve entre la partie de déclaration et le bloc principal du programme. Voyons un exemple de déclaration des SOUS-PROGRAMMES (Procédures, Fonctions) d’un programme en PASCAL. EXEMPLE 1.2 PROGRAM Exercice2; USES FORMS; {$R *.RES} VAR Nom, Prenom : STRING[8]; NouveauNom : STRING[8]; Nouveauprenom : STRING[8]; Partie de la déclaration PROCEDURE ChangementPrenom; BEGIN Nom:='Rivard'; Prenom:='Joséphine-Baquère'; NouveauPrenom:='Angéline'; WRITELN('Le prénom est ', Prenom); WRITELN('Le nom est ', Nom); Prenom:=NouveauPrenom; WRITELN('Le nouveau prénom est ', Prenom); END; BEGIN ChangementPrenom; READLN; END. 1.8 BEGIN Ce mot réservé est placé au début du programme principal et il est obligatoire dans un programme PASCAL. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 1.9 4 Instructions du programme principal Cette partie contient toutes les instructions du programme. EXEMPLE 1.3 PROGRAM Exercice3; USES FORMS; {$R *.RES} VAR A : INTEGER; BEGIN{Programme principal} REPEAT READLN(A); IF A>0 THEN WRITELN(A); UNTIL A>=9; END. {Fin du programme} Cette partie est optionnelle dans un programme PASCAL. 1.10 END Ce mot réservé, suivi d’un point (.), est obligatoire dans un programme PASCAL et il indique la fin du programme. 1.11 Point-virgule Le point-virgule (;) est obligatoirement utilisé pour séparer deux instructions. Voyons l’exemple suivant. X:=X + 1; IF X>0 THEN Y:=X; ... Devant les mots « END » et « UNTIL », le point-virgule n’est pas obligatoire, il est optionnel. Voyons l’exemple suivant. IF Car = ' N ' THEN BEGIN REPEAT READ(Nombre) UNTIL Nombre< >A; A:=0 END; {Fin du IF} B:=A* 5; ... © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 5 Il ne faut jamais mettre de point-virgule devant le mot « ELSE ». Voyons l’exemple suivant. IF (N MOD 2) = 1 THEN M := N DIV 10 ELSE M := N; ... 1.12 Commentaires On utilise des commentaires pour expliquer certaines parties d’un programme. Les blocs ou lignes de commentaires doivent être encadrés par des parenthèses ( ) ou par des accolades { }. Examinons l’exemple suivant. ... VAR N : INTEGER; ... (*Fonction qui calcule l’aire*) ... FUNCTION Aire (R:REAL) : REAL; BEGIN (*Pi = 3.14.158*) Aire := R*R3.14159; END; {Fin d’Aire} © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 6 2. TYPES DE DONNÉES DU LANGAGE PASCAL 2.1 Type Entier Le type Entier est un type simple de l’information (type ordinal). Les valeurs de ce type peuvent être représentées par deux notions différentes. Décimale : -566, 1234, +1 Hexadécimale : 10 $, +AC $, -D $ Il n’est pas nécessaire de placer le signe « + », qui représente un nombre positif, devant un nombre entier (optionnel). Dans la version PASCAL/DELPHI, il y a 7 sortes prédéfinies de type Entier. Catégorie Type de données Description Entier SHORTINT SMALLINT LONGINT 2147483647. INTEGER BYTE WORD CARDINAL Nombres entiers compris entre -128 et 127. Nombres entiers compris entre -32768 et 32767. Nombres entiers compris entre -2147483647 et Varient en fonction de l’implémentation. Nombres entiers compris entre 0 et 255. Nombres entiers compris entre 0 et 65535. Varient en fonction de l’implémentation. Dans cette version de PASCAL, CARDINAL est semblable à INTEGER, mais n’autorise que les valeurs positives. EXEMPLE 2.1 PROGRAM Exercice1; (* Ce programme imprime un nombre entier. *) USES FORMS; {$R *.RES} VAR Nombre : INTEGER; BEGIN Nombre:=266; WRITELN('C''est bien un nombre entier : ', nombre); READLN; END. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 2.2 7 Type Réel Le type Réel est un type simple de l’information (type ordinal). Les valeurs de ce type peuvent être représentées par deux notions différentes. Avec un point décimal : 5.0, 134.78, +9163.2322 Avec un exposant : 1.4E-12, -16E2, +9163.6322 Note.– L’exposant « E » signifie « multiplié par 10 à la puissance ». Exemple : -16E2 = -16 x 10e2 En PASCAL, il y a cinq sortes prédéfinies de type Réel. Catégorie Type de données Réel Description SINGLE Nombre dont la partie fractionnaire peut contenir 7 ou 8 chiffres significatifs. DOUBLE Nombre dont la partie fractionnaire peut contenir 15 ou 16 chiffres significatifs. EXTENDED Nombre dont la partie fractionnaire peut contenir 19 ou 20 chiffres significatifs. CURRENCY Nombre réel à forte précision, stocké au format entier, autorise quatre places décimales. REAL Nombre dont la partie fractionnaire peut contenir 11 ou 12 chiffres significatifs. Utilisez ce type seulement pour la compatibilité avec les versions précédentes de Borland PASCAL. Les types Double et Extended sont recommandés dans tous les autres cas. EXEMPLE 2.2 PROGRAM Exercice1; (* Ce programme imprime un nombre réel. *) USES FORMS; {$R *.RES} VAR NombreR : REAL; BEGIN NombreR:=266.99; WRITELN('C''est bien un nombre réel : ', NombreR:5:2); READLN; END. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 2.3 8 Type Caractère Le type Caractère est un type simple de l’information (type ordinal). Il y a 256 caractères en PASCAL et les valeurs de ce type sont encadrées par deux apostrophes. Exemple : ' a ', ' * ', ' | ' Note.– Un espace (blanc) est marqué par deux apostrophes « ' ' »; l’apostrophe dans un mot d’un texte est marqué par deux apostrophes successifs « '' ». On compte dans la version PASCAL/DELPHI trois sortes de type Caractère. Catégorie Type de données Description Caractère ANSICHAR WIDECHAR CHAR Un caractère ANSI. Un caractère UNICODE. Varie en fonction de l’implémentation. Dans cette version du PASCAL, CHAR est semblable à ANSICHAR. Un autre moyen de représenter un caractère avec PASCAL est de spécifier sa valeur d’ordre ASCII (American Standard Code for Information Interchange) en la faisant précéder du symbole « # ». Voici la table du jeu de caractère ASCII. Notes.– Le caractère NUL (#0) est un caractère nul. Le caractère CR (#13) est la touche Enter (ou Return). Le caractère BEL (#7) est un signal sonore (cloche). Le caractère ' ' (#32) est un espace (un blanc). Voyons quelques exemples. Le caractère « F » est équivalent à #70 (en décimale) ou #46 (en hexadécimale). Le caractère « è » est équivalent à #138 (en décimale) ou #$8A (en hexadécimale). Il existe deux fonctions, déjà implantées en PASCAL, pour manipuler les caractères : ORD : Retourner l’ordre d’un caractère. CHR : Retourner un caractère. Voyons quelques exemples. ORD ( ' 1 ' ) = 49 ORD ( ' ] ' ) = 91 CHR (49) = ' 1 ' CHR (206) = ' + ' © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 9 EXEMPLE 2.3 PROGRAM Caractere1; (* Ce programme imprime un espace blanc. *) USES FORMS; {$R *.RES} VAR Espace : CHAR; BEGIN Espace:=#32; WRITELN(' Le chiffre #32 est bien un espace blanc : >’, Espace, ‘<’); READLN; END. 2.4 Type Booléen Le type Booléen ou (Boolean) est un type simple de l’information (type ordinal). Les deux valeurs possibles sont TRUE (vrai) et FALSE (Faux). Ce type est aussi qualifié de logique. Il existe trois fonctions, déjà implantées en PASCAL, pour manipuler les valeurs du type booléen. ORD : Retourner l’ordre d’une valeur ORD(FALSE) =0 ORD(TRUE) =1 SUCC : Retourner le successeur d’une valeur SUCC(FALSE) = TRUE SUCC(TRUE) = TRUE PRED : Retourner le prédécesseur d’une valeur PRED(TRUE) = FALSE 2.5 Type Énuméré Le type Énuméré est un type simple de l’information (type ordinal). Le type Énuméré consiste en une séquence ordonnée d’identificateurs, où chaque identificateur s’interprète comme une donnée individuelle dont le diagramme syntaxique de la déclaration est présenté comme suit : Type Identificateur = (Identificateur1, Identificateur2, . . . . . . . , IdentificateurN); où Identificateur1 < Identificateur2 < . . . . . . . . . . . < IdentificateurN. Note.– Les identificateurs sont encadrés par des parenthèses et séparés par des virgules. Voyons quelques exemples. TYPE Resultat = (Succes, Echec); TYPE Sexe = (Masculin, Feminin); TYPE Semaine= (Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche); © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 10 Notez que les identificateurs ne peuvent être un mot réservé. Par exemple, la déclaration suivante est invalide : TYPE Note = (Do, Re, Mi, Fa, Sol, La, Si) ; « Do » est un mot réservé (boucle FOR . . TO . . DO) Il existe 3 fonctions, déjà implantées en PASCAL/DELPHI, pour manipuler ces identificateurs. ORD : Retourner l’ordre d’un identificateur. SUCC : Retourner le successeur d’un identificateur. PRED : Retourner le prédécesseur d’un identificateur. Note.– L’ordre du premier identificateur est égal à zéro. L’ordre du dernier identificateur est égal à (N - 1), où N est le nombre d’identificateurs déclarés. Voyons un exemple. TYPE Taille = ORD(Petite) = ORD(Moyenne) = ORD(Grande) = SUCC(Petite) = SUCC(Moyenne) = PRED(Grande) PRED(Moyenne) = (Petite, Moyenne, Grande); 0 1 2 Moyenne Grande = Moyenne Petite Note.– PRED(Petite) et SUCC(Grande) sont invalides. 2.6 Type Intervalle Le type Intervalle est un type simple de l’information (type ordinal). Si certaines données de type ordinal (Entier, Booléen, Caractère) ne prennent qu’un certain nombre de valeurs comprises dans un intervalle, on pourra définir un nouveau type leur correspondant, dont le diagramme syntaxique de la déclaration se présente comme suit : TYPE Identificateur = Constante1 . . Constante2; Notez que Constante1 doit être inférieure ou égale à Constante2 (Constante1 <= Constante2) et que les constantes peuvent être de type Entier, Caractère ou Booléen, mais pas Réel. Voyons des exemples. TYPE Age = 1 .. 100; TYPE Chiffre = '0' .. '9'; TYPE Mois = 1 .. 12; La déclaration suivante est invalide : TYPE Prix = 0 .. 999.9; © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 11 EXEMPLE 2.4 PROGRAM Project1; (* Ce programme utilise le type Intervalle *) USES FORMS; {$R *.RES} TYPE Numero = '0' .. '9'; VAR BonNumero : Numero; BEGIN BonNumero :='4'; WRITELN(BonNumero); READLN; END. 2.7 Type Ensemble Le type Ensemble est un type structuré de l’information. Le type Ensemble est une collection de données simples et ordonnées qui sont toutes de même type, dont le diagramme syntaxique de la déclaration se présente comme suit. TYPE Identificateur = SET OF Type_de_Base; Type_de_Base doit être un type ordinal (Entier, Booléen, Caractère, sauf Réel) ou un type Intervalle de type ordinal et ne peut contenir plus de 256 éléments. Voyons quelques exemples. TYPE Majuscule = SET OF 'A' .. 'Z'; TYPE Chiffre = SET OF 0 .. 9; TYPE Jour = (Lu, Ma, Me, Je, Ve, Sa, Di); Journee = SET OF Jour; La déclaration suivante est invalide car Type_de_Base comporte trop d’éléments. TYPE Nombre = SET OF 1 ..350; TYPE Valeur = SET OF INTEGER; Traitons maintenant de la construction d’un ensemble. La paire de crochets [ ] sert à créer une valeur de type Ensemble. Notez que [ ] est un ensemble vide. Voyons quelques exemples. ['e', 'h', 'p'] est un ensemble constitué de 3 caractères. [2, 4, 6, 8, 10] est un ensemble constitué de 5 entiers. [2, 3, 7, 9 .. 16] est un ensemble constitué de 11 entiers. La construction suivante est invalide, car les éléments de l’ensemble ne sont pas de même type. [43, 'd', 108] © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 12 EXEMPLE 2.5 PROGRAM Project1; (* Ce programme utilise le type Ensemble. *) USES FORMS; {$R *.RES} TYPE Touche = SET OF CHAR; VAR EntreTouche : Touche; EntreeUtilisateur : CHAR; BEGIN EntreTouche := ['0' .. '9']; READ(EntreeUtilisateur); IF EntreeUtilisateur IN EntreTouche THEN WRITELN('C''est bien une touche numérique.'); READLN; END. 2.8 Chaîne de caractères Une chaîne de caractères est une suite de caractères d’une longueur maximale spécifique et dont le diagramme syntaxique de la déclaration se présente comme suit. TYPE Type_Chaine = STRING[Longueur]; En PASCAL, il y a trois sortes prédéfinies de type Chaine. Catégorie Type de données Chaîne Description SHORTSTRING ANSISTRING Séquence pouvant comporter jusqu’à 255 caractères. Chaîne de taille dynamique de longueur théoriquement illimitée. STRING Varie en fonction de la directive de compilation $H. Par défaut, STRING est semblable à ANSISTRING. Une chaîne de caractères doit être encadrée par deux apostrophes. Voyons des exemples. 'apprentissage en DELPHI' '123 789' ' ' (Chaîne vide) Note.– S’il existe des apostrophes dans une chaîne de caractères, il faut mettre l’apostrophe en double. Par exemple, 'Aujourd''hui, c''est lundi'. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 2.9 13 Variables Les variables sont des informations dont la valeur peut changer au cours de l’exécution du programme. Chaque variable doit être déclarée en spécifiant le type avant d’apparaître dans un programme. Le diagramme syntaxique de la déclaration se présente comme suit. VAR Liste_Identificateurs : Descrip_Type: Note.– Liste_Identificateurs comprend un ou plusieurs identificateurs séparés par des virgules. Descrip_Type est la description du type (type simple ou structuré). Voyons des exemples de variables. VAR Nombre1, Nombre2, Nombre3 : SINGLE; VAR Nombre_Etudiant : WORD; VAR Débordement : BOOLEAN; TYPE VAR Distance = 1 .. 240; X, Y : CHAR; D : Distance; TYPE VAR TYPE Phrase = STRING[79]; P1, P2 : Phrase; Jour = (Lu, Ma, Me, Je, Ve, Sa, Di); Chiffre = SET OF '0' .. '9'; Jr : Jour; C1, C2 : Chiffre; VAR On peut déclarer directement une variable que l’on associe à un type. Par exemple : Au lieu de : TYPE Phrase = STRING[79]; VAR P1, P2 : Phrase; On écrit : VAR P1, P2 : STRING[79]; Au lieu de : On écrit : TYPE Distance = 1 .. 240; VAR X, Y : CHAR; D : Distance ; VAR X, Y : CHAR; D : 1 .. 240; Quand on déclare une variable, la mémoire réserve une place pour stocker sa valeur. Par exemple : Rayon VAR Rayon : REAL; A B VAR A, B : INTEGER; S VAR S : STRING[50]; © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 14 2.10 Constantes Les constantes sont des informations dont la valeur demeure inchangée tout au long du programme. Une constante doit toujours être définie avant d’apparaître dans une instruction. Le diagramme syntaxique de la déclaration se présente comme suit. CONST Identificateur = Constante; Une constante doit être de type simple. Voyons quelques exemples. CONST PI = 3.14159 CONST Capacite Succes = 1320; = TRUE; CONST Message Moins_Un Tauxtaxe Continue = 'Delphi'; = -1; = 0.13; = '0'; Quand on déclare une constante, la mémoire réserve une place pour stocker sa valeur. Voyons quelques exemples. CONST Seuil = 0.5; ... CONST X = -9; Y = 'n'; ... CONST S = 'Hello'; 0.5 -9 'n' 'Hello' EXEMPLE 2.6 PROGRAM Salaire; (*Ce programme calcule le salaire net d’une personne.*) USES FORMS; {$R *.RES} CONST Impot = 0.20; Heure = 20.00; Coutsuppl = 30.00; TotalNormal35 = 35; VAR Nom : STRING[15]; Prenom : STRING[15]; Annee : INTEGER; SalaireBrut : CURRENCY; © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 15 Salaire35 : CURRENCY; SalaireNet : CURRENCY; HeureSuppl : CURRENCY; TotalHeure : CURRENCY; SalaireSupp : CURRENCY; TotalImpot : CURRENCY; BEGIN WRITE('Entrez votre prénom : '); READLN(Prenom); WRITE('Entrez votre nom : '); READLN(Nom); WRITE('Entrez le nombre d''heures : '); READLN(TotalHeure); IF TotalHeure > TotalNormal35 THEN (*Calcule le salaire si la personne a fait des heures supplémentaires*) HeureSuppl := TotalHeure - TotalNormal35; SalaireSupp := HeureSuppl * Coutsuppl; Salaire35 := TotalNormal35 * Heure; SalaireBrut := Salaire35 + Salairesupp; TotalImpot := SalaireBrut * Impot; SalaireNet := SalaireBrut - TotalImpot; (*Calcule le salaire si la personne n’a pas fait d’heures supplémentaires*) IF TotalHeure <= TotalNormal35 THEN SalaireBrut := Heure * TotalHeure; TotalImpot := SalaireBrut * Impot; SalaireNet := SalaireBrut - TotalImpot; WRITELN; WRITELN; WRITELN; WRITELN ('Prénom : ', Prenom,' Nom : ' , Nom); WRITELN; WRITELN('Total salaire brut : ', SalaireBrut:8:2 ); WRITELN('Total à payer en impôt : ', TotalImpot:8:2 ); WRITELN('Total salaire net : ', SalaireNet:8:2 ); READLN; END. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 16 3. OPÉRATEURS 3.1 Opérateurs arithmétiques Les opérateurs arithmétiques sont utilisés pour effectuer des opérations de type numérique (Réel, Entier). 3.1.1 Opérateurs pour le type Entier Opérateur Signification Type de résultante + Addition Entier - Soustraction Entier - Opposé Entier * Multiplication Entier / Division Réel DIV Division tronquée Entier MOD Reste de la division Entier Voyons quelques exemples. Addition 10 + 2 vaut 12 Soustraction 6 - 60 vaut -54 Opposé Si X vaut -8 alors -X vaudra 8 Multiplication 4 * 7 vaut 28 Division 18 / 6 vaut 3.0 Division tronquée 4 DIV 3 vaut 1 Reste de la division 10 MOD 6 vaut 4 3.1.2 Opérateurs pour le type Réel Opérateur Signification Type de résultante + Addition Réel - Soustraction Réel - Opposé Réel * Multiplication Réel / Division Réel © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 17 Voyons quelques exemples. 3.2 Addition Soustraction 10.1 + 2.6 Vaut 12.7 6.7 - 60.8 vaut -54.1 Opposé Si X vaut 39.23 alors -X vaudra -39.23 Multiplication 4.22 * 7 vaut 29.54 Division 18.6/ 3.0 vaut 3.2 Opérateurs relationnels Opérateur Signification Type de résultante = égal Booléen <> différent Booléen < inférieur Booléen > supérieur Booléen <= inférieur ou égal Booléen >= supérieur ou égal Booléen <= sous-ensemble de Booléen >= sur ensemble de Booléen IN membre de Booléen Voyons quelques exemples. Égal à 8 = 8 vaut TRUE Différent de 17.3 <> 2.9 vaut TRUE Inférieur à 19 < 178 vaut TRUE Supérieur à 2484 > 3893 vaut FALSE 12.5 > 0.3 vaut TRUE Inférieur ou égal à 26 <= 26 99 <= 14 10 <= 19 Supérieur ou égal à 12.48 >= 972.1 vaut FALSE 12362 >= 11232 vaut TRUE 99999 >= 99999 vaut TRUE © Télé-université, 2003 vaut TRUE vaut FALSE vaut TRUE Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 18 Test d’appartenance : 12 IN [0 .. 200] 2 IN [3 .. 128] vaut TRUE vaut FALSE 'k' IN ['a' .. 'z'] vaut TRUE ORD ('S') IN [1 .. 92 ] vaut FALSE CHR(48) IN ['!' .. '*'] vaut FALSE 'O' IN ['O', 'N'] vaut TRUE Notez que la valeur à tester ne peut être un nombre réel ou une chaîne de caractères. Par exemple, les opérateurs suivants sont invalides. 2.19 IN [0 .. 3] 'Oui' IN ['O', 'N'] 3.3 Opérateurs booléens Les opérateurs booléens (opérateurs logiques) permettent la combinaison d’opérandes de type Booléen pour former des expressions de type Booléen (OR, AND) et pour inverser la valeur d’un opérande. Opérateur AND X TRUE TRUE FALSE FALSE Y TRUE FALSE TRUE FALSE Opérateur OR X TRUE TRUE FALSE FALSE Y TRUE FALSE TRUE FALSE Opérateur NOT X TRUE FALSE Y FALSE TRUE X AND Y TRUE FALSE FALSE FALSE X AND Y TRUE TRUE TRUE FALSE Notez que ces opérateurs peuvent également porter sur des entiers. (Voir la section 3.5 : Expression). © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 3.4 19 Opérateurs des ensembles 3.4.1 Opérateur de réunion La réunion de deux ensembles est l’ensemble formé des éléments appartenant au moins à l’un des deux ensembles. En PASCAL, la réunion de deux ensembles est représentée par l’opérateur « + ». Voyons quelques exemples. TYPE Lettre = SET OF 'A' .. 'Z'; VAR E1, E2, E : Lettre; ... E1 := ['G'] ; E2 := ['D'] ; E := E1 + E2; L’ensemble E vaudra ['G', 'D']. ... E1 := ['T']; E := E1 + [ ]; L’ensemble E vaudra ['T']. Ensemble vide 3.4.2 Opérateur d’insertion L’insertion de deux ensembles est l’ensemble formé des éléments appartenant simultanément aux deux ensembles. En PASCAL, l’insertion de deux ensembles est représentée par l’opérateur « * ». Voyons quelques exemples. TYPE Lettre = SET OF 0 .. 9; VAR E1, E2, E : Numero; ... E1 := [0, 1, 2, 3'] ; E2 := [0, 3, 8] ; E := E1 * E2; L’ensemble E vaudra [0, 3']. ... E1 := [2, 4, 6]; E := E1 * [ ]; L’ensemble E vaudra [ ]. Ensemble vide 3.4.3 Opérateur de différence (complémentaire relatif) Si E1 et E2 sont deux ensembles, la différence entre eux (E1 - E2) est l’ensemble formé des éléments appartenant à E1 et n’appartenant pas à E2. En PASCAL, la différence de deux ensembles est représentée par l’opérateur « - ». © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 20 Voyons un exemple. TYPE Couleur = SET OF (Blanc, Rouge, Bleu, Jaune); VAR E1, E2, E : Couleur; ... E1 := [Blanc, Bleu, rouge]; E2 := [Bleu]; E := E1 - E2; L’ensemble E vaudra [Blanc, Rouge]. ... E1 := [Jaune]; E := E1 - [ ]; Ensemble vide L’ensemble E vaudra [Jaune]. 3.4.4 Opérateurs de commande Il y a deux opérateurs de commande : égalité (:=) et inclusion (<=). Il y a égalité de deux ensembles (E1 = E2), si E1 et E2 sont formés des mêmes éléments. Voyons un exemple. TYPE Lettre = SET OF 'a' .. 'n']; Var E1, E2 : Lettre; ... E1 := ['f', 'i', 'm']; E2 := ['m', 'f', 'i']; Donc E1 = E2. Il y a inclusion de deux ensembles (E1 <= E2), si E1 est inclus dans E2, c’est-à-dire si tous les éléments de E1 appartiennent à E2. Voyons un exemple. TYPE Chiffre = SET OF '0' .. '9'; Var E1, E2 : Chiffre; ... E1 := ['3', '7']; E2 := ['3', '5', '7', '9']; Donc E1 <= E2. ... E1 := ['2', '4', '6', '8']; E2 := ['4', '2', '8', '6']; Donc E1 <= E2 (ou E2 <= E1). © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 3.5 21 Expression L’expression est un groupe d’opérandes (une succession de calculs) liées par certains opérateurs pour former un terme algébrique qui représente une valeur, c’est-à-dire un élément de donnée simple. Voyons des exemples. X+Y+Z (B * B - 4 * A * C) / (2 * A) (P AND Q) OR (NOT P OR R) En PASCAL, il y a deux sortes d’expression : – l’expression numérique qui représente une valeur numérique Exemple : (B * B - 4 * A * C) / (2 * A) – l’expression booléenne qui représente une condition logique (TRUE ou FALSE) Exemple : (P AND Q) OR (NOT P OR R) Considérons l’expression suivante : 12 + 5 * 2 DIV 4 - 10 Notez qu’il est impossible de prévoir le résultat sans connaître l’ordre dans lequel vont s’effectuer les opérations ou la priorité des opérations. 3.5.1 Liste des propriétés des opérateurs Opérateur Priorité Catégorie (. . .) 1 Expression entre parenthèses NOT ou - 2 Unaires *, /, DIV, MOD, AND 3 Multiplicatifs +, _, OR 4 Additifs +, <>, <, >, <=, >=, IN 5 Relationnels 3.5.2 Règles d’évaluation Voyons les règles d’évaluation et effectuons quelques exercices. – Une opérande entre deux opérateurs sera associée à celui qui possède la priorité la plus élevée. – Une opérande entre deux opérateurs de même priorité sera associée à celui qui se retrouve à gauche © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 22 EXERCICE 1 Si les entiers A, B, C, D valent respectivement 21, 4, 4, 3, évaluez les expressions suivantes. 1. A MOD B + A DIV B * B 2. A + B / C * D 3. (A * D - D * (10 + D)) DIV 4 4. (A > 2 AND ) AND (A >= 100) 5. -C + B - A DIV D Solutions 1. A MOD B + A DIV B * B 21 MOD 4 + 21 DIV 4 * 4 1+5*4 1 + 20 21 Donc A MOD B + A DIV B * B vaut 21. 2. A+B/C*D 21 + 4 / 4 * 3 21 + 1 * 3 21 +3 24 Donc A + B / C * D vaut 24. 3. (A * D - D * (10 + D)) DIV 4 (21 * 3 - 3 * (10 + 3)) DIV 4 (21 * 3 - 3 * 13) DIV 4 (63 - 39) DIV 4 24 DIV 4 6 Donc (A * D - D * (10 + D) DIV 4 vaut 6. 4. (A > 2) AND (A >= 100) (21 > 2) AND (21 >= 100) TRUE AND FALSE FALSE Donc (A > 2) AND (A >= 100) vaut FALSE. 5. -C + B - A DIV D - 4 + 4 - 21 DIV 3 (Unaire) -4 + 4 - 21 DIV 3 -4 + 4 - 7 0-7 -7 Donc -C + B - A DIV D vaut -7. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 23 EXERCICE 2 Soit X un entier, Y et Z deux booléens, qui valent respectivement 18, FALSE et TRUE. Évaluez les expressions suivantes. 1. (X In [1 .. 7]) AND Y 2. Not Y or (Y AND Z) Solutions 1. (X IN [1 .. 7]) AND Y (18 IN [1 .. 7]) AND FALSE FALSE AND FALSE FALSE Donc (X IN [1 .. 7]) AND FALSE vaut FALSE. 2. NOT Y OR (Y AND Z) NOT FALSE OR (FALSE AND TRUE) NOT FALSE OR FALSE TRUE OR FALSE TRUE Donc NOT Y OR (Y AND Z) vaut TRUE. 3.6 Instruction d’affectation L’instruction d’affectation est un type d’instruction simple servant à assigner un élément de donnée à une variable dont le diagramme syntaxique se présente comme suit : Variable := Element_De_Donnee; Element_De_Donnee peut être une constante, une autre variable, une expression ou une référence fonction (qu’on verra plus loin). Le point-virgule (;) agit comme séparateur pour distinguer la fin de l’instruction en cours du commencement de la prochaine instruction. deux exemples. CONST C = 50.0; VAR X, Y : REAL; Affectation à ... ↓ X := 78.5; X une constante X := C; X une constante Y := X - C; Y une expression L’exemple ci-dessus contient trois instructions. VAR I, J : INTEGER; ... J := I DIV 10; I := J * 5; © Télé-université, 2003 Affectation à ↓ J une expression I une expression Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION I := SQR (J); J := I; 24 I une fonction J une autre variable Note.– SQR est une fonction prédéfinie. L’exemple ci-dessus contient quatre instructions. Si Element_De_Donnee (partie à droite) est une expression ou une référence fonction, alors cette partie sera évaluée avant l’affectation. Si on affecte une nouvelle valeur à une variable, alors son contenu (sa valeur) sera changé par cette nouvelle valeur. Voyons l’exemple qui suit. VAR A, B, C : BOOLEAN; ... A := TRUE; B := TRUE; C := NOT B; A := (NOT B) OR C; A TRUE A FALSE Donc, A vaut présentement FALSE. 3.7 Manipulation des chaînes 3.7.1 Affectation On peut affecter les chaînes de caractères même lorsque les chaînes qu’on affecte ne sont pas déclarées de même longueur que la variable réceptrice. Par exemple : VAR Chaine1 : STRING[5]; Chaine2 : STRING[14]; Voici des affectations qui sont bonnes : Chaine1 := 'Hello'; Chaine1 := 'Moi'; Chaine2 := Chaine1; Chaine2 := 'Tout le monde'; Lorsque la variable réceptrice a une longueur maximum inférieure à la longueur de la chaîne qu’on cherche à lui affecter, celle-ci est simplement tronquée (coupée) par la droite. Par exemple : VAR Chaine1 : STRING[5]; Chaine2 : STRING[10]; ... Chaine2 := 'Comment ca va'; Chaine1 := Chaine2; On obtiendra simplement dans Chaine2, la chaîne 'Comment ca', et dans Chaine1 la Chaîne 'Comme'. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 25 3.7.2 Comparaison On peut comparer les chaînes de caractères grâce à l’ordre des codes ASCII de chacun des caractères qui les constituent ou leur longueur. Voyons des exemples, soit les 5 chaînes de caractères suivantes : Chaine1 : BONJOUR' Chaine2 : 'PASCAL' Chaine3 : 'BONJOUR' Chaine4 : 'Passe' Chaine5 : 'BONJO' 1. Chaine1 et Chaine3 sont égales. 2. Chaine1 est plus petite que Chaine2, car l’ordre du premier caractère de Chaine1 est plus petit que l’ordre du premier caractère de Chaine2. 3. Chaine2 est plus petite que Chaine4, car l’ordre du quatrième caractère de Chaine2 est plus petit que l’ordre du quatrième caractère de Chaine4. 4. Chaine5 est plus petite que chaine1, car la longueur de Chaine5 est inférieure à la longueur de Chaine1. Notez qu’il existe une fonction, déjà implantée dans PASCAL, pour calculer la longueur des chaînes de caractères; elle s’appelle « Length ». Exemple : Length ('CE JOUR') vaut 7. 3.7.3 Addition (concaténation) Cette opération permet d’unir deux ou plusieurs chaînes pour n’en former qu’une seule. Voyons des exemples, soit les chaînes de caractères suivantes : C1 : 'Comment ' C2 : 'ca' C3 : 'va' C1 + C2 vaut : 'Comment ca' C1 + C2 + C3 vaut : 'Comment ca va' Notez qu’il existe une fonction, déjà implantée en PASCAL, pour additionner les chaînes de caractères; elle s’appelle « Concat ». Par exemple : VAR C1 : STRING[8]; C2 : STRING[14]; ... C1 := 'Comment'; C2 := Concat (C1, ' ca va '); On obtiendra dans C2 la chaîne 'Comment ca va'. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 26 3.7.4 Extraction de sous-chaînes Il existe une fonction, déjà implantée en PASCAL, pour extraire les chaînes de caractères; elle s’appelle « Copy ». Cette fonction permet d’extraire une partie (sous-chaîne) d’une chaîne, d’une longueur donnée à partir d’une position donnée. Voyons l’exemple qui suit. Var C1 : STRING[8]; C2 : STRING[14]; ... C1 := 'PASCAL'; C2 := COPY (C1, 2,3); On obtiendra dans C2 la chaîne 'asc'. C1 := COPY('Version', 1,3); On obtiendra dans C1 la chaîne 'Ver'. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 27 4. LES INSTRUCTIONS DE LECTURE ET D’ÉCRITURE 4.1 Lecture La lecture sert à recopier tous les caractères frappés au clavier et à affecter ces valeurs aux variables concernées. La lecture est utilisée seulement pour les variables. Il est interdit de lire une constante. En PASCAL, la lecture est représentée par l’une des deux instructions suivantes : READ(C1 [,C2, C3, …, Cn]); READLN(C1 [,C2, C3, …., Cn]); Note.– Une ou plusieurs valeurs (ou variables). On peut lire une ou plusieurs variables. Lorsqu’on lit plusieurs variables, il faut les séparer par un ou plusieurs espaces entre deux variables lues. La fin d’une lecture est validée par la touche Return (Enter ↵). La différence entre l’instruction READ et l’instruction READLN est la suivante : – Avec l’instruction READ, le curseur de l’écran reste en place après avoir terminé la lecture. – Avec l’instruction READLN, le curseur de l’écran passe au début de la ligne suivante après avoir terminé la lecture. Voyons un exemple. VAR X, Y : REAL; N : INTEGER; ... READLN(N); READ(X, Y); Le curseur de l’écran attend une valeur entière frappée au clavier. Supposons qu’on frappe la valeur 18 sur le clavier, cette valeur sera affectée à la variable N concernée. 18 ↓ Valeur frappée ↵ N ↓ Touche Return ↓ 18 ↓ Affectation à la variable concernée Le curseur de l’écran passe au début de la ligne suivante après avoir terminé la lecture de la première ligne. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 28 Supposons qu’on frappe sur le clavier deux valeurs, soit 2.5 et 0.3; ces valeurs seront affectées aux variables X et Y concernées. 2.5 0.3 ↵ ↓ ↓ ↓ ↓ Espace frappée Touche Return ↓ par l’usager ↓ Valeurs frappées Affectation aux variables concernées : 2.5 → X 0.3 → Y Notez... – qu’on ne peut que lire les variables des types suivants : Entier Réel Caractère Intervalle Chaîne de caractères – qu’il est interdit de lire les variables des types suivants : Booléen Énuméré Ensemble Tableau Enregistrement Fichier (On verra ces trois derniers types plus loin.) Sachez, par ailleurs, qu’il existe des remèdes pour la lecture des variables des types Booléen et Énuméré. 4.2 Remède pour les lectures impossibles Il s’agit de lire une autre variable (du type qui permet la lecture), puis d’affecter la valeur lue à la variable qu’on veut lire. 4.2.1 Type Booléen Voyons un exemple. VAR Faim : Boolean; Car : CHAR; ... WRITE ('As-tu faim (O/N) ?'); READLN(Car); IF Car IN ['o', 'O'] THEN Faim := TRUE © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 29 ELSE Faim := FALSE; ... IF Faim THEN ... 4.2.2 Type Énuméré Voyons un exemple : TYPE Reponse = (OUI, Non); VAR Faim : Reponse; Car : CHAR; ... WRITE ('As-tu faim (O/N) ?'); READLN(Car); IF Car IN ['o', 'O'] THEN Faim := OUI ELSE Faim := Non; ... IF Faim = Oui THEN 4.3 Écriture L’écriture permet d’afficher le contenu d’une variable ou d’une constante. En PASCAL, l’écriture est représentée par l’une des deux instructions suivantes : WRITE(C1 [,C2, C3, …, Cn]); WRITELN(C1 [,c2, C3, …., Cn]); Note.– Une ou plusieurs valeurs (ou variables). La différence entre l’instruction WRITE et l’instruction WRITELN est la suivante : – Avec l’instruction WRITE, le curseur de l’écran reste en place après avoir terminé l’écriture. – Avec l’instruction WRITELN, le curseur de l’écran passe au début de la ligne suivante après avoir terminé l’écriture. On peut écrire seulement les variables des types suivants : Entier Réel Caractère Intervalle Booléen Chaîne de caractères © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 30 Par ailleurs, il est interdit d’écrire les variables des types suivants : Énuméré Ensemble Tableau Enregistrement Fichier 4.3.1 Écriture des entiers Sans format L’écriture est effectuée de gauche à droite. WRITE(Un_Entier[,…]); WRITELN(Un_Entier[,…]); Voyons un exemple. VAR N, M : INTEGER; ... N := 145; M := N + 1; WRITELN (N); WRITE(N, M); Apparaîtra à l’écran : 145 145146 Explication – Avec « WRITELN(N); », la valeur de N est écrite à partir de la première colonne. Le curseur passe ensuite au début de la ligne suivante. – Avec « WRITE(N, M); », la valeur de N sera écrite à partir de la première colonne, puis la valeur de M sera écrite à partir de la quatrième colonne. Avec format L’écriture est effectuée de gauche à droite. WRITE(Un_Entier: E[,…]); WRITELN(Un_Entier:E[,…]); ↓ Espaces à réserver Voyons un exemple. VAR N, M : INTEGER; ... N := 145; M := N + 1; WRITELN (N:4); WRITE(N, M:6); © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 31 Apparaîtra à l’écran : 145 145 146 Explication – Avec « WRITELN(N:4); », quatre espaces seront réservées pour l’écriture de la valeur de N. Le curseur passe ensuite au début de la ligne suivante. – Avec « WRITE(N, M:6); », la valeur de N sera écrite à partir de la première colonne, ensuite six espaces seront réservées pour l’écriture de la valeur de M. 4.3.2 Écriture des réels Sans format Il y a 18 espaces qui seront réservées pour l’écriture d’un nombre réel. Un nombre réel sera écrit sous la forme exponentielle. WRITE(Un_Réel[,…]); WRITELN(Un_Réel[,…]); Voyons un exemple. VAR X, Y : REAL; ... X := 2.4; Y := 35.2; WRITELN (X); WRITE(X,Y); Apparaîtra à l’écran : 2.4000000000E+00 2.4000000000E+00 3.5200000000E+01 Explication – Avec « WRITELN(X); », 18 espaces seront réservées pour l’écriture de la valeur de X. Le curseur passe ensuite au début de la ligne suivante. – Avec « WRITE(X,Y) ; », 36 espaces seront réservées pour l’écriture des valeurs de X et Y. Note.– Sous la forme exponentielle, les valeurs 2.4 et 35.2 sont présentées comme suit : 2.4 = 2.4 X 100 35.2 = 3.52 X 101 Avec format L’écriture est effectuée de droite à gauche. WRITE(Un_Réel:E:D [,…]); WRITELN(Un_Réel:E:D[,…]); © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 32 Voyons un exemple. VAR X, Y : REAL; ... X := 2.4; Y := 35.2; WRITELN (X:4:1); WRITE(X:6:1,Y:10:2); Apparaîtra à l’écran : 2.4 2.4 35.20 (Avec une décimale) (Avec dix espaces réservées pour la valeur de Y avec 2 décimales) Explication – Avec « WRITELN(X:4:1); », quatre espaces seront réservées pour l’écriture de la valeur de X avec une décimale. Le curseur passe ensuite au début de la ligne suivante. – Avec « WRITE(X:6:1,Y:10:2); », six espaces seront réservées pour l’écriture de la valeur de X avec une décimale et dix espaces seront réservées pour l’écriture de la valeur de Y avec deux décimales. 4.3.3 Écriture des caractères Sans format L’écriture est effectuée de gauche à droite. WRITE(Un_Caractère[,….]); WRITELN(Un_Caractère[,….]); Voyons un exemple. VAR C1, C2 : CHAR; ... C1 := #97; (Caractère « a ») C2 := 'b'; WRITELN(C1); WRITE(C1,C2); Apparaîtra à l’écran : a ab Explication – Avec « WRITELN(C1); », la valeur de C1 est écrite à partir de la première colonne. Le curseur passe ensuite au début de la ligne suivante. – Avec « WRITE(C1,C2); », la valeur de C1 est écrite à la première colonne, puis la valeur C2 sera écrite à la deuxième colonne. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 33 Avec format L’écriture est effectuée de droite à gauche. WRITE(Un_Caractère:E[,….]); WRITELN(Un_Caractère:E[,….]); Voyons un exemple. VAR C1, C2 : CHAR; ... C1 := #97; (Caractère « a ») C2 := 'b'; WRITELN(C1:4); WRITE(C1,C2:5); Apparaîtra à l’écran : a a b Explication – Avec « WRITELN(C1:4); », quatre espaces seront réservées pour l’écriture de la valeur de C1. Le curseur passe ensuite au début de la ligne suivante. – Avec « WRITE(C1,C2:5); », la valeur de C1 sera écrite à la première colonne, puis cinq espaces seront réservées pour l’écriture de la valeur C2. Note.– On peut écrire un caractère en spécifiant son ordre dans la table ASCII grâce à la fonction « CHR ». Voyons un exemple ... WRITE(CHR(97)); À l’écran sera affiché : a 4.3.4 Écriture des booléens Sans format L’écriture est effectuée de gauche à droite. WRITE(Un_Booléen[,….]); WRITELN(Un_Booléen[,….]); Voyons un exemple. VAR B1, B2 : BOOLEAN; ... B1 := FALSE; B2 := TRUE; WRITELN(B1); WRITE(B1, B2); Apparaîtra à l’écran : FALSE FALSETRUE © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 34 Explication – Avec « WRITELN(B1); », la valeur de B1 est écrite à partir de la première colonne. Le curseur passe ensuite au début de la ligne suivante. – Avec « WRITE(B1,B2); », la valeur de B1 sera écrite à partir de la première colonne, puis la valeur B2 sera écrite à partir de la sixième colonne. Avec format L’écriture est effectuée de droite à gauche. WRITE(Un_Booléen:E[,….]); WRITELN(Un_Booléen:E[,….]); Voyons un exemple. VAR B1, B2 : BOOLEAN; ... B1 := FALSE; B2 := TRUE; WRITELN(B1:6); WRITE(B1, B2:5); Apparaîtra à l’écran : FALSE FALSE TRUE Explication – Avec « WRITELN(B1:6); », six espaces seront réservées pour l’écriture de la valeur B1. Le curseur passe ensuite au début de la ligne suivante. – Avec « WRITE(B1,B2:5); », la valeur de B1 sera écrite à partir de la première colonne, puis cinq espaces seront réservées pour écrire la valeur de B2. 4.3.5 Écriture des chaînes de caractères Sans format L’écriture est effectuée de gauche à droite. WRITE(Un_Chaîne[,….]); WRITELN(Un_Chaîne[,….]); Voyons un exemple. VAR C1, C2 : STRING[10]; ... C1 := 'Je'; C2 := 'mange'; WRITELN(C1); WRITE(C1, C2); Apparaîtra à l’écran : Je Je mange © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 35 Explication – Avec « WRITELN(C1); », la valeur de C1 est écrite à partir de la première colonne. Le curseur passe ensuite au début de la ligne suivante. – Avec « WRITE(C1,C2); », la valeur de C1 sera écrite à partir de la première colonne, puis la valeur de C2 sera écrite à partir de la troisième colonne. Avec format L’écriture est effectuée de gauche à droite. WRITE(Une_Chaîne:E[,….]); WRITELN(Une_Chaîne:E[,….]); Voyons un exemple VAR C1, C2 : STRING[10]; ... C1 := 'Je'; C2 := 'mange'; WRITELN(C1:4); WRITE(C1,C2:6); Apparaîtra à l’écran : Je Jemange Explication – Avec « WRITELN(C1:4); », quatre espaces seront réservées pour l’écriture de la valeur de C1. Le curseur passe ensuite au début de la ligne suivante. – Avec « WRITE(C1,C2:6); », la valeur de C1 sera écrite à partir de la première colonne, puis six espaces seront réservées pour l’écriture de la valeur de C2. 4.3.6 Écriture des constantes L’écriture des constantes est identique à l’écriture des : – Entiers (si la constante est un entier) – Réels (si la constante est un réel) – Caractères (si la constante est un caractère) – Booléens (si la constante est une booléenne) – Chaîne de caractères (si la constante est une chaîne) © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 5. LES TABLEAUX ET LES ENREGISTREMENTS 5.1 Les tableaux 36 Nous vous rappelons qu’un tableau est une structure comprenant un nombre fixe d’éléments de même type, répondant à un nom collectif. Ces éléments peuvent être de type Entier, Réel, Caractère, Booléen ou autre. Un paramètre très important d’un tableau, c’est sa taille, qui n’est que le nombre d’éléments qu’il peut contenir. La taille d’un tableau est limitée par la capacité de mémoire de l’ordinateur utilisé. 5.1.1 Les tableaux à une dimension Un tableau à une dimension est une structure linéaire dans laquelle chaque élément est repéré par un seul indice. On l’appelle aussi un vecteur, d’où le mot clé ARRAY utilisé en PASCAL pour le déclarer. EXEMPLE 5.1 PROGRAM Tableau1; (* Ce programme utilise un tableau à une dimension. *) USES FORMS; {$R *.RES} TYPE PetitTableau = ARRAY [1 .. 5] of REAL; VAR Montantachat : PetitTableau; BEGIN Montantachat[1] := 55.6; Montantachat[2] := 79.7; Montantachat[3] := 42.2; Montantachat[4] := 100.0; Montantachat[5] := 34.9; WRITELN(Montantachat[1]:5:2); WRITELN(Montantachat[2]:5:2); WRITELN(Montantachat[3]:5:2); WRITELN(Montantachat[4]:5:2); WRITELN(Montantachat[5]:5:2); READLN; END. 5.1.1 Les tableaux à deux dimensions Le tableau à deux dimensions est une structure de données dans laquelle chaque élément est repéré par deux indices : un indice indiquant le numéro de la ligne et un autre indiquant le numéro de la colonne. C’est donc un vecteur dont chacun des éléments ou composantes est lui-même un vecteur, d’où leur appellation équivalente de matrice dans laquelle l’élément auquel on se réfère se trouve à l’intersection de la ligne et de la colonne spécifiées par les indices. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 37 EXEMPLE 5.2 PROGRAM Tableau1; (* Ce programme utilise un tableau à deux dimensions. *) USES FORMS; {$R *.RES} TYPE PetitTableau = ARRAY [1 .. 3, 1.. 3] of CHAR; VAR Tentative : PetitTableau; BEGIN Tentative[1, 1] := 'B'; Tentative[2, 1] := 'n'; Tentative[1, 3] := 'u'; Tentative[3, 2] := 'o'; Tentative[3, 1] := 'r'; Tentative[3, 3] := 'j'; WRITELN(Tentative[1, 1]); WRITELN(Tentative[3, 2]); WRITELN(Tentative[2, 1]); WRITELN(Tentative[3, 3]); WRITELN(Tentative[3, 2]); WRITELN(Tentative[1, 3]); WRITELN(Tentative[3, 1]); READLN; END. EXEMPLE 5.3 PROGRAM Tableau; (*Ce programme permet d’entrer cinq noms et prénoms dans deux (*tableaux et d’imprimer cette liste*) USES FORMS; {$R *.RES} CONST NombreMax = 5; TYPE TabNom = ARRAY[1..NombreMax] of STRING[15]; TabPrenom = ARRAY[1..NombreMax] of STRING[15]; VAR Nom : TabNom; Prenom : TabPrenom; i : INTEGER; BEGIN WRITELN('Nom Prénom '); FOR i := 1 TO NombreMax DO © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION READLN(Nom[i],Prenom[i]); WRITELN('Liste de noms'); WRITELN; WRITELN('Nom Prénom FOR i := 1 TO NombreMax DO WRITELN(Nom[i],Prenom[i]); READLN; END. 5.2 38 '); Les enregistrements Un enregistrement (RECORD) ou article est une structure de données composée d’un ensemble d’éléments qui ne sont pas nécessairement du même type, appelés champs, et qui sont manipulés comme un tout. Les champs peuvent être de type Entier, Réel, Caractère, Booléen, Tableau, Chaîne de caractères, Intervalle, Énumération, Ensemble et autre. La déclaration d’une constante de type enregistrement (RECORD) s’effectue en spécifiant l’identificateur et la valeur de chaque champ. Les éléments de contenu des différents champs doivent être séparés les uns des autres par des points-virgules, et les valeurs des enregistrements doivent être encadrées par des parenthèses. EXEMPLE 5.4 PROGRAM Record1; (*Ce programme permet d’entrer cinq noms dans un type *) (*de données Enregistrement et d’imprimer cette liste de noms.*) USES FORMS; (* Déclaration du type Enregistrement *) CONST Nombre = 6; TYPE Etudiant = RECORD Nom, Prenom : STRING[15]; END; (* Déclaration des variables globales *) VAR Liste : ARRAY[1..5] OF Etudiant; x, y : INTEGER; BEGIN FOR Y := 1 TO nombre DO BEGIN WRITE('Entrez le prénom de l''étudiant '); READLN(liste[Y].Prenom); WRITE('Entrez le nom de l''étudiant '); READLN(Liste[Y].Nom); END; © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 39 (* Imprime les lignes une à une *) FOR x := 1 TO nombre DO BEGIN WRITE('Prénom', Liste[x].Prenom:16); WRITELN(' Nom ', Liste[x].Nom:15); END; END. 5.3 Les pointeurs Toute information traitée par l’ordinateur réside à une certaine adresse dans la mémoire. Un pointeur fait référence à l’adresse de la mémoire où cette information est stockée. C’est donc une variable dynamique dont le contenu est lui-même une adresse. Un pointeur P qui ne renvoie à aucune autre adresse prend la valeur nulle (NIL); on dit, dans ce cas, que P ne pointe sur aucun élément. EXEMPLE 5.5 PROGRAM Project1; USES FORMS; TYPE Typeadresse = RECORD No : STRING; Rue : STRING; Ville : STRING; Province : STRING; Codepostal : STRING; END; Pointeuradresse = ^Typeadresse; {$R *.RES} VAR Adresse : Pointeuradresse; BEGIN NEW(Adresse); Adresse^.No := '1200'; Adresse^.Rue := 'Street'; Adresse^.Ville := 'Bonne Ville'; Adresse^.Province := 'Quebec'; Adresse^.Codepostal := 'HOH 0H0'; Writeln('Son adresse : '); WRITELN(Adresse^.No, ' ', Adresse^.Rue, ' '); WRITELN(Adresse^.Ville,' ',Adresse^.Province); WRITELN(Adresse^.Codepostal); DISPOSE(Adresse); READLN; END. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 40 6. LES STRUCTURES DE CONTRÔLE 6.1 Instruction IF. . THEN . . . ELSE L'expression doit fournir un résultat du type standard Booléen. Si l’expression produit la valeur TRUE, l’instruction suivant le mot réservé THEN est exécutée. Si l’expression produit la valeur FALSE et qu’une partie ELSE est présente, l’instruction suivant le mot clé ELSE est exécutée; s’il n’y a pas de partie ELSE, l’exécution se poursuit par l’instruction suivant le IF. EXEMPLE 6.1 PROGRAM DECISION; (* Utilisation de la boucle IF .. THEN … ELSE.*) USES FORMS; VAR A, B : INTEGER; {$R *.RES} BEGIN WRITE ('Entrez un nombre A: '); READLN(A); WRITE('Entrez un nombre B :'); READLN(B); IF A < B THEN B := A ELSE A := B; WRITE('A = ', A, ' , B = ', B); END. Exécution A B 56 56 Expression Entrez un nombre A : 56 Entrez un nombre B : 56 A = 56 , © Télé-université, 2003 B = 56 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 41 EXEMPLE 6.2 PROGRAM Exemple2; (*Ce programme permet de calculer la surface ou le périmètre*) USES FORMS; CONST Pi = 3.1416; VAR R : REAL; (*Rayon*) C : CHAR; (*Choix*) {$R *.RES} BEGIN (*Programme principal*) R := 2.5; (*Choix S pour calculer la surface ou P pour calculer le périmètre*) WRITE('Votre choix (S, P) : '); READLN(C); IF C IN ['S', 's', 'P', 'p'] THEN BEGIN IF C IN ['S', 's'] THEN WRITE ('Surface : ', (Pi*R*R):5:2) ELSE WRITE ('Périmètre : ', (2*Pi*R):5:2); END ELSE WRITE ('Choix invalide ....'); READLN; END. Exécution Surface : Périmètre : 19.65 15.71 EXEMPLE 6.3 PROGRAM Exemple; (*Utilisation de l’instruction IF .. THEN … ELSE*) USES FORMS; VAR X, Y, Z, V1, V2 : INTEGER; {$R *.RES} BEGIN (*Programme principal*) X := -234; Y := 492; Z := 757; IF (X >= Y) AND (X >= Z) THEN © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 42 BEGIN V2 := X; IF Y >= Z THEN V1 := Z ELSE V1 := Y; END (* Fin du IF*) ELSE BEGIN IF (X >= Y) AND (X < Z) THEN BEGIN V2 := Y; V1 := Z; END (*Fin du IF*) ELSE BEGIN IF (X < Y) AND (X >= Z) THEN BEGIN V2 := Y; V1 := Z; END (*Fin du IF*) ELSE BEGIN IF (X < Y) AND (X < Z) THEN BEGIN V1 := X; IF Y >= Z THEN V2 := Y ELSE V2 := Z; END; (*Fin du IF*) END; (*Fin du ELSE*) END; (*Fin du ELSE*) END; (*Fin du ELSE*) WRITELN('La valeur de V1 est : ', V1); WRITELN('La valeur de V2 est : ', V2); END. Exécution La valeur de V1 est : -234 La valeur de V2 est : 757 © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 6.2 43 Instruction CASE .. OF L’instruction CASE comprend une expression (le sélecteur) et une liste d’instructions, chacune étant « préfixée » par une ou plusieurs constantes (les constantes de cas), ou par le mot ELSE. Le sélecteur doit être d’un type scalaire; de ce fait, les types Chaîne de caractères ne sont pas des types de sélecteurs valides. Les constantes de cas doivent être uniques et d’un type scalaire compatible avec le type du sélecteur. EXEMPLE 6.4 PROGRAM Exercice1; (*Ce programme permet de convertir la note d’un étudiant.*) USES FORMS; VAR Intra, Final, Travaux : REAL; Note : BYTE; Resultat : STRING[20]; {$R *.RES} BEGIN Intra := 73.5; Final := 81; Travaux := 65.5; Note := ROUND((Intra*0.3) + (Final*0.4) + (Travaux*0.3)); CASE Note OF 85 .. 100 :Resultat := 'A'; 75 .. 84 : Resultat := 'B'; 65 .. 74 : Resultat := 'C'; 50 .. 64 : Resultat := 'D'; ELSE Resultat := 'E'; END; WRITELN('La note finale est :', Resultat); READLN; END. Exécution La note finale est : C. 6.3 Boucle WHILE .. DO L’instruction WHILE .. DO contient une expression dont l’évaluation contrôle l’exécution répétitive d’une instruction (simple ou composée). © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 44 L’expression doit produire un résultat de type Booléen. Elle est évaluée avant l’exécution de la séquence. La séquence est ensuite exécutée de façon répétitive tant que l’expression renvoie la valeur TRUE. Si l’expression renvoie la valeur FALSE avant la première exécution de la séquence d’instructions, cette dernière n’est jamais exécutée. EXEMPLE 6.5 PROGRAM Exercice; (*Calculer la somme des 10 premiers chiffres : *) (*Somme = 1+ 2 + 3 + ... + 10*) USES FORMS; VAR Somme, Chiffre : Integer ; (*Programme principal*) {$R *.RES} BEGIN Somme := 0; Chiffre := 1; WHILE Chiffre <= 10 DO BEGIN Somme := Somme + Chiffre; Chiffre := Chiffre + 1; END; WRITE('La somme est : ', Somme); READLN; END. Exécution Somme Chiffre 55 11 Expression FALSE La somme est : 55 © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 45 EXEMPLE 6.6 PROGRAM Exercice2; (* Affiche un triangle rempli d’étoiles s’étendant sur 7 lignes.*) USES FORMS; VAR Ligne, Colon : INTEGER; {$R *.RES} BEGIN (*Programme principal*) Ligne := 1; WHILE ligne <= 7 DO BEGIN Colon := 1; WHILE Colon <= Ligne DO BEGIN WRITE ('*'); Colon := Colon + 1; END; (* Fin du WHILE *) Ligne := Ligne + 1 ; WRITELN; END; END. Exécution * ** *** **** ***** ****** ******* EXEMPLE 6.7 PROGRAM Exercice 4; (* Calcul de la valeur Z*) USES FORMS; VAR X, Y, Z, I : INTEGER; {$R *.RES} BEGIN (*PROGRAMME principal*) X := 3; Y := 4; © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 46 I := 1; Z := 1; WHILE I <= Y DO BEGIN Z := Z * X; I := I + 1; END; WRITELN(' La valeur de Z est : ',Z); END. Exécution La valeur de Z est : 81. EXEMPLE 6.8 PROGRAM Exercice5; (* Calcul des valeurs L, P, K*) USES FORMS; VAR K, P, L : INTEGER; {$R *.RES} BEGIN (*Programme principal*) K := 3; P := 6; L := 5; WHILE P < 10 DO BEGIN L := L * 10; P := P + 2; K := L + P; END; WRITELN(' La valeur de L est : ',L); WRITELN(' La valeur de P est : ',P); WRITELN(' La valeur de K est : ',K); READLN; END. Exécution La valeur de L est : 500 La valeur de P est : 10 La valeur de K est : 510. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 6.4 47 Instruction WHILE NOT EOF(fichier) DO L’instruction WHILE NOT EOF(fichier) DO est utilisée pour la lecture de fichiers texte. Elle permet de lire, dans le cas de fichiers texte, une ou plusieurs valeurs dans une ou plusieurs variables. La fonction EOF détermine si la position en cours du pointeur se trouve à la fin de fichier Explication de l’utilisation des instructions READ et EOF avec une variable de type Chaîne. READ lit tous les caractères jusqu’au marqueur suivant de fin de ligne (non compris) ou jusqu’à ce que EOF (F) passe à TRUE; la lecture achevée, la procédure ne passe pas à la ligne suivante. La chaîne résultante est tronquée si elle est de taille supérieure à la taille maximale de variable chaîne. À l’issue du premier READ, chaque READ suivant détecte le marqueur fin de ligne et renvoie une chaîne de taille nulle. Il est bon d’utiliser plusieurs appels à READLN pour lire des valeurs successives de type Chaîne. Explications de l’utilisation des instructions READ et EOF avec une variable de type Entier ou Réel. READ passe outre les espaces, les tabulations et les marqueurs de fin de ligne qui précèdent la chaîne numérique. Si la chaîne numérique ne respecte pas le format attendu, une erreur d’E/S se produit ; sinon, la valeur est affectée à la variable. Le READ suivant recommence à partir de l’espace, de la tabulation ou du marqueur de fin de ligne qui a terminé la chaîne numérique précédemment lue. EXEMPLE 6.9 PROGRAM Tableau1while; (*Ce programme permet de lire dans le fichier 'DONNEE.DTA' *) (*et d’imprimer cette liste de noms*) USES FORMS; {$R *.RES} CONST NombreMax = 30; TYPE TabNom = ARRAY[1..NombreMax] of STRING[15]; TabPrenom = ARRAY[1..NombreMax] of STRING[15]; VAR Nom : TabNom; Prenom : TabPrenom; i : INTEGER; Fichier : TEXT; Cmptligne : INTEGER; © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 48 BEGIN ASSIGN(Fichier,'TP4_3.dta'); RESET(Fichier); Cmptligne := 1; i := 1; WRITELN('Nom Prénom '); WHILE NOT EOF(Fichier) DO BEGIN READLN(Fichier,Nom[i],Prenom[i]); CmptLigne := CmptLigne + 1; i := i + 1; END; IF Cmptligne > NombreMax THEN Cmptligne := NombreMax; WRITELN('Liste de noms'); WRITELN; WRITELN('Nom Prénom '); FOR i := 1 TO NombreMax DO WRITELN(Nom[i],Prenom[i]); CLOSE(Fichier); READLN; END. 6.5 Boucle REPEAT. . UNTIL REPEAT permet de répéter une instruction ou une série d’instructions jusqu’à ce qu’une condition soit vraie (TRUE). Elle commence par le mot réservé REPEAT et se termine par le mot réservé UNTIL, suivi de la condition évaluée. Cette condition est toujours une expression booléenne. EXEMPLE 6.10 PROGRAM Exercice1; ( *Exemple d’utilisation de la boucle REPEAT UNTIL* ) USES FORMS; VAR Ligne, Colonne : INTEGER; {$R *.RES} BEGIN (*Programme principal*) Ligne := 1; REPEAT Colonne := Ligne; REPEAT WRITE(Colonne); © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 49 Colonne := Colonne + 1; UNTIL Colonne > 4 ; Ligne := Ligne + 1; WRITELN; UNTIL Ligne > 4; READLN; END. Exécution 1234 123 12 1 EXEMPLE 6.11 PROGRAM REPEATUNTIL1; (*Calculer le nombre d’années pour terminer de payer un prêt hypothécaire de 50 000 $ avec un taux d’intérêt annuel de 7,5 % sachant que le montant déposé annuellement est de 8,200$*) USES FORMS; VAR Pret, Montant, Taux, Interet : REAL; NbAn :INTEGER; (* Nombre d’années*) (* à calculer*) {$R *.RES} BEGIN (*Programme principal*) Pret := 50000; Taux := 0.075; Montant := 8200; NbAn := 0; REPEAT NbAn := NbAn + 1; Interet := Pret * Taux; Pret := Pret + Interet; Pret := Pret - Montant; UNTIL Pret <= 0; WRITE ('Nombre d''années est : ', NbAn); READLN; END. Exécution Nombre d’années est : 9. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 50 EXEMPLE 6.12 PROGRAM REPEATUNTIL1; (* Exemple d’utilisation de la boucle REPEAT .. UNTIL *) USES FORMS; VAR X, N : INTEGER; {$R *.RES} BEGIN (*Programme principal*) X := 0; N := 0; REPEAT X := X + 1; IF X MOD 2 = 0 THEN N := N +1; UNTIL X > 20; WRITELN(' Valeur de N est : ' , N); READLN; END. Exécution La valeur de N est : 10. EXEMPLE 6.13 PROGRAM Exercice5; (* Exemple d’utilisation de la boucle REAPET .. UNTIL *) USES FORMS; CONST Max = 0.875; VAR Terme: INTEGER; Somme : REAL; {$R *.RES} BEGIN (*Programme principal*) Somme := 0; Terme := 2; REPEAT Somme := Somme + (1/Terme); Terme := Terme * 2; UNTIL Somme >= Max; WRITELN('La valeur finale de Terme est : ',Terme); READLN; END. Exécution La valeur finale de Terme est : 16. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 6.6 51 Boucles FOR 6.6.1 FOR .. TO L’instruction FOR provoque l’exécution répétitive d’une instruction (simple ou composée) parallèlement à l’incrémentation ou la décrémentation du contenu d’une variable de contrôle. EXEMPLE 6.14 PROGRAM FORTO; (*Calculer la factorielle d’un nombre entier positif : N! = 1 x 2 x ... x n exemple : 4! = 1 x 2 x 3 x 4 = 24*) USES FORMS; VAR N, F, I : INTEGER; {$R *.RES} BEGIN (*Programme principal*) N := 4; F := 1; FOR I := 1 TO N DO F := F * I; WRITELN('La factorielle de 4 est : ',F); READLN; END. Exécution La factorielle de 4 est : 24. 6.6.2 FOR .. DOWNTO Avec le mot réservé DOWNTO, le contenu de la variable de contrôle est décrémenté de 1 à chaque répétition. Si la valeur initiale est inférieure à la valeur courante de la variable de contrôle, l’instruction n’est pas exécutée. EXEMPLE 6.15 PROGRAM DOWTO1; (* Exemple d’utilisation de DOWNTO *) USES FORMS; VAR J, I : INTEGER; {$R *.RES} © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 52 BEGIN (*Programme principal*) FOR I := 1 TO 3 DO BEGIN FOR J := 3 DOWNTO 1 DO BEGIN IF J > I THEN WRITE (I:2) ELSE WRITE(J:2); END; WRITELN; END; READLN; END. Exécution 111 221 321 © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 7. 53 LES PROCÉDURES PASCAL permet de décomposer un programme en plusieurs sous-programmes. La décomposition offre les avantages suivants : – Évite la duplication des mêmes séquences d’instructions dans un même programme. – Détecte plus facilement les erreurs logiques. – Comprend et s’adapte plus facilement aux besoins des usagers. – Est accessible à partir de plusieurs endroits du programme. Il existe deux sortes de sous-programmes : – Les procédures – Les fonctions Une procédure est une structure de programme autonome incluse dans un programme. Son diagramme syntaxique se présente comme suit : PROCEDURE-En-tête Bloc d’instructions L’en-tête est constitué du nom de la procédure et d’une liste de paramètres formels (optionnelle). Le bloc d’instructions est constitué d’une partie de la déclaration et d’une liste d’instructions. La liste d’instructions doit être encadrée par un « BEGIN » et un « END ». Les procédures se retrouvent entre les déclarations globales et le début (BEGIN) du corps du programme principal. Le programme de l’exemple 7.1 est un exemple de programme qui comporte une procédure EXEMPLE 7.1 PROGRAM Procedure2; Programme principal USES FORMS; VAR Pret, Montant, Taux, Interet : REAL; {$R *.RES} PROCEDURE CALCUL; VAR NbAn : INTEGER; Déclaration globale du programme Procédure En-tête de la procédure Déclaration locale de la procédure BEGIN Liste d’instructions de la procédure NbAn := 0; REPEAT NbAN := NbAn + 1; Interet := Pret * Taux; Pret:= Pret + Interet; Pret := Pret - Montant; UNTIL Pret <=0; WRITE('Le nombre d''années est de : ',NbAn); END; © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 54 BEGIN Début du WRITE('Ecrire le montant du prêt :'); programme principal READLN ( Pret); WRITE('Entrez le taux : Exemple 0.065 = 6.5% : '); READLN (Taux); WRITE('Écrire le montant que vous voulez payer à chaque année '); READLN(Montant); CALCUL; READLN; END. Fin du programme principal 7.1 Variables globales Les variables globales sont des variables qui sont déclarées dans la partie de la déclaration globale du programme et qui sont connues partout dans le programme; c’est la même chose pour les constantes globales. Dans l’exemple précédent, Pret, Montant, Taux, Interet sont des variables globales. 7.2 Variables locales Les variables locales sont des variables qui ne sont connues qu’à l’intérieur de la procédure où elles sont déclarées. Elles ne sont pas connues dans le bloc du programme principal et elles n’existent qu’au moment où la procédure est appelée. Dans l’exemple précédent, NbAn est une variable locale dans la procédure CALCUL. 7.3 Appel de procédure On appelle une procédure par son nom. De plus, le nombre de paramètres effectifs (à envoyer) doit être identique au nombre de paramètres formels (à recevoir). Par ailleurs, les paramètres correspondants doivent être du même type. Dans l’exemple précédent, « CALCUL » est un appel de procédure. 7.4 Transmission de paramètres Il y a deux modes de transmission de paramètres : la transmission par valeur (ou par copie) et la transmission par référence (ou par variable). – Transmission par valeur. On fournit de l’information à la procédure appelée, mais on n’a pas besoin du résultat de retour du ou des paramètres. Après être sorti de cette procédure, ce ou ces paramètres contiendront toujours leurs anciennes valeurs. Note.– Avant de transmettre un paramètre par valeur, sa valeur doit être connue. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION – 55 Transmission par référence. On attend le résultat de retour du ou des paramètres envoyés. Après être sorti de cette procédure, ce ou ces paramètres prendront la ou les valeurs les plus récentes. Important.– On doit introduire le mot « VAR » devant le ou les paramètres dans l’entête de la procédure appelée. Note.– Avant de transmettre un paramètre par référence, sa valeur n’est pas nécessairement connue. EXEMPLE 7.2 PROGRAM Procedure2; (* Ce programme permet de lire et de calculer la somme de deux nombres réels en utilisant la décomposition en procédures. *) USES FORMS; {$R *.RES} VAR R1, R2, Somme : REAL; (*On attend la valeur de retour*) PROCEDURE lire (VAR Z : REAL); BEGIN WRITE ('Entrez un nombre : '); READLN(Z); END; (*On fournit les valeurs de X et Y et on attend la valeur *) (* de retour de Somme *) PROCEDURE Calcul (X, Y: REAL); BEGIN Somme := X + Y; END; (*Fin de la procédure Calcul*) BEGIN Lire (R1); Les valeurs de R1 et de R2 ne sont pas connues Lire (R2); avant d'appeler la procédure. Calcul(R1, R2); Les valeurs de R1 et R2 sont déjà connues. WRITELN('Le nombre de R1 est : ',R1:9:2); WRITELN('Le nombre de R2 est : ',R2:9:2); WRITELN('Le nombre de la somme est : ',Somme:9:2); END. (* Fin du programme*) Note.– Les identificateurs des paramètres à l'appel et les identificateurs des paramètres de la procédure ne sont pas nécessairement identiques. Litre (R1) © Télé-université, 2003 → PROCEDURE lire (VAR Z : REAL); Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 56 EXEMPLE 7.3 PROGRAM Exemple1; (*Exemple de procédure*) USES FORMS; {$R *.RES} VAR K, L : BYTE; PROCEDURE Calcul (A: BYTE; VAR B : BYTE); BEGIN A := A * B; B := B MOD 2; WRITELN (K, A:3, B:3); END; (*Fin de la procédure Calcul*) BEGIN K := 5; L := 7; WRITELN ('Les nombres : ',K , L:3); Calcul(K, L); WRITELN ('Les nombres : ',K , L:3); READLN; END. EXEMPLE 7.4 PROGRAM Exercice2; (*Exemple de procédure*) USES FORMS; {$R *.RES} VAR K , Y: INTEGER; PROCEDURE P (X : Integer); PROCEDURE Q (VAR Y : Integer); BEGIN Y := SQR(Y); WRITELN ('Les nombres : ',Y); END; BEGIN Q(X); X := X + 1; END; (*Fin du Calcul*) BEGIN K := 8; P(K); WRITELN ('Les nombres : ',K); READLN; END. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 57 EXEMPLE 7.5 PROGRAM Procedurecalcul3; (*Exemple de procédure*) USES FORMS; {$R *.RES} VAR A, B, C: INTEGER; PROCEDURE Une; BEGIN A := 2 * A; B := A + 5; END; PROCEDURE Deux(VAR A, B : Integer); VAR C : INTEGER; BEGIN IF ((B-A) MOD 2 <> 0) THEN BEGIN C := A; A := B; B := C; END (*Fin du IF*) ELSE B := A; END; BEGIN A := 10; B := 2; C := 4; WRITELN ('Les nombres : ',A:5, B:5, C:5); Une; WRITELN ('Les nombres : ',A:5, B:5, C:5); Deux(A,B); WRITELN ('Les nombres : ',A:5, B:5, C:5); Deux(C,B); WRITELN ('Les nombres : ',A:5, B:5, C:5); READLN; END. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 8. 58 LES FONCTIONS PASCAL permet de décomposer un programme en plusieurs sous-programmes. La décomposition offre les avantages suivants : – Évite la duplication des mêmes séquences d’instructions dans un même programme. – Détecte plus facilement les erreurs logiques. – Comprend et s’adapte plus facilement aux besoins des usagers. – Est accessible à partir de plusieurs endroits du programme. Une fonction est une structure de programme autonome incluse dans un programme qui ressemble en plusieurs points à une procédure. La seule différence réside dans le fait que la fonction retourne une seule valeur de type simple (Réel, Entier, Caractère, Booléen, Chaîne des caractères, Énuméré et Intervalle). Le diagramme syntaxique d’une fonction se présente comme suit : FUNCTION - en-tête Bloc d’instructions L’en-tête est constitué du nom de la fonction, d’une liste des paramètres formels (optionnelle) et d’un type de retour. Le bloc d’instructions doit être constitué d’une partie de la déclaration et d’une liste d’instructions. La liste d’instructions doit être encadrée dans un « BEGIN » et un « END ». Les fonctions se retrouvent entre les déclarations globales et le début (BEGIN) du corps du programme principal. EXEMPLE 8.0 Structure d’un programme qui comporte une fonction PROGRAM Fonctionl3; USES FORMS; {$R *.RES} VAR Utilisateur : REAL; Programme principal Déclaration globale du programme principal FUNCTION Carre (Entree : REAL) : REAL; L’en-tête de la fonction CONST Nombre1 = 3.1416; Déclaration locale de la fonction VAR Nombre2 : REAL; BEGIN Liste d’instructions de la fonction Nombre2 := Nombre1 * Entree; Carre := Entree * Entree * nombre2; END; BEGIN Début du WRITE(Entrez un nombre :'); programme principal READLN(Utilisateur); Appel de la fonction WRITE('Le nombre est : ',carre(Utilisateur)); READLN END. Fin du programme principal © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 8.1 59 Variables globales Les variables globales sont des variables qui sont déclarées dans la partie de la déclaration globale du programme et sont connues partout dans le programme; c’est la même chose pour les constantes globales). Dans l’exemple précédent, Utilisateur est la variable globale. 8.2 Variables locales Les variables locales sont des variables qui ne sont connues qu’à l’intérieur de la fonction où elles sont déclarées. Elles ne sont pas connues dans le bloc du programme principal et elles n’existent qu’au moment où la fonction est appelée. Dans l’exemple précédent, Nombre2 est une variable locale dans la fonction CARRE. 8.3 Appel des fonctions On appelle une fonction par son nom. De plus, le nombre de paramètres effectifs (à envoyer) doit être identique au nombre de paramètres formels (à recevoir). Par ailleurs, les paramètres correspondants doivent être du même type. EXEMPLE 8.1 PROGRAM FUNCTIONfin; USES FORMS; VAR X, Y : INTEGER; {$R *.RES} FUNCTION Lire : INTEGER; VAR Nb : INTEGER; BEGIN WRITE ('Entrez un nombre > '); READLN(Nb); Lire := Nb; END; FUNCTION Moyen (A, Y : LONGINT): REAL; BEGIN Moyen := (A + Y) / 2; END; BEGIN Y := Lire; X := Lire; WRITE('Moyenne = ', Moyen(Y,X):15:2); READLN; END. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 9. 60 UNITÉS Le langage PASCAL Objet pour DELPHI 3 (Borland) supporte des modules d’instructions compilés séparément et plus connus sous le nom d’unités. Avec les unités, les instructions sont plus structurées et peuvent être réutilisées dans plusieurs projets. Dans les projets DELPHI 3, les unités les plus utilisées sont les unités fiches. Elles contiennent les gestionnaires d’événements et les instructions des fiches des projets. Cependant, des unités peuvent faire partie du projet sans être associées à des fiches. Vous pouvez créer et enregistrer une unité, en tant que fichier indépendant, qu’aucun projet n’utilise. Par exemple, vous pouvez écrire vos propres fonctions, DLL et composants, puis placer leurs instructions sources dans un fichier à part, qui ne soit associé à aucune fiche. Qu’une unité soit associée à une fiche ou non, sa structure de base est la même. Les parties d’une unité sont les suivantes : – UNIT < identificateur >; – INTERFACE – USES < liste des unités>; { facultatif } { Déclarations publiques } – Implémentation – USES <liste des unités>; { facultatif } { Déclarations privées } { implémentation des procédures et fonctions } – Initialisation { facultatif } { code d’initialisation facultatif } – END; L’en-tête de l’unité commence par le mot réservé UNIT, suivi du nom de l’unité (identificateur). L’élément suivant est le mot réservé INTERFACE, qui indique le début de la partie interface de l’unité; c’est la partie visible pour les autres unités ou applications qui utilisent celle-ci. Ce programme utilise une unité et additionne, en utilisant le langage PASCAL Objet pour DELPHI 3, deux chiffres en cliquant sur un bouton. Nous utilisons dans ce programme une fiche, l’inspecteur objet, un programme principal et une unité.pas. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 61 CRÉATION D’UNE FICHE INSPECTEUR OBJET PERMETTANT DE MODIFIER LES CARACTÉRISTIQUES DE LA FICHE. © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 62 EXEMPLE D’UN PROGRAMME EN PASCAL OBJET (DELPHI) : LE PROGRAMME PRINCIPAL (TESTEPROJECT1.DPR) PROGRAM TesteProject1; USES FORMS, testeunite in 'testeunite.pas' {Form1}; {$R *.RES} BEGIN Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; END. L’UNITÉ SOURCE (TESTEUNITE.PAS). UNIT Testeunite; INTERFACE USES Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; TYPE TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Button1: TButton; PROCEDURE Button1Click(Sender: TObject); private { Déclarations privées } PROCEDURE AjouteNombre; public { Déclarations publiques } END; VAR Form1: TForm1; IMPLEMENTATION {$R *.DFM} © Télé-université, 2003 Introduction à la programmation INF 1200 COMPLÉMENT D’INFORMATION 63 PROCEDURE TForm1.AjouteNombre; VAR Valeur1, Valeur2, Total : INTEGER; BEGIN Valeur1 := StrtoInt(Edit1.Text); Valeur2 := StrtoInt(Edit2.Text); Label1.Caption := IntToStr(Valeur1 + Valeur2); END; PROCEDURE TForm1.Button1Click(Sender: TObject); BEGIN AjouteNombre; END; END. SOLUTION DU PROBLÈME (1024 + 1024 = 2048) : BIBLIOGRAPHIE Guide du développeur Borland DELPHI 3, Borland International, Ireland, 1997. Guide de l’utilisateur Borland DELPHI 3, Borland International, Ireland, 1997. Dan Osier, Steve Batson et Steve Grobman, DELPHI 3, Simon & Schuster Macmillan, Paris, 1997. © Télé-université, 2003 Introduction à la programmation INF 1200