le langage pascal - franceprog2.free.frfranceprog2.free.fr/pascal.pdf · programmation un premier...
Post on 06-Aug-2018
219 Views
Preview:
TRANSCRIPT
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
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
-
- ONPMDGIFPOKFCDJGPMAEAIKCGMLDGEID
-
- form1
-
- x
-
- f1
-
- f2
-
- form2
-
- x
-
- f1 sitewww-ipstu-strasbgfr
- f2 fr
-
- f3 Recherche Google
- f4
-
- LMAOHKCJAINEOPOJHHCIFKOOLJECNLEJ
-
- form1
-
- x
-
- f1 [International Sites]
-
- OCIDGKGDMPENIPNDOMADBMHDIOPGPIEN
-
- form1
-
- x
-
- f1 0
- f2
-
- f3
top related