Pascal PDF
Pascal PDF
Pascal PDF
● INTRODUCTION
Ce document présente (de manière claire je crois, d'après ce qu'en
❍ LES LOGICIELS
ont dit certains) le langage PASCAL. Il a été publié dans APTEP
❍ ORGANISATION DE
- INFO il y a quelques années. Depuis, bien que je maîtrisais bien
L'ORDINATEUR ce langage et avais développé de nombreux programmes en
❍ LANGAGES DE Pascal, je suis passé au C. Le C est d'après moi plus souple et plus
PROGRAMMATION efficace à condition de bien en comprendre les mécanismes (il
● UN PREMIER PETIT faut d'après moi comprendre à la fois l'assembleur et les objets
PROGRAMME pour bien programmer en C). De plus le C est plus utilisé dans
● CONSTANTES mon environnement d'informaticiens. Néanmoins le Pascal reste
● INSTRUCTION bien meilleur pour le débutant et le programmeur moyen :
parfaitement structuré et clair, il conduit rapidement à un
D'AFFECTATION
programme de bonne qualité et assez facilement maintenable (ce
● LES TYPES DE qui l'est moins en C, qui possède trop souvent trop de possibilités
VARIABLES STANDARD pour résoudre le même problème).
SIMPLES ET OPERATEURS
ASSOCIES De plus, on trouve des compilateurs Pascal très conviviaux
❍ ENTIERS (Turbo Pascal sur PC, avec aide en ligne, déboguage,...).
❍ REELS
❍ BOOLEENS Ce document reste donc d'actualité : le Pascal est d'après moi une
❍ CARACTERES
très bonne manière d'aborder la programmation. C'est pourquoi
● LES FONCTIONS j'ai choisi de mettre à disposition ce document sur Internet, qu'il
serve à qui en a besoin ! Néanmoins, je n'ai pas passé trop de
STANDARD
temps à sa mise en page, les graphiques restent en mode
● INSTRUCTION
caractère, il n'y a pas de lien direct entre les sujets d'exercices et
● STRUCTURES DE leur correction (que l'on trouvera en fin du document).
CONTROLE
❍ BOUCLE WHILE - Voici quelques adresses intéressantes :
DO (tant que - faire)
❍ BOUCLE REPEAT - ● ABC de la Programmation : Olivier Pecheux vous aide à
UNTIL (répéter - démarrer (y compris à installer le compilateur freeware
jusqu'à ce que) DJGPP)
❍ BOUCLE FOR - DO ● Pascalissime
(pour - faire) ● Point de rencontre des utilisateurs de Borland Pascal
❍ INSTRUCTION IF - ● Site officiel de Borland France, et en particulier les
THEN - ELSE (si - compilateurs gratuits (sous Dos-Windows évidement, sous
alors - sinon) Unix vous saviez déjà que les meilleurs compilateurs sont
❍ LA STRUCTURE
chez GNU).
UNIDIMENSIONNELS
❍ LES CHAINES DE
CARACTERES ● INTRODUCTION
❍ TABLEAUX DE ● UN PREMIER PETIT PROGRAMME
TABLEAUX ● CONSTANTES
❍ TABLEAUX ● INSTRUCTION D'AFFECTATION
COMPACTES ● LES TYPES DE VARIABLES STANDARD SIMPLES
● ENREGISTREMENTS ET OPERATEURS ASSOCIES
❍ DECLARATION ● LES FONCTIONS STANDARD
❍ UTILISATION DES ● INSTRUCTION
ENREGISTREMENTS ● STRUCTURES DE CONTROLE
❍ LA STRUCTURE ● TYPES ENUMERES NON STANDARDS
WITH - DO (avec - ● LES TYPES INTERVALLES
faire) ● TABLEAUX
❍ ENREGISTREMENTS ● ENREGISTREMENTS
AVEC VARIANTES ● PROCEDURES ET FONCTIONS
● PROCEDURES ET ● LES ENTREES / SORTIES
FONCTIONS ● ENSEMBLES
❍ GENERALITES ● POINTEURS
❍ PORTEE DES ● CORRECTION DES EXERCICES
DECLARATIONS
❍ ARGUMENTS (OU ● Sommaire détaillé
PARAMETRES)
❍ LES FONCTIONS
❍ RECURSIVITE
❍ LES FICHIERS DE
TEXTE
❍ EXTENSIONS NON
STANDARD
■ ACCES
DIRECT
■ IMPRIMANTE
■ AUTRES
● ENSEMBLES
● POINTEURS
❍ LES LISTES
CHAINEES ET
ARBRES
❍ LES POINTEURS EN
PASCAL
● CORRECTION DES
EXERCICES
❍ -- Ex ex_tva
❍ -- Ex ex_puiss
❍ -- Ex ex_jeu
❍ -- Ex ex_moy
❍ -- Ex ex_jeu_bis
❍ -- Ex ex_calc
❍ -- EX moy.a
❍ -- Ex rot.b
❍ -- Ex clas.c
❍ -- Ex str
❍ --Ex mat
❍ -- Ex tel
❍ -- Ex rec
❍ -- Ex fichier
❍ -- Ex pointeurs
le Langage PASCAL
Patrick TRAU Janvier 92
version HTML mars 97
Ce document présente (de manière claire je crois, d'après ce qu'en ont dit certains) le langage
PASCAL. Il a été publié dans APTEP - INFO il y a quelques années. Depuis, bien que je maîtrisais
bien ce langage et avais développé de nombreux programmes en Pascal, je suis passé au C. Le C est
d'après moi plus souple et plus efficace à condition de bien en comprendre les mécanismes (il faut
d'après moi comprendre à la fois l'assembleur et les objets pour bien programmer en C). De plus le C
est plus utilisé dans mon environnement d'informaticiens. Néanmoins le Pascal reste bien meilleur
pour le débutant et le programmeur moyen : parfaitement structuré et clair, il conduit rapidement à un
programme de bonne qualité et assez facilement maintenable (ce qui l'est moins en C, qui possède
trop souvent trop de possibilités pour résoudre le même problème).
De plus, on trouve des compilateurs Pascal très conviviaux (Turbo Pascal sur PC, avec aide en ligne,
déboguage,...).
Ce document reste donc d'actualité : le Pascal est d'après moi une très bonne manière d'aborder la
programmation. C'est pourquoi j'ai choisi de mettre à disposition ce document sur Internet, qu'il serve
à qui en a besoin ! Néanmoins, je n'ai pas passé trop de temps à sa mise en page, les graphiques
restent en mode caractère, il n'y a pas de lien direct entre les sujets d'exercices et leur correction (que
l'on trouvera en fin du document).
Copyright : utilisation de ce document libre pour tout usage personnel. Utilisation autorisée pour tout
usage public non commercial, à condition de citer son auteur (Patrick TRAU, IPST, Université Louis
Pasteur Strasbourg) et de me signaler tout usage intensif. Utilisation commerciale interdite sans
accord écrit de ma part.
● INTRODUCTION
● UN PREMIER PETIT PROGRAMME
● CONSTANTES
● INSTRUCTION D'AFFECTATION
● LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
● LES FONCTIONS STANDARD
● INSTRUCTION
● STRUCTURES DE CONTROLE
● TYPES ENUMERES NON STANDARDS
● LES TYPES INTERVALLES
● TABLEAUX
● ENREGISTREMENTS
● PROCEDURES ET FONCTIONS
● LES ENTREES / SORTIES
● ENSEMBLES
● POINTEURS
● CORRECTION DES EXERCICES
● Sommaire détaillé
Vous êtes le ième lecteur de cette page depuis le 1/1/1664. Vous pouvez signer mon
livre d'or chez .
Je m'apelle Patrick TRAU, j'ai près de 40 ans (mais du côté où l'on s'en éloigne), je suis marié et ai
trois enfants. Nous habitons à Obernai, en Alsace
De formation technique (Bac E, ENS Cachan section Mécanique, Agrégé de mécanique), j'ai effectué
ma recherche au LMT (Laboratoire de Mécanique et Technologie) à Cachan, dans le groupe CAO.
J'ai mis au point SYMATRAU, un SYstème expert de MAillage TRidimensionnel AUtomatique. J'y
ai travaillé sur UNIVAC 1100, puis sur NorkData/Matra DataSystem, principalement en FORTRAN.
Puis j'ai été nommé enseignant à l'Université de Metz, où j'ai enseigné l'informatique (Basic, Pascal)
et l'automatisme, principalement en licence/maîtrise Technologie Mécanique, Génie Mécanique,
préparation à l'agregation de mécanique, DESS GMP où je m'occupais du module CAO, et ISFATES.
Au LPMM (Laboratoire de Physique et Mécanique des Matériaux), je m'occupais du matériel
informatique, de leur installation physique à l'administration système du réseau. Je travaillais sur PC
et VAX 780 puis sur stations Apollo sous AEGIS)
Depuis 1990 je suis en poste à l'IPST. Jusqu'en 94, j'étais directeur adjoint de l'IPST. Désormais je
m'occupe de l'informatique de l'UFR, pour l'enseignement (PC), l'administration et la recherche au
L3MI (Laboratoire de Mécanique des Multi Matériaux Industriels) (stations SUN sous UNIX/Solaris,
PC sous Linux et Windows). Je m'occupe également de ce serveur (sous Linux), ainsi que du contenu
de notre site. J'enseigne principalement l'informatique (C, PROLOG, Algorithmique) et
l'automatisme en IUP Génie des Systèmes Industriels et DESS Mécanique Avancée et Stratégies
Industrielles,
A part cela, il me reste un peu de temps pour m'occuper de ma famille, bricoler chez moi et sous ma
voiture, faire du VTT avec des copains. Pendant les vacances, je pars en camping car, en général en
France.
Si vraiment vous désirez plus de détails sur mes activités, consultez mon CV. Peut être cela vous
permettra de répondre à cette question :
Choisissez BACK (en haut à gauche) pour revenir à la page précédente, cliquez ici pour la Pat's
Home Page
INTRODUCTION
● LES LOGICIELS
● ORGANISATION DE L'ORDINATEUR
● LANGAGES DE PROGRAMMATION
LES LOGICIELS
Dans la majorité des cas, on achète des programmes (logiciels) tout faits qui correspondent plus ou
moins au besoin :
* Base de données : ensemble de fiches (nom, adresse...) et recherche par rubrique, publipostage...
Soit on achète un logiciel général : très bon niveau, parfaitement testé, documentation, formation...
mais trop général (fonctions inutiles, fonctions utiles avec trop de paramètres ou difficilement
accessibles). Soit on fait (ou fait faire) un logiciel particulier : plus pratique, mais plus hasardeux
(erreurs, SAV, doc...). Le cahier des charges doit être très précis.
ORGANISATION DE L'ORDINATEUR
* Multiposte : plusieurs consoles sur un même ordinateur (CPU puissant, tout est partageable)
* Réseau : plusieurs CPU et MC non partageable (sauf réseau de multipostes), MdM et périphériques
partageables ou locaux.
LANGAGES DE PROGRAMMATION
Un ordinateur est une machine bête, ne sachant qu'obéir, et à très peu de choses :
* sortir un résultat ou lire une valeur binaire (dans une mémoire par exemple),
Sa puissance vient du fait qu'il peut être PROGRAMME, c'est à dire que l'on peut lui donner, à
l'avance, la séquence (la suite ordonnée) des ordres à effectuer l'un après l'autre. Le grand avantage de
l'ordinateur est sa rapidité. Par contre, c'est le programmeur qui doit TOUT faire. L'ordinateur ne
comprennant que des ordres codés en binaire (le langage machine), des langages dits "évolués" ont
été mis au point pour faciliter la programmation.
Le PASCAL, créé par WIRTH au début des années 70, possède des instructions assez claires (si vous
comprenez l'anglais), et favorise une approche méthodique et disciplinée (on dit "structurée").
* le traduire en langage machine (c'est à dire en codes binaires compréhensibles par l'ordinateur) :
c'est la compilation et éventuellement l'édition de liens (LINK),
* l'exécuter.
Contrairement à un basic interprété, l'exécution sera beaucoup plus rapide puisqu'il n'y a plus de
traduction à effectuer.
Bien que le langage soit normalisé, un certain nombre de points dépendent de la machine et du
compilateur utilisé (par exemple comment appeler le compilateur). Ces indications ne seront pas
données ici. Si vous avez le choix, je vous conseille TURBO PASCAL, le plus pratique d'emploi (en
particulier parce qu'il possède son propre éditeur de texte).
L'entête est composée du mot PROGRAM, suivi du nom du programme (cercle), et d'indications sur
les Entrées/Sorties (ici le clavier et l'écran).
La partie déclarative de notre programme est limitée à la déclaration de deux variables (mot clef
VAR). Une variable est une "case" mémoire de l'ordinateur, à laquelle on donne ici un nom. Chaque
case peut contenir une valeur. On a précisé ici que nos deux variables PERIMETRE et DIAMETRE
contiendraient des réels. Les types simples connus en PASCAL sont : REAL, INTEGER (entier
naturel), CHAR (contient UN est un seul caractère), et BOOLEAN (booléen, c.a.d qui peut valoir soit
TRUE (vrai) soit FALSE (faux). En TURBO PASCAL, les entiers admissibles sont compris entre -
32768 et +32767. Dans tous les PASCALs on possède la variable prédéclarée MAXINT qui donne le
plus grand entier admissible. Les réels doivent être compris en TURBO entre + et -1.7E37 (c.a.d 1,7
fois 10 puissance 37), avec 11 chiffres significatifs. La virgule décimale est toujours représentée par
un point en informatique.
Un identificateur (tout nom que vous choisissez : variable, programme...) peut être formé de lettres
(A à Z), de chiffres et (pas sur toutes les versions de PASCAL) du signe _ (souligné). TURBO
PASCAL accepte des noms de 127 caractères maximum, certains PASCAL sont plus limités (31
caractères par ex). Le premier caractère doit être une lettre. Par exemple, VALEUR1 ou
PREM_VALEUR sont possibles mais pas 1ERE_VALEUR. En PASCAL les minuscules sont
traitées comme des majuscules (SURface et surFACE désignent la même case mémoire). Je n'utilise
les majuscules que pour faire ressortir les mots importants. Les accents et autres ç ne sont pas
autorisés (var diamètre:real est interdit à cause de l'accent). Un blanc dans un identificateur est
également interdit (utilisez _ pour séparer des mots dans un même identificateur).
Toute variable utilisée dans un programme doit être déclarée. Ceci évite la plupart des erreurs de
frappe, et rend le programme plus compréhensible.
le programme s'arrête, attend que l'on donne une valeur à l'aide du clavier, met cette valeur dans la
case DIAMETRE et continue le programme lorsque l'on appuie sur la touche "ENTREE" ou
"RETURN".
* calcul et affectation :
on multiplie le contenu de la case DIAMETRE par PI, et on met le résultat dans la case PERIMETRE.
Le := symbolise une flèche à gauche. Ce n'est PAS une égalité au sens mathématique, mais la copie
d'une valeur dans une mémoire.
on affiche sur l'écran le contenu des case DIAMETRE (que l'on connaissait puisque nous l'avions
donné) et PERIMETRE (qui nous intéresse un peu plus). Ce programme affiche donc deux chiffres. Il
serait plus parlant d'afficher également des commentaires par l'instruction :
Les textes doivent être entourés de cotes ('). Les majuscules/minuscules sont significatives. Pour
afficher une apostrophe utiliser deux cotes ('l''exemple'). Pour sauter une ligne utiliser WRITELN
seul.
Les instructions doivent toujours être séparées par des ";" (j'ai dit "séparées", pas "terminées"). Le fait
de passer à la ligne n'est interprété par l'ordinateur que comme un blanc. On aurait donc pu écrire
notre programme sur une seule ligne (peut-être un peu longue pour l'éditeur). Le programme doit
toujours se terminer par un point.
On peut insérer des remarques dans le programme (qui ne seront pas lues par le compilateur) en les
entourant par (* et *) ou { et }. On ne peut en standard pas imbriquer des commentaires. Les
commentaires peuvent faire plus d'une ligne, ceci permet de supprimer momentanément une partie
d'un programme.
Chaque identificateur est séparé du suivant par un blanc. On considère comme un blanc : plusieurs
blanc, un retour à la ligne, un commentaire.
EXERCICE (ex_tva) Faire un programme demandant le prix unitaire HT d'un article et sa quantité,
puis qui affiche : le total Hors Taxes, le montant de la TVA (pour un taux de 18,6 %) et le total TTC.
CONSTANTES
Nous avons déjà utilisé des VARIABLES (on donne un nom à une mémoire). Mais on peut
également utiliser des CONSTANTES, qui sont des valeurs qui restent fixes tout au long du
programme et pour chaque exécution. On déclare les constantes avant de déclarer les variables, par :
CONST nom=valeur
ex : CONST taux_tva=18.6
Le type de la constante est déterminé automatiquement par le compilateur (entier si nombre sans
point, réel si nombre avec point, caractères si entre cotes).
Rq1: on peut toujours utiliser un entier à la place d'un réel mais pas l'inverse.
Rq2: si on utilise un point décimal, il FAUT l'encadrer de chiffres (0.3 et non .3 , 10 ou 10.0 et non
10.)
http://www-ipst.u-strasbg.fr/pat/program/pascal03.htm09/08/2003 22:40:30
le Langage PASCAL - INSTRUCTION D'AFFECTATION
INSTRUCTION D'AFFECTATION
On appelle AFFECTATION la mise d'une valeur dans une variable. Celle-ci peut être sous forme
directe (A:=B) ou sous forme d'un calcul (A:=B*C). Le signe := représente une flèche à gauche, et
signifie "mettre la VALEUR à droite du := dans la mémoire désignée à gauche" (mettre le contenu de
B dans A ou mettre le résultat du calcul (contenu de B) fois (contenu de C) dans A). Une affectation
du type B*C:=A est donc IMPOSSIBLE.
Une affectation ne peut se faire qu'entre une variable et une expression de même type (si A est réel,
impossible de faire A:='xyz'). La seule exception est de mettre un entier dans un réel (le .0 est rajouté
automatiquement), mais l'inverse est impossible directement. Soient I entier et X réel, pour mettre X
dans I il faut utiliser I:=ROUND(X) (arrondi) ou I:=TRUNC(X) (partie entière).
On peut également utiliser des affectations et expressions booléennes. Par exemple, en ayant déclaré :
VAR test:boolean;
a,b:real;
http://www-ipst.u-strasbg.fr/pat/program/pascal04.htm09/08/2003 22:40:30
le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
ENTIERS
déclaration : VAR variable1,variable2,...,variableN : INTEGER;
opérations sur entiers : + - * div (division) mod (reste de la division). Elles sont toutes à résultat
entier, et nécessitent deux arguments entiers.
Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard prédéfinie (sa
valeur dépend par contre du compilateur, 32767 en TURBO).
REELS
déclaration : VAR liste de variables : REAL;
opérations : + - * /
Quand une opération comprend un argument réel et un entier, le résultat est réel. / donne toujours un
résultat réel, même si les deux arguments sont entiers.
* et / sont de priorité supérieure à + et -, mais entre * et / tout dépend du compilateur (en général de
gauche à droite). En cas d'ambiguïté, utilisez des parenthèses (il n'y a aucun inconvénient à mettre
plus de parenthèses que nécessaire).
A+B/C = A+(B/C) = 5
(A+B)/C = 3.5
A/B*C = (A/B)*C (1.5) dans certains cas, A/(B*C) (0.375) dans d'autres
B*A-5*C = (B*A)-(5*C) = 2
BOOLEENS
déclaration : VAR liste de variables : BOOLEAN;
Ces variables peuvent prendre soit la valeur TRUE (vrai), soit la valeur FALSE (faux).
opérations booléennes : AND, OR, NOT, et (non standard) XOR (ou exclusif). Ces opérations
nécessitent des arguments booléens.
opérations à valeur booléenne : > (supérieur), < (inf), >= (sup ou égal), <=, = (égal), <> (différent).
Ces opérations comparent tous éléments de type simple (les 2 arguments doivent être de même type,
sauf entiers et réels qui peuvent être comparés entre eux), et renvoient un booléen. Les caractères sont
comparés suivant l'ordre du code ASCII.
AND (et), OR (ou), NOT (non), sont de priorité supérieure aux précédents et ne peuvent opérer que
sur des booléens : A>B et C doit être écrit : (A>B) and (A>C). Les parenthèses sont obligatoires pour
ne pas faire en premier B and A.
CARACTERES
déclaration : VAR liste de variables : CHAR;
ces variables contiennent UN caractère. Ceux-ci sont classés suivant un ordre précis: le code ASCII
qui suit l'ordre suivant :
Dans le code ASCII, chaque caractère possible a un numéro de code. Par exemple A a pour code 65.
En déclarant C comme variable caractère, on peut mettre le signe A dans C par C:='A' ou C:=CHR
(65). Dans le premier cas, il faut mettre les cotes pour différencier 'A' de la variable A. Pour mettre
une cote dans C, on peut faire C:=chr(39) ou C:='''' : la 1ère cote pour dire qu'il va y avoir un
caractère, les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractère), la
dernière qui signifie fin du caractère.
Les principales fonctions standard connues par tous les compilateurs sont :
trunc(4.5)=4)
Comme toute variable, une fonction possède un type (entier, réel,...) défini, et ne peut donc être
utilisée que comme une variable de ce type.
http://www-ipst.u-strasbg.fr/pat/program/pascal06.htm09/08/2003 22:40:31
le Langage PASCAL - INSTRUCTION
INSTRUCTION
On appelle "instruction simple" soit :
* une affectation
* un appel à une procédure (une procédure est un ensemble d'instructions regroupées sous un nom,
par exemple READLN)
On ne met pas de ; après BEGIN ni avant END (puisque le ; sépare deux instructions). Par contre, si
l'instruction composée est SUIVIE d'une autre instruction, on mettra un ; après le END .
Rq La lisibilité du programme sera meilleure en mettant une instruction par ligne, et en décalant à
droite les instructions comprises entre un begin et un end.
http://www-ipst.u-strasbg.fr/pat/program/pascal07.htm09/08/2003 22:40:32
le Langage PASCAL - STRUCTURES DE CONTROLE
STRUCTURES DE CONTROLE
● BOUCLE WHILE - DO (tant que - faire)
● BOUCLE REPEAT - UNTIL (répéter - jusqu'à ce que)
● BOUCLE FOR - DO (pour - faire)
● INSTRUCTION IF - THEN - ELSE (si - alors - sinon)
● LA STRUCTURE CASE - OF (cas - parmi)
Nos connaissances actuelles ne nous permettent pas de faire des programmes utilisant la capacité de
l'ordinateur de répéter rapidement et sans erreur beaucoup de calculs. Nous allons donc remédier
immédiatement à cela. Chaque structure de contrôle forme une instruction (qui peut donc être utilisée
dans une autre structure de contrôle).
elle permet de répéter l'instruction tant que l'expression (ou la variable) booléenne est vraie.
ex : PROGRAM racine_a_deux_decimales(input,output);
VAR nombre,racine:REAL;
begin
writeln('entrez un réel entre 0 et 10');
readln(nombre);
racine:=0;
WHILE racine*racine < nombre DO racine:=racine+0.01;
writeln('la racine de ',nombre,' vaut à peu près',
racine)
END.
Il faut noter que si l'expression booléenne est fausse dès le début, l'instruction n'est jamais exécutée
(ici si NOMBRE=0). Attention, Pascal n'initialise pas automatiquement les variables à 0, c'est à dire
que sans l'instruction RACINE:=0 le programme risquerait de donner une réponse fausse (RACINE
valant n'importe quoi, il sera en général très supérieur à la racine cherchée).
On ne peut répéter qu'UNE seule instruction. Mais celle-ci peut être simple (comme dans l'exemple
précédent) ou composée (begin - end).
EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusqu'à une valeur maxi
donnée par l'utilisateur (par multiplication successive par 2).
Les N instructions sont répétées jusqu'à ce que la condition soit vérifiée. Même si la condition est
vraie dès le début, elles sont au moins exécutées une fois.
Quelle que soit la valeur initiale de A (même 482), la question sera au moins posée une fois (plus si
vous désobéissez).
EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par
l'ordinateur (en comptant les coups). On utilisera la fonction RANDOM(N) (non standard, disponible
en TURBO PASCAL) qui renvoie un entier entre 0 et N-1 compris, par l'instruction
VALEUR_CHOISIE:=RANDOM(11).
La variable_énumérée (non réelle) prend la valeur_début, et l'instruction est exécutée. Puis elle est
incrémentée (on passe à la suivante, c.a.d si elle est entière on ajoute 1), et ce jusqu'à valeur_fin
(compris).
L'instruction sera donc exécutée (valeur_fin - valeur_début + 1) fois. Si valeur_ fin est inférieur à
valeur_début l'instruction n'est jamais exécutée. Cette forme de boucle est utilisée chaque fois que
l'on connaît le nombre de boucles à effectuer.
La variable_énumérée peut être utilisée (mais pas modifiée) dans l'instruction (simple ou composée).
Elle est souvent appelée "indice" de la boucle. Sa valeur est perdue dès que l'on sort de la boucle.
EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres. N doit être
demandé par un READLN. (initialiser une variable à 0, y ajouter progressivement chaque note puis
diviser par N).
Si la condition est vraie, alors on exécute l'instruction1 (simple ou composée). Sinon, on passe à la
suite (cas 1), ou on exécute l'instruction2 (cas 2).
EXERCICE (ex_jeu_bis) modifier le jeu précédent (ex_jeu) en aidant le joueur (en précisant si c'est
plus ou c'est moins).
Un ELSE correspond toujours au dernier IF rencontré (mais dont on n'a pas encore utilisé le ELSE).
L'instruction i sera exécutée si l'expression appartient à la liste_de_cas i. Les autres ne seront pas
exécutées (on passe directement au END). L'expression doit être de type énuméré (pas de réels).
En TURBO PASCAL, on accepte une liste_de_cas particulière qui est ELSE (et doit être placée en
dernier), pour prévoir le cas où expression n'appartient à aucun des cas cités au dessus. En MS-
PASCAL on utilise de même OTHERWISE.
Attention certains compilateurs n'acceptent pas de passer sur un CASE avec une valeur prévue dans
aucune liste de cas.
EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opérations en utilisant CASE
pour le choix de l'opération à effectuer.
Sommaire général
PROGRAMMATION
Vous trouverez ici mes (gros) documents sur la programmation : C, C++, algorithmique, infographie,
Pascal). ainsi que la possibilité de télécharger les exemples (bien que le copier - coller sous Netscape
ou IE marche également très bien), mais aussi les corrections des exercices, la bibliothèque
graphique, des exemples supplémentaires, des sujets de TP, d'examens....
Copyright : utilisation de ces documents libre pour tout usage personnel. Utilisation autorisée pour
tout usage public non commercial, à condition de citer son auteur (Patrick TRAU, IPST, Université
Louis Pasteur Strasbourg, email : Patrick.Trau (à) ipst-ulp.u-strasbg.fr ) et de me signaler tout usage
intensif. Utilisation commerciale interdite sans accord écrit de ma part.
Cliquez sur l'icône (à droite) pour voter pour le site n°3464 du TOP Ouaibe (cours en
ligne de P. TRAU).
vous pouvez accéder à :
● Cours sur le C (ANSI) (y compris correction des exercices), qui détaille complètement le
langage C
● Données et Algorithmes : les différents algorithmes classiques, expliqués, comparés, en
fonction des types de données choisies. Chaque algorithme est accompagné de sa mise en
oeuvre en C
● Infographie : comment dessiner sur un matériel (écran, imprimante...) sur lequel on sait au
moins allumer un point. Les tracés de base (droites, courbes...), les remplissages et
hachurages, clipping, tracés 3D,... La documentation de la bibliothèque graphique
téléchargeable. Les exemples sont en C ANSI. Mais tout ceci est théorique, je vous propose
également plusieurs documents expliquant dans la pratique comment faire du graphisme en C
dans les OS que je connais (Dos Unix).
● sommaire et instructions de téléchargement de la disquette d'accompagnement concernant les
trois documents cités ci-dessus (mais aussi la bibliothèque graphique en version Pascal)
● le C++ (ce petit document suppose que vous connaissez déjà le C)
● Mon Cours de Pascal (c'est un document sur lequel j'ai travaillé plusieurs années, mais
actuellment je m'occupe surtout de C)
● Cours de Prolog : c'est une découverte du langage, avec divers exemples. Dans le cadre de
cours d'intelligence artificielle, j'ai aussi écrit un petit moteur d'inférence (ordre 0, en gcc ou
TurboPascal).
● Comment insérer un programme de calcul dans une page HTML : du C à JavaScript
● Fortran, en particulier pour les Licence - Maîtrise Techno Méca
● évaluez vous avec mes sujets d'examens (dont certains avec correction) (en particulier en C)
● Plus spécifiquement pour les étudiants d'IUP2 à l'IPST (les autres ont aussi le droit de
regarder) : les sujets et correction des TP (97/98 en version détaillée, et ceux de l'année en
cours, au fur et à mesure).
● Certains points du C expliqués par les étudiants de DEUG TI
La plupart de ces documents contiennent des frames (écran séparé en deux parties). Pour revenir à
cette page (et quitter les frames), une solution est de cliquer sur le bon (à vous de trouver
lequel).
Bonne lecture !
Pour toute question, envoyez moi un mail , ou regardez mes FAQ. S'il vous plait, signalez moi toute
erreur !
Liens externes : Vous cherchez un compilateur gratuit (C/Pascal) ? utilisez gcc, gpp sous Linux/Unix,
Sous DOS regardez l'ABC de la Programmation : Olivier Pecheux vous aide à démarrer (y compris à
installer le compilateur freeware DJGPP). si vous cherchez d'autres sites sur la programmation, il y en
a plein. Allez par exemple dans la bonne rubrique Yahoo En voici, parmi d'autres : comment ça
marche (en français)
Vous pouvez ici accéder aux autres informations sur ce serveur, normalement ou par carte.
❍ ORGANISATION DE L'ORDINATEUR
❍ LANGAGES DE PROGRAMMATION
❍ REELS
❍ BOOLEENS
❍ CARACTERES
❍ TABLEAUX DE TABLEAUX
❍ TABLEAUX COMPACTES
● ENREGISTREMENTS
❍ DECLARATION
● PROCEDURES ET FONCTIONS
❍ GENERALITES
❍ LES FONCTIONS
❍ RECURSIVITE
■ ACCES DIRECT
■ IMPRIMANTE
■ AUTRES
● ENSEMBLES
● POINTEURS
❍ LES LISTES CHAINEES ET ARBRES
❍ -- Ex ex_puiss
❍ -- Ex ex_jeu
❍ -- Ex ex_moy
❍ -- Ex ex_jeu_bis
❍ -- Ex ex_calc
❍ -- EX moy.a
❍ -- Ex rot.b
❍ -- Ex clas.c
❍ -- Ex str
❍ --Ex mat
❍ -- Ex tel
❍ -- Ex rec
❍ -- Ex fichier
❍ -- Ex pointeurs
Sélection du mois
comment les grands éditeurs de logiciels
vont imposer un copyright sur le contenu
des textes créés avev leurs logiciels Youpi! on peut voir dans Yahoo
par exemple vos mails. Et pour cela vous Internet Life n°1 une super photo
payerez soit à l'unité soit par forfait. Et en
plus ils analyseront tout ce que vous
produissez (1984 ?).
Moi, je veux bien qu'Internet soit utilisé par certains pour se faire de l'argent (surtout si on les fait
participer à son financement). Mais Internet devrait aussi permettre de mettre la connaissance à
disposition de ceux qui désirent l'acquérir. C'est pour celà que je maintiens ce site, c'est pour celà
que j'ai signé ce manifeste.
● Qui suis-je ?
● Mes polycopiés sur (regardez les, je me suis fatigué):
❍ Mes cours sur le Langage C, le C++ ainsi que l'algorithmique et l'infographie,
❍ un autre sur l'automatisme (On y parle de : Boole, binaire, portes, bascules, mémoires,
PC (de base), Prolog (découverte approfondie), JavaScript (plus pour proposer des
calculs intéractifs que pour le graphisme), le Fortran
❍ Je me suis également fait un petit mémento sur le langage HTML, ainsi que d'autres
Ces documents sont soumis aux règles du EverythingWare, c'est à dire que s'ils vous plaisent vous
m'envoyez ce que vous voullez, une carte postale, une spécialité de votre pays... (cliquez ici si vous
utilisez Windows 95 ou 98, certifié sans virus ni problème, jetez le après l'avoir exécuté).
Cliquez sur l'icône (à droite) pour voter pour le site n°3464 du TOP Ouaibe (cours en
ligne de P. TRAU).
Pour toute remarque, (ou si c'est une question vérifiez avant si je n'y ai pas déjà
répondu dans mes FAQ). Vous pouvez aussi lire ou compléter mon livre d'or.
Informations Importantes
● les sujets de la prochaine session d'examens
● On m'a envoyé par mail un rapport de problèmes d'installation concernant GirlFriend.1.0 (et
les intéractions avec les autres programmes installés, et particulièrement la mise à jour en
Wife.1.0 ou ultérieures). Du mal à comprendre ?
● Si M.S. a du mal avec les trains (en anglais dans le texte), peut-être va t'il se lancer dans
l'automobile (in french) ?Toujours dans les transports, vous pouvez survoler ceci.
- du Racing
- de l'O.M.
- du "Soleil Bischeim"
- du PSG
Question du jour
Pourquoi les étudiants de l'IPST posent-ils toujours sur leur table de nuit :
- un verre vide
- un verre plein d'eau ?
Google est mon moteur préféré. En laissant "site:www-ipst.u-strasbg.fr" derrière (ou devant) votre
demande, la recherche sera limitée à ce site
site:www-ipst.u-strasbg.fr
Recherche Google
Si vous cherchez des sites francais, allez voir ici. Ils s'occupent même de mon livre d'or (et peut-être
bientôt du votre ?)
pourchanger, je vais mettre une pub pour Bill (eh oui, certains produitsont un
rapport simplicité/efficacité étonnant). J'utilise aussi MSDRAW (1.01) pour les
images
Accueil
Index du site
A comme Assembleur.
C comme C ou C++.
de la comme Linux.
Objet du site
A qui s'adresse ce site?
La pédagogie de l'erreur
Présentation de la méthode d'apprentissage
Naviguer sur mon site
Où cliquer rapidement la prochaine fois?
Choisir entre assembleur, basic, C ou Pascal
Panorama des différents langages.
Copier le site ABC P
Pour exploiter le site déconnecté, gratuitement.
Mes liens préférés
Petite pub comme sur les autres sites.
Historique du site
Les dates de modification du site.
Écrivez-moi
Comment faire pour m'écrire.
Accueil
Index du site
> Didacticiels
> Archive du site (5 Mo)
> Liste des sites FTP Turbo Pascal
> Liste des forums informatiques
> Pages perso INRACI
> Qui est AVC?
> Qui est JMy?
Nous vous souhaitons la bienvenue sur cette page hébergée gracieusement par
Multimania.
N'oubliez pas que cette page est aussi la vôtre. Envoyez-nous des textes, sources (en
Pascal) personnels qui mériteraient d'être placés à la disposition de tous.
Nous espérons vous être utiles et chaque réaction de votre part est un encouragement.
Accueil
Bienvenue aux programmeurs
en Borland Pascal !
Adresses
Débutants comme confirmés
Questions / Réponse
Ce site a pour but de permettre aux programmeurs en borland
Ecrire pascal de se rencontrer. Vous pourrez :
* Y poser des questions, y apporter vos réponses, ou
Consulter simplement consulter la liste des questions/réponses.
* Inscrire ou chercher des sites relatifs à la programmation,
* Proposer des programmes (code source).
Sites sur la * Faire évoluer ce site par vos suggestions...
programmation * Bref, tout ce qui peut aider à progresser avec ce langage.
Livre d'Or
Suggestions
Promenades
http://members.aol.com/cbaussaron/bcpasc.htm09/08/2003 22:45:59
Borland
International Sites
Borland® Copyright© 1994-2003 Borland Software Corporation. Tous droits réservés. Conditions d'utilisation, Politique de confidentialité
http://www.borland.fr/09/08/2003 22:46:04
GNU's Not Unix! - Le projet GNU et la Fondation pour le Logiciel Libre (FLL/FSF)
[ Allemand | Anglais | Catalan | Chinois | Coréen | Danois | Espagnol | Français | Hongrois | Italien |
Japonais | Néerlandais | Portugais | Suédois | Turc ]
Don Marti lance un appel pour nominer Richard M. Stallman pour le Comité de Consultation
Publique de l'Office des Brevets et des Marques déposées des États-Unis dans son essai, Patent
Reform Now!. L'échéance tombe le 12 April 2001.
Le secrétaire d'État de l'industrie français Christian Pierret est entré dans l'histoire pour son
opposition aux brevets sur les logiciels.
Voici un liste des toutes dernières versions des logiciels du projet GNU. Nous la mettons à jour
durant la nuit.
Pour d'autres nouvelles, voyez ce qu'il y a de neuf à l'intérieur et à propos du projet GNU.
Information supplémentaire
La Fondation pour le Logiciel Libre est une organisation caritative exemptée de taxe qui
rassemble des fonds pour travailler sur le projet GNU.
La FLL soutient les libertés de parole, de presse et d'association sur l'Internet, le droit d'utiliser
l'encryption pour la communication privée ainsi que le droit d'écrire des logiciels sans l'entrave
imposée par les monopoles de logiciels.
Information de contact
Veuillez envoyez vos questions et commentaires à propos de GNU et de la FLL à
webmasters@www.gnu.org
[ Allemand | Anglais | Catalan | Chinois | Coréen | Danois | Espagnol | Français | Hongrois | Italien |
Japonais | Néerlandais | Portugais | Suédois | Turc ]
Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc., 59 Temple Place - Suite
330, Boston, MA 02111, USA
Verbatim copying and distribution of this entire article is permitted in any medium, provided this
notice is preserved.
La reproduction exacte et la distribution intégrale de cet article est permise sur n'importe quel support
d'archivage, pourvu que cette notice est préservée.
exemple :
TYPE tjour=(lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche);
Toutes le variables de ce type ne pourront pas avoir d'autres valeurs que celles que l'on a énumérées.
JOUR2:=JOUR1;
* des fonctions prédéfinies: PRED (précédent), SUCC (suivant), ORD (numéro d'ordre (dans la
déclaration), entre 0 et N-1)
ex: pred(mardi)=lundi
succ(mardi)=mercredi
ord(mardi)=1
* des comparaisons : lundi<mercredi mais attention dimanche>lundi (suivant l'ordre donné dans la
déclaration)
lundi : ...;
samedi,dimanche : ...
END
Rq1: les types entiers, booléens, caractères sont des types énumérés prédéfinis. Toutes ces
possibilités s'y appliquent donc (succ(10)=11, ord('A')=65,...). Par contre les réels ne sont pas
énumérés (on ne peut pas définir de successeur), et ni CASE ni FOR ne peuvent s'y appliquer.
Rq2: READLN et WRITELN ne fonctionnent pas en standard pour les types définis par l'utilisateur,
mais plusieurs compilateurs l'acceptent (pas TURBO).
minuscules='a'..'z';
Ces variables s'utilisent comme des variables du type dont est issu leur intervalle (on peut utiliser une
variable MOIS comme tout autre entier) mais peuvent utiliser moins de mémoire.
http://www-ipst.u-strasbg.fr/pat/program/pascal10.htm09/08/2003 22:46:09
le Langage PASCAL - TABLEAUX
TABLEAUX
● TABLEAUX UNIDIMENSIONNELS
● LES CHAINES DE CARACTERES
● TABLEAUX DE TABLEAUX
● TABLEAUX COMPACTES
TABLEAUX UNIDIMENSIONNELS
On a souvent besoin de regrouper dans une seule variable (et donc un seul nom) plusieurs variables
(exemple 3 coordonnées d'un même vecteur). On utilise pour cela les TABLEAUX. La manière la
plus simple des les définir est :
PROGRAM heures(input,output);
TYPE tj=(lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche);
VAR jour:tj;
nb_heures_cours:ARRAY[tj] OF integer;
begin
{il faudrait ici entrer les nombres d'heures de cours par jour}
FOR jour:=lundi TO samedi DO writeln(nb_heures_cours[jour])
end.
EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres, calcule et affiche la
moyenne puis l'écart entre chaque note et cette moyenne.
EXERCICE (rot.b) Ecrire le programme qui lit une liste de N nombres, la décale d'un cran vers le
haut (le 1er doit se retrouver en dernier) l'affiche puis la décale vers le bas.
EXERCICE (clas.c) Classer automatiquement une liste de n entiers par ordre croissant puis
décroissant.
Mais en général, les compilateurs possèdent des types plus puissants, associés à des fonctions et
procédures non standard. En Turbo on déclare une chaîne par STRING[nbcar]. Une fonction utile est
alors LENGTH(variable_string) qui donne la longueur de la chaîne (inférieure ou égale à la
dimension déclarée).
EXERCICE (str) Ecrire un programme qui détermine le nombre et les positions d'une chaîne dans
une autre (ex ON dans FONCTION : en position 2 et 7).
TABLEAUX DE TABLEAUX
On peut faire des tableaux avec des composantes de tous types, y compris de tableaux. On peut voir
une matrice comme un tableau de lignes qui sont elles même des tableaux de composantes (exemple
matrice 5 lignes, 10 colonnes):
sont strictement équivalentes (sauf si la définition du type ligne est nécessaire pour d'autres variables).
soit la déclaration
VAR m1,m2:mat;
i,j:integer;
on peut écrire :
RAPPEL: READLN et WRITELN ne s'appliquent qu'a des variables simples prédéfinies (c.a.d les
composantes, si celles-ci sont réelles, entières, chaînes ou booléennes).
EXERCICE (mat) faire le calcul de multiplication d'une matrice (M lignes, L col) par (L lignes, N
col) (résultat M lignes, N col).
TABLEAUX COMPACTES
On peut en PASCAL standard définir des tableaux en PACKED ARRAY. Ils s'utilisent de la même
manière que des tableaux normaux, mais prennent moins de place en mémoire. Sur certains
ordinateurs, ceci se paie par un ralentissement du programme dans certaines applications. En TURBO
ce n'est pas le cas, et elles sont donc automatiquement toutes compactées (inutile de le préciser).
ENREGISTREMENTS
● DECLARATION
● UTILISATION DES ENREGISTREMENTS
● LA STRUCTURE WITH - DO (avec - faire)
● ENREGISTREMENTS AVEC VARIANTES
Dans un tableau, tous les constituants doivent être semblables. Ce n'est pas le cas des
enregistrements, qui sont des variables composées de plusieurs variables (ou CHAMPS) de types
différents.
DECLARATION
structure d'une déclaration d'enregistrement :
ou
Dans un enregistrement, chaque champ doit avoir un nom différent. Mais pour des enregistrements
Une composante d'enregistrement s'utilise comme une variable du même type (avec les mêmes
possibilités mais aussi les mêmes limitations).
Il ne peut y avoir qu'un CASE par enregistrement. Celui-ci doit se placer en dernier, après les champs
commun (si il y en a). Mais dans ce CASE on peut avoir UN autre CASE imbriqué (etc).
Les cas où il n'y a pas de champ variant doivent être précisés (ici celibataire). Le champ discriminant
(situation) s'utilise comme un autre champ commun.
x.situation:=marie;
if x.situation=veuf then writeln(x.enfants)
EXERCICE (tel) A l'aide d'un tableau de personnes (nom, prénom, numéro dans la rue, rue,
département, ville, numéro de téléphone), faire un programme de recherche automatique de toutes les
informations sur les personnes répondant à une valeur d'une rubrique donnée (tous les PATRICK ,
tous ceux de Saverne, etc...)
PROCEDURES ET FONCTIONS
● GENERALITES
● PORTEE DES DECLARATIONS
● ARGUMENTS (OU PARAMETRES)
● LES FONCTIONS
● RECURSIVITE
Nous avons déjà vu un certain nombre de procédures (ex WRITELN) et fonctions (SQRT, SIN...)
prédéfinies par le compilateur. Mais si l'on en désire d'autres, il suffit de les définir.
GENERALITES
On peut regrouper un ensemble d'instructions sous un même nom. On forme alors un sous-
programme ou procédure. On utilise les procédures :
* chaque fois qu'une même suite d'instructions doit être répétée plusieurs fois dans un programme,
* quand une suite d'instruction forme une action globale. Le programme est alors plus clair et les
erreurs plus facilement détectables.
Pour pouvoir utiliser une procédure, il faut d'abord la déclarer. La déclaration des procédures et
fonctions se fait après toutes les autres déclarations.
entête
déclaration des :
labels; {pour les GOTO, déconseillé}
constantes;
types;
variables;
définition des sous-routines; {sous-programmes}
BEGIN
instructions
END
le programme principal comme les procédures et les fonctions ont toujours cette structure. L'entête
est composée d'un mot clef (PROGRAM, PROCEDURE ou FUNCTION), suivi de l'identificateur
(nom) de la routine, et de la liste des arguments entre parenthèses. Les arguments forment la liaison
avec l'extérieur de la routine (clavier, écran et éventuellement fichiers pour le programme).
la procédure LIGNE écrit N caractères '*' sur une même ligne. Le programme remplit donc l'écran
(25 lignes 70 colonnes) d'étoiles.
On peut appeler une procédure déclarée dans une routine n'importe où dans cette routine en indiquant
simplement son nom comme si c'était une instruction. A l'appel d'une procédure, le programme
interrompt son déroulement normal, exécute les instructions de la procédure, puis retourne au
programme appelant et exécute l'instruction suivante. Tout ce passe donc comme si le nom de la
procédure était remplacé dans le programme par les instructions de la procédure (avec n=70).
En d'autres termes :
* Une variable est LOCALE pour une procédure X si elle est déclarée dans X. Elle n'existe que dans
X (et dans les procédures déclarées à l'intérieur de X). La routine qui comporte la procédure X ne
* Une variable est GLOBALE pour une procédure X si elle est déclarée dans une routine
ENGLOBANT la procédure X. Elle peut être utilisée dans la procédure. La modifier la modifie
également dans le routine appelante (englobante).
Si l'on avait déclaré une variable I dans la procédure LIGNE (au lieu de N ou J), celle-ci aurait été
locale à la procédure, c'est à dire que, dans le programme principal, I désigne une autre case mémoire
que dans la procédure. Modifier la variable locale I ne modifie pas la variable globale I
(momentanément inaccessible).
Rq : Ceci s'applique à toutes les déclarations. En particulier, une procédure déclarée localement à
l'intérieur d'une procédure est indéfinie à l'extérieur.
LES FONCTIONS
Tout ce qui a été dit pour les procédures s'applique également aux fonctions. La différence avec une
procédure est qu'une fonction renvoie un résultat. L'entête est du type :
la liste des paramètres (en général passés par valeur) est de la même forme que pour une procédure, le
type de la fonction étant le type du résultat retourné. On retourne le résultat par :
NOM_FONCTION := ... Cette affectation ne peut se faire qu'une seule fois par appel à la fonction.
ex : program classer(input,output);
var a,b,c:real;
function MAX(x,y:real):real;
begin
if x>=y then MAX:=x else MAX:=y
end;
begin
writeln('entrez deux valeurs : ');
readln(a,b);
c:=max(a,b);
writeln('le plus grand est ',c)
end.
RECURSIVITE
C'est ainsi que l'on appelle le fait qu'une routine puisse s'appeler elle-même.
ex : function factorielle(n:integer):integer;
begin
if n<=1 then factorielle:=1
else factorielle:=n*factorielle(n-1)
end;
Rq : Il faut toujours vérifier qu'en aucun cas on ne puisse avoir une boucle infinie qui bloquerait la
machine. Ce serait le cas en mettant le test IF N=1 et en appelant factorielle pour une valeur négative
ou nulle.
Une procédure devant toujours être déclarée pour pouvoir être utilisée, on utilise FORWARD pour
les cas de récursivité passant par 2 procédures :
EXERCICE (rec) écrire le programme qui calcule le déterminant d'une matrice carrée NxN sachant
que celui-ci vaut :
On utilisera bien évidement une fonction récursive, et l'on séparera le calcul de sous-matrice dans une
procédure.
Rq : Il existe des méthodes numériques permettant d'accéder au résultat beaucoup plus rapidement
que par cette méthode.
❍ IMPRIMANTE
❍ AUTRES
SUR LA CONSOLE
La procédure WRITELN permet d'afficher des résultats sur l'écran. Les différents arguments sont
affichés les uns après les autres sur la même ligne. Le curseur est ensuite automatiquement mis en
début de ligne suivante. Pour éviter ceci, on peut utiliser WRITE, qui s'utilise comme WRITELN
mais le curseur est laissé derrière le dernier caractère. De même, READ fonctionne comme
READLN, excepté le curseur qui reste sur la ligne.
WRITE(I:5,' ',R:7:2) écrira I sur 5 caractères, et R sur 7 caractères dont 2 après la virgule. Si les
valeurs sont trop petites pour entrer dans le format, des blancs sont mis devant. Si elles sont trop
grandes, le format est ignoré.
SUR FICHIER
Un fichier est un ensemble de données, écrites sur un "support" lisible par l'ordinateur (disquette,
cartes perforées,...), et regroupées sous un nom. Un fichier peut contenir des caractères (fichier de
textes), des programmes, des valeurs (fichier de données).
program recopier(input,output);
var fic_ent,fic_sor : file of real;
x:real;
begin
assign(fic_ent,'fichier1'); (* non standard *)
reset(fic_ent);
assign(fic_sor,'fichier2'); (* non standard *)
rewrite(fic_sor);
while not eof(fic_ent) do begin
read(fic_ent,x);
write(fic_sor,x)
end;
close(fic_ent);
close(fic_sor)
end.
Un fichier peut contenir des éléments de n'importe quel type (aussi compliqué soit-il, même
tableaux), mais tous les enregistrements du fichier doivent être du même type.
Avant d'utiliser le fichier, il faut relier son identificateur au nom effectif du fichier par ASSIGN. Ici,
FIC_ENT correspondra à un fichier qui aura pour nom FICHIER1 sur la disquette. ASSIGN n'est pas
une fonction standard, d'autres compilateurs utilisent OPEN.
Puis il faut préciser si l'on va écrire ou lire sur le fichier par RESET ou REWRITE. Ceci positionne
en début du fichier.
Il ne faut pas oublier de fermer le fichier (close) quand on n'en a plus besoin. CLOSE est nécessaire
également si l'on veut refaire un nouvel ASSIGN sur le même fichier.
La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File).
Rq : Lors de la définition initiale du Pascal, on devait ouvrir les fichiers avant d'appeler le
programme. Les fichiers étaient des variables globales déclarées en arguments du programme (et
donc passés du système d'exploitation au programme). Nous les déclarons maintenant DANS le
programme, les deux seuls fichiers donnés en paramètres du programme restant INPUT et OUTPUT.
VAR nomfic:TEXT
Ce sont des fichiers de caractères, et se comportent comme l'écran ou le clavier (qui sont d'ailleurs les
fichiers text INPUT et OUTPUT utilisés automatiquement si on ne précise pas de nomfic dans les
READ<ln> et WRITE<ln> ). On a aussi les mêmes limitations (écriture d'entiers, réels et chaînes de
caractères seulement).
ex : program lire(input,output,fic);
type chaine=array[1..80]of char;
var fic:text;
ligne:chaine;
begin
assign(fic,'texte');
rewrite(fic);
writeln('tapez votre texte, il sera enregistré dans le
fichier TEXTE ');
writeln('tapez FIN pour arrêter');
repeat
readln(ligne);
writeln(fic,ligne)
until ligne='FIN';
close(fic)
end.
ACCES DIRECT
SEEK est d'autant plus utile que RESET autorise la lecture et l'écriture des fichiers à accès direct
(REWRITE par contre efface tout le contenu du fichier, on ne peut donc plus qu'écrire).
IMPRIMANTE
* ouvrir un fichier TEXT sur disque, le remplir, et lorsque le programme est terminé le copier (par le
DOS) sur imprimante
* utiliser un nom de fichier prédéfini correspondant à l'imprimante. En Turbo, c'est LST. ex : writeln
(lst, 'COUCOU'). LST n'a pas besoin d'être ouvert en TURBO (tout comme OUTPUT).
AUTRES
Turbo Pascal permet beaucoup d'autres opérations sur les fichiers (Delete, Rename, Path...) qui ne
sont pas standard. Si vous les utilisez, rappelez vous qu'elles ne fonctionneront pas avec un autre
compilateur (Microsoft par ex) ni sous un autre système d'exploitation (Unix par ex).
EXERCICE (fichier) Ecrire la procédure qui lit le fichier "annuaire" afin de rendre opérationnel
l'exercice tel. Modifier ce programme pour permettre l'entrée et la modification du fichier annuaire.
ENSEMBLES
Un ensemble est une "collection" d'éléments de même type (cf cours maths 6ème). Supposons vouloir
représenter des vendeurs et leurs domaines d'action.
TYPE produits=(velos,motos,autos,accessoires);
VAR vendeur1,vendeur2 : SET OF produits;
vendeur1:=[velos,motos];
vendeur2:=[motos,accessoires];
l'ensemble vide est : []
UNION : vendeur1+vendeur2=[velos,motos,accessoires]
INTERSECTION : vendeur1*vendeur2=[motos]
COMPLEMENT : vendeur1-vendeur2=[velos]
vendeur2-vendeur1=[accessoires]
les tests booléens possibles sont : = , <> , <= (inclus) , >= (contenant).
On teste l'appartenance d'un élément par IN : si X vaut motos, alors X IN VENDEUR1 et [motos]
<=VENDEUR1 sont équivalents (IN compare un élément et un ensemble, alors que <= compare deux
ensembles.
Rq: En général, on ne pense pas à utiliser les ensembles (le prof de maths aurait-il oublié de nous dire
à quoi ça sert ?), et l'on s'embrouille dans des programmes complexes. Voici par exemple, des idées
pour programmer facilement un automatisme défini par plusieurs Grafcet complexes ([xx] se lisant
"ensemble des xx") :
On peut trouver un exemple détaillé dans mon document sur la mise en oeuvre du Grafcet
POINTEURS
● LES LISTES CHAINEES ET ARBRES
● LES POINTEURS EN PASCAL
Un pointeur est une variable qui stocke l'adresse (c.a.d la position en mémoire) d'une variable.
si l'on veut insérer une valeur dans la liste, les modifications à apporter sont minimes :
Contrairement à l'insertion dans un tableau, il est inutile de décaler les termes suivants. Pour
connaître la liste, il suffit de connaître l'adresse du premier terme.
Pour représenter un arbre, il suffit pour chaque élément de connaître l'adresse de chaque fils :
Rq : si le nombre de fils n'est pas constant, on a intérêt à stocker uniquement le fils aîné, ainsi que le
frère suivant.
TYPE pointeur=^type_de_la_variable_pointée
Dans cet exemple, les variables de type TVAL contiendront un entier et l'adresse de la suivante (liste
chaînée vue plus haut).
Contrairement aux tableaux, il n'est pas nécessaire de prévoir le nombre de variables pointées à
l'avance. C'est "l'allocation dynamique de mémoire" : on réserve la place pour chaque variable en
cours d'exécution du programme, par la commande NEW(nom_variable). On récupère la place, si la
variable est devenue inutile, par DISPOSE(nom_variable).
P1 contient donc une adresse d'une variable de type TVAL. Cette variable sera P1^ (c.a.d pointée par
P1). On la "remplit" donc par des affectations du type :
P1^.valeur:=15; P1^.suivant:=P2;
Examinons un programme qui lit puis affiche une liste chaînée d'entiers :
program liste(input,output);
TYPE tpoint=^tval;
tval=record
valeur:integer;
suivant:tpoint
end;
VAR prem,precedent,point:tpoint;
i,n:integer;
begin
write('combien d''éléments comporte votre liste ?');
readln(n);
new(prem); (* le 1er est particulier : si on le perd, on
perd la liste *)
write('1ère valeur ? ');
readln(prem^.valeur); (* lecture de l'enregistrement VALEUR
de la variable d'adresse (pointée par) PREM *)
precedent:=prem;
for i:=2 to n do begin
new(point); (* création d'une nouvelle variable *)
write(i,'ième valeur ? ');
readln(point^.valeur);
precedent^.suivant:=point; (* mise à jour du chaînage *)
precedent:=point (*se préparer pour la prochaine boucle*)
end;
precedent^.suivant:=NIL;
(* NIL signifie "rien" car 0 est un entier, non une adresse *)
point:=prem; (* heureusement, on se souvient du premier *)
for i:=1 to n do begin
writeln(point^.valeur);
point:=point^.suivant (* pour la prochaine boucle *)
end
end.
EXERCICE (pointeurs) modifier ce programme pour qu'il permette de rajouter ou supprimer des
éléments. Décomposez le en routines.
Mécanique Technologie
Electronique Qualité
http://www-ipst.u-strasbg.fr/ipst/09/08/2003 22:46:19
Université Louis Pasteur - Strasbourg I -
http://www-ulp.u-strasbg.fr/09/08/2003 22:46:26
le Langage PASCAL - CORRECTION DES EXERCICES
-- Ex ex_tva
program tva(input,output);
var prix_unitaire,quantite,
total_ht,tva,total_ttc:real;
begin
writeln('prix de l''article ?');
readln(prix_unitaire);
writeln('quantité désirée ? ');
readln(quantite);
total_ht:=prix_unitaire*quantite;
tva:=total_ht*(18.6/100);
total_ttc:=total_ht+tva;
writeln('total ht : ',total_ht);
writeln('tva : ',tva);
writeln(' -------------');
writeln('total ttc : ',total_ttc)
end.
-- Ex ex_puiss
program puissances(input,output);
var n,max:integer;
begin
writeln('nombre maxi ? ');
readln(max);
n:=2;
while n<=max do begin
writeln(n);
n:=n*2
end;
writeln('c''est fini')
end.
-- Ex ex_jeu
program jeu(input,output);
var choix,rep,nb:integer;
begin
nb:=0;
choix:=random(11);
repeat
nb:=nb+1;
writeln('choix ndeg. ',nb,' ? ');
readln(rep)
until rep=choix;
writeln('trouvé en ',nb,' coups')
end.
-- Ex ex_moy
program moyenne(input,output);
var n,i:integer;
note,total,moyenne:real;
begin
writeln('nombre notes à entrer ?');
readln(n);
total:=0;
for i:=1 to n do begin
writeln(i,'ième note ? ');
readln(note);
total:=total+note
end;
moyenne:=total/n;
writeln('la moyenne est : ',moyenne)
end.
-- Ex ex_jeu_bis
program jeu_ameliore(input,output);
var choix,rep,nb:integer;
begin
nb:=0;
choix:=random(11);
repeat
nb:=nb+1;
writeln('choix ndeg. ',nb,' ? ');
readln(rep);
if rep<choix then
writeln('c''est plus')
else if rep>choix then
writeln('c''est moins')
{le 2ème if empêche d'écrire si juste}
until rep=choix;
writeln('juste en ',nb,' coups')
end.
-- Ex ex_calc
program calculatrice(input,output);
var val1,val2,resultat:real;
operation:char;
begin
writeln('première valeur ?');
readln(val1);
writeln('opération (+ - * /) ? ');
readln(operation)
writeln('deuxième valeur ? ');
readln(val2);
case operation of
'+':resultat:=val1+val2;
'-':resultat:=val1-val2;
'*':resultat:=val1*val2;
'/':resultat:=val1/val2
end;
writeln('résultat : ',resultat)
end.
-- EX moy.a
program moyenne(input,output);
var n,compteur:integer
somme,moyenne,ecart:real;
note:array[1..100] of real;
begin
repeat
writeln('nb notes (100 maxi)?');
readln(n)
until (n>0) and (n<=100);
{entrée notes et calcul de la somme}
somme:=0;
for compteur:=1 to n do
begin
writeln(compteur,'è note ?');
readln(note[compteur]);
somme:=somme+note[compteur]
end;
{calcul et affichage de la moyenne}
moyenne:=somme/n;
writeln('moyenne : ',moyenne);
{calcul et affichage des écarts}
writeln('écarts :');
for compteur:=1 to n do
begin
ecart:=note[compteur]-moyenne;
writeln(compteur,'ième note (',
note[compteur],
') : écart : ',ecart)
end
end.
-- Ex rot.b
program rotation(input,output);
var index,n:integer;
prem:real;
tableau:array[1..100]of real;
begin
repeat
writeln('nb valeurs (100 maxi)?');
readln(n)
until (n>0) and (n<=100);
-- Ex clas.c
program classer(input,output);
var n,i,index,petit,indexpetit:integer;
avant,apres:array[1..100]of integer;
pris:array[1..100] of boolean;
{pour noter ceux déjà pris}
begin
repeat
writeln('nb valeurs (100 maxi) ?');
readln(n)
until (n>0) and (n<=100);
{entrée valeurs - initialisation de pris}
for index:=1 to n do begin
writeln(index,'ième valeur ? ');
readln(avant[index]);
pris[index]:=false
end;
{ordre croissant,on cherche N valeurs}
for i:=1 to n do begin
petit:=maxint; {plus grand possible}
{recherche du plus petit non pris}
for index:=1 to n do
-- Ex str
program position(input,output);
var ch,sch:string[255];
i,j,n,l,ls:integer;
begin
writeln('chaîne à tester ? ');
readln(ch);
writeln('sous-chaîne à trouver ?');
readln(sch);
l:=length(ch);ls:=length(sch);
n:=0;
for i:=1 to l-ls do begin
j:=1;
while (j<=l)and(ch[i+j-1]=sch[j])
do j:=j+1;
if j>ls then begin
writeln('trouvé position ',i);
n:=n+1
end
end;
writeln(n,' fois ',sch,' dans ',ch)
end.
--Ex mat
program produit_mat(input,output);
var m1,m2,m3:array[1..10,1..10]of real;
l,m,n,jl,jm,jn:integer;
begin
writeln('nb lignes 1ère matrice ?');
readln(m);
writeln('nb colonnes 1è matrice ?');
readln(l);
writeln('nb colonnes 2è matrice ?');
readln(n);
(* entrée de m1 *)
writeln('première matrice');
for jm:=1 to m do for jl:=1 to l do
begin
writeln('lig',jm,', col',jl,'?');
readln(m1[jm,jl])
end;
(* entrée de m2 *)
writeln('2ième matrice');
for jl:=1 to l do for jn:=1 to n do
begin
writeln('lig',jl,', col',jn,'?');
readln(m2[jl,jn])
end;
(* calcul du produit *)
for jm:=1 to m do for jn:=1 to n do
begin {calcul composante m,n de m2}
m3[jm,jn]:=0;
for jl:=1 to l do m3[jm,jn]:=
m3[jm,jn]+(m1[jm,jl]*m2[jl,jn]);
end;
(* affichage du résultat *)
writeln('résultat');
for jm:=1 to m do for jn:=1 to n do
writeln('m[',jm,',',jn,']=',
m3[jm,jn])
end.
-- Ex tel
program annuaire(input,output);
(* version simplifiée *)
type ligne=string[40];
typepersonne=record
nom:ligne;
num_tel:ligne
(* integer malheureusement < 32635 *)
end;
var pers:array[1..100]of
typepersonne;
nb,i:1..100;
rep:char;
imprimer:boolean;
texte:ligne;
begin
{on suppose avoir ici les instructions
permettant de lire sur fichier disque
NB et le tableau PERS }
repeat
writeln('recherche suivant : ');
writeln(' N : nom');
writeln(' T : numéro téléphone');
writeln(' Q : quitter le prog');
writeln('quel est votre choix ?');
readln(rep);
if rep<>'Q' then begin
writeln('texte à chercher ? ');
readln(texte)
for i:=1 to nb do with pers[i] do
begin
case rep of
'N':imprimer:=nom=texte;
'T':imprimer:=num_tel=texte;
end;
if imprimer then begin
writeln('nom : ',nom);
writeln('tel : ',num_tel)
end
end
end
until rep='Q'
end.
-- Ex rec
program determ(input,output);
{ on se limite à 10x10, ce qui fait 7h
de calcul et 6.235.314 appels à DETN }
type tmat=array[1..10,1..10] of real;
var dim:integer;
{dimension matrice à calculer}
det:real; {résultat désiré}
mat:tmat; {matrice à calculer}
appel:real; {nb appels à }
procedure entree;
var lig,col:integer;
begin
writeln('dimension de la matrice ?');
readln(dim); {DIM variable globale}
writeln('entrez les composantes :');
for lig:=1 to dim do begin
writeln('pour la ligne ndeg. ',lig);
for col:=1 to dim do begin
writeln('colonne ',col,' ?');
readln(mat[lig,col])
end
end
end;
function detn(m:tmat;d:integer):real;
{dét ordre d en fonction ordre d-1}
var result:real;
mprim:tmat; {matrice intermédiaire}
lig,signe:integer;
begin
appel:=appel+1;
if d=1 then detn:=m[1,1]
(* fin de récursivité *)
else begin
result:=0;
signe:=-1;
for lig:=1 to d do begin
sous_mat(m,mprim,lig,d);
signe:=-signe;
{changer de signe à chaque ligne}
result:=result +
(signe*m[lig,1]*detn(mprim,d-1))
end;
detn:=result
end
end;
-- Ex fichier
procedure lirefic;
var i:1..100;
f:file of typepersonne;
(* variables globales :
NB et le tableau PERS *)
begin
assign(f,'annuaire'); {non standard}
reset(f);
nb:=0;
while not EOF(f) do begin
nb:=nb+1;
read(f,pers[nb)
end;
close(f)
end;
{à vous de faire la suite}
-- Ex pointeurs
program liste(input,output);
TYPE tpoint=^tval;
tval=record
valeur:integer;
suivant:tpoint
end;
VAR prem:tpoint; {variable globale}
n:integer;
c:char;
procedure lire;
var precedent,point:tpoint;
i:integer;
{ modifie N et PREM }
begin
write('combien d''éléments?');
readln(n);
new(prem);
write('1ère valeur ? ');
readln(prem^.valeur);
precedent:=prem;
for i:=2 to n do begin
new(point);
write(i,'ième valeur ? ');
readln(point^.valeur);
precedent^.suivant:=point;
precedent:=point
end;
precedent^.suivant:=NIL
(* le dernier ne pointe sur rien *)
end;
procedure afficher;
var point:tpoint;
i:integer;
begin
point:=prem;
for i:=1 to n do begin
writeln(point^.valeur);
point:=point^.suivant
end
end;
procedure supprimer;
var point,prec:tpoint;
rep:char;
begin
point:=prem;
repeat
write(point^.valeur,' à ôter ?');
readln(rep);
if rep='O' then begin
n:=n-1;
if point<>prem then begin
prec^.suivant:=point^.suivant;
dispose(point);
point:=prec^.suivant
(* se préparer pour la suite *)
end
else begin
prem:=prem^.suivant;
dispose(point);
(* ancien premier *)
point:=prem
end
end
else begin
(* pointer sur le suivant *)
prec:=point;
point:=point^.suivant
end
until point=nil
end;
procedure rajouter;
var p1,p2,prec:tpoint;
rep:char;
begin
p1:=prem;
repeat
write(p1^.valeur,' rajouter un
élément avant (O/N) ? ');
readln(rep);
if rep='O' then begin
n:=n+1;
if p1<>prem then begin
new(p2);
write('valeur ? ');
readln(p2^.valeur);
prec^.suivant:=p2;
p2^.suivant:=p1;
prec:=p2;
end
else begin
new(p1);
write('valeur ? ');
readln(p1^.valeur);
p1^.suivant:=prem;
prem:=p1
end
end
else begin
(* pointer sur le suivant *)
prec:=p1;
p1:=p1^.suivant
end
until p1=nil;
p1:=prec;
repeat
write('ajouter un élément en fin
de liste (O/N) ? ');
readln(rep);
if rep='O' then begin
n:=n+1;
new(p2);
write('valeur ? ');
readln(p2^.valeur);
p1^.suivant:=p2;
p2^.suivant:=nil;
p1:=p2
end
until rep<>'O'
end;