82
le Langage PASCAL le Langage PASCAL - Sommaire INTRODUCTION LES LOGICIELS ORGANISATION DE L'ORDINATEUR LANGAGES DE PROGRAMMATION UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION D'AFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES ENTIERS REELS BOOLEENS CARACTERES LES FONCTIONS STANDARD INSTRUCTION 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 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). Voici quelques adresses intéressantes : ABC de la Programmation : Olivier Pecheux vous aide à démarrer (y compris à installer le compilateur freeware DJGPP) Pascalissime Point de rencontre des utilisateurs de Borland Pascal Site officiel de Borland France, et en particulier les compilateurs gratuits (sous Dos-Windows évidement, sous Unix vous saviez déjà que les meilleurs compilateurs sont chez GNU). http://www-ipst.u-strasbg.fr/pat/program/pascal.htm (1 sur 3)09/08/2003 22:40:26

le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Embed Size (px)

Citation preview

Page 1: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE

LORDINATEUR LANGAGES DE

PROGRAMMATION UN PREMIER PETIT

PROGRAMME CONSTANTES INSTRUCTION

DAFFECTATION LES TYPES DE

VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD

INSTRUCTION STRUCTURES DE

CONTROLE BOUCLE WHILE -

DO (tant que - faire) BOUCLE REPEAT -

UNTIL (reacutepeacuteter - jusquagrave ce que)

BOUCLE FOR - DO (pour - faire)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

LA STRUCTURE

le Langage PASCAL

Patrick TRAU Janvier 92version HTML mars 97

Ce document preacutesente (de maniegravere claire je crois dapregraves ce quen ont dit certains) le langage PASCAL Il a eacuteteacute publieacute dans APTEP - INFO il y a quelques anneacutees Depuis bien que je maicirctrisais bien ce langage et avais deacuteveloppeacute de nombreux programmes en Pascal je suis passeacute au C Le C est dapregraves moi plus souple et plus efficace agrave condition de bien en comprendre les meacutecanismes (il faut dapregraves moi comprendre agrave la fois lassembleur et les objets pour bien programmer en C) De plus le C est plus utiliseacute dans mon environnement dinformaticiens Neacuteanmoins le Pascal reste bien meilleur pour le deacutebutant et le programmeur moyen parfaitement structureacute et clair il conduit rapidement agrave un programme de bonne qualiteacute et assez facilement maintenable (ce qui lest moins en C qui possegravede trop souvent trop de possibiliteacutes pour reacutesoudre le mecircme problegraveme)

De plus on trouve des compilateurs Pascal tregraves conviviaux (Turbo Pascal sur PC avec aide en ligne deacuteboguage)

Ce document reste donc dactualiteacute le Pascal est dapregraves moi une tregraves bonne maniegravere daborder la programmation Cest pourquoi jai choisi de mettre agrave disposition ce document sur Internet quil serve agrave qui en a besoin Neacuteanmoins je nai pas passeacute trop de temps agrave sa mise en page les graphiques restent en mode caractegravere il ny a pas de lien direct entre les sujets dexercices et leur correction (que lon trouvera en fin du document)

Voici quelques adresses inteacuteressantes

ABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP)

Pascalissime Point de rencontre des utilisateurs de Borland Pascal Site officiel de Borland France et en particulier les

compilateurs gratuits (sous Dos-Windows eacutevidement sous Unix vous saviez deacutejagrave que les meilleurs compilateurs sont chez GNU)

httpwww-ipstu-strasbgfrpatprogrampascalhtm (1 sur 3)09082003 224026

le Langage PASCAL

CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS

LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS

LES CHAINES DE CARACTERES

TABLEAUX DE TABLEAUX

TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES

ENREGISTREMENTS LA STRUCTURE

WITH - DO (avec - faire)

ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES

DECLARATIONS ARGUMENTS (OU

PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE LES FICHIERS DE

TEXTE EXTENSIONS NON

STANDARD ACCES

DIRECT IMPRIMANTE AUTRES

ENSEMBLES POINTEURS

LES LISTES

Copyright utilisation de ce document libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

INTRODUCTION UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION 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 deacutetailleacute

httpwww-ipstu-strasbgfrpatprogrampascalhtm (2 sur 3)09082003 224026

le Langage PASCAL

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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascalhtm (3 sur 3)09082003 224026

Le langage PASCAL - PTRAU

le Langage PASCAL

Patrick TRAU Janvier 92version HTML mars 97

Ce document preacutesente (de maniegravere claire je crois dapregraves ce quen ont dit certains) le langage PASCAL Il a eacuteteacute publieacute dans APTEP - INFO il y a quelques anneacutees Depuis bien que je maicirctrisais bien ce langage et avais deacuteveloppeacute de nombreux programmes en Pascal je suis passeacute au C Le C est dapregraves moi plus souple et plus efficace agrave condition de bien en comprendre les meacutecanismes (il faut dapregraves moi comprendre agrave la fois lassembleur et les objets pour bien programmer en C) De plus le C est plus utiliseacute dans mon environnement dinformaticiens Neacuteanmoins le Pascal reste bien meilleur pour le deacutebutant et le programmeur moyen parfaitement structureacute et clair il conduit rapidement agrave un programme de bonne qualiteacute et assez facilement maintenable (ce qui lest moins en C qui possegravede trop souvent trop de possibiliteacutes pour reacutesoudre le mecircme problegraveme)

De plus on trouve des compilateurs Pascal tregraves conviviaux (Turbo Pascal sur PC avec aide en ligne deacuteboguage)

Ce document reste donc dactualiteacute le Pascal est dapregraves moi une tregraves bonne maniegravere daborder la programmation Cest pourquoi jai choisi de mettre agrave disposition ce document sur Internet quil serve agrave qui en a besoin Neacuteanmoins je nai pas passeacute trop de temps agrave sa mise en page les graphiques restent en mode caractegravere il ny a pas de lien direct entre les sujets dexercices et leur correction (que lon trouvera en fin du document)

Voici quelques adresses inteacuteressantes

ABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP)

Pascalissime Point de rencontre des utilisateurs de Borland Pascal Site officiel de Borland France et en particulier les compilateurs gratuits (sous Dos-Windows

eacutevidement sous Unix vous saviez deacutejagrave que les meilleurs compilateurs sont chez GNU)

Copyright utilisation de ce document libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

httpwww-ipstu-strasbgfrpatprogrampascal_thtm (1 sur 2)09082003 224027

Le langage PASCAL - PTRAU

INTRODUCTION UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION 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 deacutetailleacute

httpwww-ipstu-strasbgfrpatprogrampascal_thtm (2 sur 2)09082003 224027

Mais qui est donc Patrick TRAU

Vous ecirctes le iegraveme lecteur de cette page depuis le 111664 Vous pouvez signer mon

livre dor chez

Vous vous demandiez

Mais qui est donc Patrick TRAU

Je vais essayer ici dapporter une reacuteponse agrave cette question sans grand inteacuterecirct

Je mapelle Patrick TRAU jai pregraves de 40 ans (mais du cocircteacute ougrave lon sen eacuteloigne) je suis marieacute et ai trois enfants Nous habitons agrave Obernai en Alsace

Je suis enseignant agrave lULP (Universiteacute Louis Pasteur) agrave Strasbourg jenseigne linformatique lautomatisme et la technologie agrave lIPST (Institut Professionnel des Sciences et Technologies)

De formation technique (Bac E ENS Cachan section Meacutecanique Agreacutegeacute de meacutecanique) jai effectueacute ma recherche au LMT (Laboratoire de Meacutecanique et Technologie) agrave Cachan dans le groupe CAO Jai mis au point SYMATRAU un SYstegraveme expert de MAillage TRidimensionnel AUtomatique Jy ai travailleacute sur UNIVAC 1100 puis sur NorkDataMatra DataSystem principalement en FORTRAN Puis jai eacuteteacute nommeacute enseignant agrave lUniversiteacute de Metz ougrave jai enseigneacute linformatique (Basic Pascal) et lautomatisme principalement en licencemaicirctrise Technologie Meacutecanique Geacutenie Meacutecanique preacuteparation agrave lagregation de meacutecanique DESS GMP ougrave je moccupais du module CAO et ISFATES Au LPMM (Laboratoire de Physique et Meacutecanique des Mateacuteriaux) je moccupais du mateacuteriel informatique de leur installation physique agrave ladministration systegraveme du reacuteseau Je travaillais sur PC et VAX 780 puis sur stations Apollo sous AEGIS)

Depuis 1990 je suis en poste agrave lIPST Jusquen 94 jeacutetais directeur adjoint de lIPST Deacutesormais je moccupe de linformatique de lUFR pour lenseignement (PC) ladministration et la recherche au L3MI (Laboratoire de Meacutecanique des Multi Mateacuteriaux Industriels) (stations SUN sous UNIXSolaris PC sous Linux et Windows) Je moccupe eacutegalement de ce serveur (sous Linux) ainsi que du contenu de notre site Jenseigne principalement linformatique (C PROLOG Algorithmique) et lautomatisme en IUP Geacutenie des Systegravemes Industriels et DESS Meacutecanique Avanceacutee et Strateacutegies Industrielles

A part cela il me reste un peu de temps pour moccuper 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 geacuteneacuteral en France

Si vraiment vous deacutesirez plus de deacutetails sur mes activiteacutes consultez mon CV Peut ecirctre cela vous permettra de reacutepondre agrave cette question

httpwww-ipstu-strasbgfrpatquisuisjhtm (1 sur 2)09082003 224028

Mais qui est donc Patrick TRAU

Qui est Patrick TRAU

(PS si jai mis cette question en gras cest pour que les moteurs indexent cette phrase)

Choisissez BACK (en haut agrave gauche) pour revenir agrave la page preacuteceacutedente cliquez ici pour la Pats Home Page

httpwww-ipstu-strasbgfrpatquisuisjhtm (2 sur 2)09082003 224028

le Langage PASCAL - INTRODUCTION

INTRODUCTION

LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

LES LOGICIELS

Dans la majoriteacute des cas on achegravete des programmes (logiciels) tout faits qui correspondent plus ou moins au besoin

Traitement de texte - PAO avec mise en page justification numeacuterotation chapitres-pagestable des matiegraveresdictionnaire

Tableur tableau de nombres agrave 2 dimensions et calculs

Base de donneacutees ensemble de fiches (nom adresse) et recherche par rubrique publipostage

CAO Dessin par ordinateur propre modification aiseacutee archivage

Gestion paye facturation stock

Communication transfert de programmes par modem et ligne teacuteleacutephonique serveur minitel

Un Inteacutegreacute regroupe plusieurs de ces possibiliteacutes

Soit on achegravete un logiciel geacuteneacuteral tregraves bon niveau parfaitement testeacute documentation formation mais trop geacuteneacuteral (fonctions inutiles fonctions utiles avec trop de paramegravetres 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 ecirctre tregraves preacutecis

ORGANISATION DE LORDINATEUR

Multiposte plusieurs consoles sur un mecircme ordinateur (CPU puissant tout est partageable)

Reacuteseau plusieurs CPU et MC non partageable (sauf reacuteseau de multipostes) MdM et peacuteripheacuteriques

httpwww-ipstu-strasbgfrpatprogrampascal01htm (1 sur 2)09082003 224029

le Langage PASCAL - INTRODUCTION

partageables ou locaux

LANGAGES DE PROGRAMMATION

Un ordinateur est une machine becircte ne sachant quobeacuteir et agrave tregraves peu de choses

addition soustraction multiplication en binaire uniquement sur des entiers

sortir un reacutesultat ou lire une valeur binaire (dans une meacutemoire par exemple)

comparer des nombres

Sa puissance vient du fait quil peut ecirctre PROGRAMME cest agrave dire que lon peut lui donner agrave lavance la seacutequence (la suite ordonneacutee) des ordres agrave effectuer lun apregraves lautre Le grand avantage de lordinateur est sa rapiditeacute Par contre cest le programmeur qui doit TOUT faire Lordinateur ne comprennant que des ordres codeacutes en binaire (le langage machine) des langages dits eacutevolueacutes ont eacuteteacute mis au point pour faciliter la programmation

Le PASCAL creacuteeacute par WIRTH au deacutebut des anneacutees 70 possegravede des instructions assez claires (si vous comprenez langlais) et favorise une approche meacutethodique et disciplineacutee (on dit structureacutee)

Le PASCAL est un langage compileacute cest agrave dire quil faut

entrer un texte dans lordinateur (agrave laide dun programme appeleacute EDITEUR)

le traduire en langage machine (cest agrave dire en codes binaires compreacutehensibles par lordinateur) cest la compilation et eacuteventuellement leacutedition de liens (LINK)

lexeacutecuter

Contrairement agrave un basic interpreacuteteacute lexeacutecution sera beaucoup plus rapide puisquil ny a plus de traduction agrave effectuer

Bien que le langage soit normaliseacute un certain nombre de points deacutependent de la machine et du compilateur utiliseacute (par exemple comment appeler le compilateur) Ces indications ne seront pas donneacutees ici Si vous avez le choix je vous conseille TURBO PASCAL le plus pratique demploi (en particulier parce quil possegravede son propre eacutediteur de texte)

httpwww-ipstu-strasbgfrpatprogrampascal01htm (2 sur 2)09082003 224029

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

UN PREMIER PETIT PROGRAMME

Un programme PASCAL est composeacute dune entecircte des deacuteclarations et des instructions (deacutelimiteacutees par BEGIN et END )

ex PROGRAM cercle (inputoutput) ( entecircte ) VAR perimetrediametre REAL ( deacuteclarations ) BEGIN readln(diametre) ( instruction ) perimetre = 3141592 diametre ( instruction ) writeln(diametreperimetre) ( instruction ) END

Lentecircte est composeacutee du mot PROGRAM suivi du nom du programme (cercle) et dindications sur les EntreacuteesSorties (ici le clavier et leacutecran)

La partie deacuteclarative de notre programme est limiteacutee agrave la deacuteclaration de deux variables (mot clef VAR) Une variable est une case meacutemoire de lordinateur agrave laquelle on donne ici un nom Chaque case peut contenir une valeur On a preacuteciseacute ici que nos deux variables PERIMETRE et DIAMETRE contiendraient des reacuteels Les types simples connus en PASCAL sont REAL INTEGER (entier naturel) CHAR (contient UN est un seul caractegravere) et BOOLEAN (booleacuteen cad 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 possegravede la variable preacutedeacuteclareacutee MAXINT qui donne le plus grand entier admissible Les reacuteels doivent ecirctre compris en TURBO entre + et -17E37 (cad 17 fois 10 puissance 37) avec 11 chiffres significatifs La virgule deacutecimale est toujours repreacutesenteacutee par un point en informatique

Un identificateur (tout nom que vous choisissez variable programme) peut ecirctre formeacute de lettres (A agrave Z) de chiffres et (pas sur toutes les versions de PASCAL) du signe _ (souligneacute) TURBO PASCAL accepte des noms de 127 caractegraveres maximum certains PASCAL sont plus limiteacutes (31 caractegraveres par ex) Le premier caractegravere doit ecirctre une lettre Par exemple VALEUR1 ou PREM_VALEUR sont possibles mais pas 1ERE_VALEUR En PASCAL les minuscules sont traiteacutees comme des majuscules (SURface et surFACE deacutesignent la mecircme case meacutemoire) Je nutilise les majuscules que pour faire ressortir les mots importants Les accents et autres ccedil ne sont pas autoriseacutes (var diamegravetrereal est interdit agrave cause de laccent) Un blanc dans un identificateur est eacutegalement interdit (utilisez _ pour seacuteparer des mots dans un mecircme identificateur)

Toute variable utiliseacutee dans un programme doit ecirctre deacuteclareacutee Ceci eacutevite la plupart des erreurs de frappe et rend le programme plus compreacutehensible

httpwww-ipstu-strasbgfrpatprogrampascal02htm (1 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

Les instructions de notre programme sont

lecture sur le clavier

le programme sarrecircte attend que lon donne une valeur agrave laide du clavier met cette valeur dans la case DIAMETRE et continue le programme lorsque lon appuie sur la touche ENTREE ou RETURN

calcul et affectation

on multiplie le contenu de la case DIAMETRE par PI et on met le reacutesultat dans la case PERIMETRE

Le = symbolise une flegraveche agrave gauche Ce nest PAS une eacutegaliteacute au sens matheacutematique mais la copie dune valeur dans une meacutemoire

eacutecriture sur leacutecran

on affiche sur leacutecran le contenu des case DIAMETRE (que lon connaissait puisque nous lavions donneacute) et PERIMETRE (qui nous inteacuteresse un peu plus) Ce programme affiche donc deux chiffres Il serait plus parlant dafficher eacutegalement des commentaires par linstruction

writeln(Diamegravetre diametre Peacuterimegravetre perimetre)

Les textes doivent ecirctre entoureacutes de cotes () Les majusculesminuscules sont significatives Pour afficher une apostrophe utiliser deux cotes (lexemple) Pour sauter une ligne utiliser WRITELN seul

Les instructions doivent toujours ecirctre seacutepareacutees par des (jai dit seacutepareacutees pas termineacutees) Le fait de passer agrave la ligne nest interpreacuteteacute par lordinateur que comme un blanc On aurait donc pu eacutecrire notre programme sur une seule ligne (peut-ecirctre un peu longue pour leacutediteur) Le programme doit toujours se terminer par un point

On peut inseacuterer 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 dune ligne ceci permet de supprimer momentaneacutement une partie dun programme

Chaque identificateur est seacutepareacute du suivant par un blanc On considegravere comme un blanc plusieurs blanc un retour agrave la ligne un commentaire

EXERCICE (ex_tva) Faire un programme demandant le prix unitaire HT dun article et sa quantiteacute puis qui affiche le total Hors Taxes le montant de la TVA (pour un taux de 186 ) et le total TTC

httpwww-ipstu-strasbgfrpatprogrampascal02htm (2 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

httpwww-ipstu-strasbgfrpatprogrampascal02htm (3 sur 3)09082003 224030

le Langage PASCAL - CONSTANTES

CONSTANTES

Nous avons deacutejagrave utiliseacute des VARIABLES (on donne un nom agrave une meacutemoire) Mais on peut eacutegalement utiliser des CONSTANTES qui sont des valeurs qui restent fixes tout au long du programme et pour chaque exeacutecution On deacuteclare les constantes avant de deacuteclarer les variables par CONST nom=valeur

ex CONST taux_tva=186

MAXINT (plus grand entier possible) est une constante preacutedeacutefinie

On peut eacutegalement avoir des constantes de type chaicircne de caractegraveres

PROGRAM bonjour(output) on na pas besoin ici du clavier CONST message1=salut ccedila va message2=moi ccedila baigne BEGIN writeln(message1) writeln(message2) ( notez labsence de devant le END ) END

Le type de la constante est deacutetermineacute automatiquement par le compilateur (entier si nombre sans point reacuteel si nombre avec point caractegraveres si entre cotes)

Rq1 on peut toujours utiliser un entier agrave la place dun reacuteel mais pas linverse

Rq2 si on utilise un point deacutecimal il FAUT lencadrer de chiffres (03 et non 3 10 ou 100 et non 10)

httpwww-ipstu-strasbgfrpatprogrampascal03htm09082003 224030

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 2: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL

CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS

LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS

LES CHAINES DE CARACTERES

TABLEAUX DE TABLEAUX

TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES

ENREGISTREMENTS LA STRUCTURE

WITH - DO (avec - faire)

ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES

DECLARATIONS ARGUMENTS (OU

PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE LES FICHIERS DE

TEXTE EXTENSIONS NON

STANDARD ACCES

DIRECT IMPRIMANTE AUTRES

ENSEMBLES POINTEURS

LES LISTES

Copyright utilisation de ce document libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

INTRODUCTION UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION 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 deacutetailleacute

httpwww-ipstu-strasbgfrpatprogrampascalhtm (2 sur 3)09082003 224026

le Langage PASCAL

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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascalhtm (3 sur 3)09082003 224026

Le langage PASCAL - PTRAU

le Langage PASCAL

Patrick TRAU Janvier 92version HTML mars 97

Ce document preacutesente (de maniegravere claire je crois dapregraves ce quen ont dit certains) le langage PASCAL Il a eacuteteacute publieacute dans APTEP - INFO il y a quelques anneacutees Depuis bien que je maicirctrisais bien ce langage et avais deacuteveloppeacute de nombreux programmes en Pascal je suis passeacute au C Le C est dapregraves moi plus souple et plus efficace agrave condition de bien en comprendre les meacutecanismes (il faut dapregraves moi comprendre agrave la fois lassembleur et les objets pour bien programmer en C) De plus le C est plus utiliseacute dans mon environnement dinformaticiens Neacuteanmoins le Pascal reste bien meilleur pour le deacutebutant et le programmeur moyen parfaitement structureacute et clair il conduit rapidement agrave un programme de bonne qualiteacute et assez facilement maintenable (ce qui lest moins en C qui possegravede trop souvent trop de possibiliteacutes pour reacutesoudre le mecircme problegraveme)

De plus on trouve des compilateurs Pascal tregraves conviviaux (Turbo Pascal sur PC avec aide en ligne deacuteboguage)

Ce document reste donc dactualiteacute le Pascal est dapregraves moi une tregraves bonne maniegravere daborder la programmation Cest pourquoi jai choisi de mettre agrave disposition ce document sur Internet quil serve agrave qui en a besoin Neacuteanmoins je nai pas passeacute trop de temps agrave sa mise en page les graphiques restent en mode caractegravere il ny a pas de lien direct entre les sujets dexercices et leur correction (que lon trouvera en fin du document)

Voici quelques adresses inteacuteressantes

ABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP)

Pascalissime Point de rencontre des utilisateurs de Borland Pascal Site officiel de Borland France et en particulier les compilateurs gratuits (sous Dos-Windows

eacutevidement sous Unix vous saviez deacutejagrave que les meilleurs compilateurs sont chez GNU)

Copyright utilisation de ce document libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

httpwww-ipstu-strasbgfrpatprogrampascal_thtm (1 sur 2)09082003 224027

Le langage PASCAL - PTRAU

INTRODUCTION UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION 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 deacutetailleacute

httpwww-ipstu-strasbgfrpatprogrampascal_thtm (2 sur 2)09082003 224027

Mais qui est donc Patrick TRAU

Vous ecirctes le iegraveme lecteur de cette page depuis le 111664 Vous pouvez signer mon

livre dor chez

Vous vous demandiez

Mais qui est donc Patrick TRAU

Je vais essayer ici dapporter une reacuteponse agrave cette question sans grand inteacuterecirct

Je mapelle Patrick TRAU jai pregraves de 40 ans (mais du cocircteacute ougrave lon sen eacuteloigne) je suis marieacute et ai trois enfants Nous habitons agrave Obernai en Alsace

Je suis enseignant agrave lULP (Universiteacute Louis Pasteur) agrave Strasbourg jenseigne linformatique lautomatisme et la technologie agrave lIPST (Institut Professionnel des Sciences et Technologies)

De formation technique (Bac E ENS Cachan section Meacutecanique Agreacutegeacute de meacutecanique) jai effectueacute ma recherche au LMT (Laboratoire de Meacutecanique et Technologie) agrave Cachan dans le groupe CAO Jai mis au point SYMATRAU un SYstegraveme expert de MAillage TRidimensionnel AUtomatique Jy ai travailleacute sur UNIVAC 1100 puis sur NorkDataMatra DataSystem principalement en FORTRAN Puis jai eacuteteacute nommeacute enseignant agrave lUniversiteacute de Metz ougrave jai enseigneacute linformatique (Basic Pascal) et lautomatisme principalement en licencemaicirctrise Technologie Meacutecanique Geacutenie Meacutecanique preacuteparation agrave lagregation de meacutecanique DESS GMP ougrave je moccupais du module CAO et ISFATES Au LPMM (Laboratoire de Physique et Meacutecanique des Mateacuteriaux) je moccupais du mateacuteriel informatique de leur installation physique agrave ladministration systegraveme du reacuteseau Je travaillais sur PC et VAX 780 puis sur stations Apollo sous AEGIS)

Depuis 1990 je suis en poste agrave lIPST Jusquen 94 jeacutetais directeur adjoint de lIPST Deacutesormais je moccupe de linformatique de lUFR pour lenseignement (PC) ladministration et la recherche au L3MI (Laboratoire de Meacutecanique des Multi Mateacuteriaux Industriels) (stations SUN sous UNIXSolaris PC sous Linux et Windows) Je moccupe eacutegalement de ce serveur (sous Linux) ainsi que du contenu de notre site Jenseigne principalement linformatique (C PROLOG Algorithmique) et lautomatisme en IUP Geacutenie des Systegravemes Industriels et DESS Meacutecanique Avanceacutee et Strateacutegies Industrielles

A part cela il me reste un peu de temps pour moccuper 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 geacuteneacuteral en France

Si vraiment vous deacutesirez plus de deacutetails sur mes activiteacutes consultez mon CV Peut ecirctre cela vous permettra de reacutepondre agrave cette question

httpwww-ipstu-strasbgfrpatquisuisjhtm (1 sur 2)09082003 224028

Mais qui est donc Patrick TRAU

Qui est Patrick TRAU

(PS si jai mis cette question en gras cest pour que les moteurs indexent cette phrase)

Choisissez BACK (en haut agrave gauche) pour revenir agrave la page preacuteceacutedente cliquez ici pour la Pats Home Page

httpwww-ipstu-strasbgfrpatquisuisjhtm (2 sur 2)09082003 224028

le Langage PASCAL - INTRODUCTION

INTRODUCTION

LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

LES LOGICIELS

Dans la majoriteacute des cas on achegravete des programmes (logiciels) tout faits qui correspondent plus ou moins au besoin

Traitement de texte - PAO avec mise en page justification numeacuterotation chapitres-pagestable des matiegraveresdictionnaire

Tableur tableau de nombres agrave 2 dimensions et calculs

Base de donneacutees ensemble de fiches (nom adresse) et recherche par rubrique publipostage

CAO Dessin par ordinateur propre modification aiseacutee archivage

Gestion paye facturation stock

Communication transfert de programmes par modem et ligne teacuteleacutephonique serveur minitel

Un Inteacutegreacute regroupe plusieurs de ces possibiliteacutes

Soit on achegravete un logiciel geacuteneacuteral tregraves bon niveau parfaitement testeacute documentation formation mais trop geacuteneacuteral (fonctions inutiles fonctions utiles avec trop de paramegravetres 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 ecirctre tregraves preacutecis

ORGANISATION DE LORDINATEUR

Multiposte plusieurs consoles sur un mecircme ordinateur (CPU puissant tout est partageable)

Reacuteseau plusieurs CPU et MC non partageable (sauf reacuteseau de multipostes) MdM et peacuteripheacuteriques

httpwww-ipstu-strasbgfrpatprogrampascal01htm (1 sur 2)09082003 224029

le Langage PASCAL - INTRODUCTION

partageables ou locaux

LANGAGES DE PROGRAMMATION

Un ordinateur est une machine becircte ne sachant quobeacuteir et agrave tregraves peu de choses

addition soustraction multiplication en binaire uniquement sur des entiers

sortir un reacutesultat ou lire une valeur binaire (dans une meacutemoire par exemple)

comparer des nombres

Sa puissance vient du fait quil peut ecirctre PROGRAMME cest agrave dire que lon peut lui donner agrave lavance la seacutequence (la suite ordonneacutee) des ordres agrave effectuer lun apregraves lautre Le grand avantage de lordinateur est sa rapiditeacute Par contre cest le programmeur qui doit TOUT faire Lordinateur ne comprennant que des ordres codeacutes en binaire (le langage machine) des langages dits eacutevolueacutes ont eacuteteacute mis au point pour faciliter la programmation

Le PASCAL creacuteeacute par WIRTH au deacutebut des anneacutees 70 possegravede des instructions assez claires (si vous comprenez langlais) et favorise une approche meacutethodique et disciplineacutee (on dit structureacutee)

Le PASCAL est un langage compileacute cest agrave dire quil faut

entrer un texte dans lordinateur (agrave laide dun programme appeleacute EDITEUR)

le traduire en langage machine (cest agrave dire en codes binaires compreacutehensibles par lordinateur) cest la compilation et eacuteventuellement leacutedition de liens (LINK)

lexeacutecuter

Contrairement agrave un basic interpreacuteteacute lexeacutecution sera beaucoup plus rapide puisquil ny a plus de traduction agrave effectuer

Bien que le langage soit normaliseacute un certain nombre de points deacutependent de la machine et du compilateur utiliseacute (par exemple comment appeler le compilateur) Ces indications ne seront pas donneacutees ici Si vous avez le choix je vous conseille TURBO PASCAL le plus pratique demploi (en particulier parce quil possegravede son propre eacutediteur de texte)

httpwww-ipstu-strasbgfrpatprogrampascal01htm (2 sur 2)09082003 224029

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

UN PREMIER PETIT PROGRAMME

Un programme PASCAL est composeacute dune entecircte des deacuteclarations et des instructions (deacutelimiteacutees par BEGIN et END )

ex PROGRAM cercle (inputoutput) ( entecircte ) VAR perimetrediametre REAL ( deacuteclarations ) BEGIN readln(diametre) ( instruction ) perimetre = 3141592 diametre ( instruction ) writeln(diametreperimetre) ( instruction ) END

Lentecircte est composeacutee du mot PROGRAM suivi du nom du programme (cercle) et dindications sur les EntreacuteesSorties (ici le clavier et leacutecran)

La partie deacuteclarative de notre programme est limiteacutee agrave la deacuteclaration de deux variables (mot clef VAR) Une variable est une case meacutemoire de lordinateur agrave laquelle on donne ici un nom Chaque case peut contenir une valeur On a preacuteciseacute ici que nos deux variables PERIMETRE et DIAMETRE contiendraient des reacuteels Les types simples connus en PASCAL sont REAL INTEGER (entier naturel) CHAR (contient UN est un seul caractegravere) et BOOLEAN (booleacuteen cad 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 possegravede la variable preacutedeacuteclareacutee MAXINT qui donne le plus grand entier admissible Les reacuteels doivent ecirctre compris en TURBO entre + et -17E37 (cad 17 fois 10 puissance 37) avec 11 chiffres significatifs La virgule deacutecimale est toujours repreacutesenteacutee par un point en informatique

Un identificateur (tout nom que vous choisissez variable programme) peut ecirctre formeacute de lettres (A agrave Z) de chiffres et (pas sur toutes les versions de PASCAL) du signe _ (souligneacute) TURBO PASCAL accepte des noms de 127 caractegraveres maximum certains PASCAL sont plus limiteacutes (31 caractegraveres par ex) Le premier caractegravere doit ecirctre une lettre Par exemple VALEUR1 ou PREM_VALEUR sont possibles mais pas 1ERE_VALEUR En PASCAL les minuscules sont traiteacutees comme des majuscules (SURface et surFACE deacutesignent la mecircme case meacutemoire) Je nutilise les majuscules que pour faire ressortir les mots importants Les accents et autres ccedil ne sont pas autoriseacutes (var diamegravetrereal est interdit agrave cause de laccent) Un blanc dans un identificateur est eacutegalement interdit (utilisez _ pour seacuteparer des mots dans un mecircme identificateur)

Toute variable utiliseacutee dans un programme doit ecirctre deacuteclareacutee Ceci eacutevite la plupart des erreurs de frappe et rend le programme plus compreacutehensible

httpwww-ipstu-strasbgfrpatprogrampascal02htm (1 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

Les instructions de notre programme sont

lecture sur le clavier

le programme sarrecircte attend que lon donne une valeur agrave laide du clavier met cette valeur dans la case DIAMETRE et continue le programme lorsque lon appuie sur la touche ENTREE ou RETURN

calcul et affectation

on multiplie le contenu de la case DIAMETRE par PI et on met le reacutesultat dans la case PERIMETRE

Le = symbolise une flegraveche agrave gauche Ce nest PAS une eacutegaliteacute au sens matheacutematique mais la copie dune valeur dans une meacutemoire

eacutecriture sur leacutecran

on affiche sur leacutecran le contenu des case DIAMETRE (que lon connaissait puisque nous lavions donneacute) et PERIMETRE (qui nous inteacuteresse un peu plus) Ce programme affiche donc deux chiffres Il serait plus parlant dafficher eacutegalement des commentaires par linstruction

writeln(Diamegravetre diametre Peacuterimegravetre perimetre)

Les textes doivent ecirctre entoureacutes de cotes () Les majusculesminuscules sont significatives Pour afficher une apostrophe utiliser deux cotes (lexemple) Pour sauter une ligne utiliser WRITELN seul

Les instructions doivent toujours ecirctre seacutepareacutees par des (jai dit seacutepareacutees pas termineacutees) Le fait de passer agrave la ligne nest interpreacuteteacute par lordinateur que comme un blanc On aurait donc pu eacutecrire notre programme sur une seule ligne (peut-ecirctre un peu longue pour leacutediteur) Le programme doit toujours se terminer par un point

On peut inseacuterer 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 dune ligne ceci permet de supprimer momentaneacutement une partie dun programme

Chaque identificateur est seacutepareacute du suivant par un blanc On considegravere comme un blanc plusieurs blanc un retour agrave la ligne un commentaire

EXERCICE (ex_tva) Faire un programme demandant le prix unitaire HT dun article et sa quantiteacute puis qui affiche le total Hors Taxes le montant de la TVA (pour un taux de 186 ) et le total TTC

httpwww-ipstu-strasbgfrpatprogrampascal02htm (2 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

httpwww-ipstu-strasbgfrpatprogrampascal02htm (3 sur 3)09082003 224030

le Langage PASCAL - CONSTANTES

CONSTANTES

Nous avons deacutejagrave utiliseacute des VARIABLES (on donne un nom agrave une meacutemoire) Mais on peut eacutegalement utiliser des CONSTANTES qui sont des valeurs qui restent fixes tout au long du programme et pour chaque exeacutecution On deacuteclare les constantes avant de deacuteclarer les variables par CONST nom=valeur

ex CONST taux_tva=186

MAXINT (plus grand entier possible) est une constante preacutedeacutefinie

On peut eacutegalement avoir des constantes de type chaicircne de caractegraveres

PROGRAM bonjour(output) on na pas besoin ici du clavier CONST message1=salut ccedila va message2=moi ccedila baigne BEGIN writeln(message1) writeln(message2) ( notez labsence de devant le END ) END

Le type de la constante est deacutetermineacute automatiquement par le compilateur (entier si nombre sans point reacuteel si nombre avec point caractegraveres si entre cotes)

Rq1 on peut toujours utiliser un entier agrave la place dun reacuteel mais pas linverse

Rq2 si on utilise un point deacutecimal il FAUT lencadrer de chiffres (03 et non 3 10 ou 100 et non 10)

httpwww-ipstu-strasbgfrpatprogrampascal03htm09082003 224030

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 3: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL

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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascalhtm (3 sur 3)09082003 224026

Le langage PASCAL - PTRAU

le Langage PASCAL

Patrick TRAU Janvier 92version HTML mars 97

Ce document preacutesente (de maniegravere claire je crois dapregraves ce quen ont dit certains) le langage PASCAL Il a eacuteteacute publieacute dans APTEP - INFO il y a quelques anneacutees Depuis bien que je maicirctrisais bien ce langage et avais deacuteveloppeacute de nombreux programmes en Pascal je suis passeacute au C Le C est dapregraves moi plus souple et plus efficace agrave condition de bien en comprendre les meacutecanismes (il faut dapregraves moi comprendre agrave la fois lassembleur et les objets pour bien programmer en C) De plus le C est plus utiliseacute dans mon environnement dinformaticiens Neacuteanmoins le Pascal reste bien meilleur pour le deacutebutant et le programmeur moyen parfaitement structureacute et clair il conduit rapidement agrave un programme de bonne qualiteacute et assez facilement maintenable (ce qui lest moins en C qui possegravede trop souvent trop de possibiliteacutes pour reacutesoudre le mecircme problegraveme)

De plus on trouve des compilateurs Pascal tregraves conviviaux (Turbo Pascal sur PC avec aide en ligne deacuteboguage)

Ce document reste donc dactualiteacute le Pascal est dapregraves moi une tregraves bonne maniegravere daborder la programmation Cest pourquoi jai choisi de mettre agrave disposition ce document sur Internet quil serve agrave qui en a besoin Neacuteanmoins je nai pas passeacute trop de temps agrave sa mise en page les graphiques restent en mode caractegravere il ny a pas de lien direct entre les sujets dexercices et leur correction (que lon trouvera en fin du document)

Voici quelques adresses inteacuteressantes

ABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP)

Pascalissime Point de rencontre des utilisateurs de Borland Pascal Site officiel de Borland France et en particulier les compilateurs gratuits (sous Dos-Windows

eacutevidement sous Unix vous saviez deacutejagrave que les meilleurs compilateurs sont chez GNU)

Copyright utilisation de ce document libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

httpwww-ipstu-strasbgfrpatprogrampascal_thtm (1 sur 2)09082003 224027

Le langage PASCAL - PTRAU

INTRODUCTION UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION 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 deacutetailleacute

httpwww-ipstu-strasbgfrpatprogrampascal_thtm (2 sur 2)09082003 224027

Mais qui est donc Patrick TRAU

Vous ecirctes le iegraveme lecteur de cette page depuis le 111664 Vous pouvez signer mon

livre dor chez

Vous vous demandiez

Mais qui est donc Patrick TRAU

Je vais essayer ici dapporter une reacuteponse agrave cette question sans grand inteacuterecirct

Je mapelle Patrick TRAU jai pregraves de 40 ans (mais du cocircteacute ougrave lon sen eacuteloigne) je suis marieacute et ai trois enfants Nous habitons agrave Obernai en Alsace

Je suis enseignant agrave lULP (Universiteacute Louis Pasteur) agrave Strasbourg jenseigne linformatique lautomatisme et la technologie agrave lIPST (Institut Professionnel des Sciences et Technologies)

De formation technique (Bac E ENS Cachan section Meacutecanique Agreacutegeacute de meacutecanique) jai effectueacute ma recherche au LMT (Laboratoire de Meacutecanique et Technologie) agrave Cachan dans le groupe CAO Jai mis au point SYMATRAU un SYstegraveme expert de MAillage TRidimensionnel AUtomatique Jy ai travailleacute sur UNIVAC 1100 puis sur NorkDataMatra DataSystem principalement en FORTRAN Puis jai eacuteteacute nommeacute enseignant agrave lUniversiteacute de Metz ougrave jai enseigneacute linformatique (Basic Pascal) et lautomatisme principalement en licencemaicirctrise Technologie Meacutecanique Geacutenie Meacutecanique preacuteparation agrave lagregation de meacutecanique DESS GMP ougrave je moccupais du module CAO et ISFATES Au LPMM (Laboratoire de Physique et Meacutecanique des Mateacuteriaux) je moccupais du mateacuteriel informatique de leur installation physique agrave ladministration systegraveme du reacuteseau Je travaillais sur PC et VAX 780 puis sur stations Apollo sous AEGIS)

Depuis 1990 je suis en poste agrave lIPST Jusquen 94 jeacutetais directeur adjoint de lIPST Deacutesormais je moccupe de linformatique de lUFR pour lenseignement (PC) ladministration et la recherche au L3MI (Laboratoire de Meacutecanique des Multi Mateacuteriaux Industriels) (stations SUN sous UNIXSolaris PC sous Linux et Windows) Je moccupe eacutegalement de ce serveur (sous Linux) ainsi que du contenu de notre site Jenseigne principalement linformatique (C PROLOG Algorithmique) et lautomatisme en IUP Geacutenie des Systegravemes Industriels et DESS Meacutecanique Avanceacutee et Strateacutegies Industrielles

A part cela il me reste un peu de temps pour moccuper 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 geacuteneacuteral en France

Si vraiment vous deacutesirez plus de deacutetails sur mes activiteacutes consultez mon CV Peut ecirctre cela vous permettra de reacutepondre agrave cette question

httpwww-ipstu-strasbgfrpatquisuisjhtm (1 sur 2)09082003 224028

Mais qui est donc Patrick TRAU

Qui est Patrick TRAU

(PS si jai mis cette question en gras cest pour que les moteurs indexent cette phrase)

Choisissez BACK (en haut agrave gauche) pour revenir agrave la page preacuteceacutedente cliquez ici pour la Pats Home Page

httpwww-ipstu-strasbgfrpatquisuisjhtm (2 sur 2)09082003 224028

le Langage PASCAL - INTRODUCTION

INTRODUCTION

LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

LES LOGICIELS

Dans la majoriteacute des cas on achegravete des programmes (logiciels) tout faits qui correspondent plus ou moins au besoin

Traitement de texte - PAO avec mise en page justification numeacuterotation chapitres-pagestable des matiegraveresdictionnaire

Tableur tableau de nombres agrave 2 dimensions et calculs

Base de donneacutees ensemble de fiches (nom adresse) et recherche par rubrique publipostage

CAO Dessin par ordinateur propre modification aiseacutee archivage

Gestion paye facturation stock

Communication transfert de programmes par modem et ligne teacuteleacutephonique serveur minitel

Un Inteacutegreacute regroupe plusieurs de ces possibiliteacutes

Soit on achegravete un logiciel geacuteneacuteral tregraves bon niveau parfaitement testeacute documentation formation mais trop geacuteneacuteral (fonctions inutiles fonctions utiles avec trop de paramegravetres 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 ecirctre tregraves preacutecis

ORGANISATION DE LORDINATEUR

Multiposte plusieurs consoles sur un mecircme ordinateur (CPU puissant tout est partageable)

Reacuteseau plusieurs CPU et MC non partageable (sauf reacuteseau de multipostes) MdM et peacuteripheacuteriques

httpwww-ipstu-strasbgfrpatprogrampascal01htm (1 sur 2)09082003 224029

le Langage PASCAL - INTRODUCTION

partageables ou locaux

LANGAGES DE PROGRAMMATION

Un ordinateur est une machine becircte ne sachant quobeacuteir et agrave tregraves peu de choses

addition soustraction multiplication en binaire uniquement sur des entiers

sortir un reacutesultat ou lire une valeur binaire (dans une meacutemoire par exemple)

comparer des nombres

Sa puissance vient du fait quil peut ecirctre PROGRAMME cest agrave dire que lon peut lui donner agrave lavance la seacutequence (la suite ordonneacutee) des ordres agrave effectuer lun apregraves lautre Le grand avantage de lordinateur est sa rapiditeacute Par contre cest le programmeur qui doit TOUT faire Lordinateur ne comprennant que des ordres codeacutes en binaire (le langage machine) des langages dits eacutevolueacutes ont eacuteteacute mis au point pour faciliter la programmation

Le PASCAL creacuteeacute par WIRTH au deacutebut des anneacutees 70 possegravede des instructions assez claires (si vous comprenez langlais) et favorise une approche meacutethodique et disciplineacutee (on dit structureacutee)

Le PASCAL est un langage compileacute cest agrave dire quil faut

entrer un texte dans lordinateur (agrave laide dun programme appeleacute EDITEUR)

le traduire en langage machine (cest agrave dire en codes binaires compreacutehensibles par lordinateur) cest la compilation et eacuteventuellement leacutedition de liens (LINK)

lexeacutecuter

Contrairement agrave un basic interpreacuteteacute lexeacutecution sera beaucoup plus rapide puisquil ny a plus de traduction agrave effectuer

Bien que le langage soit normaliseacute un certain nombre de points deacutependent de la machine et du compilateur utiliseacute (par exemple comment appeler le compilateur) Ces indications ne seront pas donneacutees ici Si vous avez le choix je vous conseille TURBO PASCAL le plus pratique demploi (en particulier parce quil possegravede son propre eacutediteur de texte)

httpwww-ipstu-strasbgfrpatprogrampascal01htm (2 sur 2)09082003 224029

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

UN PREMIER PETIT PROGRAMME

Un programme PASCAL est composeacute dune entecircte des deacuteclarations et des instructions (deacutelimiteacutees par BEGIN et END )

ex PROGRAM cercle (inputoutput) ( entecircte ) VAR perimetrediametre REAL ( deacuteclarations ) BEGIN readln(diametre) ( instruction ) perimetre = 3141592 diametre ( instruction ) writeln(diametreperimetre) ( instruction ) END

Lentecircte est composeacutee du mot PROGRAM suivi du nom du programme (cercle) et dindications sur les EntreacuteesSorties (ici le clavier et leacutecran)

La partie deacuteclarative de notre programme est limiteacutee agrave la deacuteclaration de deux variables (mot clef VAR) Une variable est une case meacutemoire de lordinateur agrave laquelle on donne ici un nom Chaque case peut contenir une valeur On a preacuteciseacute ici que nos deux variables PERIMETRE et DIAMETRE contiendraient des reacuteels Les types simples connus en PASCAL sont REAL INTEGER (entier naturel) CHAR (contient UN est un seul caractegravere) et BOOLEAN (booleacuteen cad 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 possegravede la variable preacutedeacuteclareacutee MAXINT qui donne le plus grand entier admissible Les reacuteels doivent ecirctre compris en TURBO entre + et -17E37 (cad 17 fois 10 puissance 37) avec 11 chiffres significatifs La virgule deacutecimale est toujours repreacutesenteacutee par un point en informatique

Un identificateur (tout nom que vous choisissez variable programme) peut ecirctre formeacute de lettres (A agrave Z) de chiffres et (pas sur toutes les versions de PASCAL) du signe _ (souligneacute) TURBO PASCAL accepte des noms de 127 caractegraveres maximum certains PASCAL sont plus limiteacutes (31 caractegraveres par ex) Le premier caractegravere doit ecirctre une lettre Par exemple VALEUR1 ou PREM_VALEUR sont possibles mais pas 1ERE_VALEUR En PASCAL les minuscules sont traiteacutees comme des majuscules (SURface et surFACE deacutesignent la mecircme case meacutemoire) Je nutilise les majuscules que pour faire ressortir les mots importants Les accents et autres ccedil ne sont pas autoriseacutes (var diamegravetrereal est interdit agrave cause de laccent) Un blanc dans un identificateur est eacutegalement interdit (utilisez _ pour seacuteparer des mots dans un mecircme identificateur)

Toute variable utiliseacutee dans un programme doit ecirctre deacuteclareacutee Ceci eacutevite la plupart des erreurs de frappe et rend le programme plus compreacutehensible

httpwww-ipstu-strasbgfrpatprogrampascal02htm (1 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

Les instructions de notre programme sont

lecture sur le clavier

le programme sarrecircte attend que lon donne une valeur agrave laide du clavier met cette valeur dans la case DIAMETRE et continue le programme lorsque lon appuie sur la touche ENTREE ou RETURN

calcul et affectation

on multiplie le contenu de la case DIAMETRE par PI et on met le reacutesultat dans la case PERIMETRE

Le = symbolise une flegraveche agrave gauche Ce nest PAS une eacutegaliteacute au sens matheacutematique mais la copie dune valeur dans une meacutemoire

eacutecriture sur leacutecran

on affiche sur leacutecran le contenu des case DIAMETRE (que lon connaissait puisque nous lavions donneacute) et PERIMETRE (qui nous inteacuteresse un peu plus) Ce programme affiche donc deux chiffres Il serait plus parlant dafficher eacutegalement des commentaires par linstruction

writeln(Diamegravetre diametre Peacuterimegravetre perimetre)

Les textes doivent ecirctre entoureacutes de cotes () Les majusculesminuscules sont significatives Pour afficher une apostrophe utiliser deux cotes (lexemple) Pour sauter une ligne utiliser WRITELN seul

Les instructions doivent toujours ecirctre seacutepareacutees par des (jai dit seacutepareacutees pas termineacutees) Le fait de passer agrave la ligne nest interpreacuteteacute par lordinateur que comme un blanc On aurait donc pu eacutecrire notre programme sur une seule ligne (peut-ecirctre un peu longue pour leacutediteur) Le programme doit toujours se terminer par un point

On peut inseacuterer 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 dune ligne ceci permet de supprimer momentaneacutement une partie dun programme

Chaque identificateur est seacutepareacute du suivant par un blanc On considegravere comme un blanc plusieurs blanc un retour agrave la ligne un commentaire

EXERCICE (ex_tva) Faire un programme demandant le prix unitaire HT dun article et sa quantiteacute puis qui affiche le total Hors Taxes le montant de la TVA (pour un taux de 186 ) et le total TTC

httpwww-ipstu-strasbgfrpatprogrampascal02htm (2 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

httpwww-ipstu-strasbgfrpatprogrampascal02htm (3 sur 3)09082003 224030

le Langage PASCAL - CONSTANTES

CONSTANTES

Nous avons deacutejagrave utiliseacute des VARIABLES (on donne un nom agrave une meacutemoire) Mais on peut eacutegalement utiliser des CONSTANTES qui sont des valeurs qui restent fixes tout au long du programme et pour chaque exeacutecution On deacuteclare les constantes avant de deacuteclarer les variables par CONST nom=valeur

ex CONST taux_tva=186

MAXINT (plus grand entier possible) est une constante preacutedeacutefinie

On peut eacutegalement avoir des constantes de type chaicircne de caractegraveres

PROGRAM bonjour(output) on na pas besoin ici du clavier CONST message1=salut ccedila va message2=moi ccedila baigne BEGIN writeln(message1) writeln(message2) ( notez labsence de devant le END ) END

Le type de la constante est deacutetermineacute automatiquement par le compilateur (entier si nombre sans point reacuteel si nombre avec point caractegraveres si entre cotes)

Rq1 on peut toujours utiliser un entier agrave la place dun reacuteel mais pas linverse

Rq2 si on utilise un point deacutecimal il FAUT lencadrer de chiffres (03 et non 3 10 ou 100 et non 10)

httpwww-ipstu-strasbgfrpatprogrampascal03htm09082003 224030

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 4: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Le langage PASCAL - PTRAU

le Langage PASCAL

Patrick TRAU Janvier 92version HTML mars 97

Ce document preacutesente (de maniegravere claire je crois dapregraves ce quen ont dit certains) le langage PASCAL Il a eacuteteacute publieacute dans APTEP - INFO il y a quelques anneacutees Depuis bien que je maicirctrisais bien ce langage et avais deacuteveloppeacute de nombreux programmes en Pascal je suis passeacute au C Le C est dapregraves moi plus souple et plus efficace agrave condition de bien en comprendre les meacutecanismes (il faut dapregraves moi comprendre agrave la fois lassembleur et les objets pour bien programmer en C) De plus le C est plus utiliseacute dans mon environnement dinformaticiens Neacuteanmoins le Pascal reste bien meilleur pour le deacutebutant et le programmeur moyen parfaitement structureacute et clair il conduit rapidement agrave un programme de bonne qualiteacute et assez facilement maintenable (ce qui lest moins en C qui possegravede trop souvent trop de possibiliteacutes pour reacutesoudre le mecircme problegraveme)

De plus on trouve des compilateurs Pascal tregraves conviviaux (Turbo Pascal sur PC avec aide en ligne deacuteboguage)

Ce document reste donc dactualiteacute le Pascal est dapregraves moi une tregraves bonne maniegravere daborder la programmation Cest pourquoi jai choisi de mettre agrave disposition ce document sur Internet quil serve agrave qui en a besoin Neacuteanmoins je nai pas passeacute trop de temps agrave sa mise en page les graphiques restent en mode caractegravere il ny a pas de lien direct entre les sujets dexercices et leur correction (que lon trouvera en fin du document)

Voici quelques adresses inteacuteressantes

ABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP)

Pascalissime Point de rencontre des utilisateurs de Borland Pascal Site officiel de Borland France et en particulier les compilateurs gratuits (sous Dos-Windows

eacutevidement sous Unix vous saviez deacutejagrave que les meilleurs compilateurs sont chez GNU)

Copyright utilisation de ce document libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

httpwww-ipstu-strasbgfrpatprogrampascal_thtm (1 sur 2)09082003 224027

Le langage PASCAL - PTRAU

INTRODUCTION UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION 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 deacutetailleacute

httpwww-ipstu-strasbgfrpatprogrampascal_thtm (2 sur 2)09082003 224027

Mais qui est donc Patrick TRAU

Vous ecirctes le iegraveme lecteur de cette page depuis le 111664 Vous pouvez signer mon

livre dor chez

Vous vous demandiez

Mais qui est donc Patrick TRAU

Je vais essayer ici dapporter une reacuteponse agrave cette question sans grand inteacuterecirct

Je mapelle Patrick TRAU jai pregraves de 40 ans (mais du cocircteacute ougrave lon sen eacuteloigne) je suis marieacute et ai trois enfants Nous habitons agrave Obernai en Alsace

Je suis enseignant agrave lULP (Universiteacute Louis Pasteur) agrave Strasbourg jenseigne linformatique lautomatisme et la technologie agrave lIPST (Institut Professionnel des Sciences et Technologies)

De formation technique (Bac E ENS Cachan section Meacutecanique Agreacutegeacute de meacutecanique) jai effectueacute ma recherche au LMT (Laboratoire de Meacutecanique et Technologie) agrave Cachan dans le groupe CAO Jai mis au point SYMATRAU un SYstegraveme expert de MAillage TRidimensionnel AUtomatique Jy ai travailleacute sur UNIVAC 1100 puis sur NorkDataMatra DataSystem principalement en FORTRAN Puis jai eacuteteacute nommeacute enseignant agrave lUniversiteacute de Metz ougrave jai enseigneacute linformatique (Basic Pascal) et lautomatisme principalement en licencemaicirctrise Technologie Meacutecanique Geacutenie Meacutecanique preacuteparation agrave lagregation de meacutecanique DESS GMP ougrave je moccupais du module CAO et ISFATES Au LPMM (Laboratoire de Physique et Meacutecanique des Mateacuteriaux) je moccupais du mateacuteriel informatique de leur installation physique agrave ladministration systegraveme du reacuteseau Je travaillais sur PC et VAX 780 puis sur stations Apollo sous AEGIS)

Depuis 1990 je suis en poste agrave lIPST Jusquen 94 jeacutetais directeur adjoint de lIPST Deacutesormais je moccupe de linformatique de lUFR pour lenseignement (PC) ladministration et la recherche au L3MI (Laboratoire de Meacutecanique des Multi Mateacuteriaux Industriels) (stations SUN sous UNIXSolaris PC sous Linux et Windows) Je moccupe eacutegalement de ce serveur (sous Linux) ainsi que du contenu de notre site Jenseigne principalement linformatique (C PROLOG Algorithmique) et lautomatisme en IUP Geacutenie des Systegravemes Industriels et DESS Meacutecanique Avanceacutee et Strateacutegies Industrielles

A part cela il me reste un peu de temps pour moccuper 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 geacuteneacuteral en France

Si vraiment vous deacutesirez plus de deacutetails sur mes activiteacutes consultez mon CV Peut ecirctre cela vous permettra de reacutepondre agrave cette question

httpwww-ipstu-strasbgfrpatquisuisjhtm (1 sur 2)09082003 224028

Mais qui est donc Patrick TRAU

Qui est Patrick TRAU

(PS si jai mis cette question en gras cest pour que les moteurs indexent cette phrase)

Choisissez BACK (en haut agrave gauche) pour revenir agrave la page preacuteceacutedente cliquez ici pour la Pats Home Page

httpwww-ipstu-strasbgfrpatquisuisjhtm (2 sur 2)09082003 224028

le Langage PASCAL - INTRODUCTION

INTRODUCTION

LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

LES LOGICIELS

Dans la majoriteacute des cas on achegravete des programmes (logiciels) tout faits qui correspondent plus ou moins au besoin

Traitement de texte - PAO avec mise en page justification numeacuterotation chapitres-pagestable des matiegraveresdictionnaire

Tableur tableau de nombres agrave 2 dimensions et calculs

Base de donneacutees ensemble de fiches (nom adresse) et recherche par rubrique publipostage

CAO Dessin par ordinateur propre modification aiseacutee archivage

Gestion paye facturation stock

Communication transfert de programmes par modem et ligne teacuteleacutephonique serveur minitel

Un Inteacutegreacute regroupe plusieurs de ces possibiliteacutes

Soit on achegravete un logiciel geacuteneacuteral tregraves bon niveau parfaitement testeacute documentation formation mais trop geacuteneacuteral (fonctions inutiles fonctions utiles avec trop de paramegravetres 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 ecirctre tregraves preacutecis

ORGANISATION DE LORDINATEUR

Multiposte plusieurs consoles sur un mecircme ordinateur (CPU puissant tout est partageable)

Reacuteseau plusieurs CPU et MC non partageable (sauf reacuteseau de multipostes) MdM et peacuteripheacuteriques

httpwww-ipstu-strasbgfrpatprogrampascal01htm (1 sur 2)09082003 224029

le Langage PASCAL - INTRODUCTION

partageables ou locaux

LANGAGES DE PROGRAMMATION

Un ordinateur est une machine becircte ne sachant quobeacuteir et agrave tregraves peu de choses

addition soustraction multiplication en binaire uniquement sur des entiers

sortir un reacutesultat ou lire une valeur binaire (dans une meacutemoire par exemple)

comparer des nombres

Sa puissance vient du fait quil peut ecirctre PROGRAMME cest agrave dire que lon peut lui donner agrave lavance la seacutequence (la suite ordonneacutee) des ordres agrave effectuer lun apregraves lautre Le grand avantage de lordinateur est sa rapiditeacute Par contre cest le programmeur qui doit TOUT faire Lordinateur ne comprennant que des ordres codeacutes en binaire (le langage machine) des langages dits eacutevolueacutes ont eacuteteacute mis au point pour faciliter la programmation

Le PASCAL creacuteeacute par WIRTH au deacutebut des anneacutees 70 possegravede des instructions assez claires (si vous comprenez langlais) et favorise une approche meacutethodique et disciplineacutee (on dit structureacutee)

Le PASCAL est un langage compileacute cest agrave dire quil faut

entrer un texte dans lordinateur (agrave laide dun programme appeleacute EDITEUR)

le traduire en langage machine (cest agrave dire en codes binaires compreacutehensibles par lordinateur) cest la compilation et eacuteventuellement leacutedition de liens (LINK)

lexeacutecuter

Contrairement agrave un basic interpreacuteteacute lexeacutecution sera beaucoup plus rapide puisquil ny a plus de traduction agrave effectuer

Bien que le langage soit normaliseacute un certain nombre de points deacutependent de la machine et du compilateur utiliseacute (par exemple comment appeler le compilateur) Ces indications ne seront pas donneacutees ici Si vous avez le choix je vous conseille TURBO PASCAL le plus pratique demploi (en particulier parce quil possegravede son propre eacutediteur de texte)

httpwww-ipstu-strasbgfrpatprogrampascal01htm (2 sur 2)09082003 224029

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

UN PREMIER PETIT PROGRAMME

Un programme PASCAL est composeacute dune entecircte des deacuteclarations et des instructions (deacutelimiteacutees par BEGIN et END )

ex PROGRAM cercle (inputoutput) ( entecircte ) VAR perimetrediametre REAL ( deacuteclarations ) BEGIN readln(diametre) ( instruction ) perimetre = 3141592 diametre ( instruction ) writeln(diametreperimetre) ( instruction ) END

Lentecircte est composeacutee du mot PROGRAM suivi du nom du programme (cercle) et dindications sur les EntreacuteesSorties (ici le clavier et leacutecran)

La partie deacuteclarative de notre programme est limiteacutee agrave la deacuteclaration de deux variables (mot clef VAR) Une variable est une case meacutemoire de lordinateur agrave laquelle on donne ici un nom Chaque case peut contenir une valeur On a preacuteciseacute ici que nos deux variables PERIMETRE et DIAMETRE contiendraient des reacuteels Les types simples connus en PASCAL sont REAL INTEGER (entier naturel) CHAR (contient UN est un seul caractegravere) et BOOLEAN (booleacuteen cad 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 possegravede la variable preacutedeacuteclareacutee MAXINT qui donne le plus grand entier admissible Les reacuteels doivent ecirctre compris en TURBO entre + et -17E37 (cad 17 fois 10 puissance 37) avec 11 chiffres significatifs La virgule deacutecimale est toujours repreacutesenteacutee par un point en informatique

Un identificateur (tout nom que vous choisissez variable programme) peut ecirctre formeacute de lettres (A agrave Z) de chiffres et (pas sur toutes les versions de PASCAL) du signe _ (souligneacute) TURBO PASCAL accepte des noms de 127 caractegraveres maximum certains PASCAL sont plus limiteacutes (31 caractegraveres par ex) Le premier caractegravere doit ecirctre une lettre Par exemple VALEUR1 ou PREM_VALEUR sont possibles mais pas 1ERE_VALEUR En PASCAL les minuscules sont traiteacutees comme des majuscules (SURface et surFACE deacutesignent la mecircme case meacutemoire) Je nutilise les majuscules que pour faire ressortir les mots importants Les accents et autres ccedil ne sont pas autoriseacutes (var diamegravetrereal est interdit agrave cause de laccent) Un blanc dans un identificateur est eacutegalement interdit (utilisez _ pour seacuteparer des mots dans un mecircme identificateur)

Toute variable utiliseacutee dans un programme doit ecirctre deacuteclareacutee Ceci eacutevite la plupart des erreurs de frappe et rend le programme plus compreacutehensible

httpwww-ipstu-strasbgfrpatprogrampascal02htm (1 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

Les instructions de notre programme sont

lecture sur le clavier

le programme sarrecircte attend que lon donne une valeur agrave laide du clavier met cette valeur dans la case DIAMETRE et continue le programme lorsque lon appuie sur la touche ENTREE ou RETURN

calcul et affectation

on multiplie le contenu de la case DIAMETRE par PI et on met le reacutesultat dans la case PERIMETRE

Le = symbolise une flegraveche agrave gauche Ce nest PAS une eacutegaliteacute au sens matheacutematique mais la copie dune valeur dans une meacutemoire

eacutecriture sur leacutecran

on affiche sur leacutecran le contenu des case DIAMETRE (que lon connaissait puisque nous lavions donneacute) et PERIMETRE (qui nous inteacuteresse un peu plus) Ce programme affiche donc deux chiffres Il serait plus parlant dafficher eacutegalement des commentaires par linstruction

writeln(Diamegravetre diametre Peacuterimegravetre perimetre)

Les textes doivent ecirctre entoureacutes de cotes () Les majusculesminuscules sont significatives Pour afficher une apostrophe utiliser deux cotes (lexemple) Pour sauter une ligne utiliser WRITELN seul

Les instructions doivent toujours ecirctre seacutepareacutees par des (jai dit seacutepareacutees pas termineacutees) Le fait de passer agrave la ligne nest interpreacuteteacute par lordinateur que comme un blanc On aurait donc pu eacutecrire notre programme sur une seule ligne (peut-ecirctre un peu longue pour leacutediteur) Le programme doit toujours se terminer par un point

On peut inseacuterer 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 dune ligne ceci permet de supprimer momentaneacutement une partie dun programme

Chaque identificateur est seacutepareacute du suivant par un blanc On considegravere comme un blanc plusieurs blanc un retour agrave la ligne un commentaire

EXERCICE (ex_tva) Faire un programme demandant le prix unitaire HT dun article et sa quantiteacute puis qui affiche le total Hors Taxes le montant de la TVA (pour un taux de 186 ) et le total TTC

httpwww-ipstu-strasbgfrpatprogrampascal02htm (2 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

httpwww-ipstu-strasbgfrpatprogrampascal02htm (3 sur 3)09082003 224030

le Langage PASCAL - CONSTANTES

CONSTANTES

Nous avons deacutejagrave utiliseacute des VARIABLES (on donne un nom agrave une meacutemoire) Mais on peut eacutegalement utiliser des CONSTANTES qui sont des valeurs qui restent fixes tout au long du programme et pour chaque exeacutecution On deacuteclare les constantes avant de deacuteclarer les variables par CONST nom=valeur

ex CONST taux_tva=186

MAXINT (plus grand entier possible) est une constante preacutedeacutefinie

On peut eacutegalement avoir des constantes de type chaicircne de caractegraveres

PROGRAM bonjour(output) on na pas besoin ici du clavier CONST message1=salut ccedila va message2=moi ccedila baigne BEGIN writeln(message1) writeln(message2) ( notez labsence de devant le END ) END

Le type de la constante est deacutetermineacute automatiquement par le compilateur (entier si nombre sans point reacuteel si nombre avec point caractegraveres si entre cotes)

Rq1 on peut toujours utiliser un entier agrave la place dun reacuteel mais pas linverse

Rq2 si on utilise un point deacutecimal il FAUT lencadrer de chiffres (03 et non 3 10 ou 100 et non 10)

httpwww-ipstu-strasbgfrpatprogrampascal03htm09082003 224030

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 5: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Le langage PASCAL - PTRAU

INTRODUCTION UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION 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 deacutetailleacute

httpwww-ipstu-strasbgfrpatprogrampascal_thtm (2 sur 2)09082003 224027

Mais qui est donc Patrick TRAU

Vous ecirctes le iegraveme lecteur de cette page depuis le 111664 Vous pouvez signer mon

livre dor chez

Vous vous demandiez

Mais qui est donc Patrick TRAU

Je vais essayer ici dapporter une reacuteponse agrave cette question sans grand inteacuterecirct

Je mapelle Patrick TRAU jai pregraves de 40 ans (mais du cocircteacute ougrave lon sen eacuteloigne) je suis marieacute et ai trois enfants Nous habitons agrave Obernai en Alsace

Je suis enseignant agrave lULP (Universiteacute Louis Pasteur) agrave Strasbourg jenseigne linformatique lautomatisme et la technologie agrave lIPST (Institut Professionnel des Sciences et Technologies)

De formation technique (Bac E ENS Cachan section Meacutecanique Agreacutegeacute de meacutecanique) jai effectueacute ma recherche au LMT (Laboratoire de Meacutecanique et Technologie) agrave Cachan dans le groupe CAO Jai mis au point SYMATRAU un SYstegraveme expert de MAillage TRidimensionnel AUtomatique Jy ai travailleacute sur UNIVAC 1100 puis sur NorkDataMatra DataSystem principalement en FORTRAN Puis jai eacuteteacute nommeacute enseignant agrave lUniversiteacute de Metz ougrave jai enseigneacute linformatique (Basic Pascal) et lautomatisme principalement en licencemaicirctrise Technologie Meacutecanique Geacutenie Meacutecanique preacuteparation agrave lagregation de meacutecanique DESS GMP ougrave je moccupais du module CAO et ISFATES Au LPMM (Laboratoire de Physique et Meacutecanique des Mateacuteriaux) je moccupais du mateacuteriel informatique de leur installation physique agrave ladministration systegraveme du reacuteseau Je travaillais sur PC et VAX 780 puis sur stations Apollo sous AEGIS)

Depuis 1990 je suis en poste agrave lIPST Jusquen 94 jeacutetais directeur adjoint de lIPST Deacutesormais je moccupe de linformatique de lUFR pour lenseignement (PC) ladministration et la recherche au L3MI (Laboratoire de Meacutecanique des Multi Mateacuteriaux Industriels) (stations SUN sous UNIXSolaris PC sous Linux et Windows) Je moccupe eacutegalement de ce serveur (sous Linux) ainsi que du contenu de notre site Jenseigne principalement linformatique (C PROLOG Algorithmique) et lautomatisme en IUP Geacutenie des Systegravemes Industriels et DESS Meacutecanique Avanceacutee et Strateacutegies Industrielles

A part cela il me reste un peu de temps pour moccuper 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 geacuteneacuteral en France

Si vraiment vous deacutesirez plus de deacutetails sur mes activiteacutes consultez mon CV Peut ecirctre cela vous permettra de reacutepondre agrave cette question

httpwww-ipstu-strasbgfrpatquisuisjhtm (1 sur 2)09082003 224028

Mais qui est donc Patrick TRAU

Qui est Patrick TRAU

(PS si jai mis cette question en gras cest pour que les moteurs indexent cette phrase)

Choisissez BACK (en haut agrave gauche) pour revenir agrave la page preacuteceacutedente cliquez ici pour la Pats Home Page

httpwww-ipstu-strasbgfrpatquisuisjhtm (2 sur 2)09082003 224028

le Langage PASCAL - INTRODUCTION

INTRODUCTION

LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

LES LOGICIELS

Dans la majoriteacute des cas on achegravete des programmes (logiciels) tout faits qui correspondent plus ou moins au besoin

Traitement de texte - PAO avec mise en page justification numeacuterotation chapitres-pagestable des matiegraveresdictionnaire

Tableur tableau de nombres agrave 2 dimensions et calculs

Base de donneacutees ensemble de fiches (nom adresse) et recherche par rubrique publipostage

CAO Dessin par ordinateur propre modification aiseacutee archivage

Gestion paye facturation stock

Communication transfert de programmes par modem et ligne teacuteleacutephonique serveur minitel

Un Inteacutegreacute regroupe plusieurs de ces possibiliteacutes

Soit on achegravete un logiciel geacuteneacuteral tregraves bon niveau parfaitement testeacute documentation formation mais trop geacuteneacuteral (fonctions inutiles fonctions utiles avec trop de paramegravetres 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 ecirctre tregraves preacutecis

ORGANISATION DE LORDINATEUR

Multiposte plusieurs consoles sur un mecircme ordinateur (CPU puissant tout est partageable)

Reacuteseau plusieurs CPU et MC non partageable (sauf reacuteseau de multipostes) MdM et peacuteripheacuteriques

httpwww-ipstu-strasbgfrpatprogrampascal01htm (1 sur 2)09082003 224029

le Langage PASCAL - INTRODUCTION

partageables ou locaux

LANGAGES DE PROGRAMMATION

Un ordinateur est une machine becircte ne sachant quobeacuteir et agrave tregraves peu de choses

addition soustraction multiplication en binaire uniquement sur des entiers

sortir un reacutesultat ou lire une valeur binaire (dans une meacutemoire par exemple)

comparer des nombres

Sa puissance vient du fait quil peut ecirctre PROGRAMME cest agrave dire que lon peut lui donner agrave lavance la seacutequence (la suite ordonneacutee) des ordres agrave effectuer lun apregraves lautre Le grand avantage de lordinateur est sa rapiditeacute Par contre cest le programmeur qui doit TOUT faire Lordinateur ne comprennant que des ordres codeacutes en binaire (le langage machine) des langages dits eacutevolueacutes ont eacuteteacute mis au point pour faciliter la programmation

Le PASCAL creacuteeacute par WIRTH au deacutebut des anneacutees 70 possegravede des instructions assez claires (si vous comprenez langlais) et favorise une approche meacutethodique et disciplineacutee (on dit structureacutee)

Le PASCAL est un langage compileacute cest agrave dire quil faut

entrer un texte dans lordinateur (agrave laide dun programme appeleacute EDITEUR)

le traduire en langage machine (cest agrave dire en codes binaires compreacutehensibles par lordinateur) cest la compilation et eacuteventuellement leacutedition de liens (LINK)

lexeacutecuter

Contrairement agrave un basic interpreacuteteacute lexeacutecution sera beaucoup plus rapide puisquil ny a plus de traduction agrave effectuer

Bien que le langage soit normaliseacute un certain nombre de points deacutependent de la machine et du compilateur utiliseacute (par exemple comment appeler le compilateur) Ces indications ne seront pas donneacutees ici Si vous avez le choix je vous conseille TURBO PASCAL le plus pratique demploi (en particulier parce quil possegravede son propre eacutediteur de texte)

httpwww-ipstu-strasbgfrpatprogrampascal01htm (2 sur 2)09082003 224029

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

UN PREMIER PETIT PROGRAMME

Un programme PASCAL est composeacute dune entecircte des deacuteclarations et des instructions (deacutelimiteacutees par BEGIN et END )

ex PROGRAM cercle (inputoutput) ( entecircte ) VAR perimetrediametre REAL ( deacuteclarations ) BEGIN readln(diametre) ( instruction ) perimetre = 3141592 diametre ( instruction ) writeln(diametreperimetre) ( instruction ) END

Lentecircte est composeacutee du mot PROGRAM suivi du nom du programme (cercle) et dindications sur les EntreacuteesSorties (ici le clavier et leacutecran)

La partie deacuteclarative de notre programme est limiteacutee agrave la deacuteclaration de deux variables (mot clef VAR) Une variable est une case meacutemoire de lordinateur agrave laquelle on donne ici un nom Chaque case peut contenir une valeur On a preacuteciseacute ici que nos deux variables PERIMETRE et DIAMETRE contiendraient des reacuteels Les types simples connus en PASCAL sont REAL INTEGER (entier naturel) CHAR (contient UN est un seul caractegravere) et BOOLEAN (booleacuteen cad 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 possegravede la variable preacutedeacuteclareacutee MAXINT qui donne le plus grand entier admissible Les reacuteels doivent ecirctre compris en TURBO entre + et -17E37 (cad 17 fois 10 puissance 37) avec 11 chiffres significatifs La virgule deacutecimale est toujours repreacutesenteacutee par un point en informatique

Un identificateur (tout nom que vous choisissez variable programme) peut ecirctre formeacute de lettres (A agrave Z) de chiffres et (pas sur toutes les versions de PASCAL) du signe _ (souligneacute) TURBO PASCAL accepte des noms de 127 caractegraveres maximum certains PASCAL sont plus limiteacutes (31 caractegraveres par ex) Le premier caractegravere doit ecirctre une lettre Par exemple VALEUR1 ou PREM_VALEUR sont possibles mais pas 1ERE_VALEUR En PASCAL les minuscules sont traiteacutees comme des majuscules (SURface et surFACE deacutesignent la mecircme case meacutemoire) Je nutilise les majuscules que pour faire ressortir les mots importants Les accents et autres ccedil ne sont pas autoriseacutes (var diamegravetrereal est interdit agrave cause de laccent) Un blanc dans un identificateur est eacutegalement interdit (utilisez _ pour seacuteparer des mots dans un mecircme identificateur)

Toute variable utiliseacutee dans un programme doit ecirctre deacuteclareacutee Ceci eacutevite la plupart des erreurs de frappe et rend le programme plus compreacutehensible

httpwww-ipstu-strasbgfrpatprogrampascal02htm (1 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

Les instructions de notre programme sont

lecture sur le clavier

le programme sarrecircte attend que lon donne une valeur agrave laide du clavier met cette valeur dans la case DIAMETRE et continue le programme lorsque lon appuie sur la touche ENTREE ou RETURN

calcul et affectation

on multiplie le contenu de la case DIAMETRE par PI et on met le reacutesultat dans la case PERIMETRE

Le = symbolise une flegraveche agrave gauche Ce nest PAS une eacutegaliteacute au sens matheacutematique mais la copie dune valeur dans une meacutemoire

eacutecriture sur leacutecran

on affiche sur leacutecran le contenu des case DIAMETRE (que lon connaissait puisque nous lavions donneacute) et PERIMETRE (qui nous inteacuteresse un peu plus) Ce programme affiche donc deux chiffres Il serait plus parlant dafficher eacutegalement des commentaires par linstruction

writeln(Diamegravetre diametre Peacuterimegravetre perimetre)

Les textes doivent ecirctre entoureacutes de cotes () Les majusculesminuscules sont significatives Pour afficher une apostrophe utiliser deux cotes (lexemple) Pour sauter une ligne utiliser WRITELN seul

Les instructions doivent toujours ecirctre seacutepareacutees par des (jai dit seacutepareacutees pas termineacutees) Le fait de passer agrave la ligne nest interpreacuteteacute par lordinateur que comme un blanc On aurait donc pu eacutecrire notre programme sur une seule ligne (peut-ecirctre un peu longue pour leacutediteur) Le programme doit toujours se terminer par un point

On peut inseacuterer 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 dune ligne ceci permet de supprimer momentaneacutement une partie dun programme

Chaque identificateur est seacutepareacute du suivant par un blanc On considegravere comme un blanc plusieurs blanc un retour agrave la ligne un commentaire

EXERCICE (ex_tva) Faire un programme demandant le prix unitaire HT dun article et sa quantiteacute puis qui affiche le total Hors Taxes le montant de la TVA (pour un taux de 186 ) et le total TTC

httpwww-ipstu-strasbgfrpatprogrampascal02htm (2 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

httpwww-ipstu-strasbgfrpatprogrampascal02htm (3 sur 3)09082003 224030

le Langage PASCAL - CONSTANTES

CONSTANTES

Nous avons deacutejagrave utiliseacute des VARIABLES (on donne un nom agrave une meacutemoire) Mais on peut eacutegalement utiliser des CONSTANTES qui sont des valeurs qui restent fixes tout au long du programme et pour chaque exeacutecution On deacuteclare les constantes avant de deacuteclarer les variables par CONST nom=valeur

ex CONST taux_tva=186

MAXINT (plus grand entier possible) est une constante preacutedeacutefinie

On peut eacutegalement avoir des constantes de type chaicircne de caractegraveres

PROGRAM bonjour(output) on na pas besoin ici du clavier CONST message1=salut ccedila va message2=moi ccedila baigne BEGIN writeln(message1) writeln(message2) ( notez labsence de devant le END ) END

Le type de la constante est deacutetermineacute automatiquement par le compilateur (entier si nombre sans point reacuteel si nombre avec point caractegraveres si entre cotes)

Rq1 on peut toujours utiliser un entier agrave la place dun reacuteel mais pas linverse

Rq2 si on utilise un point deacutecimal il FAUT lencadrer de chiffres (03 et non 3 10 ou 100 et non 10)

httpwww-ipstu-strasbgfrpatprogrampascal03htm09082003 224030

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 6: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Mais qui est donc Patrick TRAU

Vous ecirctes le iegraveme lecteur de cette page depuis le 111664 Vous pouvez signer mon

livre dor chez

Vous vous demandiez

Mais qui est donc Patrick TRAU

Je vais essayer ici dapporter une reacuteponse agrave cette question sans grand inteacuterecirct

Je mapelle Patrick TRAU jai pregraves de 40 ans (mais du cocircteacute ougrave lon sen eacuteloigne) je suis marieacute et ai trois enfants Nous habitons agrave Obernai en Alsace

Je suis enseignant agrave lULP (Universiteacute Louis Pasteur) agrave Strasbourg jenseigne linformatique lautomatisme et la technologie agrave lIPST (Institut Professionnel des Sciences et Technologies)

De formation technique (Bac E ENS Cachan section Meacutecanique Agreacutegeacute de meacutecanique) jai effectueacute ma recherche au LMT (Laboratoire de Meacutecanique et Technologie) agrave Cachan dans le groupe CAO Jai mis au point SYMATRAU un SYstegraveme expert de MAillage TRidimensionnel AUtomatique Jy ai travailleacute sur UNIVAC 1100 puis sur NorkDataMatra DataSystem principalement en FORTRAN Puis jai eacuteteacute nommeacute enseignant agrave lUniversiteacute de Metz ougrave jai enseigneacute linformatique (Basic Pascal) et lautomatisme principalement en licencemaicirctrise Technologie Meacutecanique Geacutenie Meacutecanique preacuteparation agrave lagregation de meacutecanique DESS GMP ougrave je moccupais du module CAO et ISFATES Au LPMM (Laboratoire de Physique et Meacutecanique des Mateacuteriaux) je moccupais du mateacuteriel informatique de leur installation physique agrave ladministration systegraveme du reacuteseau Je travaillais sur PC et VAX 780 puis sur stations Apollo sous AEGIS)

Depuis 1990 je suis en poste agrave lIPST Jusquen 94 jeacutetais directeur adjoint de lIPST Deacutesormais je moccupe de linformatique de lUFR pour lenseignement (PC) ladministration et la recherche au L3MI (Laboratoire de Meacutecanique des Multi Mateacuteriaux Industriels) (stations SUN sous UNIXSolaris PC sous Linux et Windows) Je moccupe eacutegalement de ce serveur (sous Linux) ainsi que du contenu de notre site Jenseigne principalement linformatique (C PROLOG Algorithmique) et lautomatisme en IUP Geacutenie des Systegravemes Industriels et DESS Meacutecanique Avanceacutee et Strateacutegies Industrielles

A part cela il me reste un peu de temps pour moccuper 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 geacuteneacuteral en France

Si vraiment vous deacutesirez plus de deacutetails sur mes activiteacutes consultez mon CV Peut ecirctre cela vous permettra de reacutepondre agrave cette question

httpwww-ipstu-strasbgfrpatquisuisjhtm (1 sur 2)09082003 224028

Mais qui est donc Patrick TRAU

Qui est Patrick TRAU

(PS si jai mis cette question en gras cest pour que les moteurs indexent cette phrase)

Choisissez BACK (en haut agrave gauche) pour revenir agrave la page preacuteceacutedente cliquez ici pour la Pats Home Page

httpwww-ipstu-strasbgfrpatquisuisjhtm (2 sur 2)09082003 224028

le Langage PASCAL - INTRODUCTION

INTRODUCTION

LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

LES LOGICIELS

Dans la majoriteacute des cas on achegravete des programmes (logiciels) tout faits qui correspondent plus ou moins au besoin

Traitement de texte - PAO avec mise en page justification numeacuterotation chapitres-pagestable des matiegraveresdictionnaire

Tableur tableau de nombres agrave 2 dimensions et calculs

Base de donneacutees ensemble de fiches (nom adresse) et recherche par rubrique publipostage

CAO Dessin par ordinateur propre modification aiseacutee archivage

Gestion paye facturation stock

Communication transfert de programmes par modem et ligne teacuteleacutephonique serveur minitel

Un Inteacutegreacute regroupe plusieurs de ces possibiliteacutes

Soit on achegravete un logiciel geacuteneacuteral tregraves bon niveau parfaitement testeacute documentation formation mais trop geacuteneacuteral (fonctions inutiles fonctions utiles avec trop de paramegravetres 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 ecirctre tregraves preacutecis

ORGANISATION DE LORDINATEUR

Multiposte plusieurs consoles sur un mecircme ordinateur (CPU puissant tout est partageable)

Reacuteseau plusieurs CPU et MC non partageable (sauf reacuteseau de multipostes) MdM et peacuteripheacuteriques

httpwww-ipstu-strasbgfrpatprogrampascal01htm (1 sur 2)09082003 224029

le Langage PASCAL - INTRODUCTION

partageables ou locaux

LANGAGES DE PROGRAMMATION

Un ordinateur est une machine becircte ne sachant quobeacuteir et agrave tregraves peu de choses

addition soustraction multiplication en binaire uniquement sur des entiers

sortir un reacutesultat ou lire une valeur binaire (dans une meacutemoire par exemple)

comparer des nombres

Sa puissance vient du fait quil peut ecirctre PROGRAMME cest agrave dire que lon peut lui donner agrave lavance la seacutequence (la suite ordonneacutee) des ordres agrave effectuer lun apregraves lautre Le grand avantage de lordinateur est sa rapiditeacute Par contre cest le programmeur qui doit TOUT faire Lordinateur ne comprennant que des ordres codeacutes en binaire (le langage machine) des langages dits eacutevolueacutes ont eacuteteacute mis au point pour faciliter la programmation

Le PASCAL creacuteeacute par WIRTH au deacutebut des anneacutees 70 possegravede des instructions assez claires (si vous comprenez langlais) et favorise une approche meacutethodique et disciplineacutee (on dit structureacutee)

Le PASCAL est un langage compileacute cest agrave dire quil faut

entrer un texte dans lordinateur (agrave laide dun programme appeleacute EDITEUR)

le traduire en langage machine (cest agrave dire en codes binaires compreacutehensibles par lordinateur) cest la compilation et eacuteventuellement leacutedition de liens (LINK)

lexeacutecuter

Contrairement agrave un basic interpreacuteteacute lexeacutecution sera beaucoup plus rapide puisquil ny a plus de traduction agrave effectuer

Bien que le langage soit normaliseacute un certain nombre de points deacutependent de la machine et du compilateur utiliseacute (par exemple comment appeler le compilateur) Ces indications ne seront pas donneacutees ici Si vous avez le choix je vous conseille TURBO PASCAL le plus pratique demploi (en particulier parce quil possegravede son propre eacutediteur de texte)

httpwww-ipstu-strasbgfrpatprogrampascal01htm (2 sur 2)09082003 224029

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

UN PREMIER PETIT PROGRAMME

Un programme PASCAL est composeacute dune entecircte des deacuteclarations et des instructions (deacutelimiteacutees par BEGIN et END )

ex PROGRAM cercle (inputoutput) ( entecircte ) VAR perimetrediametre REAL ( deacuteclarations ) BEGIN readln(diametre) ( instruction ) perimetre = 3141592 diametre ( instruction ) writeln(diametreperimetre) ( instruction ) END

Lentecircte est composeacutee du mot PROGRAM suivi du nom du programme (cercle) et dindications sur les EntreacuteesSorties (ici le clavier et leacutecran)

La partie deacuteclarative de notre programme est limiteacutee agrave la deacuteclaration de deux variables (mot clef VAR) Une variable est une case meacutemoire de lordinateur agrave laquelle on donne ici un nom Chaque case peut contenir une valeur On a preacuteciseacute ici que nos deux variables PERIMETRE et DIAMETRE contiendraient des reacuteels Les types simples connus en PASCAL sont REAL INTEGER (entier naturel) CHAR (contient UN est un seul caractegravere) et BOOLEAN (booleacuteen cad 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 possegravede la variable preacutedeacuteclareacutee MAXINT qui donne le plus grand entier admissible Les reacuteels doivent ecirctre compris en TURBO entre + et -17E37 (cad 17 fois 10 puissance 37) avec 11 chiffres significatifs La virgule deacutecimale est toujours repreacutesenteacutee par un point en informatique

Un identificateur (tout nom que vous choisissez variable programme) peut ecirctre formeacute de lettres (A agrave Z) de chiffres et (pas sur toutes les versions de PASCAL) du signe _ (souligneacute) TURBO PASCAL accepte des noms de 127 caractegraveres maximum certains PASCAL sont plus limiteacutes (31 caractegraveres par ex) Le premier caractegravere doit ecirctre une lettre Par exemple VALEUR1 ou PREM_VALEUR sont possibles mais pas 1ERE_VALEUR En PASCAL les minuscules sont traiteacutees comme des majuscules (SURface et surFACE deacutesignent la mecircme case meacutemoire) Je nutilise les majuscules que pour faire ressortir les mots importants Les accents et autres ccedil ne sont pas autoriseacutes (var diamegravetrereal est interdit agrave cause de laccent) Un blanc dans un identificateur est eacutegalement interdit (utilisez _ pour seacuteparer des mots dans un mecircme identificateur)

Toute variable utiliseacutee dans un programme doit ecirctre deacuteclareacutee Ceci eacutevite la plupart des erreurs de frappe et rend le programme plus compreacutehensible

httpwww-ipstu-strasbgfrpatprogrampascal02htm (1 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

Les instructions de notre programme sont

lecture sur le clavier

le programme sarrecircte attend que lon donne une valeur agrave laide du clavier met cette valeur dans la case DIAMETRE et continue le programme lorsque lon appuie sur la touche ENTREE ou RETURN

calcul et affectation

on multiplie le contenu de la case DIAMETRE par PI et on met le reacutesultat dans la case PERIMETRE

Le = symbolise une flegraveche agrave gauche Ce nest PAS une eacutegaliteacute au sens matheacutematique mais la copie dune valeur dans une meacutemoire

eacutecriture sur leacutecran

on affiche sur leacutecran le contenu des case DIAMETRE (que lon connaissait puisque nous lavions donneacute) et PERIMETRE (qui nous inteacuteresse un peu plus) Ce programme affiche donc deux chiffres Il serait plus parlant dafficher eacutegalement des commentaires par linstruction

writeln(Diamegravetre diametre Peacuterimegravetre perimetre)

Les textes doivent ecirctre entoureacutes de cotes () Les majusculesminuscules sont significatives Pour afficher une apostrophe utiliser deux cotes (lexemple) Pour sauter une ligne utiliser WRITELN seul

Les instructions doivent toujours ecirctre seacutepareacutees par des (jai dit seacutepareacutees pas termineacutees) Le fait de passer agrave la ligne nest interpreacuteteacute par lordinateur que comme un blanc On aurait donc pu eacutecrire notre programme sur une seule ligne (peut-ecirctre un peu longue pour leacutediteur) Le programme doit toujours se terminer par un point

On peut inseacuterer 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 dune ligne ceci permet de supprimer momentaneacutement une partie dun programme

Chaque identificateur est seacutepareacute du suivant par un blanc On considegravere comme un blanc plusieurs blanc un retour agrave la ligne un commentaire

EXERCICE (ex_tva) Faire un programme demandant le prix unitaire HT dun article et sa quantiteacute puis qui affiche le total Hors Taxes le montant de la TVA (pour un taux de 186 ) et le total TTC

httpwww-ipstu-strasbgfrpatprogrampascal02htm (2 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

httpwww-ipstu-strasbgfrpatprogrampascal02htm (3 sur 3)09082003 224030

le Langage PASCAL - CONSTANTES

CONSTANTES

Nous avons deacutejagrave utiliseacute des VARIABLES (on donne un nom agrave une meacutemoire) Mais on peut eacutegalement utiliser des CONSTANTES qui sont des valeurs qui restent fixes tout au long du programme et pour chaque exeacutecution On deacuteclare les constantes avant de deacuteclarer les variables par CONST nom=valeur

ex CONST taux_tva=186

MAXINT (plus grand entier possible) est une constante preacutedeacutefinie

On peut eacutegalement avoir des constantes de type chaicircne de caractegraveres

PROGRAM bonjour(output) on na pas besoin ici du clavier CONST message1=salut ccedila va message2=moi ccedila baigne BEGIN writeln(message1) writeln(message2) ( notez labsence de devant le END ) END

Le type de la constante est deacutetermineacute automatiquement par le compilateur (entier si nombre sans point reacuteel si nombre avec point caractegraveres si entre cotes)

Rq1 on peut toujours utiliser un entier agrave la place dun reacuteel mais pas linverse

Rq2 si on utilise un point deacutecimal il FAUT lencadrer de chiffres (03 et non 3 10 ou 100 et non 10)

httpwww-ipstu-strasbgfrpatprogrampascal03htm09082003 224030

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 7: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Mais qui est donc Patrick TRAU

Qui est Patrick TRAU

(PS si jai mis cette question en gras cest pour que les moteurs indexent cette phrase)

Choisissez BACK (en haut agrave gauche) pour revenir agrave la page preacuteceacutedente cliquez ici pour la Pats Home Page

httpwww-ipstu-strasbgfrpatquisuisjhtm (2 sur 2)09082003 224028

le Langage PASCAL - INTRODUCTION

INTRODUCTION

LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

LES LOGICIELS

Dans la majoriteacute des cas on achegravete des programmes (logiciels) tout faits qui correspondent plus ou moins au besoin

Traitement de texte - PAO avec mise en page justification numeacuterotation chapitres-pagestable des matiegraveresdictionnaire

Tableur tableau de nombres agrave 2 dimensions et calculs

Base de donneacutees ensemble de fiches (nom adresse) et recherche par rubrique publipostage

CAO Dessin par ordinateur propre modification aiseacutee archivage

Gestion paye facturation stock

Communication transfert de programmes par modem et ligne teacuteleacutephonique serveur minitel

Un Inteacutegreacute regroupe plusieurs de ces possibiliteacutes

Soit on achegravete un logiciel geacuteneacuteral tregraves bon niveau parfaitement testeacute documentation formation mais trop geacuteneacuteral (fonctions inutiles fonctions utiles avec trop de paramegravetres 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 ecirctre tregraves preacutecis

ORGANISATION DE LORDINATEUR

Multiposte plusieurs consoles sur un mecircme ordinateur (CPU puissant tout est partageable)

Reacuteseau plusieurs CPU et MC non partageable (sauf reacuteseau de multipostes) MdM et peacuteripheacuteriques

httpwww-ipstu-strasbgfrpatprogrampascal01htm (1 sur 2)09082003 224029

le Langage PASCAL - INTRODUCTION

partageables ou locaux

LANGAGES DE PROGRAMMATION

Un ordinateur est une machine becircte ne sachant quobeacuteir et agrave tregraves peu de choses

addition soustraction multiplication en binaire uniquement sur des entiers

sortir un reacutesultat ou lire une valeur binaire (dans une meacutemoire par exemple)

comparer des nombres

Sa puissance vient du fait quil peut ecirctre PROGRAMME cest agrave dire que lon peut lui donner agrave lavance la seacutequence (la suite ordonneacutee) des ordres agrave effectuer lun apregraves lautre Le grand avantage de lordinateur est sa rapiditeacute Par contre cest le programmeur qui doit TOUT faire Lordinateur ne comprennant que des ordres codeacutes en binaire (le langage machine) des langages dits eacutevolueacutes ont eacuteteacute mis au point pour faciliter la programmation

Le PASCAL creacuteeacute par WIRTH au deacutebut des anneacutees 70 possegravede des instructions assez claires (si vous comprenez langlais) et favorise une approche meacutethodique et disciplineacutee (on dit structureacutee)

Le PASCAL est un langage compileacute cest agrave dire quil faut

entrer un texte dans lordinateur (agrave laide dun programme appeleacute EDITEUR)

le traduire en langage machine (cest agrave dire en codes binaires compreacutehensibles par lordinateur) cest la compilation et eacuteventuellement leacutedition de liens (LINK)

lexeacutecuter

Contrairement agrave un basic interpreacuteteacute lexeacutecution sera beaucoup plus rapide puisquil ny a plus de traduction agrave effectuer

Bien que le langage soit normaliseacute un certain nombre de points deacutependent de la machine et du compilateur utiliseacute (par exemple comment appeler le compilateur) Ces indications ne seront pas donneacutees ici Si vous avez le choix je vous conseille TURBO PASCAL le plus pratique demploi (en particulier parce quil possegravede son propre eacutediteur de texte)

httpwww-ipstu-strasbgfrpatprogrampascal01htm (2 sur 2)09082003 224029

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

UN PREMIER PETIT PROGRAMME

Un programme PASCAL est composeacute dune entecircte des deacuteclarations et des instructions (deacutelimiteacutees par BEGIN et END )

ex PROGRAM cercle (inputoutput) ( entecircte ) VAR perimetrediametre REAL ( deacuteclarations ) BEGIN readln(diametre) ( instruction ) perimetre = 3141592 diametre ( instruction ) writeln(diametreperimetre) ( instruction ) END

Lentecircte est composeacutee du mot PROGRAM suivi du nom du programme (cercle) et dindications sur les EntreacuteesSorties (ici le clavier et leacutecran)

La partie deacuteclarative de notre programme est limiteacutee agrave la deacuteclaration de deux variables (mot clef VAR) Une variable est une case meacutemoire de lordinateur agrave laquelle on donne ici un nom Chaque case peut contenir une valeur On a preacuteciseacute ici que nos deux variables PERIMETRE et DIAMETRE contiendraient des reacuteels Les types simples connus en PASCAL sont REAL INTEGER (entier naturel) CHAR (contient UN est un seul caractegravere) et BOOLEAN (booleacuteen cad 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 possegravede la variable preacutedeacuteclareacutee MAXINT qui donne le plus grand entier admissible Les reacuteels doivent ecirctre compris en TURBO entre + et -17E37 (cad 17 fois 10 puissance 37) avec 11 chiffres significatifs La virgule deacutecimale est toujours repreacutesenteacutee par un point en informatique

Un identificateur (tout nom que vous choisissez variable programme) peut ecirctre formeacute de lettres (A agrave Z) de chiffres et (pas sur toutes les versions de PASCAL) du signe _ (souligneacute) TURBO PASCAL accepte des noms de 127 caractegraveres maximum certains PASCAL sont plus limiteacutes (31 caractegraveres par ex) Le premier caractegravere doit ecirctre une lettre Par exemple VALEUR1 ou PREM_VALEUR sont possibles mais pas 1ERE_VALEUR En PASCAL les minuscules sont traiteacutees comme des majuscules (SURface et surFACE deacutesignent la mecircme case meacutemoire) Je nutilise les majuscules que pour faire ressortir les mots importants Les accents et autres ccedil ne sont pas autoriseacutes (var diamegravetrereal est interdit agrave cause de laccent) Un blanc dans un identificateur est eacutegalement interdit (utilisez _ pour seacuteparer des mots dans un mecircme identificateur)

Toute variable utiliseacutee dans un programme doit ecirctre deacuteclareacutee Ceci eacutevite la plupart des erreurs de frappe et rend le programme plus compreacutehensible

httpwww-ipstu-strasbgfrpatprogrampascal02htm (1 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

Les instructions de notre programme sont

lecture sur le clavier

le programme sarrecircte attend que lon donne une valeur agrave laide du clavier met cette valeur dans la case DIAMETRE et continue le programme lorsque lon appuie sur la touche ENTREE ou RETURN

calcul et affectation

on multiplie le contenu de la case DIAMETRE par PI et on met le reacutesultat dans la case PERIMETRE

Le = symbolise une flegraveche agrave gauche Ce nest PAS une eacutegaliteacute au sens matheacutematique mais la copie dune valeur dans une meacutemoire

eacutecriture sur leacutecran

on affiche sur leacutecran le contenu des case DIAMETRE (que lon connaissait puisque nous lavions donneacute) et PERIMETRE (qui nous inteacuteresse un peu plus) Ce programme affiche donc deux chiffres Il serait plus parlant dafficher eacutegalement des commentaires par linstruction

writeln(Diamegravetre diametre Peacuterimegravetre perimetre)

Les textes doivent ecirctre entoureacutes de cotes () Les majusculesminuscules sont significatives Pour afficher une apostrophe utiliser deux cotes (lexemple) Pour sauter une ligne utiliser WRITELN seul

Les instructions doivent toujours ecirctre seacutepareacutees par des (jai dit seacutepareacutees pas termineacutees) Le fait de passer agrave la ligne nest interpreacuteteacute par lordinateur que comme un blanc On aurait donc pu eacutecrire notre programme sur une seule ligne (peut-ecirctre un peu longue pour leacutediteur) Le programme doit toujours se terminer par un point

On peut inseacuterer 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 dune ligne ceci permet de supprimer momentaneacutement une partie dun programme

Chaque identificateur est seacutepareacute du suivant par un blanc On considegravere comme un blanc plusieurs blanc un retour agrave la ligne un commentaire

EXERCICE (ex_tva) Faire un programme demandant le prix unitaire HT dun article et sa quantiteacute puis qui affiche le total Hors Taxes le montant de la TVA (pour un taux de 186 ) et le total TTC

httpwww-ipstu-strasbgfrpatprogrampascal02htm (2 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

httpwww-ipstu-strasbgfrpatprogrampascal02htm (3 sur 3)09082003 224030

le Langage PASCAL - CONSTANTES

CONSTANTES

Nous avons deacutejagrave utiliseacute des VARIABLES (on donne un nom agrave une meacutemoire) Mais on peut eacutegalement utiliser des CONSTANTES qui sont des valeurs qui restent fixes tout au long du programme et pour chaque exeacutecution On deacuteclare les constantes avant de deacuteclarer les variables par CONST nom=valeur

ex CONST taux_tva=186

MAXINT (plus grand entier possible) est une constante preacutedeacutefinie

On peut eacutegalement avoir des constantes de type chaicircne de caractegraveres

PROGRAM bonjour(output) on na pas besoin ici du clavier CONST message1=salut ccedila va message2=moi ccedila baigne BEGIN writeln(message1) writeln(message2) ( notez labsence de devant le END ) END

Le type de la constante est deacutetermineacute automatiquement par le compilateur (entier si nombre sans point reacuteel si nombre avec point caractegraveres si entre cotes)

Rq1 on peut toujours utiliser un entier agrave la place dun reacuteel mais pas linverse

Rq2 si on utilise un point deacutecimal il FAUT lencadrer de chiffres (03 et non 3 10 ou 100 et non 10)

httpwww-ipstu-strasbgfrpatprogrampascal03htm09082003 224030

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 8: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - INTRODUCTION

INTRODUCTION

LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

LES LOGICIELS

Dans la majoriteacute des cas on achegravete des programmes (logiciels) tout faits qui correspondent plus ou moins au besoin

Traitement de texte - PAO avec mise en page justification numeacuterotation chapitres-pagestable des matiegraveresdictionnaire

Tableur tableau de nombres agrave 2 dimensions et calculs

Base de donneacutees ensemble de fiches (nom adresse) et recherche par rubrique publipostage

CAO Dessin par ordinateur propre modification aiseacutee archivage

Gestion paye facturation stock

Communication transfert de programmes par modem et ligne teacuteleacutephonique serveur minitel

Un Inteacutegreacute regroupe plusieurs de ces possibiliteacutes

Soit on achegravete un logiciel geacuteneacuteral tregraves bon niveau parfaitement testeacute documentation formation mais trop geacuteneacuteral (fonctions inutiles fonctions utiles avec trop de paramegravetres 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 ecirctre tregraves preacutecis

ORGANISATION DE LORDINATEUR

Multiposte plusieurs consoles sur un mecircme ordinateur (CPU puissant tout est partageable)

Reacuteseau plusieurs CPU et MC non partageable (sauf reacuteseau de multipostes) MdM et peacuteripheacuteriques

httpwww-ipstu-strasbgfrpatprogrampascal01htm (1 sur 2)09082003 224029

le Langage PASCAL - INTRODUCTION

partageables ou locaux

LANGAGES DE PROGRAMMATION

Un ordinateur est une machine becircte ne sachant quobeacuteir et agrave tregraves peu de choses

addition soustraction multiplication en binaire uniquement sur des entiers

sortir un reacutesultat ou lire une valeur binaire (dans une meacutemoire par exemple)

comparer des nombres

Sa puissance vient du fait quil peut ecirctre PROGRAMME cest agrave dire que lon peut lui donner agrave lavance la seacutequence (la suite ordonneacutee) des ordres agrave effectuer lun apregraves lautre Le grand avantage de lordinateur est sa rapiditeacute Par contre cest le programmeur qui doit TOUT faire Lordinateur ne comprennant que des ordres codeacutes en binaire (le langage machine) des langages dits eacutevolueacutes ont eacuteteacute mis au point pour faciliter la programmation

Le PASCAL creacuteeacute par WIRTH au deacutebut des anneacutees 70 possegravede des instructions assez claires (si vous comprenez langlais) et favorise une approche meacutethodique et disciplineacutee (on dit structureacutee)

Le PASCAL est un langage compileacute cest agrave dire quil faut

entrer un texte dans lordinateur (agrave laide dun programme appeleacute EDITEUR)

le traduire en langage machine (cest agrave dire en codes binaires compreacutehensibles par lordinateur) cest la compilation et eacuteventuellement leacutedition de liens (LINK)

lexeacutecuter

Contrairement agrave un basic interpreacuteteacute lexeacutecution sera beaucoup plus rapide puisquil ny a plus de traduction agrave effectuer

Bien que le langage soit normaliseacute un certain nombre de points deacutependent de la machine et du compilateur utiliseacute (par exemple comment appeler le compilateur) Ces indications ne seront pas donneacutees ici Si vous avez le choix je vous conseille TURBO PASCAL le plus pratique demploi (en particulier parce quil possegravede son propre eacutediteur de texte)

httpwww-ipstu-strasbgfrpatprogrampascal01htm (2 sur 2)09082003 224029

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

UN PREMIER PETIT PROGRAMME

Un programme PASCAL est composeacute dune entecircte des deacuteclarations et des instructions (deacutelimiteacutees par BEGIN et END )

ex PROGRAM cercle (inputoutput) ( entecircte ) VAR perimetrediametre REAL ( deacuteclarations ) BEGIN readln(diametre) ( instruction ) perimetre = 3141592 diametre ( instruction ) writeln(diametreperimetre) ( instruction ) END

Lentecircte est composeacutee du mot PROGRAM suivi du nom du programme (cercle) et dindications sur les EntreacuteesSorties (ici le clavier et leacutecran)

La partie deacuteclarative de notre programme est limiteacutee agrave la deacuteclaration de deux variables (mot clef VAR) Une variable est une case meacutemoire de lordinateur agrave laquelle on donne ici un nom Chaque case peut contenir une valeur On a preacuteciseacute ici que nos deux variables PERIMETRE et DIAMETRE contiendraient des reacuteels Les types simples connus en PASCAL sont REAL INTEGER (entier naturel) CHAR (contient UN est un seul caractegravere) et BOOLEAN (booleacuteen cad 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 possegravede la variable preacutedeacuteclareacutee MAXINT qui donne le plus grand entier admissible Les reacuteels doivent ecirctre compris en TURBO entre + et -17E37 (cad 17 fois 10 puissance 37) avec 11 chiffres significatifs La virgule deacutecimale est toujours repreacutesenteacutee par un point en informatique

Un identificateur (tout nom que vous choisissez variable programme) peut ecirctre formeacute de lettres (A agrave Z) de chiffres et (pas sur toutes les versions de PASCAL) du signe _ (souligneacute) TURBO PASCAL accepte des noms de 127 caractegraveres maximum certains PASCAL sont plus limiteacutes (31 caractegraveres par ex) Le premier caractegravere doit ecirctre une lettre Par exemple VALEUR1 ou PREM_VALEUR sont possibles mais pas 1ERE_VALEUR En PASCAL les minuscules sont traiteacutees comme des majuscules (SURface et surFACE deacutesignent la mecircme case meacutemoire) Je nutilise les majuscules que pour faire ressortir les mots importants Les accents et autres ccedil ne sont pas autoriseacutes (var diamegravetrereal est interdit agrave cause de laccent) Un blanc dans un identificateur est eacutegalement interdit (utilisez _ pour seacuteparer des mots dans un mecircme identificateur)

Toute variable utiliseacutee dans un programme doit ecirctre deacuteclareacutee Ceci eacutevite la plupart des erreurs de frappe et rend le programme plus compreacutehensible

httpwww-ipstu-strasbgfrpatprogrampascal02htm (1 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

Les instructions de notre programme sont

lecture sur le clavier

le programme sarrecircte attend que lon donne une valeur agrave laide du clavier met cette valeur dans la case DIAMETRE et continue le programme lorsque lon appuie sur la touche ENTREE ou RETURN

calcul et affectation

on multiplie le contenu de la case DIAMETRE par PI et on met le reacutesultat dans la case PERIMETRE

Le = symbolise une flegraveche agrave gauche Ce nest PAS une eacutegaliteacute au sens matheacutematique mais la copie dune valeur dans une meacutemoire

eacutecriture sur leacutecran

on affiche sur leacutecran le contenu des case DIAMETRE (que lon connaissait puisque nous lavions donneacute) et PERIMETRE (qui nous inteacuteresse un peu plus) Ce programme affiche donc deux chiffres Il serait plus parlant dafficher eacutegalement des commentaires par linstruction

writeln(Diamegravetre diametre Peacuterimegravetre perimetre)

Les textes doivent ecirctre entoureacutes de cotes () Les majusculesminuscules sont significatives Pour afficher une apostrophe utiliser deux cotes (lexemple) Pour sauter une ligne utiliser WRITELN seul

Les instructions doivent toujours ecirctre seacutepareacutees par des (jai dit seacutepareacutees pas termineacutees) Le fait de passer agrave la ligne nest interpreacuteteacute par lordinateur que comme un blanc On aurait donc pu eacutecrire notre programme sur une seule ligne (peut-ecirctre un peu longue pour leacutediteur) Le programme doit toujours se terminer par un point

On peut inseacuterer 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 dune ligne ceci permet de supprimer momentaneacutement une partie dun programme

Chaque identificateur est seacutepareacute du suivant par un blanc On considegravere comme un blanc plusieurs blanc un retour agrave la ligne un commentaire

EXERCICE (ex_tva) Faire un programme demandant le prix unitaire HT dun article et sa quantiteacute puis qui affiche le total Hors Taxes le montant de la TVA (pour un taux de 186 ) et le total TTC

httpwww-ipstu-strasbgfrpatprogrampascal02htm (2 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

httpwww-ipstu-strasbgfrpatprogrampascal02htm (3 sur 3)09082003 224030

le Langage PASCAL - CONSTANTES

CONSTANTES

Nous avons deacutejagrave utiliseacute des VARIABLES (on donne un nom agrave une meacutemoire) Mais on peut eacutegalement utiliser des CONSTANTES qui sont des valeurs qui restent fixes tout au long du programme et pour chaque exeacutecution On deacuteclare les constantes avant de deacuteclarer les variables par CONST nom=valeur

ex CONST taux_tva=186

MAXINT (plus grand entier possible) est une constante preacutedeacutefinie

On peut eacutegalement avoir des constantes de type chaicircne de caractegraveres

PROGRAM bonjour(output) on na pas besoin ici du clavier CONST message1=salut ccedila va message2=moi ccedila baigne BEGIN writeln(message1) writeln(message2) ( notez labsence de devant le END ) END

Le type de la constante est deacutetermineacute automatiquement par le compilateur (entier si nombre sans point reacuteel si nombre avec point caractegraveres si entre cotes)

Rq1 on peut toujours utiliser un entier agrave la place dun reacuteel mais pas linverse

Rq2 si on utilise un point deacutecimal il FAUT lencadrer de chiffres (03 et non 3 10 ou 100 et non 10)

httpwww-ipstu-strasbgfrpatprogrampascal03htm09082003 224030

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 9: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - INTRODUCTION

partageables ou locaux

LANGAGES DE PROGRAMMATION

Un ordinateur est une machine becircte ne sachant quobeacuteir et agrave tregraves peu de choses

addition soustraction multiplication en binaire uniquement sur des entiers

sortir un reacutesultat ou lire une valeur binaire (dans une meacutemoire par exemple)

comparer des nombres

Sa puissance vient du fait quil peut ecirctre PROGRAMME cest agrave dire que lon peut lui donner agrave lavance la seacutequence (la suite ordonneacutee) des ordres agrave effectuer lun apregraves lautre Le grand avantage de lordinateur est sa rapiditeacute Par contre cest le programmeur qui doit TOUT faire Lordinateur ne comprennant que des ordres codeacutes en binaire (le langage machine) des langages dits eacutevolueacutes ont eacuteteacute mis au point pour faciliter la programmation

Le PASCAL creacuteeacute par WIRTH au deacutebut des anneacutees 70 possegravede des instructions assez claires (si vous comprenez langlais) et favorise une approche meacutethodique et disciplineacutee (on dit structureacutee)

Le PASCAL est un langage compileacute cest agrave dire quil faut

entrer un texte dans lordinateur (agrave laide dun programme appeleacute EDITEUR)

le traduire en langage machine (cest agrave dire en codes binaires compreacutehensibles par lordinateur) cest la compilation et eacuteventuellement leacutedition de liens (LINK)

lexeacutecuter

Contrairement agrave un basic interpreacuteteacute lexeacutecution sera beaucoup plus rapide puisquil ny a plus de traduction agrave effectuer

Bien que le langage soit normaliseacute un certain nombre de points deacutependent de la machine et du compilateur utiliseacute (par exemple comment appeler le compilateur) Ces indications ne seront pas donneacutees ici Si vous avez le choix je vous conseille TURBO PASCAL le plus pratique demploi (en particulier parce quil possegravede son propre eacutediteur de texte)

httpwww-ipstu-strasbgfrpatprogrampascal01htm (2 sur 2)09082003 224029

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

UN PREMIER PETIT PROGRAMME

Un programme PASCAL est composeacute dune entecircte des deacuteclarations et des instructions (deacutelimiteacutees par BEGIN et END )

ex PROGRAM cercle (inputoutput) ( entecircte ) VAR perimetrediametre REAL ( deacuteclarations ) BEGIN readln(diametre) ( instruction ) perimetre = 3141592 diametre ( instruction ) writeln(diametreperimetre) ( instruction ) END

Lentecircte est composeacutee du mot PROGRAM suivi du nom du programme (cercle) et dindications sur les EntreacuteesSorties (ici le clavier et leacutecran)

La partie deacuteclarative de notre programme est limiteacutee agrave la deacuteclaration de deux variables (mot clef VAR) Une variable est une case meacutemoire de lordinateur agrave laquelle on donne ici un nom Chaque case peut contenir une valeur On a preacuteciseacute ici que nos deux variables PERIMETRE et DIAMETRE contiendraient des reacuteels Les types simples connus en PASCAL sont REAL INTEGER (entier naturel) CHAR (contient UN est un seul caractegravere) et BOOLEAN (booleacuteen cad 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 possegravede la variable preacutedeacuteclareacutee MAXINT qui donne le plus grand entier admissible Les reacuteels doivent ecirctre compris en TURBO entre + et -17E37 (cad 17 fois 10 puissance 37) avec 11 chiffres significatifs La virgule deacutecimale est toujours repreacutesenteacutee par un point en informatique

Un identificateur (tout nom que vous choisissez variable programme) peut ecirctre formeacute de lettres (A agrave Z) de chiffres et (pas sur toutes les versions de PASCAL) du signe _ (souligneacute) TURBO PASCAL accepte des noms de 127 caractegraveres maximum certains PASCAL sont plus limiteacutes (31 caractegraveres par ex) Le premier caractegravere doit ecirctre une lettre Par exemple VALEUR1 ou PREM_VALEUR sont possibles mais pas 1ERE_VALEUR En PASCAL les minuscules sont traiteacutees comme des majuscules (SURface et surFACE deacutesignent la mecircme case meacutemoire) Je nutilise les majuscules que pour faire ressortir les mots importants Les accents et autres ccedil ne sont pas autoriseacutes (var diamegravetrereal est interdit agrave cause de laccent) Un blanc dans un identificateur est eacutegalement interdit (utilisez _ pour seacuteparer des mots dans un mecircme identificateur)

Toute variable utiliseacutee dans un programme doit ecirctre deacuteclareacutee Ceci eacutevite la plupart des erreurs de frappe et rend le programme plus compreacutehensible

httpwww-ipstu-strasbgfrpatprogrampascal02htm (1 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

Les instructions de notre programme sont

lecture sur le clavier

le programme sarrecircte attend que lon donne une valeur agrave laide du clavier met cette valeur dans la case DIAMETRE et continue le programme lorsque lon appuie sur la touche ENTREE ou RETURN

calcul et affectation

on multiplie le contenu de la case DIAMETRE par PI et on met le reacutesultat dans la case PERIMETRE

Le = symbolise une flegraveche agrave gauche Ce nest PAS une eacutegaliteacute au sens matheacutematique mais la copie dune valeur dans une meacutemoire

eacutecriture sur leacutecran

on affiche sur leacutecran le contenu des case DIAMETRE (que lon connaissait puisque nous lavions donneacute) et PERIMETRE (qui nous inteacuteresse un peu plus) Ce programme affiche donc deux chiffres Il serait plus parlant dafficher eacutegalement des commentaires par linstruction

writeln(Diamegravetre diametre Peacuterimegravetre perimetre)

Les textes doivent ecirctre entoureacutes de cotes () Les majusculesminuscules sont significatives Pour afficher une apostrophe utiliser deux cotes (lexemple) Pour sauter une ligne utiliser WRITELN seul

Les instructions doivent toujours ecirctre seacutepareacutees par des (jai dit seacutepareacutees pas termineacutees) Le fait de passer agrave la ligne nest interpreacuteteacute par lordinateur que comme un blanc On aurait donc pu eacutecrire notre programme sur une seule ligne (peut-ecirctre un peu longue pour leacutediteur) Le programme doit toujours se terminer par un point

On peut inseacuterer 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 dune ligne ceci permet de supprimer momentaneacutement une partie dun programme

Chaque identificateur est seacutepareacute du suivant par un blanc On considegravere comme un blanc plusieurs blanc un retour agrave la ligne un commentaire

EXERCICE (ex_tva) Faire un programme demandant le prix unitaire HT dun article et sa quantiteacute puis qui affiche le total Hors Taxes le montant de la TVA (pour un taux de 186 ) et le total TTC

httpwww-ipstu-strasbgfrpatprogrampascal02htm (2 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

httpwww-ipstu-strasbgfrpatprogrampascal02htm (3 sur 3)09082003 224030

le Langage PASCAL - CONSTANTES

CONSTANTES

Nous avons deacutejagrave utiliseacute des VARIABLES (on donne un nom agrave une meacutemoire) Mais on peut eacutegalement utiliser des CONSTANTES qui sont des valeurs qui restent fixes tout au long du programme et pour chaque exeacutecution On deacuteclare les constantes avant de deacuteclarer les variables par CONST nom=valeur

ex CONST taux_tva=186

MAXINT (plus grand entier possible) est une constante preacutedeacutefinie

On peut eacutegalement avoir des constantes de type chaicircne de caractegraveres

PROGRAM bonjour(output) on na pas besoin ici du clavier CONST message1=salut ccedila va message2=moi ccedila baigne BEGIN writeln(message1) writeln(message2) ( notez labsence de devant le END ) END

Le type de la constante est deacutetermineacute automatiquement par le compilateur (entier si nombre sans point reacuteel si nombre avec point caractegraveres si entre cotes)

Rq1 on peut toujours utiliser un entier agrave la place dun reacuteel mais pas linverse

Rq2 si on utilise un point deacutecimal il FAUT lencadrer de chiffres (03 et non 3 10 ou 100 et non 10)

httpwww-ipstu-strasbgfrpatprogrampascal03htm09082003 224030

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 10: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

UN PREMIER PETIT PROGRAMME

Un programme PASCAL est composeacute dune entecircte des deacuteclarations et des instructions (deacutelimiteacutees par BEGIN et END )

ex PROGRAM cercle (inputoutput) ( entecircte ) VAR perimetrediametre REAL ( deacuteclarations ) BEGIN readln(diametre) ( instruction ) perimetre = 3141592 diametre ( instruction ) writeln(diametreperimetre) ( instruction ) END

Lentecircte est composeacutee du mot PROGRAM suivi du nom du programme (cercle) et dindications sur les EntreacuteesSorties (ici le clavier et leacutecran)

La partie deacuteclarative de notre programme est limiteacutee agrave la deacuteclaration de deux variables (mot clef VAR) Une variable est une case meacutemoire de lordinateur agrave laquelle on donne ici un nom Chaque case peut contenir une valeur On a preacuteciseacute ici que nos deux variables PERIMETRE et DIAMETRE contiendraient des reacuteels Les types simples connus en PASCAL sont REAL INTEGER (entier naturel) CHAR (contient UN est un seul caractegravere) et BOOLEAN (booleacuteen cad 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 possegravede la variable preacutedeacuteclareacutee MAXINT qui donne le plus grand entier admissible Les reacuteels doivent ecirctre compris en TURBO entre + et -17E37 (cad 17 fois 10 puissance 37) avec 11 chiffres significatifs La virgule deacutecimale est toujours repreacutesenteacutee par un point en informatique

Un identificateur (tout nom que vous choisissez variable programme) peut ecirctre formeacute de lettres (A agrave Z) de chiffres et (pas sur toutes les versions de PASCAL) du signe _ (souligneacute) TURBO PASCAL accepte des noms de 127 caractegraveres maximum certains PASCAL sont plus limiteacutes (31 caractegraveres par ex) Le premier caractegravere doit ecirctre une lettre Par exemple VALEUR1 ou PREM_VALEUR sont possibles mais pas 1ERE_VALEUR En PASCAL les minuscules sont traiteacutees comme des majuscules (SURface et surFACE deacutesignent la mecircme case meacutemoire) Je nutilise les majuscules que pour faire ressortir les mots importants Les accents et autres ccedil ne sont pas autoriseacutes (var diamegravetrereal est interdit agrave cause de laccent) Un blanc dans un identificateur est eacutegalement interdit (utilisez _ pour seacuteparer des mots dans un mecircme identificateur)

Toute variable utiliseacutee dans un programme doit ecirctre deacuteclareacutee Ceci eacutevite la plupart des erreurs de frappe et rend le programme plus compreacutehensible

httpwww-ipstu-strasbgfrpatprogrampascal02htm (1 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

Les instructions de notre programme sont

lecture sur le clavier

le programme sarrecircte attend que lon donne une valeur agrave laide du clavier met cette valeur dans la case DIAMETRE et continue le programme lorsque lon appuie sur la touche ENTREE ou RETURN

calcul et affectation

on multiplie le contenu de la case DIAMETRE par PI et on met le reacutesultat dans la case PERIMETRE

Le = symbolise une flegraveche agrave gauche Ce nest PAS une eacutegaliteacute au sens matheacutematique mais la copie dune valeur dans une meacutemoire

eacutecriture sur leacutecran

on affiche sur leacutecran le contenu des case DIAMETRE (que lon connaissait puisque nous lavions donneacute) et PERIMETRE (qui nous inteacuteresse un peu plus) Ce programme affiche donc deux chiffres Il serait plus parlant dafficher eacutegalement des commentaires par linstruction

writeln(Diamegravetre diametre Peacuterimegravetre perimetre)

Les textes doivent ecirctre entoureacutes de cotes () Les majusculesminuscules sont significatives Pour afficher une apostrophe utiliser deux cotes (lexemple) Pour sauter une ligne utiliser WRITELN seul

Les instructions doivent toujours ecirctre seacutepareacutees par des (jai dit seacutepareacutees pas termineacutees) Le fait de passer agrave la ligne nest interpreacuteteacute par lordinateur que comme un blanc On aurait donc pu eacutecrire notre programme sur une seule ligne (peut-ecirctre un peu longue pour leacutediteur) Le programme doit toujours se terminer par un point

On peut inseacuterer 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 dune ligne ceci permet de supprimer momentaneacutement une partie dun programme

Chaque identificateur est seacutepareacute du suivant par un blanc On considegravere comme un blanc plusieurs blanc un retour agrave la ligne un commentaire

EXERCICE (ex_tva) Faire un programme demandant le prix unitaire HT dun article et sa quantiteacute puis qui affiche le total Hors Taxes le montant de la TVA (pour un taux de 186 ) et le total TTC

httpwww-ipstu-strasbgfrpatprogrampascal02htm (2 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

httpwww-ipstu-strasbgfrpatprogrampascal02htm (3 sur 3)09082003 224030

le Langage PASCAL - CONSTANTES

CONSTANTES

Nous avons deacutejagrave utiliseacute des VARIABLES (on donne un nom agrave une meacutemoire) Mais on peut eacutegalement utiliser des CONSTANTES qui sont des valeurs qui restent fixes tout au long du programme et pour chaque exeacutecution On deacuteclare les constantes avant de deacuteclarer les variables par CONST nom=valeur

ex CONST taux_tva=186

MAXINT (plus grand entier possible) est une constante preacutedeacutefinie

On peut eacutegalement avoir des constantes de type chaicircne de caractegraveres

PROGRAM bonjour(output) on na pas besoin ici du clavier CONST message1=salut ccedila va message2=moi ccedila baigne BEGIN writeln(message1) writeln(message2) ( notez labsence de devant le END ) END

Le type de la constante est deacutetermineacute automatiquement par le compilateur (entier si nombre sans point reacuteel si nombre avec point caractegraveres si entre cotes)

Rq1 on peut toujours utiliser un entier agrave la place dun reacuteel mais pas linverse

Rq2 si on utilise un point deacutecimal il FAUT lencadrer de chiffres (03 et non 3 10 ou 100 et non 10)

httpwww-ipstu-strasbgfrpatprogrampascal03htm09082003 224030

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 11: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

Les instructions de notre programme sont

lecture sur le clavier

le programme sarrecircte attend que lon donne une valeur agrave laide du clavier met cette valeur dans la case DIAMETRE et continue le programme lorsque lon appuie sur la touche ENTREE ou RETURN

calcul et affectation

on multiplie le contenu de la case DIAMETRE par PI et on met le reacutesultat dans la case PERIMETRE

Le = symbolise une flegraveche agrave gauche Ce nest PAS une eacutegaliteacute au sens matheacutematique mais la copie dune valeur dans une meacutemoire

eacutecriture sur leacutecran

on affiche sur leacutecran le contenu des case DIAMETRE (que lon connaissait puisque nous lavions donneacute) et PERIMETRE (qui nous inteacuteresse un peu plus) Ce programme affiche donc deux chiffres Il serait plus parlant dafficher eacutegalement des commentaires par linstruction

writeln(Diamegravetre diametre Peacuterimegravetre perimetre)

Les textes doivent ecirctre entoureacutes de cotes () Les majusculesminuscules sont significatives Pour afficher une apostrophe utiliser deux cotes (lexemple) Pour sauter une ligne utiliser WRITELN seul

Les instructions doivent toujours ecirctre seacutepareacutees par des (jai dit seacutepareacutees pas termineacutees) Le fait de passer agrave la ligne nest interpreacuteteacute par lordinateur que comme un blanc On aurait donc pu eacutecrire notre programme sur une seule ligne (peut-ecirctre un peu longue pour leacutediteur) Le programme doit toujours se terminer par un point

On peut inseacuterer 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 dune ligne ceci permet de supprimer momentaneacutement une partie dun programme

Chaque identificateur est seacutepareacute du suivant par un blanc On considegravere comme un blanc plusieurs blanc un retour agrave la ligne un commentaire

EXERCICE (ex_tva) Faire un programme demandant le prix unitaire HT dun article et sa quantiteacute puis qui affiche le total Hors Taxes le montant de la TVA (pour un taux de 186 ) et le total TTC

httpwww-ipstu-strasbgfrpatprogrampascal02htm (2 sur 3)09082003 224030

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

httpwww-ipstu-strasbgfrpatprogrampascal02htm (3 sur 3)09082003 224030

le Langage PASCAL - CONSTANTES

CONSTANTES

Nous avons deacutejagrave utiliseacute des VARIABLES (on donne un nom agrave une meacutemoire) Mais on peut eacutegalement utiliser des CONSTANTES qui sont des valeurs qui restent fixes tout au long du programme et pour chaque exeacutecution On deacuteclare les constantes avant de deacuteclarer les variables par CONST nom=valeur

ex CONST taux_tva=186

MAXINT (plus grand entier possible) est une constante preacutedeacutefinie

On peut eacutegalement avoir des constantes de type chaicircne de caractegraveres

PROGRAM bonjour(output) on na pas besoin ici du clavier CONST message1=salut ccedila va message2=moi ccedila baigne BEGIN writeln(message1) writeln(message2) ( notez labsence de devant le END ) END

Le type de la constante est deacutetermineacute automatiquement par le compilateur (entier si nombre sans point reacuteel si nombre avec point caractegraveres si entre cotes)

Rq1 on peut toujours utiliser un entier agrave la place dun reacuteel mais pas linverse

Rq2 si on utilise un point deacutecimal il FAUT lencadrer de chiffres (03 et non 3 10 ou 100 et non 10)

httpwww-ipstu-strasbgfrpatprogrampascal03htm09082003 224030

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 12: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - UN PREMIER PETIT PROGRAMME

httpwww-ipstu-strasbgfrpatprogrampascal02htm (3 sur 3)09082003 224030

le Langage PASCAL - CONSTANTES

CONSTANTES

Nous avons deacutejagrave utiliseacute des VARIABLES (on donne un nom agrave une meacutemoire) Mais on peut eacutegalement utiliser des CONSTANTES qui sont des valeurs qui restent fixes tout au long du programme et pour chaque exeacutecution On deacuteclare les constantes avant de deacuteclarer les variables par CONST nom=valeur

ex CONST taux_tva=186

MAXINT (plus grand entier possible) est une constante preacutedeacutefinie

On peut eacutegalement avoir des constantes de type chaicircne de caractegraveres

PROGRAM bonjour(output) on na pas besoin ici du clavier CONST message1=salut ccedila va message2=moi ccedila baigne BEGIN writeln(message1) writeln(message2) ( notez labsence de devant le END ) END

Le type de la constante est deacutetermineacute automatiquement par le compilateur (entier si nombre sans point reacuteel si nombre avec point caractegraveres si entre cotes)

Rq1 on peut toujours utiliser un entier agrave la place dun reacuteel mais pas linverse

Rq2 si on utilise un point deacutecimal il FAUT lencadrer de chiffres (03 et non 3 10 ou 100 et non 10)

httpwww-ipstu-strasbgfrpatprogrampascal03htm09082003 224030

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 13: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CONSTANTES

CONSTANTES

Nous avons deacutejagrave utiliseacute des VARIABLES (on donne un nom agrave une meacutemoire) Mais on peut eacutegalement utiliser des CONSTANTES qui sont des valeurs qui restent fixes tout au long du programme et pour chaque exeacutecution On deacuteclare les constantes avant de deacuteclarer les variables par CONST nom=valeur

ex CONST taux_tva=186

MAXINT (plus grand entier possible) est une constante preacutedeacutefinie

On peut eacutegalement avoir des constantes de type chaicircne de caractegraveres

PROGRAM bonjour(output) on na pas besoin ici du clavier CONST message1=salut ccedila va message2=moi ccedila baigne BEGIN writeln(message1) writeln(message2) ( notez labsence de devant le END ) END

Le type de la constante est deacutetermineacute automatiquement par le compilateur (entier si nombre sans point reacuteel si nombre avec point caractegraveres si entre cotes)

Rq1 on peut toujours utiliser un entier agrave la place dun reacuteel mais pas linverse

Rq2 si on utilise un point deacutecimal il FAUT lencadrer de chiffres (03 et non 3 10 ou 100 et non 10)

httpwww-ipstu-strasbgfrpatprogrampascal03htm09082003 224030

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 14: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - INSTRUCTION DAFFECTATION

INSTRUCTION DAFFECTATION

On appelle AFFECTATION la mise dune valeur dans une variable Celle-ci peut ecirctre sous forme directe (A=B) ou sous forme dun calcul (A=BC) Le signe = repreacutesente une flegraveche agrave gauche et signifie mettre la VALEUR agrave droite du = dans la meacutemoire deacutesigneacutee agrave gauche (mettre le contenu de B dans A ou mettre le reacutesultat du calcul (contenu de B) fois (contenu de C) dans A) Une affectation du type BC=A est donc IMPOSSIBLE

Une affectation ne peut se faire quentre une variable et une expression de mecircme type (si A est reacuteel impossible de faire A=xyz) La seule exception est de mettre un entier dans un reacuteel (le 0 est rajouteacute automatiquement) mais linverse est impossible directement Soient I entier et X reacuteel pour mettre X dans I il faut utiliser I=ROUND(X) (arrondi) ou I=TRUNC(X) (partie entiegravere)

On peut eacutegalement utiliser des affectations et expressions booleacuteennes Par exemple en ayant deacuteclareacute

VAR testboolean

abreal

on peut eacutecrire TEST=(AltB)and(Agt0)

httpwww-ipstu-strasbgfrpatprogrampascal04htm09082003 224030

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 15: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

Tous ces types excepteacute les reacuteels sont dits eacutenumeacutereacutes

ENTIERS

deacuteclaration VAR variable1variable2variableN INTEGER

opeacuterations sur entiers + - div (division) mod (reste de la division) Elles sont toutes agrave reacutesultat entier et neacutecessitent deux arguments entiers

Les entiers sont compris entre -MAXINT et +MAXINT qui est une constante standard preacutedeacutefinie (sa valeur deacutepend par contre du compilateur 32767 en TURBO)

REELS

deacuteclaration VAR liste de variables REAL

opeacuterations + -

Quand une opeacuteration comprend un argument reacuteel et un entier le reacutesultat est reacuteel donne toujours un reacutesultat reacuteel mecircme si les deux arguments sont entiers

et sont de prioriteacute supeacuterieure agrave + et - mais entre et tout deacutepend du compilateur (en geacuteneacuteral de gauche agrave droite) En cas dambiguiumlteacute utilisez des parenthegraveses (il ny a aucun inconveacutenient agrave mettre plus de parenthegraveses que neacutecessaire)

Exemples dexpressions numeacuteriques (soit A=3 B=4 C=2)

httpwww-ipstu-strasbgfrpatprogrampascal05htm (1 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 16: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

A+BC = A+(BC) = 5

(A+B)C = 35

ABC = (AB)C (15) dans certains cas A(BC) (0375) dans dautres

ABC = valeur de A sur valeur de la variable de nom BC et non A sur BC

BA-5C = (BA)-(5C) = 2

BOOLEENS

deacuteclaration VAR liste de variables BOOLEAN

Ces variables peuvent prendre soit la valeur TRUE (vrai) soit la valeur FALSE (faux)

opeacuterations booleacuteennes AND OR NOT et (non standard) XOR (ou exclusif) Ces opeacuterations neacutecessitent des arguments booleacuteens

opeacuterations agrave valeur booleacuteenne gt (supeacuterieur) lt (inf) gt= (sup ou eacutegal) lt= = (eacutegal) ltgt (diffeacuterent) Ces opeacuterations comparent tous eacuteleacutements de type simple (les 2 arguments doivent ecirctre de mecircme type sauf entiers et reacuteels qui peuvent ecirctre compareacutes entre eux) et renvoient un booleacuteen Les caractegraveres sont compareacutes suivant lordre du code ASCII

AND (et) OR (ou) NOT (non) sont de prioriteacute supeacuterieure aux preacuteceacutedents et ne peuvent opeacuterer que sur des booleacuteens AgtB et C doit ecirctre eacutecrit (AgtB) and (AgtC) Les parenthegraveses sont obligatoires pour ne pas faire en premier B and A

CARACTERES

deacuteclaration VAR liste de variables CHAR

ces variables contiennent UN caractegravere Ceux-ci sont classeacutes suivant un ordre preacutecis le code ASCII qui suit lordre suivant

- les chiffres 0 agrave 9 par ordre croissant

- les majuscules A agrave Z par ordre alphabeacutetique

- les minuscules a agrave z

Dans le code ASCII chaque caractegravere possible a un numeacutero de code Par exemple A a pour code 65 En deacuteclarant C comme variable caractegravere on peut mettre le signe A dans C par C=A ou C=CHR

httpwww-ipstu-strasbgfrpatprogrampascal05htm (2 sur 3)09082003 224031

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 17: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

(65) Dans le premier cas il faut mettre les cotes pour diffeacuterencier A de la variable A Pour mettre une cote dans C on peut faire C=chr(39) ou C= la 1egravere cote pour dire quil va y avoir un caractegravere les 2 suivantes qui symbolisent la cote (car une seule cote voudrait dire fin du caractegravere) la derniegravere qui signifie fin du caractegravere

httpwww-ipstu-strasbgfrpatprogrampascal05htm (3 sur 3)09082003 224031

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 18: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - LES FONCTIONS STANDARD

LES FONCTIONS STANDARD

On peut utiliser comme une variable des fonctions (qui peuvent soit ecirctre connues par le compilateur soit deacutefinies par vous-mecircme) Une fonction est un module ou routine qui renvoie une valeur au programme Par exemple A=sqrt(BC) met dans A la racine carreacutee de B fois C BC est appeleacute ARGUMENT de la fonction

Les principales fonctions standard connues par tous les compilateurs sont

ABS renvoie la valeur absolue SIN sinus

SQR renvoie le carreacute ARCTAN arc tangente

SQRT racine carreacutee EX exponentielle

COS cosinus LN log neacutepeacuterien

SUCC variable eacutenumeacutereacutee suivante PRED preacuteceacutedent

ROUND arrondi agrave lentier le plus proche

TRUNC partie entiegravere (permet de mettre un reacuteel dans un entier

trunc(45)=4)

Comme toute variable une fonction possegravede un type (entier reacuteel) deacutefini et ne peut donc ecirctre utiliseacutee que comme une variable de ce type

httpwww-ipstu-strasbgfrpatprogrampascal06htm09082003 224031

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 19: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - INSTRUCTION

INSTRUCTION

On appelle instruction simple soit

une affectation

un appel agrave une proceacutedure (une proceacutedure est un ensemble dinstructions regroupeacutees sous un nom par exemple READLN)

une structure de controcircle (voir plus bas)

On appelle instruction composeacutee le regroupement de plusieurs instructions sous la forme

BEGIN instruction1instruction2 instructionN END

On ne met pas de apregraves BEGIN ni avant END (puisque le seacutepare deux instructions) Par contre si linstruction composeacutee est SUIVIE dune autre instruction on mettra un apregraves le END

Rq La lisibiliteacute du programme sera meilleure en mettant une instruction par ligne et en deacutecalant agrave droite les instructions comprises entre un begin et un end

On appelle instruction une instruction soit simple soit composeacutee

httpwww-ipstu-strasbgfrpatprogrampascal07htm09082003 224032

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 20: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - STRUCTURES DE CONTROLE

STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave 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 capaciteacute de lordinateur de reacutepeacuteter rapidement et sans erreur beaucoup de calculs Nous allons donc remeacutedier immeacutediatement agrave cela Chaque structure de controcircle forme une instruction (qui peut donc ecirctre utiliseacutee dans une autre structure de controcircle)

BOUCLE WHILE - DO (tant que - faire)

structure WHILE expression booleacuteenne DO instruction

elle permet de reacutepeacuteter linstruction tant que lexpression (ou la variable) booleacuteenne est vraie

ex PROGRAM racine_a_deux_decimales(inputoutput) VAR nombreracineREAL begin writeln(entrez un reacuteel entre 0 et 10) readln(nombre) racine=0 WHILE racineracine lt nombre DO racine=racine+001 writeln(la racine de nombre vaut agrave peu pregravesracine) END

Il faut noter que si lexpression booleacuteenne est fausse degraves le deacutebut linstruction nest jamais exeacutecuteacutee (ici si NOMBRE=0) Attention Pascal ninitialise pas automatiquement les variables agrave 0 cest agrave dire que sans linstruction RACINE=0 le programme risquerait de donner une reacuteponse fausse (RACINE valant nimporte quoi il sera en geacuteneacuteral tregraves supeacuterieur agrave la racine chercheacutee)

On ne peut reacutepeacuteter quUNE seule instruction Mais celle-ci peut ecirctre simple (comme dans lexemple preacuteceacutedent) ou composeacutee (begin - end)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (1 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 21: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - STRUCTURES DE CONTROLE

EXERCICE (ex_puiss) faire un programme qui affiche les puissances de 2 jusquagrave une valeur maxi donneacutee par lutilisateur (par multiplication successive par 2)

BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que)

structure REPEAT instruction1 instruction2 etc instructionN UNTIL condition

Les N instructions sont reacutepeacuteteacutees jusquagrave ce que la condition soit veacuterifieacutee Mecircme si la condition est vraie degraves le deacutebut elles sont au moins exeacutecuteacutees une fois

ex PROGRAM jeu_simpliste(inputoutput) VAR ainteger begin writeln(entrez le nombre 482) REPEAT readln(a) UNTIL a=482 writeln(cest gentil de mavoir obeacutei) end

Quelle que soit la valeur initiale de A (mecircme 482) la question sera au moins poseacutee une fois (plus si vous deacutesobeacuteissez)

EXERCICE (ex_jeu) Faites un jeu qui demande de trouver le nombre entre 0 et 10 choisi par lordinateur (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 linstruction VALEUR_CHOISIE=RANDOM(11)

BOUCLE FOR - DO (pour - faire)

structure

FOR variable_eacutenumeacutereacutee=valeur_deacutebut TO valeur_fin DO instruction

La variable_eacutenumeacutereacutee (non reacuteelle) prend la valeur_deacutebut et linstruction est exeacutecuteacutee Puis elle est increacutementeacutee (on passe agrave la suivante cad si elle est entiegravere on ajoute 1) et ce jusquagrave valeur_fin (compris)

httpwww-ipstu-strasbgfrpatprogrampascal08htm (2 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 22: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - STRUCTURES DE CONTROLE

Linstruction sera donc exeacutecuteacutee (valeur_fin - valeur_deacutebut + 1) fois Si valeur_ fin est infeacuterieur agrave valeur_deacutebut linstruction nest jamais exeacutecuteacutee Cette forme de boucle est utiliseacutee chaque fois que lon connaicirct le nombre de boucles agrave effectuer

On peut utiliser un pas deacutegressif en remplaccedilant TO par DOWNTO

ex for lettre=Z downto A do writeln(lettre)

eacutecrit lalphabet agrave lenvers(en deacuteclarant LETTRE du type CHAR)

La variable_eacutenumeacutereacutee peut ecirctre utiliseacutee (mais pas modifieacutee) dans linstruction (simple ou composeacutee) Elle est souvent appeleacutee indice de la boucle Sa valeur est perdue degraves que lon sort de la boucle

EXERCICE (ex_moy) Faire un programme qui calcule la moyenne de N nombres N doit ecirctre demandeacute par un READLN (initialiser une variable agrave 0 y ajouter progressivement chaque note puis diviser par N)

INSTRUCTION IF - THEN - ELSE (si - alors - sinon)

structure IF condition THEN instruction1 (CAS 1)

ou IF condition THEN instruction1 ELSE instruction2 (CAS 2)

Si la condition est vraie alors on exeacutecute linstruction1 (simple ou composeacutee) Sinon on passe agrave la suite (cas 1) ou on exeacutecute linstruction2 (cas 2)

Remarquez quil ny a pas de devant le ELSE

EXERCICE (ex_jeu_bis) modifier le jeu preacuteceacutedent (ex_jeu) en aidant le joueur (en preacutecisant si cest plus ou cest moins)

Linstruction2 peut ecirctre composeacutee ou entre autres ecirctre une instruction IF

IF condition1 THEN instruction1 ELSE IF condition2 THEN instruction2 ELSE IF condition3 THEN instruction3 ELSE instructionN

Un ELSE correspond toujours au dernier IF rencontreacute (mais dont on na pas encore utiliseacute le ELSE)

ex IF cond1 then if cond2 then inst1 cond1 et cond2 else inst2 cond1 et pas cond2 else if cond3 then inst3 pas cond1 mais cond3

httpwww-ipstu-strasbgfrpatprogrampascal08htm (3 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 23: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - STRUCTURES DE CONTROLE

else inst4 ni cond1 ni cond3

Si on deacutesire autre chose utiliser BEGIN et END

IF cond1 THEN begin if cond2 then inst1 end ( le prochain ELSE se rapporte agrave COND1 puisquelinstruction (composeacutee) suivant THEN est termineacutee )ELSE inst2

LA STRUCTURE CASE - OF (cas - parmi)

Elle eacutevite dutiliser une trop grande suite de ELSE IF

structure CASE expression OF regardez bien ougrave jai mis les liste_de_cas1instruction1 liste_de_cas2instruction2 liste_de_casNinstructionN END

Linstruction i sera exeacutecuteacutee si lexpression appartient agrave la liste_de_cas i Les autres ne seront pas exeacutecuteacutees (on passe directement au END) Lexpression doit ecirctre de type eacutenumeacutereacute (pas de reacuteels)

En TURBO PASCAL on accepte une liste_de_cas particuliegravere qui est ELSE (et doit ecirctre placeacutee en dernier) pour preacutevoir le cas ougrave expression nappartient agrave aucun des cas citeacutes au dessus En MS-PASCAL on utilise de mecircme OTHERWISE

ex CASE ab OF ( avec a et b deacuteclareacutes entiers ) 0 writeln(un des nombres est nul) 110100100010000 writeln(le produit est une puissance de 10) ( 100000 est impossible en TURBO car supeacuterieur agrave MAXINT) END

Attention certains compilateurs nacceptent pas de passer sur un CASE avec une valeur preacutevue dans aucune liste de cas

EXERCICE (ex_calc) faire un programme simulant une calculatrice 4 opeacuterations en utilisant CASE pour le choix de lopeacuteration agrave effectuer

httpwww-ipstu-strasbgfrpatprogrampascal08htm (4 sur 5)09082003 224033

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 24: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - STRUCTURES DE CONTROLE

httpwww-ipstu-strasbgfrpatprogrampascal08htm (5 sur 5)09082003 224033

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 25: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Sommaire geacuteneacuteral PROGRAMMATION

Sommaire geacuteneacuteral PROGRAMMATION

Vous trouverez ici mes (gros) documents sur la programmation C C++ algorithmique infographie Pascal) ainsi que la possibiliteacute de teacuteleacutecharger les exemples (bien que le copier - coller sous Netscape ou IE marche eacutegalement tregraves bien) mais aussi les corrections des exercices la bibliothegraveque graphique des exemples suppleacutementaires des sujets de TP dexamens

Copyright utilisation de ces documents libre pour tout usage personnel Utilisation autoriseacutee pour tout usage public non commercial agrave condition de citer son auteur (Patrick TRAU IPST Universiteacute Louis Pasteur Strasbourg email PatrickTrau (agrave) ipst-ulpu-strasbgfr ) et de me signaler tout usage intensif Utilisation commerciale interdite sans accord eacutecrit de ma part

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

vous pouvez acceacuteder agrave

Cours sur le C (ANSI) (y compris correction des exercices) qui deacutetaille complegravetement le langage C

Donneacutees et Algorithmes les diffeacuterents algorithmes classiques expliqueacutes compareacutes en fonction des types de donneacutees choisies Chaque algorithme est accompagneacute de sa mise en oeuvre en C

Infographie comment dessiner sur un mateacuteriel (eacutecran imprimante) sur lequel on sait au moins allumer un point Les traceacutes de base (droites courbes) les remplissages et hachurages clipping traceacutes 3D La documentation de la bibliothegraveque graphique teacuteleacutechargeable Les exemples sont en C ANSI Mais tout ceci est theacuteorique je vous propose eacutegalement plusieurs documents expliquant dans la pratique comment faire du graphisme en C dans les OS que je connais (Dos Unix)

sommaire et instructions de teacuteleacutechargement de la disquette daccompagnement concernant les trois documents citeacutes ci-dessus (mais aussi la bibliothegraveque graphique en version Pascal)

le C++ (ce petit document suppose que vous connaissez deacutejagrave le C) Mon Cours de Pascal (cest un document sur lequel jai travailleacute plusieurs anneacutees mais

actuellment je moccupe surtout de C) Cours de Prolog cest une deacutecouverte du langage avec divers exemples Dans le cadre de

cours dintelligence artificielle jai aussi eacutecrit un petit moteur dinfeacuterence (ordre 0 en gcc ou TurboPascal)

Comment inseacuterer un programme de calcul dans une page HTML du C agrave JavaScript Fortran en particulier pour les Licence - Maicirctrise Techno Meacuteca

httpwww-ipstu-strasbgfrpatprogram (1 sur 2)09082003 224035

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 26: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Sommaire geacuteneacuteral PROGRAMMATION

eacutevaluez vous avec mes sujets dexamens (dont certains avec correction) (en particulier en C) Plus speacutecifiquement pour les eacutetudiants dIUP2 agrave lIPST (les autres ont aussi le droit de

regarder) les sujets et correction des TP (9798 en version deacutetailleacutee et ceux de lanneacutee en cours au fur et agrave mesure)

Certains points du C expliqueacutes par les eacutetudiants de DEUG TI

La plupart de ces documents contiennent des frames (eacutecran seacutepareacute en deux parties) Pour revenir agrave

cette page (et quitter les frames) une solution est de cliquer sur le bon (agrave vous de trouver lequel)

Bonne lecture

Pour toute question envoyez moi un mail ou regardez mes FAQ Sil vous plait signalez moi toute erreur

Liens externes Vous cherchez un compilateur gratuit (CPascal) utilisez gcc gpp sous LinuxUnix Sous DOS regardez lABC de la Programmation Olivier Pecheux vous aide agrave deacutemarrer (y compris agrave installer le compilateur freeware DJGPP) si vous cherchez dautres sites sur la programmation il y en a plein Allez par exemple dans la bonne rubrique Yahoo En voici parmi dautres comment ccedila marche (en franccedilais)

Depuis le 2031997 vous ecirctes le egraveme lecteur de cette page

P TRAU ULP-IPST 20397

Vous pouvez ici acceacuteder aux autres informations sur ce serveur normalement ou par carte

httpwww-ipstu-strasbgfrpatprogram (2 sur 2)09082003 224035

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 27: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - Sommaire

le Langage PASCAL - Sommaire

INTRODUCTION LES LOGICIELS ORGANISATION DE LORDINATEUR LANGAGES DE PROGRAMMATION

UN PREMIER PETIT PROGRAMME CONSTANTES INSTRUCTION DAFFECTATION LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES

ENTIERS REELS BOOLEENS CARACTERES

LES FONCTIONS STANDARD INSTRUCTION STRUCTURES DE CONTROLE

BOUCLE WHILE - DO (tant que - faire) BOUCLE REPEAT - UNTIL (reacutepeacuteter - jusquagrave ce que) BOUCLE FOR - DO (pour - faire) INSTRUCTION IF - THEN - ELSE (si - alors - sinon) LA STRUCTURE CASE - OF (cas - parmi)

TYPES ENUMERES NON STANDARDS LES TYPES INTERVALLES TABLEAUX

TABLEAUX UNIDIMENSIONNELS LES CHAINES DE CARACTERES TABLEAUX DE TABLEAUX TABLEAUX COMPACTES

ENREGISTREMENTS DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

PROCEDURES ET FONCTIONS GENERALITES PORTEE DES DECLARATIONS

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (1 sur 2)09082003 224036

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 28: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - Sommaire

ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

LES ENTREES SORTIES SUR LA CONSOLE 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 moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal_chtm (2 sur 2)09082003 224036

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 29: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Patrick TRAUs Home Page

Je suis enseignant dinformatique et dautomatisme agrave lIPST (InstitutProfessionnel des Sciences et Technologies) de lUniversiteacute LouisPasteur de Strasbourg (ULP)Dans cette page vous trouverez mes supports de cours (Langage C composantsdeacutelectronique numeacuterique HTML) des liens classeacuteset commenteacutes des informations sur moi-mecircme ainsi que quelquespetites choses qui me semblent amusantes

Depuis le 121997 vous ecirctes le egraveme lecteur de cette

Patrick TRAUs Home Page

Remarque Comment ai-je fait ce compteur (jai voulu le faire moi-mecircme) Si vous voulez savoir sil passera correctement la valeur 65535 il ne vous reste quagrave demander agrave tous ceux que vous connaissez de visiter ma pageQui a deacutejagrave regardeacute ce serveur

Cette anneacutee agrave Noeumll changez de recette pour votre dinde traditionnelle

Des liens en veux-tu en voilagrave

- Ma (longue) liste de liens commenteacutes(un peu) - Vous cherchez quelque chose Mining Coa deacuteja creuseacute la question (vraiment geacutenial mais en anglais) - la tregraves ceacutelegravebre LDCQCP- toutes les informations de ce serveur sont eacutegalement accessibles par des cartes

httpwww-ipstu-strasbgfrpat (1 sur 4)09082003 224537

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 30: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Patrick TRAUs Home Page

Seacutelection du moiscomment les grands eacutediteurs de logiciels vont imposer un copyright sur le contenu

des textes creacuteeacutes avev leurs logiciels par exemple vos mails Et pour cela vous payerez soit agrave luniteacute soit par forfait Et en

plus ils analyseront tout ce que vous produissez (1984 )

Youpi on peut voir dans Yahoo Internet Life ndeg1 une super photo

Quelques informations personnelles

Moi je veux bien quInternet soit utiliseacute par certains pour se faire de largent (surtout si on les fait participer agrave son financement) Mais Internet devrait aussi permettre de mettre la connaissance agrave disposition de ceux qui deacutesirent lacqueacuterir Cest pour celagrave que je maintiens ce site cest pour celagrave que jai signeacute ce manifeste

Qui suis-je Mes polycopieacutes sur (regardez les je me suis fatigueacute)

Mes cours sur le Langage C le C++ ainsi que lalgorithmique et linfographie un autre sur lautomatisme (On y parle de Boole binaire portes bascules meacutemoires

numeacuterique CAN Grafcet automates) dautres langages Pascal (complet avec exercices et corrections) meacutemo Assembleur

PC (de base) Prolog (deacutecouverte approfondie) JavaScript (plus pour proposer des calculs inteacuteractifs que pour le graphisme) le Fortran

Je me suis eacutegalement fait un petit meacutemento sur le langage HTML ainsi que dautres documents sur Internet

je suis en train de creacuteer une page regroupant des liens permettant dapprendre sur Internet (en se limitant aux domaines traiteacutes agrave lIPST) Pour linstant il ny a pas grand chose dedans mais ccedila va venir (surtout si )

quelques uns de mes sujets dexamens (dont certains avec correction et auto-eacutevaluation) Fin 98 jai preacutesenteacute un bilan de ma mise agrave disposition sur le web de mes supports de cours

lors de la 6egraveme JEM-ULP Vous pouvez voir ce que jy ai dit (et pour ceux qui y eacutetaient les documents preacutesenteacutes)

Ces documents sont soumis aux regravegles du EverythingWare cest agrave dire que sils vous plaisent vous menvoyez ce que vous voullez une carte postale une speacutecialiteacute de votre pays (cliquez ici si vous utilisez Windows 95 ou 98 certifieacute sans virus ni problegraveme jetez le apregraves lavoir exeacutecuteacute)

Cliquez sur licocircne (agrave droite) pour voter pour le site ndeg3464 du TOP Ouaibe (cours en ligne de P TRAU)

httpwww-ipstu-strasbgfrpat (2 sur 4)09082003 224537

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 31: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Patrick TRAUs Home Page

Pour toute remarque (ou si cest une question veacuterifiez avant si je ny ai pas deacutejagrave reacutepondu dans mes FAQ) Vous pouvez aussi lire ou compleacuteter mon livre dor

Informations Importantes

les sujets de la prochaine session dexamens On ma envoyeacute par mail un rapport de problegravemes dinstallation concernant GirlFriend10 (et

les inteacuteractions avec les autres programmes installeacutes et particuliegraverement la mise agrave jour en Wife10 ou ulteacuterieures) Du mal agrave comprendre

Si MS a du mal avec les trains (en anglais dans le texte) peut-ecirctre va til se lancer dans lautomobile (in french) Toujours dans les transports vous pouvez survoler ceci

Derniers potins de lIPST

- Savez-vous qui se promegravene avec une valise qui tient debout sur un coin - Samedi dernier trois eacutetudiants strasbourgeois eacutetaient dans le mecircme compartiment du train pour Paris une eacutetudiante en licence de psycho un eacutetudiant de lENA et un IUP GSI Passeacute Saverne dans lobscuriteacute dun tunnel on entend un bisou puis une eacutenorme claque A la sortie du tunnel lEnarque a la joue droite bien rouge Quont penseacute agrave ce moment lagrave ces trois eacutetudiants - SOS enfants battus - Savez vous ce quon peut en geacuteneacuteral demander agrave un eacutetudiant (minimum bac +2) en formation agrave lULP

Pour reacutepandre une rumeur

Jeu Primeacute du NetSurfer attentif

JLW sont les initiales dun ancien entraineur (jeunes)

- du Racing- de lOM- du Soleil Bischeim- du PSG

Question du jour

Pourquoi les eacutetudiants de lIPST posent-ils toujours sur leur table de nuit

- un verre vide- un verre plein deau

httpwww-ipstu-strasbgfrpat (3 sur 4)09082003 224537

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 32: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Patrick TRAUs Home Page

cliquez ici pour la reacuteponse

Vous cherchez quelquun sur le NET

son nom dans nimporte quel ordre

Vous cherchez quelque chose

Google est mon moteur preacutefeacutereacute En laissant sitewww-ipstu-strasbgfr derriegravere (ou devant) votre demande la recherche sera limiteacutee agrave ce site

Ou testez BigFootou bien Four 11 ou encore IAF

Si vous cherchez des sites francais allez voir ici Ils soccupent mecircme de mon livre dor (et peut-ecirctre bientocirct du votre )

Voici quelques fournisseurs de statistiques daudience (gratuits) (voir les reacutesultats)

Et maintenant voici des gens qui vous proposent (gratuitement) des adresses faciles agrave meacutemoriser

Mon url httppatfrst

je laime bien

celui lagrave

Mon URL httpdrivetopat

I got it for free at httpcometo

pourchanger je vais mettre une pub pour Bill (eh oui certains produitsont un rapport simpliciteacuteefficaciteacute eacutetonnant) Jutilise aussi MSDRAW (101) pour les images

httpwww-ipstu-strasbgfrpat (4 sur 4)09082003 224537

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 33: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

ABC de la Programmation Accueil

Accueil Index du site

A comme Assembleur

B comme Basic (ou comme Balle)

C comme C ou C++

de la comme Linux

Programmation

comme Pascal

Ce site sadresse particuliegraverement aux personnes deacutesireuses de deacutebuter la programmation sur PC (Dos ou Windows) en assembleur en C ou en Pascal ou en C sous Linux

Objet du siteA qui sadresse ce site

La peacutedagogie de lerreurPreacutesentation de la meacutethode dapprentissage

Naviguer sur mon siteOugrave cliquer rapidement la prochaine fois

Choisir entre assembleur basic C ou PascalPanorama des diffeacuterents langages

Copier le site ABC PPour exploiter le site deacuteconnecteacute gratuitement

Mes liens preacutefeacutereacutesPetite pub comme sur les autres sites

Historique du siteLes dates de modification du site

Eacutecrivez-moiComment faire pour meacutecrire

httpwwwvijenet~opecheuxabcpabcpabcphtml (1 sur 2)09082003 224545

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 34: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

ABC de la Programmation Accueil

Les listes pour deacutebutantsA quoi elles servent Comment les utiliser

Mes imagesSocieacuteteacute de limage voici un eacutechantillon des miennes

Accueil Index du site

Copier le site | Mes liens | Historique du site Eacutecrivez-moi | Mes autres sites

httpwwwvijenet~opecheuxabcpabcpabcphtml (2 sur 2)09082003 224545

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 35: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

PASCALissime

| Apprentissage | Turbo Pascal | Sources | Divers | Mises agrave jour | Accueil

gt Apprenez agrave programmer

gt Les pointeurs

gt Exercices et exemples

gt Gestion des interruptions

gt Les variables du BIOS

gt Organisation des disque(tte)s

gt Le TP 701 en franccedilais et gratuit

gt Correction du bug Runtime Error 200

gt Les types de donneacutees

gt Les fichiers

gt Ecrire des programmes auto-modifiants

gt Les formats numeacuteriques

gt Toutes les fonctionsproceacutedures TP

gt Toutes les fonctionsproceacutedures de lunit CRT

gt Optimiser des programmes TP

gt Programmer les polices de caractegravere

gt Les variables ABSOLUTE

gt Les directives de compilation propres

gt SHR et SHL

gt Les modules assembleur

gt Les SWAG

gt 5000 sources disponibles

gt Sources diverses

gt Sources graphiques

gt Mastermind

gt Traductions de pseudo-code en TP

gt Contributions de visiteurs

gt Jeux en mode texte

gt 48 Mo agrave deacutecouvrir

gt Didacticiels

gt Archive du site (5 Mo)

gt Liste des sites FTP Turbo Pascal

gt Liste des forums informatiques

gt Pages perso INRACI

gt Qui est AVC

gt Qui est JMy

httpmembreslycosfrjmy51 (1 sur 3)09082003 224552

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 36: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

PASCALissime

Nous vous souhaitons la bienvenue sur cette page heacutebergeacutee gracieusement par Multimania

Lenvie de creacuteer une page consacreacutee agrave la programmation mest venue en 1996 lorsque je me suis rendu compte de la difficulteacute de trouver sur Internet des sites dalgorithmique aussi bien en anglais quen franccedilais Cest ainsi que jai deacutecideacute de mettre agrave la disposition de tous le cours eacuteleacutementaire de programmation que je donnais depuis une quinzaine danneacutees dans lenseignement secondaire agrave Bruxelles Jai ensuite solliciteacute mes eacutetudiants en informatique pour enrichir cette page mais sans grand succegraves Heureusement jai retrouveacute un de mes anciens eacutetudiants dans un newsgroup et unis par la mecircme envie de partager notre mince savoir nous avons enfin reacuteussi agrave donner une certaine consistance agrave cette page

Noubliez pas que cette page est aussi la vocirctre Envoyez-nous des textes sources (en Pascal) personnels qui meacuteriteraient decirctre placeacutes agrave la disposition de tous

Si vous voulez nous envoyer un commentaire une correction un texte un exercice une ideacutee pour ameacuteliorer la mise en page une suggestion de site une question cliquez AVC ou JMy

Nous espeacuterons vous ecirctre utiles et chaque reacuteaction de votre part est un encouragement

Si le menu napparaicirct pas au bord supeacuterieur de leacutecran cliquez ici

Creacuteation le 08111996 Derniegravere mise agrave jour le 13042001

Informations actualiteacute patches deacutemos seacuteminaires sur Delphi C++Builder JBuilder InterBase Corba VisiBroker et Inprise Application Server

Association dentraide des deacuteveloppeurs francophones Delphi Pascal C++ Java Corba actualiteacute - trucs amp astuces - cours - teacuteleacutechargement - composants - freewares - livres - newsgroups - etc

httpmembreslycosfrjmy51 (2 sur 3)09082003 224552

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 37: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

PASCALissime

Le Centre Officiel de mise agrave jour Borland Delphi C++Builder JBuilder InterBase Les outils compleacutementaires Quickreport Crystal Reports TeeChart AsyncPro InfoPower La Librairie Borland Delphi C++Builder JBuilder Java 2 Corba

Des algorithmes avec traduction en Pascal tri date inversion de matrice Soundex interpolation spline calculs sur des nombres entiers de 200 chiffres

Un site sur la rando

Faites exploser le compteur des collegravegues -)

Un site sur la plongeacutee

httpmembreslycosfrjmy51 (3 sur 3)09082003 224552

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 38: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Point Rencontre Borland Pascal

Accueil

Adresses

Questions Reacuteponse

Ecrire

Consulter

Sites sur la

programmation

Programmes

Livre dOr

Suggestions

Promenades

Bienvenue aux programmeursen Borland Pascal

Deacutebutants comme confirmeacutes

Ce site a pour but de permettre aux programmeurs en borland pascal de se rencontrer Vous pourrez Y poser des questions y apporter vos reacuteponses ou simplement consulter la liste des questionsreacuteponses Inscrire ou chercher des sites relatifs agrave la programmation Proposer des programmes (code source) Faire eacutevoluer ce site par vos suggestions Bref tout ce qui peut aider agrave progresser avec ce langage

Merci pour cette egraveme connexion depuis le 02101997

httpmembersaolcomcbaussaronbcpaschtm09082003 224559

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 39: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Borland

Borlandreg Copyrightcopy 1994-2003 Borland Software Corporation Tous droits reacuteserveacutes Conditions dutilisation Politique de confidentialiteacute

httpwwwborlandfr09082003 224604

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 40: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

FSF | FSF Europe | FSF Inde

GNUs Not Unix

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | Turc ]

Bienvenue sur le serveur web du projet GNU wwwgnuorg Le projet GNU a eacuteteacute lanceacute en 1984 afin de deacutevelopper un systegraveme dexploitation complet semblable agrave Unix et qui soit un logiciel libre le systegraveme GNU (laquo GNU raquo est lacronyme reacutecursif the laquo GNUs Not Unix raquo on le prononce laquo gnou raquo avec un G audible) Des variantes du systegraveme dexploitation GNU baseacutees sur le noyau laquo Linux raquo sont utiliseacutees largement agrave preacutesent bien que ces systegravemes soient communeacutement appeleacutes par le terme laquo Linux raquo ils le seraient plus exactement par laquo GNULinux raquo

Ce que nous offrons Pourquoi nous sommes

lagrave Vers ougrave nous allons

Aidez-nous agrave y arriver Qui nous sommes Ce que les utilisateurs

pensent des logiciels GNU

Reacutepertoire des Logiciels Libres | Agenda | Nos confeacuterenciers

Commander nos produits | Logiciels GNU | Obtenir de laide

Les licences de logiciels | Le coin des deacuteveloppeurs | Les projets GNU

Documentation GNU | Autre documentation libre | Les licences pour la documentation

Brave GNU World | La reconnaissance de GNU | Information pour la presse

Sites-miroirs | Quoi de neuf | Rechercher | Scheacutema du site | Liens | Humour

httpwwwgnuorghomefrhtml (1 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 41: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

Les deacutepecircches de GNU

Nous invitons les scientifiques agrave joindre au plus vite la campagne deacutecriture de lettres pour la Public Library of Science (Bibliothegraveque Scientifique Publique)

Don Marti lance un appel pour nominer Richard M Stallman pour le Comiteacute de Consultation Publique de lOffice des Brevets et des Marques deacuteposeacutees des Eacutetats-Unis dans son essai Patent Reform Now Leacutecheacuteance tombe le 12 April 2001

Le secreacutetaire dEacutetat de lindustrie franccedilais Christian Pierret est entreacute dans lhistoire pour son opposition aux brevets sur les logiciels

Voici un liste des toutes derniegraveres versions des logiciels du projet GNU Nous la mettons agrave jour durant la nuit

Pour dautres nouvelles voyez ce quil y a de neuf agrave linteacuterieur et agrave propos du projet GNU

Information suppleacutementaire

La Fondation pour le Logiciel Libre est une organisation caritative exempteacutee de taxe qui rassemble des fonds pour travailler sur le projet GNU

La philosophie et lhistorique du projet GNU sont preacutesenteacutees dans larticle de Richard M Stallman laquo Le projet GNU raquo ainsi que dans plusieurs autres textes de notre section philosophie

La FLL soutient les liberteacutes de parole de presse et dassociation sur lInternet le droit dutiliser lencryption pour la communication priveacutee ainsi que le droit deacutecrire des logiciels sans lentrave imposeacutee par les monopoles de logiciels

Information de contact

Veuillez envoyez vos questions et commentaires agrave propos de GNU et de la FLL agrave

Free Software Foundation Teacuteleacutephone +1-617-542-594259 Temple Place - Suite 330 Teacuteleacutecopieur +1-617-542-2652Boston MA 02111-1307 USA gnugnuorg

Merci de votre visite Les webmestres GNU

httpwwwgnuorghomefrhtml (2 sur 3)09082003 224608

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 42: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

GNUs Not Unix - Le projet GNU et la Fondation pour le Logiciel Libre (FLLFSF)

webmasterswwwgnuorg

[ Allemand | Anglais | Catalan | Chinois | Coreacuteen | Danois | Espagnol | Franccedilais | Hongrois | Italien | Japonais | Neacuteerlandais | Portugais | Sueacutedois | 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 inteacutegrale de cet article est permise sur nimporte quel support darchivage pourvu que cette notice est preacuteserveacutee

Derniegravere mise-agrave-jour Last modified Wed Feb 12 130542 CET 2003

httpwwwgnuorghomefrhtml (3 sur 3)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 43: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

TYPES ENUMERES NON STANDARDS

Si les types preacutedeacutefinis mentionneacutes preacuteceacutedement ne vous suffisent pas vous pouvez deacuteclarer (donc creacuteer) dautres types Il faut dabord deacutefinir le type que vous deacutesirez creacuteer en donnant la liste ordonneacutee de toutes les valeurs possibles

exemple

TYPE tjour=(lundimardimercredijeudivendredisamedidimanche)

Toutes le variables de ce type ne pourront pas avoir dautres valeurs que celles que lon a eacutenumeacutereacutees

Il faut ensuite deacuteclarer quelles variables seront de ce type

ex VAR jour1jour2tjour

On peut alors les utiliser dans le programme gracircce agrave

des affectations JOUR1=mercredi

JOUR2=JOUR1

des fonctions preacutedeacutefinies PRED (preacuteceacutedent) SUCC (suivant) ORD (numeacutero dordre (dans la deacuteclaration) entre 0 et N-1)

ex pred(mardi)=lundi

succ(mardi)=mercredi

ord(mardi)=1

des comparaisons lundiltmercredi mais attention dimanchegtlundi (suivant lordre donneacute dans la deacuteclaration)

des boucles FOR jour1=lundi TO vendredi DO

des seacutelections de cas CASE jour2 OF

lundi

httpwww-ipstu-strasbgfrpatprogrampascal09htm (1 sur 2)09082003 224608

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 44: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - TYPES ENUMERES NON STANDARDS

samedidimanche

END

Rq1 les types entiers booleacuteens caractegraveres sont des types eacutenumeacutereacutes preacutedeacutefinis Toutes ces possibiliteacutes sy appliquent donc (succ(10)=11 ord(A)=65) Par contre les reacuteels ne sont pas eacutenumeacutereacutes (on ne peut pas deacutefinir de successeur) et ni CASE ni FOR ne peuvent sy appliquer

Rq2 READLN et WRITELN ne fonctionnent pas en standard pour les types deacutefinis par lutilisateur mais plusieurs compilateurs lacceptent (pas TURBO)

httpwww-ipstu-strasbgfrpatprogrampascal09htm (2 sur 2)09082003 224608

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 45: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - LES TYPES INTERVALLES

LES TYPES INTERVALLES

On peut eacutegalement deacutefinir un type eacutenumeacutereacute comme sous-ensemble dun autre type eacutenumeacutereacute en en donnant les bornes En voici quelques exemples

TYPE jourtravail=lundivendredi si on a deacutejagrave deacutefini tjour

mois=112 sous-ensemble du type INTEGER

byte=0255 preacutedeacutefini en TURBO prend 1 octet en meacutemoire

minuscules=az

Ces variables sutilisent 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 meacutemoire

httpwww-ipstu-strasbgfrpatprogrampascal10htm09082003 224609

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 46: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

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 coordonneacutees dun mecircme vecteur) On utilise pour cela les TABLEAUX La maniegravere la plus simple des les deacutefinir est

VAR nom_tableau ARRAY [type_index] OF type_composantes

ex CONST dimension=3

VAR vecteur1vecteur2 ARRAY [1dimension] OF REAL

On peut utiliser le tableau complet (vecteur1=vecteur2) pour laffectation uniquement (vecteur1+vecteur2 est impossible directement) Mais on peut eacutegalement acceacuteder aux diffeacuterentes composantes par un index (si vecteur1 est le vecteur unitaire porteacute par Y alors VECTEUR1[1]=0 VECTEUR1[2]=1 VECTEUR1[3]=0 )

lindex peut ecirctre variable

PROGRAM heures(inputoutput) TYPE tj=(lundimardimercredijeudivendredisamedidimanche) VAR jourtj nb_heures_coursARRAY[tj] OF integer begin il faudrait ici entrer les nombres dheures de cours par jour FOR jour=lundi TO samedi DO writeln(nb_heures_cours[jour]) end

On peut eacutegalement deacutefinir un TYPE tableau par exemple

httpwww-ipstu-strasbgfrpatprogrampascal11htm (1 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 47: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - TABLEAUX

TYPE typheures=ARRAY[tj] OF integerVAR nb_heures_courstypheures

EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres calcule et affiche la moyenne puis leacutecart entre chaque note et cette moyenne

EXERCICE (rotb) Ecrire le programme qui lit une liste de N nombres la deacutecale dun cran vers le haut (le 1er doit se retrouver en dernier) laffiche puis la deacutecale vers le bas

EXERCICE (clasc) Classer automatiquement une liste de n entiers par ordre croissant puis deacutecroissant

LES CHAINES DE CARACTERES

On appelle chaicircne de caractegraveres une suite de caractegraveres regroupeacutes dans une seule variable En PASCAL standard il faut la deacuteclarer comme ARRAY[1nbcar] OF CHAR Les tests sont possibles entre chaines (test suivant lordre ASCII du 1er caractegravere puis automatiquement du 2egraveme etc)

ex aazltaba aa ltaaa ZZZltaaa (majuscules)

On peut eacutegalement utiliser ces tableaux dans READLN et WRITELN

Mais en geacuteneacuteral les compilateurs possegravedent des types plus puissants associeacutes agrave des fonctions et proceacutedures non standard En Turbo on deacuteclare une chaicircne par STRING[nbcar] Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaicircne (infeacuterieure ou eacutegale agrave la dimension deacuteclareacutee)

EXERCICE (str) Ecrire un programme qui deacutetermine le nombre et les positions dune chaicircne 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 mecircme des tableaux de composantes (exemple matrice 5 lignes 10 colonnes)

TYPE ligne=array[110] of real mat=array[15] of ligne

leacutecriture TYPE mat=array[15] of array[110] of real

ou mecircme TYPE mat=array[15110] of real

httpwww-ipstu-strasbgfrpatprogrampascal11htm (2 sur 3)09082003 224609

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 48: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - TABLEAUX

sont strictement eacutequivalentes (sauf si la deacutefinition du type ligne est neacutecessaire pour dautres variables)

soit la deacuteclaration

VAR m1m2mat ijinteger

on peut eacutecrire

m1[ij]=10 affectation de la valeur 10 en ligne i colonne j m1[i]=m1[i+1] copie complegravete de la ligne i+1 sur la ligne i m2=m1 copie de la matrice complegravete

mais il est impossible dacceacuteder directement agrave une colonne

RAPPEL READLN et WRITELN ne sappliquent qua des variables simples preacutedeacutefinies (cad les composantes si celles-ci sont reacuteelles entiegraveres chaicircnes ou booleacuteennes)

EXERCICE (mat) faire le calcul de multiplication dune matrice (M lignes L col) par (L lignes N col) (reacutesultat M lignes N col)

TABLEAUX COMPACTES

On peut en PASCAL standard deacutefinir des tableaux en PACKED ARRAY Ils sutilisent de la mecircme maniegravere que des tableaux normaux mais prennent moins de place en meacutemoire Sur certains ordinateurs ceci se paie par un ralentissement du programme dans certaines applications En TURBO ce nest pas le cas et elles sont donc automatiquement toutes compacteacutees (inutile de le preacuteciser)

Ex VAR truc PACKED ARRAY [110] OF typtruc

On possegravede en standard les proceacutedures de transfert

PACK(table_non_packeacutee index_deacutebut table_packeacutee_resultat)

UNPACK(table_packeacutee table_non_packeacutee_resultat index_deacutebut)

pour transfeacuterer toute la table mettre index_deacutebut agrave 1

httpwww-ipstu-strasbgfrpatprogrampascal11htm (3 sur 3)09082003 224609

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 49: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - ENREGISTREMENTS

ENREGISTREMENTS

DECLARATION UTILISATION DES ENREGISTREMENTS LA STRUCTURE WITH - DO (avec - faire) ENREGISTREMENTS AVEC VARIANTES

Dans un tableau tous les constituants doivent ecirctre semblables Ce nest pas le cas des enregistrements qui sont des variables composeacutees de plusieurs variables (ou CHAMPS) de types diffeacuterents

DECLARATION

structure dune deacuteclaration denregistrement

VAR nom_variable RECORD champ1type champ2type END

ou

TYPE nom_type = RECORD champ1type champ2type END

ex TYPE date = RECORD jour131 mois112 an19801999 END facture = RECORD referenceinteger jourdate enregistrement denregistrement clientstring[100] total_HTreal END VAR date1date2date comptesarray[1100] of facture factfacture

Dans un enregistrement chaque champ doit avoir un nom diffeacuterent Mais pour des enregistrements

httpwww-ipstu-strasbgfrpatprogrampascal12htm (1 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 50: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - ENREGISTREMENTS

diffeacuterents on peut reacuteutiliser le mecircme nom de champ (ici JOUR)

UTILISATION DES ENREGISTREMENTS

Comme laffectation fonctionne toujours pour des variables de mecircme type on peut eacutecrire DATE1=DATE2

On accegravede agrave une composante par NOM_VARIABLE NOM_CHAMP

writeln(reacutefeacuterence de la facture ) readln(factreference) writeln(mois de la facture ) readln(factjourmois) writeln(jour de la facture ) readln(factjourjour) for i= 1 to nb_fact do writeln(comptes[i]prix)

Une composante denregistrement sutilise comme une variable du mecircme type (avec les mecircmes possibiliteacutes mais aussi les mecircmes limitations)

LA STRUCTURE WITH - DO (avec - faire)

structure WITH nom_enregistrement DO instruction

Elle permet domettre le nom_enregistrement dans linstruction

ex FOR I=1 TO nb_fact DO WITH comptes[i] DO begin reference=i ( cad comptes[i]reference ) writeln(nom du client de la facture ndegi ) readln(client) END

Dans un WITH on peut eacutevidement acceacuteder agrave dautres enregis-trements il suffit de preacuteciser le nom_enregistrementchamp Si lon utilise des WITH imbriqueacutes en cas dambiguiumlteacute des noms de champs on se reacutefegravere au WITH le plus proche (inteacuterieur)

ex WITH fact DO begin WITH date1 DO begin mois=12 date1mois reference=1 factreference car date1reference nexiste pas

httpwww-ipstu-strasbgfrpatprogrampascal12htm (2 sur 3)09082003 224610

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 51: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - ENREGISTREMENTS

jour=15 date1jour car WITH DATE1 le plus agrave linteacuterieur factjour=date2 factjour puisquon le preacutecise end end

ENREGISTREMENTS AVEC VARIANTES

Certains champs dun enregistrement peuvent ecirctre diffeacuterents suivant la valeur dun des champs en utilisant la structure CASE OF dans la deacuteclaration de lenregistrement

ex TYPE statut=(celibatairemariedivorceveuf) perso=RECORD nomstring[20] CASE situationstatut OF celibataire() marie(enfants010) divorceveuf(enfants010remarieboolean) END

Il ne peut y avoir quun CASE par enregistrement Celui-ci doit se placer en dernier apregraves les champs commun (si il y en a) Mais dans ce CASE on peut avoir UN autre CASE imbriqueacute (etc)

Les cas ougrave il ny a pas de champ variant doivent ecirctre preacuteciseacutes (ici celibataire) Le champ discriminant (situation) sutilise comme un autre champ commun

exemples dinstructions possibles (x deacuteclareacute comme perso)

xsituation=marie if xsituation=veuf then writeln(xenfants)

EXERCICE (tel) A laide dun tableau de personnes (nom preacutenom numeacutero dans la rue rue deacutepartement ville numeacutero de teacuteleacutephone) faire un programme de recherche automatique de toutes les informations sur les personnes reacutepondant agrave une valeur dune rubrique donneacutee (tous les PATRICK tous ceux de Saverne etc)

httpwww-ipstu-strasbgfrpatprogrampascal12htm (3 sur 3)09082003 224610

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 52: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - PROCEDURES ET FONCTIONS

PROCEDURES ET FONCTIONS

GENERALITES PORTEE DES DECLARATIONS ARGUMENTS (OU PARAMETRES) LES FONCTIONS RECURSIVITE

Nous avons deacutejagrave vu un certain nombre de proceacutedures (ex WRITELN) et fonctions (SQRT SIN) preacutedeacutefinies par le compilateur Mais si lon en deacutesire dautres il suffit de les deacutefinir

GENERALITES

On peut regrouper un ensemble dinstructions sous un mecircme nom On forme alors un sous-programme ou proceacutedure On utilise les proceacutedures

chaque fois quune mecircme suite dinstructions doit ecirctre reacutepeacuteteacutee plusieurs fois dans un programme

quand une suite dinstruction forme une action globale Le programme est alors plus clair et les erreurs plus facilement deacutetectables

Pour pouvoir utiliser une proceacutedure il faut dabord la deacuteclarer La deacuteclaration des proceacutedures et fonctions se fait apregraves toutes les autres deacuteclarations

structure dune entiteacute de programme (routine)

entecircte deacuteclaration des labels pour les GOTO deacuteconseilleacute constantes types variablesdeacutefinition des sous-routines sous-programmesBEGIN instructionsEND

httpwww-ipstu-strasbgfrpatprogrampascal13htm (1 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 53: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - PROCEDURES ET FONCTIONS

le programme principal comme les proceacutedures et les fonctions ont toujours cette structure Lentecircte est composeacutee dun mot clef (PROGRAM PROCEDURE ou FUNCTION) suivi de lidentificateur (nom) de la routine et de la liste des arguments entre parenthegraveses Les arguments forment la liaison avec lexteacuterieur de la routine (clavier eacutecran et eacuteventuellement fichiers pour le programme)

PROGRAM remplir (output) entecircte du prog principal

var iinteger deacuteclarations prog princ

dont deacuteclaration LIGNE

PROCEDURE ligne(ninteger) entecircte de la proceacutedure

var jinteger deacuteclarations proceacutedure

BEGIN corps de la proceacutedure

for j=1 to n do write()

writeln

END

BEGIN instructions du prog princ

for i=1 to 25 do ligne(70)

END

la proceacutedure LIGNE eacutecrit N caractegraveres sur une mecircme ligne Le programme remplit donc leacutecran (25 lignes 70 colonnes) deacutetoiles

On peut appeler une proceacutedure deacuteclareacutee dans une routine nimporte ougrave dans cette routine en indiquant simplement son nom comme si ceacutetait une instruction A lappel dune proceacutedure le programme interrompt son deacuteroulement normal exeacutecute les instructions de la proceacutedure puis retourne au programme appelant et exeacutecute linstruction suivante Tout ce passe donc comme si le nom de la proceacutedure eacutetait remplaceacute dans le programme par les instructions de la proceacutedure (avec n=70)

PORTEE DES DECLARATIONS

Celle-ci est symboliseacutee dans lexemple ci-dessus par deux cadres la variable I et la proceacutedure LIGNE (avec un argument entier) sont deacuteclareacutees dans REMPLIR et donc connues dans tout le programme (rectangle exteacuterieur) Par contre N et J sont deacuteclareacutes dans LIGNE et ne sont connus (et utilisables) que dans le rectangle inteacuterieur

En dautres termes

Une variable est LOCALE pour une proceacutedure X si elle est deacuteclareacutee dans X Elle nexiste que dans X (et dans les proceacutedures deacuteclareacutees agrave linteacuterieur de X) La routine qui comporte la proceacutedure X ne

httpwww-ipstu-strasbgfrpatprogrampascal13htm (2 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 54: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - PROCEDURES ET FONCTIONS

peut donc pas acceacuteder agrave cette variable locale

Une variable est GLOBALE pour une proceacutedure X si elle est deacuteclareacutee dans une routine ENGLOBANT la proceacutedure X Elle peut ecirctre utiliseacutee dans la proceacutedure La modifier la modifie eacutegalement dans le routine appelante (englobante)

Si lon avait deacuteclareacute une variable I dans la proceacutedure LIGNE (au lieu de N ou J) celle-ci aurait eacuteteacute locale agrave la proceacutedure cest agrave dire que dans le programme principal I deacutesigne une autre case meacutemoire que dans la proceacutedure Modifier la variable locale I ne modifie pas la variable globale I (momentaneacutement inaccessible)

Rq Ceci sapplique agrave toutes les deacuteclarations En particulier une proceacutedure deacuteclareacutee localement agrave linteacuterieur dune proceacutedure est indeacutefinie agrave lexteacuterieur

ARGUMENTS (OU PARAMETRES)

Les eacutechanges dinformations entre une routine appelant une sous-routine peuvent se faire par lintermeacutediaire des variables globales Mais il est beaucoup plus inteacuteressant dutiliser les PARAMETRES

Ex PROGRAM machin (inputoutput) VAR abcdreal PROCEDURE aff_somme(xyreal) var zreal begin z=x+y writeln(x + y = z) end BEGIN programme principal writeln(entrez 4 valeurs ) readln(abcd) aff_somme(ab) aff_somme(35) aff_somme(c+ad) END

En appelant AFF_SOMME(AB) la proceacutedure prend pour X la valeur de A et pour Y la valeur de B On dit que les arguments sont passeacutes par valeur Mais si la proceacutedure modifiait X ou Y A et B ne seraient pas modifieacutes dans le programme appelant Pour reacutepercuter les modifications des arguments il faut les deacuteclarer comme variables (ils sont alors dits passeacutes par adresse)

ex procedure echange(VAR xyreal) var zreal begin z=x x=y y=z

httpwww-ipstu-strasbgfrpatprogrampascal13htm (3 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 55: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - PROCEDURES ET FONCTIONS

end cette proceacutedure eacutechange les contenus des 2arguments

LES FONCTIONS

Tout ce qui a eacuteteacute dit pour les proceacutedures sapplique eacutegalement aux fonctions La diffeacuterence avec une proceacutedure est quune fonction renvoie un reacutesultat Lentecircte est du type

FUNCTION nom_fonction (liste_parametres)type_de_la_fonction

la liste des paramegravetres (en geacuteneacuteral passeacutes par valeur) est de la mecircme forme que pour une proceacutedure le type de la fonction eacutetant le type du reacutesultat retourneacute On retourne le reacutesultat par

NOM_FONCTION = Cette affectation ne peut se faire quune seule fois par appel agrave la fonction

ex program classer(inputoutput) var abcreal function MAX(xyreal)real begin if xgt=y then MAX=x else MAX=y end begin writeln(entrez deux valeurs ) readln(ab) c=max(ab) writeln(le plus grand est c) end

La fonction MAX a 2 paramegravetres reacuteels (X et Y) et renvoie un reacuteel

RECURSIVITE

Cest ainsi que lon appelle le fait quune routine puisse sappeler elle-mecircme

ex function factorielle(ninteger)integer begin if nlt=1 then factorielle=1 else factorielle=nfactorielle(n-1) end

Par exemple en appelant factorielle(3) on calcule 3factorielle(2) Or factorielle(2)=2factorielle(1) qui lui vaut 1 Donc factorielle(3)=3(21) (ce qui me parait juste) Faites un petit dessin agrave chaque appel on recreacutee de nouvelles variables locales donc on obtient 3 cases N distinctes valant 3 2 et 1 on les supprime petit agrave petit en passant sur le END

httpwww-ipstu-strasbgfrpatprogrampascal13htm (4 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 56: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - PROCEDURES ET FONCTIONS

Rq Il faut toujours veacuterifier quen 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 neacutegative ou nulle

Une proceacutedure devant toujours ecirctre deacuteclareacutee pour pouvoir ecirctre utiliseacutee on utilise FORWARD pour les cas de reacutecursiviteacute passant par 2 proceacutedures

function prem(abreal)boolean FORWARDdeacuteclaration anticipeacutee de lentecircte procedure deux(xyreal)var boolbooleanbegin bool=prem(xy) on peut utiliser PREM car deacutejagrave deacuteclareacutee endfunction prem ne plus donner les arguments car deacutejagrave deacuteclareacutesbegin if pas_fini then deux(ab) ( DEUX deacutejagravedeacuteclareacutee) end

EXERCICE (rec) eacutecrire le programme qui calcule le deacuteterminant dune matrice carreacutee NxN sachant que celui-ci vaut

n

DETn = (-1)i+1 M[i1]DETn-1 i=1

ougrave M[i1] est leacuteleacutement de la matrice (ligne i 1egravere colonne)DETn-1 est le deacuteterminant de la sous-matrice dordre n-1 obtenu en ocirctant la ligne i et la 1egravere colonne

Le deacuteterminant dune matrice 1x1 est son seul eacuteleacutement

On utilisera bien eacutevidement une fonction reacutecursive et lon seacuteparera le calcul de sous-matrice dans une proceacutedure

Rq Il existe des meacutethodes numeacuteriques permettant dacceacuteder au reacutesultat beaucoup plus rapidement que par cette meacutethode

httpwww-ipstu-strasbgfrpatprogrampascal13htm (5 sur 6)09082003 224611

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 57: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - PROCEDURES ET FONCTIONS

httpwww-ipstu-strasbgfrpatprogrampascal13htm (6 sur 6)09082003 224611

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 58: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - LES ENTREES SORTIES

LES ENTREES SORTIES

SUR LA CONSOLE LES FICHIERS DE TEXTE EXTENSIONS NON STANDARD

ACCES DIRECT IMPRIMANTE AUTRES

SUR LA CONSOLE

La proceacutedure WRITELN permet dafficher des reacutesultats sur leacutecran Les diffeacuterents arguments sont afficheacutes les uns apregraves les autres sur la mecircme ligne Le curseur est ensuite automatiquement mis en deacutebut de ligne suivante Pour eacuteviter ceci on peut utiliser WRITE qui sutilise comme WRITELN mais le curseur est laisseacute derriegravere le dernier caractegravere De mecircme READ fonctionne comme READLN excepteacute le curseur qui reste sur la ligne

WRITE et WRITELN acceptent le formatage on peut imposer le nombre de caractegraveres utiliseacutes pour chaque variable Soit I entier R reacuteel

WRITE(I5 R72) eacutecrira I sur 5 caractegraveres et R sur 7 caractegraveres dont 2 apregraves 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 ignoreacute

SUR FICHIER

Un fichier est un ensemble de donneacutees eacutecrites sur un support lisible par lordinateur (disquette cartes perforeacutees) et regroupeacutees sous un nom Un fichier peut contenir des caractegraveres (fichier de textes) des programmes des valeurs (fichier de donneacutees)

Etudions lexemple suivant

program recopier(inputoutput) var fic_entfic_sor file of real xreal begin assign(fic_entfichier1) ( non standard )

httpwww-ipstu-strasbgfrpatprogrampascal14htm (1 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 59: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - LES ENTREES SORTIES

reset(fic_ent) assign(fic_sorfichier2) ( non standard ) rewrite(fic_sor) while not eof(fic_ent) do begin read(fic_entx) write(fic_sorx) end close(fic_ent) close(fic_sor) end

On deacuteclare les fichiers par

VAR nomfic FILE OF type_du_contenu

Un fichier peut contenir des eacuteleacutements de nimporte quel type (aussi compliqueacute soit-il mecircme tableaux) mais tous les enregistrements du fichier doivent ecirctre du mecircme type

Avant dutiliser le fichier il faut relier son identificateur au nom effectif du fichier par ASSIGN Ici FIC_ENT correspondra agrave un fichier qui aura pour nom FICHIER1 sur la disquette ASSIGN nest pas une fonction standard dautres compilateurs utilisent OPEN

Puis il faut preacuteciser si lon va eacutecrire ou lire sur le fichier par RESET ou REWRITE Ceci positionne en deacutebut du fichier

On eacutecrit dans le fichier par WRITE(nomficliste_des_variables) Idem pour READ

Il ne faut pas oublier de fermer le fichier (close) quand on nen a plus besoin CLOSE est neacutecessaire eacutegalement si lon veut refaire un nouvel ASSIGN sur le mecircme fichier

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File)

Rq Lors de la deacutefinition initiale du Pascal on devait ouvrir les fichiers avant dappeler le programme Les fichiers eacutetaient des variables globales deacuteclareacutees en arguments du programme (et donc passeacutes du systegraveme dexploitation au programme) Nous les deacuteclarons maintenant DANS le programme les deux seuls fichiers donneacutes en paramegravetres du programme restant INPUT et OUTPUT

LES FICHIERS DE TEXTE

Le principal problegraveme des fichiers preacuteceacutedents est que tous les enregistrements sont du mecircme type De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme eacutecrit dans un autre langage On y remeacutedie par les fichiers texte (aussi appeleacutes fichiers formateacutes) deacuteclareacutes par

httpwww-ipstu-strasbgfrpatprogrampascal14htm (2 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 60: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - LES ENTREES SORTIES

VAR nomficTEXT

Ce sont des fichiers de caractegraveres et se comportent comme leacutecran ou le clavier (qui sont dailleurs les fichiers text INPUT et OUTPUT utiliseacutes automatiquement si on ne preacutecise pas de nomfic dans les READltlngt et WRITEltlngt ) On a aussi les mecircmes limitations (eacutecriture dentiers reacuteels et chaicircnes de caractegraveres seulement)

ex program lire(inputoutputfic) type chaine=array[180]of char var fictext lignechaine begin assign(fictexte) rewrite(fic) writeln(tapez votre texte il sera enregistreacute dans le fichier TEXTE ) writeln(tapez FIN pour arrecircter) repeat readln(ligne) writeln(ficligne) until ligne=FIN close(fic) end

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la proceacutedure SEEK(nomficposition) qui permet de se positionner nimporte ougrave dans le fichier (sans ecirctre obligeacute de lire dans lordre tous les eacuteleacutements) Ceci nest eacutevidement possible que si la taille des eacuteleacutements est constante donc pour tous les fichiers excepteacutes ceux du type TEXT puisque les lignes ny sont pas de longueur constante Laccegraves agrave une information est donc beaucoup plus rapide (agrave condition de connaicirctre sa position) On appelle ceci lACCES DIRECT agrave un fichier par opposition agrave l ACCES SEQUENTIEL preacutevu en standard

SEEK est dautant plus utile que RESET autorise la lecture et leacutecriture des fichiers agrave accegraves direct (REWRITE par contre efface tout le contenu du fichier on ne peut donc plus queacutecrire)

IMPRIMANTE

Pour acceacuteder agrave limprimante deux solutions

ouvrir un fichier TEXT sur disque le remplir et lorsque le programme est termineacute le copier (par le DOS) sur imprimante

httpwww-ipstu-strasbgfrpatprogrampascal14htm (3 sur 4)09082003 224612

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 61: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - LES ENTREES SORTIES

utiliser un nom de fichier preacutedeacutefini correspondant agrave limprimante En Turbo cest LST ex writeln(lst COUCOU) LST na pas besoin decirctre ouvert en TURBO (tout comme OUTPUT)

AUTRES

Turbo Pascal permet beaucoup dautres opeacuterations sur les fichiers (Delete Rename Path) qui ne sont pas standard Si vous les utilisez rappelez vous quelles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systegraveme dexploitation (Unix par ex)

EXERCICE (fichier) Ecrire la proceacutedure qui lit le fichier annuaire afin de rendre opeacuterationnel lexercice tel Modifier ce programme pour permettre lentreacutee et la modification du fichier annuaire

httpwww-ipstu-strasbgfrpatprogrampascal14htm (4 sur 4)09082003 224612

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 62: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - ENSEMBLES

ENSEMBLES

Un ensemble est une collection deacuteleacutements de mecircme type (cf cours maths 6egraveme) Supposons vouloir repreacutesenter des vendeurs et leurs domaines daction

Le type ensemble est deacutefini par SET OF

TYPE produits=(velosmotosautosaccessoires) VAR vendeur1vendeur2 SET OF produits

On remplit un ensemble en donnant ses eacuteleacutements entre crochets

vendeur1=[velosmotos] vendeur2=[motosaccessoires]lensemble vide est []

On peut faire les opeacuterations suivantes

UNION vendeur1+vendeur2=[velosmotosaccessoires]INTERSECTION vendeur1vendeur2=[motos]COMPLEMENT vendeur1-vendeur2=[velos] vendeur2-vendeur1=[accessoires]

les tests booleacuteens possibles sont = ltgt lt= (inclus) gt= (contenant)

On teste lappartenance dun eacuteleacutement par IN si X vaut motos alors X IN VENDEUR1 et [motos]lt=VENDEUR1 sont eacutequivalents (IN compare un eacuteleacutement et un ensemble alors que lt= compare deux ensembles

Rq En geacuteneacuteral on ne pense pas agrave utiliser les ensembles (le prof de maths aurait-il oublieacute de nous dire agrave quoi ccedila sert ) et lon sembrouille dans des programmes complexes Voici par exemple des ideacutees pour programmer facilement un automatisme deacutefini par plusieurs Grafcet complexes ([xx] se lisant ensemble des xx)

[eacutetapes actives]=[eacutetapes initiales]pour chaque transition si [eacutetapes immeacutediatement preacuteceacutedentes] lt= [eacutetapes actives] et [capteurs neacutecessaires] lt= [capteurs] alors [eacutet actives]=[eacutet actives]-[preacuteceacutedentes]+[suivantes]

httpwww-ipstu-strasbgfrpatprogrampascal15htm (1 sur 2)09082003 224613

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 63: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - ENSEMBLES

activer [sorties] en fonction [eacutetapes actives] et boucler

On peut trouver un exemple deacutetailleacute dans mon document sur la mise en oeuvre du Grafcet

httpwww-ipstu-strasbgfrpatprogrampascal15htm (2 sur 2)09082003 224613

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 64: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - POINTEURS

POINTEURS

LES LISTES CHAINEES ET ARBRES LES POINTEURS EN PASCAL

Un pointeur est une variable qui stocke ladresse (cad la position en meacutemoire) dune variable

LES LISTES CHAINEES ET ARBRES

Supposons une liste de 3 entiers On suppose connaicirctre pour chacun ladresse du suivant

si lon veut inseacuterer une valeur dans la liste les modifications agrave apporter sont minimes

Contrairement agrave linsertion dans un tableau il est inutile de deacutecaler les termes suivants Pour connaicirctre la liste il suffit de connaicirctre ladresse du premier terme

Pour repreacutesenter un arbre il suffit pour chaque eacuteleacutement de connaicirctre ladresse de chaque fils

httpwww-ipstu-strasbgfrpatprogrampascal16htm (1 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 65: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - POINTEURS

Rq si le nombre de fils nest pas constant on a inteacuterecirct agrave stocker uniquement le fils aicircneacute ainsi que le fregravere suivant

LES POINTEURS EN PASCAL

En pascal on utilise les pointeurs pour repreacutesenter ces objets La deacuteclaration se fait de la maniegravere suivante

TYPE pointeur=^type_de_la_variable_pointeacutee

ex TYPE tpoint=^tval ( pointe sur des TVAL ) tval=record valeurinteger suivanttpoint end VAR p1p2tpoint

Dans cet exemple les variables de type TVAL contiendront un entier et ladresse de la suivante (liste chaicircneacutee vue plus haut)

Contrairement aux tableaux il nest pas neacutecessaire de preacutevoir le nombre de variables pointeacutees agrave lavance Cest lallocation dynamique de meacutemoire on reacuteserve la place pour chaque variable en cours dexeacutecution du programme par la commande NEW(nom_variable) On reacutecupegravere la place si la variable est devenue inutile par DISPOSE(nom_variable)

P1 contient donc une adresse dune variable de type TVAL Cette variable sera P1^ (cad pointeacutee par P1) On la remplit donc par des affectations du type

P1^valeur=15 P1^suivant=P2

httpwww-ipstu-strasbgfrpatprogrampascal16htm (2 sur 3)09082003 224614

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 66: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - POINTEURS

Examinons un programme qui lit puis affiche une liste chaicircneacutee dentiers

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premprecedentpointtpoint ininteger begin write(combien deacuteleacutements comporte votre liste ) readln(n) new(prem) ( le 1er est particulier si on le perd on perd la liste ) write(1egravere valeur ) readln(prem^valeur) ( lecture de lenregistrement VALEUR de la variable dadresse (pointeacutee par) PREM ) precedent=prem for i=2 to n do begin new(point) ( creacuteation dune nouvelle variable ) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point ( mise agrave jour du chaicircnage ) precedent=point (se preacuteparer 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 quil permette de rajouter ou supprimer des eacuteleacutements Deacutecomposez le en routines

httpwww-ipstu-strasbgfrpatprogrampascal16htm (3 sur 3)09082003 224614

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 67: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

IPST page daccueil

IPST - Institut Professionnel des Sciences et Technologies

Meacutecanique

Electronique

Geacutenie industriel

Technologie

Qualiteacute

Informatique

IPST - Institut Professionnel des Sciences et Technologies15-17 rue du Mareacutechal Lefegravebvre - 67100 STRASBOURG

Tel 0390244950 - Fax 0390244972

httpwww-ipstu-strasbgfripst09082003 224619

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 68: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

Universiteacute Louis Pasteur - Strasbourg I -

httpwww-ulpu-strasbgfr09082003 224626

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 69: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

CORRECTION DES EXERCICES

-- Ex ex_tva -- Ex ex_puiss -- Ex ex_jeu -- Ex ex_moy -- Ex ex_jeu_bis -- Ex ex_calc -- EX moya -- Ex rotb -- Ex clasc -- Ex str --Ex mat -- Ex tel -- Ex rec -- Ex fichier -- Ex pointeurs

-- Ex ex_tva

program tva(inputoutput)var prix_unitairequantite total_httvatotal_ttcrealbegin writeln(prix de larticle ) readln(prix_unitaire) writeln(quantiteacute deacutesireacutee ) readln(quantite) total_ht=prix_unitairequantite tva=total_ht(186100) total_ttc=total_ht+tva writeln(total ht total_ht) writeln(tva tva) writeln( -------------) writeln(total ttc total_ttc)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (1 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 70: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

-- Ex ex_puiss

program puissances(inputoutput)var nmaxintegerbegin writeln(nombre maxi ) readln(max) n=2 while nlt=max do begin writeln(n) n=n2 end writeln(cest fini)end

-- Ex ex_jeu

program jeu(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) until rep=choix writeln(trouveacute en nb coups)end

-- Ex ex_moy

program moyenne(inputoutput)var niinteger notetotalmoyennerealbegin writeln(nombre notes agrave entrer ) readln(n) total=0 for i=1 to n do begin writeln(iiegraveme note ) readln(note) total=total+note end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (2 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 71: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

moyenne=totaln writeln(la moyenne est moyenne)end

-- Ex ex_jeu_bis

program jeu_ameliore(inputoutput)var choixrepnbintegerbegin nb=0 choix=random(11) repeat nb=nb+1 writeln(choix ndeg nb ) readln(rep) if repltchoix then writeln(cest plus) else if repgtchoix then writeln(cest moins)le 2egraveme if empecircche deacutecrire si juste until rep=choix writeln(juste en nb coups)end

-- Ex ex_calc

program calculatrice(inputoutput)var val1val2resultatreal operationcharbegin writeln(premiegravere valeur ) readln(val1) writeln(opeacuteration (+ - ) ) readln(operation) writeln(deuxiegraveme valeur ) readln(val2) case operation of +resultat=val1+val2 -resultat=val1-val2 resultat=val1val2 resultat=val1val2 end writeln(reacutesultat resultat)end

httpwww-ipstu-strasbgfrpatprogrampascal17htm (3 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 72: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

-- EX moya

program moyenne(inputoutput)var ncompteurinteger sommemoyenneecartreal notearray[1100] of realbegin repeat writeln(nb notes (100 maxi)) readln(n) until (ngt0) and (nlt=100)entreacutee notes et calcul de la somme somme=0 for compteur=1 to n do begin writeln(compteuregrave note ) readln(note[compteur]) somme=somme+note[compteur] endcalcul et affichage de la moyenne moyenne=sommen writeln(moyenne moyenne)calcul et affichage des eacutecarts writeln(eacutecarts ) for compteur=1 to n do begin ecart=note[compteur]-moyenne writeln(compteuriegraveme note ( note[compteur] ) eacutecart ecart) endend

-- Ex rotb

program rotation(inputoutput)var indexninteger premreal tableauarray[1100]of realbegin repeat writeln(nb valeurs (100 maxi)) readln(n) until (ngt0) and (nlt=100)

httpwww-ipstu-strasbgfrpatprogrampascal17htm (4 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 73: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

( entreacutee des valeurs ) for index=1 to n do begin writeln(indexiegraveme valeur ) readln(tableau[index]) end writeln(on deacutecale vers le haut) prem=tableau[1] ne pas eacutecraser for index=2 to n do tableau[index-1]=tableau[index] tableau[n]=prem for index=1 to n do writeln(tableau[index]) writeln(on re-deacutecale vers le bas) prem=tableau[n] for index=n downto 2 do tableau[index]=tableau[index-1] tableau[1]=prem for index=1 to n do writeln(tableau[index])end

-- Ex clasc

program classer(inputoutput)var niindexpetitindexpetitinteger avantapresarray[1100]of integer prisarray[1100] of boolean pour noter ceux deacutejagrave prisbeginrepeat writeln(nb valeurs (100 maxi) ) readln(n)until (ngt0) and (nlt=100)entreacutee valeurs - initialisation de prisfor index=1 to n do begin writeln(indexiegraveme valeur ) readln(avant[index]) pris[index]=falseendordre croissanton cherche N valeursfor i=1 to n do begin petit=maxint plus grand possiblerecherche du plus petit non pris for index=1 to n do

httpwww-ipstu-strasbgfrpatprogrampascal17htm (5 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 74: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

if (not pris[index]) and (avant[index]lt=petit) then begin petit=avant[index] indexpetit=index end sauvegarde dans le tableau APRES et mise agrave jour de PRIS apres[i]=petit pris[indexpetit]=trueend passage au prochain i affichage du tableau APRESwriteln(par ordre croissant )for i=1 to N do writeln(apres[i])classement par ordre deacutecroissantwriteln(par ordre deacutecroissant )for i=n downto 1 do writeln(apres[i]) nauriez-vous pas tout refait end

-- Ex str

program position(inputoutput)var chschstring[255] ijnllsintegerbegin writeln(chaicircne agrave tester ) readln(ch) writeln(sous-chaicircne agrave trouver ) readln(sch) l=length(ch)ls=length(sch) n=0 for i=1 to l-ls do begin j=1 while (jlt=l)and(ch[i+j-1]=sch[j]) do j=j+1 if jgtls then begin writeln(trouveacute position i) n=n+1 end end writeln(n fois sch dans ch)end

--Ex mat

httpwww-ipstu-strasbgfrpatprogrampascal17htm (6 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 75: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

program produit_mat(inputoutput)var m1m2m3array[110110]of real lmnjljmjnintegerbegin writeln(nb lignes 1egravere matrice ) readln(m) writeln(nb colonnes 1egrave matrice ) readln(l) writeln(nb colonnes 2egrave matrice ) readln(n)( entreacutee de m1 ) writeln(premiegravere matrice) for jm=1 to m do for jl=1 to l do begin writeln(ligjm coljl) readln(m1[jmjl]) end( entreacutee de m2 ) writeln(2iegraveme matrice) for jl=1 to l do for jn=1 to n do begin writeln(ligjl coljn) readln(m2[jljn]) end( calcul du produit ) for jm=1 to m do for jn=1 to n do begin calcul composante mn de m2 m3[jmjn]=0 for jl=1 to l do m3[jmjn]= m3[jmjn]+(m1[jmjl]m2[jljn]) end( affichage du reacutesultat ) writeln(reacutesultat) for jm=1 to m do for jn=1 to n do writeln(m[jmjn]= m3[jmjn])end

-- Ex tel

program annuaire(inputoutput)( version simplifieacutee )type ligne=string[40] typepersonne=record nomligne

httpwww-ipstu-strasbgfrpatprogrampascal17htm (7 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 76: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

num_telligne( integer malheureusement lt 32635 ) endvar persarray[1100]of typepersonne nbi1100 repchar imprimerboolean texteligne

beginon suppose avoir ici les instructionspermettant de lire sur fichier disqueNB et le tableau PERS repeat writeln(recherche suivant ) writeln( N nom) writeln( T numeacutero teacuteleacutephone) writeln( Q quitter le prog) writeln(quel est votre choix ) readln(rep) if repltgtQ then begin writeln(texte agrave chercher ) readln(texte) for i=1 to nb do with pers[i] do begin case rep of Nimprimer=nom=texte Timprimer=num_tel=texte end if imprimer then begin writeln(nom nom) writeln(tel num_tel) end end end until rep=Qend

-- Ex rec

program determ(inputoutput) on se limite agrave 10x10 ce qui fait 7hde calcul et 6235314 appels agrave DETN type tmat=array[110110] of real

httpwww-ipstu-strasbgfrpatprogrampascal17htm (8 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 77: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

var diminteger dimension matrice agrave calculer detreal reacutesultat deacutesireacute mattmat matrice agrave calculer appelreal nb appels agrave

procedure entreevar ligcolintegerbegin 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[ligcol]) end endend

procedure sous_mat(mdebtmat var mfin tmat inddiminteger)on supprime la colonne 1 et la ligne ind pour avoir la smat de dim-1 var colliglinteger begin l=0 for lig=1 to dim do begin if ligltgtind then begin l=l+1 for col=2 to dim do mfin[lcol-1]=mdeb[ligcol] end end end

function detn(mtmatdinteger)realdeacutet ordre d en fonction ordre d-1var resultreal mprimtmat matrice intermeacutediaire ligsigneintegerbegin appel=appel+1 if d=1 then detn=m[11] ( fin de reacutecursiviteacute )

httpwww-ipstu-strasbgfrpatprogrampascal17htm (9 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 78: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

else begin result=0 signe=-1 for lig=1 to d do begin sous_mat(mmprimligd) signe=-signe changer de signe agrave chaque ligne result=result + (signem[lig1]detn(mprimd-1)) end detn=result endend

begin ( programme principal ) entree appel=0 det=detn(matdim) writeln(reacutesultat det) writeln(nb appels DETN appel)end

-- Ex fichier

procedure lireficvar i1100 ffile of typepersonne( variables globales NB et le tableau PERS )begin assign(fannuaire) non standard reset(f) nb=0 while not EOF(f) do begin nb=nb+1 read(fpers[nb) end close(f)end agrave vous de faire la suite

-- Ex pointeurs

httpwww-ipstu-strasbgfrpatprogrampascal17htm (10 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 79: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

program liste(inputoutput) TYPE tpoint=^tval tval=record valeurinteger suivanttpoint end VAR premtpoint variable globale ninteger cchar

procedure lirevar precedentpointtpoint iinteger modifie N et PREM begin write(combien deacuteleacutements) readln(n) new(prem) write(1egravere valeur ) readln(prem^valeur) precedent=prem for i=2 to n do begin new(point) write(iiegraveme valeur ) readln(point^valeur) precedent^suivant=point precedent=point end precedent^suivant=NIL ( le dernier ne pointe sur rien ) end

procedure affichervar pointtpoint iinteger begin point=prem for i=1 to n do begin writeln(point^valeur) point=point^suivant end end

procedure supprimervar pointprectpoint repchar

httpwww-ipstu-strasbgfrpatprogrampascal17htm (11 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 80: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

begin point=prem repeat write(point^valeur agrave ocircter ) readln(rep) if rep=O then begin n=n-1 if pointltgtprem then begin prec^suivant=point^suivant dispose(point) point=prec^suivant ( se preacuteparer 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 rajoutervar p1p2prectpoint repchar begin p1=prem repeat write(p1^valeur rajouter un eacuteleacutement avant (ON) ) readln(rep) if rep=O then begin n=n+1 if p1ltgtprem then begin new(p2) write(valeur ) readln(p2^valeur) prec^suivant=p2 p2^suivant=p1 prec=p2

httpwww-ipstu-strasbgfrpatprogrampascal17htm (12 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 81: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

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 eacuteleacutement en finde liste (ON) ) 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 repltgtO end

BEGIN prog principal lire repeat writeln(Aafficher Ssupprimer Rrajouter Ffin) write(votre choix ) readln(c) case c of Aafficher Ssupprimer Rrajouter end until c=Fend

httpwww-ipstu-strasbgfrpatprogrampascal17htm (13 sur 14)09082003 224628

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3
Page 82: le Langage PASCAL - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · PROGRAMMATION UN PREMIER PETIT ... bien ce langage et avais développé de nombreux programmes en Pascal,

le Langage PASCAL - CORRECTION DES EXERCICES

httpwww-ipstu-strasbgfrpatprogrampascal17htm (14 sur 14)09082003 224628

  • www-ipstu-strasbgfr
    • le Langage PASCAL
    • Le langage PASCAL - PTRAU
    • Mais qui est donc Patrick TRAU
    • le Langage PASCAL - INTRODUCTION
    • le Langage PASCAL - UN PREMIER PETIT PROGRAMME
    • le Langage PASCAL - CONSTANTES
    • le Langage PASCAL - INSTRUCTION DAFFECTATION
    • le Langage PASCAL - LES TYPES DE VARIABLES STANDARD SIMPLES ET OPERATEURS ASSOCIES
    • le Langage PASCAL - LES FONCTIONS STANDARD
    • le Langage PASCAL - INSTRUCTION
    • le Langage PASCAL - STRUCTURES DE CONTROLE
    • Sommaire geacuteneacuteral PROGRAMMATION
    • le Langage PASCAL - Sommaire
    • Patrick TRAUs Home Page
    • le Langage PASCAL - TYPES ENUMERES NON STANDARDS
    • le Langage PASCAL - LES TYPES INTERVALLES
    • le Langage PASCAL - TABLEAUX
    • le Langage PASCAL - ENREGISTREMENTS
    • le Langage PASCAL - PROCEDURES ET FONCTIONS
    • le Langage PASCAL - LES ENTREES SORTIES
    • le Langage PASCAL - ENSEMBLES
    • le Langage PASCAL - POINTEURS
    • le Langage PASCAL - CORRECTION DES EXERCICES
          1. ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
            1. form1
              1. x
                1. f1
                  1. f2
                    1. form2
                      1. x
                        1. f1 sitewww-ipstu-strasbgfr
                        2. f2 fr
                          1. f3 Recherche Google
                          2. f4
                              1. LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
                                1. form1
                                  1. x
                                    1. f1 [International Sites]
                                      1. OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
                                        1. form1
                                          1. x
                                            1. f1 0
                                            2. f2
                                              1. f3