Professional Documents
Culture Documents
Cours Fortran
Cours Fortran
SECTION DE MECANIQUE
ÉLÉMENTS DE PROGRAMMATION
EN
FORTRAN - 77
EDITION 1992
PRESENTATION 1
Chapitre 1
INTRODUCTION A FORTRAN-77 5
1.1 Caractères et instructions 6
1.1.1 Caractères du langage 6
1.1.2 Champ pour instructions 7
1.2 Configuration d'un programme 8
1.2.1 Hiérarchie des instructions 9
1.2.2 Instructions de spécification 9
1.2.3 Instructions exécutables 10
1.2.4 Unités de programme 10
1.2.4.1 Identificateurs 10
1.2.4.2 Programme principal 11
1.2.4.3 Sous-programmes 11
Chapitre 2
EXPRESSIONS FORTRAN 12
2.1 Types de données 12
2.1.1 Occupation en mémoire des différents types 13
2.1.2 Type entier : integer 14
2.1.3 Type réel : real 14
2.1.4 Type : double precision 15
2.1.5 Type complexe : complex 16
2.1.6 Type booléen ou logique : logical 16
2.1.7 Type caractère : character 17
2.2 Constantes FORTRAN 17
2.2.1 Constantes entières 17
2.2.2 Constantes réelles 17
2.2.3 Constantes en double précision 18
2.2.4 Constantes complexes 18
2.2.5 Constantes entières non décimales 19
2.2.5.1 DOMAIN 19
2.2.5.2 MS-FORTRAN 19
2.2.5.3 VAX-11 20
2.2.6 Constantes logiques 20
2.2.7 Constantes chaîne de caractères 20
2.2.8 Constantes Hollerith 21
2.3 Variables simples 21
2.3.1 Spécification de type par implicit 22
2.3.2 Variable de type integer 22
2.3.3 Variables de type real 23
2.3.4 Variables de type double precision 23
2.3.5 Variables de type complex 24
2.3.6 Variables de type logical 24
2.3.7 Variables de type character 24
2.4 Variables de tableaux 25
Table : 1
Page
Chapitre 3
INSTRUCTIONS DE BASE 38
3.1 Structures séquentielles 38
3.1.1 Instruction parameter 38
3.1.2 Instruction data 39
3.1.3 Affectation arithmétique 39
3.1.4 Affectation logique 41
3.1.5 Affectation d'une chaîne de caractères 41
3.1.6 Lecture de données 42
3.1.7 Affichage des données et des textes 44
3.1.8 Instruction : continue 45
3.1.9 Instruction : end 45
3.1.10 Instructions d'arrêt 45
3.1.10.1 Instruction : pause 45
3.1.10.2 Instruction : stop 47
3.2 Structures sélectives 47
3.2.1 Sauts inconditionnels 47
3.2.1.1 Go to inconditionnel 48
3.2.1.2 Go to imposé 48
3.2.1.3 Go to calculé 49
3.2.2 Instruction : if ... arithmétique 51
3.2.3 Instruction : if ... logique 52
3.2.4 Instructions avec bloc if 52
3.2.4.1 Configuration générale 52
3.2.4.2 Bloc if ... simple 53
3.2.4.3 Bloc if ... et else 53
3.2.4.4 Bloc if ... et else if ... 54
3.2.4.5 Remplacement de l'instruction : if arithmétique 54
Table : 2
Page
Chapitre 4
SOUS-PROGRAMMES FORTRAN-77 65
4.1 Librairie FORTRAN 66
4.1.1 Identificateurs des fonctions 66
4.1.1.1 Référence intrinsic 66
4.1.1.2 Référence generic 66
4.1.2 Description des fonctions 67
4.1.2.1 Fonctions de conversion 67
4.1.2.2 Conversion entre entiers et caractères 67
4.1.2.3 Fonctions mathématiques élémentaires 68
4.1.2.4 Fonctions sur des expressions complexes 69
4.1.2.5 Fonctions mathématiques générales 69
4.1.2.6 Fonctions trigonométriques 70
4.1.2.7 Fonctions hyperboliques 71
4.1.2.8 Fonctions de manipulation de chaînes 71
4.1.2.9 Comparaison logique des chaînes 72
4.1.3 Table des fonctions de la librairie FORTRAN 72
4.2 Listes de paramètres 76
4.2.1 Paramètres formels et effectifs 76
4.2.1.1 Paramètres effectifs 76
4.2.1.2 Paramètres formels 77
4.2.2 Correspondance entre les listes 78
4.2.3 Transmission des variables de tableaux 79
4.2.3.1 Dimensions des variables indicées 79
4.2.3.2 Dimensions ajustables 79
4.2.3.3 Stockage des données 82
4.2.3.4 Dimensionnement par l'astérisque 85
4.2.4 Appel et retour d'un sous-programme 88
4.2.4.1 Instruction d'appel d'une procédure 88
4.2.4.2 Retour d'un sous-programme 88
4.2.4.3 Transmission d'étiquettes 89
4.3 Fonctions-formules 89
4.3.1 Définition de la fonction-formule 89
4.3.2 Appel de la fonction-formule 90
4.3.3 Exemples de fonctions-formules 90
4.3.4 Exemple de programme 91
4.4 Sous-programme : subroutine 92
4.4.1 Syntaxe de la définition 92
Table : 3
Page
Chapitre 5
MISE EN FORME DES DONNEES 112
5.1 Mise en forme des entréées - sorties 112
5.1.1 Instruction de mise en forme 112
5.1.1.1 Instruction format 112
5.1.1.2 Descripteurs d'édition 113
5.1.1.3 Mise à la ligne ou à la page 113
5.1.1.4 Codes de lecture ou d'écriture 114
5.1.1.5 Mise en forme des données 115
5.1.2 Descripteurs de constantes et variables 115
5.1.2.1 Descripteur pour type integer 115
5.1.2.2 Descripteur G pour type real 116
5.1.2.3 Descripteur F pour type real 118
5.1.2.4 Descripteurs E et D pour type real 118
5.1.2.5 Facteur de multiplication 120
5.1.2.6 Descripteur L pour type logical 120
5.1.2.7 Descripteur A pour caractères 121
5.1.2.8 Descripteur H pour chaînes de caractères 122
5.1.2.9 Descripteur Z pour constantes hexadécimales 123
5.1.3 Descripteurs de mise en page 124
5.1.3.1 Saut de colonnes : descripteur X 124
5.1.3.2 Saut d'enregistrement : descripteur / 124
5.1.3.3 Tabulateur 125
5.1.3.4 Interruption du contrôle de la transmission 126
5.1.3.5 Répétition des descripteurs 126
5.1.3.6 Exploration de la mise en forme 126
Table : 4
Page
Chapitre 6
LES FICHIERS FORTRAN 139
6.1 Généralités sur les fichiers 139
6.1.1 Description des genres de fichiers 140
6.1.1.1 Enregistrements 140
6.1.1.2 Fichiers externes 140
6.1.1.3 Fichiers internes 140
6.1.1.4 Modes d'accès 141
6.1.2 Clauses 141
6.1.2.1 Mode d'accès : access 142
6.1.2.2 Traitement des blancs : blank 142
6.1.2.3 Contrôle du mode d'accès : direct 142
6.1.2.4 Fin de fichier : end 142
6.1.2.5 Contrôle des erreurs : err 143
6.1.2.6 Existance d'un fichier : exist 143
6.1.2.7 Nom du fichier : file 143
6.1.2.8 Nature de l'enregistrement : form 144
6.1.2.9 Contrôle du codage : formatted 144
6.1.2.10 Mise en forme : fmt 144
6.1.2.11 Etat des entrées-sorties : iostat 145
6.1.2.12 Contrôle du nom : name et named 145
6.1.2.13 Numéro d'enregistrement : nextrec 145
6.1.2.14 Numéro d'unité logique : number 146
6.1.2.15 Contrôle de l'ouverture : opened 146
6.1.2.16 Spécification du numéro d'enregistrement : rec 146
6.1.2.17 Longueur de l'enregistrement : recl 146
6.1.2.18 Contrôle du mode séquentiel : sequential 146
6.1.2.19 Etat du fichier : status 147
6.1.2.20 Contrôle du codeage : unformatted 147
6.1.2.21 Spécification de l'unité : unit 147
6.1.3 Ouverture des fichiers 148
6.1.3.1 Instruction d'ouverture : open 148
6.1.3.2 Utilisation de l'ouverture 149
Table : 5
Page
Chapitre 7
REPRÉSENTATIONS GRAPHIQUES 176
7.1 Graphiques sur traceur HP 7475 A 176
7.1.1 Description du traceur HP 7475 A 176
7.1.1.1 Syntaxe du langage HP-GL 176
7.1.1.2 Zone de traçage 177
7.1.1.3 Systèmes d'unités 177
7.1.1.4 Points de cadrage 177
7.1.2 Instructions graphiques 177
7.1.3 Exemples de graphiques 179
7.1.3.1 Procédure d'initialisation 180
7.1.3.2 Direction de l'écriture 181
Table : 6
Page
Table : 7
Table : 8
PRÉSENTATION
L'introduction d'un langage symbolique en programmation implique toujours les opérations sui-
vantes :
1. écriture d'un programme au moyen d'instructions en langage clair, ce programme portant le nom
de programme source
2. traduction de ce programme en langage machine compréhensible par l'ordinateur, mais pas par le
programmeur
3. Liaison des divers modules programmés et des éléments de la librairie du langage et du système
d'exploitation afin de rendre l'ensemble exécutable dans l'environnement de l'ordinateur.
C'était il y a plus de 30 ans que la maison IBM lançait une description préliminaire du langage de
programmation FORTRAN :
DOMAIN FORTRAN
Apollo Cumputer Inc. Langage Reference
Sigle utilisé ici : DOMAIN
Microsoft FORTRAN
Microsoft Corporation Optimizing Compiler
Sigle utilisé ici : MS-FORTRAN
VAX-11 FORTRAN
Digital Equipment Corp. Language Reference Manual
Sigle utilisé ici : VAX-11
La première et la dernière versions citées sont opérationnelles sur des mini-ordinateurs, la se-
conde version est implémentable sur des micro-ordinateurs. Chaque version comprend des com-
pléments, hors norme, qui seront discutées dans le chapitre 7 de ce cours.
Ce cours est accessible à tout utilisateur connaissant quelques bases de la programmation. Il est
complété par 40 programmes exécutables afin de concrétiser la syntaxe citée dans le texte. Les ins-
tructions décrites ci-après sont conformes à la norme ANSI X3.9-1978 avec le complément MIL -STD-
1753.
Il est tout à fait normal de se demander pour quelles raisons le langage FORTRAN doit faire l'objet
d'une étude détaillée à la suite d'un cours de programmation sur le langage PASCAL . Donnons
-1-
- Langage de programmation : Fortran 77 -
brièvement une justification des avantages et citons également les inconvénients de cet outil de
création de logiciel :
Chapitre 1
L'introduction au langage FORTRAN donne un aperçu sur les composantes de base d'un pro-
gramme, la description des caractères utilisables, l'écriture des instructions dans les 80 colonnes de la
carte, la configuration d'un programme, finalement une liste des types et instructions.
Chapitre 2
La présentation de tous les types de base du langage, avec les implémentations particulières, les
domaines de définition, la représentation interne des données, c'est-à-dire dans la mémoire de l'ordi-
nateur, commence le second chapitre. Les constantes, les variables simples et de tableaux sont
discutées ensuite avant de passer à l'étude des expressions arithmétiques, chaînes de caractères,
-2-
- Langage de programmation : Fortran 77 -
relationnelles et logiques. Dans une première étude du langage, les variantes des types fonda-
mentaux peuvent être laissées de côté et reprises dans une vue complète des possibilités de
FORTRAN
Chapitre 3
Les instructions de base sont classées en trois catégories :
- instructions utilisées dans les structures séquentielles,
- structures sélectives avec citation de toutes les possibilités de choix inconditionnel ou conditionnel,
- structures itératives ou à répétition.
Chapitre 4
La structuration d'un programme fait intervenir obligatoirement des sous-programmes dédiés à
une tâche allant de l'élémentaire à la forme la plus complexe. La richesse de la librairie du langage
permet de résoudre de nombreux problèmes mathématiques et des tableaux donnent la liste des
fonctions à disposition. Le programmeur dispose de trois genres de sous-programmes afin de faciliter
les accès aux tâches à résoudre. Quelques instructions permettent de gérer au mieux la place dispo-
nible en mémoire.
Chapitre 5
La mise en forme agréable des données est une propriété de FORTRAN . L'énumération des
divers descripteurs à disposition, les possibilités de lecture et d'écriture terminent ce chapitre im-
portant dans la pratique courante.
Chapitre 6
Si les données deviennent volumineuses et si des textes ou des tableaux doivent pouvoir se lire
pendant l'exécution d'un programme, l'emploi de fichiers devient absolument nécessaire. Le chapitre
présente les divers types de fichier, les modes d'accès et les nombreuses clauses facilitant grande-
ment la manipulation des données numériques et alphanumériques.
Chapitre 7
Ce dernier chapitre décrit la programmation des instructions permettant d'accéder aux routines
graphiques du traceur HP 7475 A . Les instructions du langage HP-GL sont citées et plusieurs pro-
grammes montrent l'utilisation de cette syntaxe dans le langage FORTRAN. Les implémentations des
trois systèmes sont décrites en fin de chapitre.
Annexes et exemples
Les 40 exemples de ce cours peuvent faire l'objet d'un document enregistré sur un CD que
l’utilisateur pourrait directement employer, soit :
- 40 exemples, système d'exploitation MS-DOS sur micro-ordinateurs IBM et compatibles,
- 40 exemples, système d'exploitation AEGIS sur station Apollo,
- 40 exemples, système d'exploitation VMS sur Micro-VAX.
Le dernier exemple n'est exploitable que sur une station Apollo, car il utilise des routines
graphiques spécifiques à ce système d'exploitation.
-3-
- Langage de programmation : Fortran 77 -
BIBLIOGRAPHIE
Les sources bibliographiques des trois implémentations citées et traitées dans ce cours sont
données au chapitre 7 . La description du traceur HP 7475 A , des instructions du langage graphique
HP-GL et de l'interfaçage avec les micro-ordinateurs, est donnée dans :
-4-
CHAPITRE 1
INTRODUCTION À FORTRAN-77
Exemple élémentaire :
Programme élémentaire montrant la façon d'introduire un nombre entier et d'afficher le quadruple
de ce nombre.
*
* Exemple 1
* Programme élémentaire lisant un nombre
* et calculant son quadruple
program exemOl
integer*4 i,j
*
print *,'Entrez un nombre entier :'
read *,i
j=4*i
print *,'Valeur introduite : ',i,' , quadruple = ',j
end
-5-
- Langage de programmation : Fortran 77 -
Cet exemple comprend les quatre parties fondamentales que l'on rencontre pratiquement dans
tous les programmes :
1. déclaration des entités utilisées,
2. introduction des données numériques,
3. traitement des données,
4. affichage des résultats.
Le langage FORTRAN ne connaît pas de mots réservés comme la plupart des autres langages de
programmation et ne fait pas de distinction entre les lettres majuscules et minuscules dans l'écriture
des mots de la syntaxe et les identificateurs d'entités. La plupart des anciens programmes sont écrits
en lettres majuscules, ce qui n'est plus une obligation avec la version FORTRAN-77.
Les caractères utilisables dans la syntaxe et les identificateurs des instruction du langage appar-
tiennent au code ASCII à 7 bits (ASCII > American Standard Code for Information Interchange), les
lettres accentuées n'étant pas autorisées dans ce cas. Les caractères utilisables sont limités à :
1. Toutes les 26 lettres majuscules de A à Z ainsi que toutes les 26 lettres minuscules de a à z .
2. Tous les chiffres de 0 à 9.
3. Les caractères spéciaux suivants
Les autres caractères ASCII , des codes à 7 et 8 bits, ne peuvent apparaître que comme cons-
tante Hollerith ou dans une chaîne de caractères. Lors de la traduction du programme source, le
compilateur FORTRAN ne fait aucune distinction entre les majuscules et les minuscules, sauf dans
les chaînes de caractères à afficher et à imprimer. Le compilateur ne tient pas compte des espaces.
-6-
- 1. Introduction à Fortran 77 -
1. La colonne 1 est réservée au caractère C (ou c), à l'astérisque * , pour l'identification d'un
commentaire. Chaque ligne de commentaire doit contenir dans sa première colonne un C (ou c)
ou un * . Les commentaires peuvent s'écrire dans les colonnes 2 à 72. Dans ce cours, nous
utiliserons le caractère * .
Variante DOMAIN et VAX-11 : la première colonne peut contenir le caractère D (ou d) permettant
une compilation conditionnelle d'une instruction.
2. Les cinq premières colonnes sont réservées à l'écriture des diverses étiquettes : valeur entière
non signée de 1 à 99999, unique dans l'unité de programme et ne comprenant que des chiffres
et/ou des espaces.
3. La colonne 6 est réservée au caractère d'identification d'une ligne de suite ou additionnelle : tout
caractère ou tout chiffre, sauf zéro ou l'espace peuvent s'utiliser dans ce but. Dans les exemples,
nous utiliserons soit le caractère c , soit le caractère + .
4. Les colonnes 7 à 72 sont réservées à l'écriture des instructions du programme. Actuellement, les
programmes sont écrits au moyen d'un éditeur de texte. Si cet éditeur n'affiche pas le numéro de
colonne où se trouve la pointeur d'écriture, introduisez 6 espaces avant de commencer à écrire
l'instruction FORTRAN , le pointeur se trouvant dans la colonne 7. La colonne 72 est très souvent
signalée par la marge de droite ou par un signal acoustique. Evitez d'utiliser le tabulateur pour
positionner les instructions, ce caractère n'étant pas reconnu par tous les compilateurs.
5. Les colonnes 73 à 80 sont réservées aux identificateurs de rangement des instructions sur cartes
perforées, les lignes du programme n'étant pas numérotées.
Particularités
Dans la plupart des implémentations FORTRAN , un commentaire complémentaire peut se placer
à la suite d'une instruction, dans n'importe quelle colonne entre 2 et 72, ce commentaire étant signalé
par le caractère ! .
Le caractère espace, dit également blanc, n'a pas de signification pour le compilateur et s'utilise
seulement pour améliorer la lisibilité du programme. Les exceptions à cette règle sont :
1. les blancs sont significatifs dans les chaînes de caractères;
2. les blancs sont significatifs dans les constantes Hollerith;
3. un blanc dans la colonne 6 signifie une nouvelle instruction et non une ligne de suite.
-7-
- Langage de programmation : Fortran 77 -
De ces diverses règles contraignantes, nous nous apercevons que le numéro de colonne est
significatif dans l'écriture des instructions du fichier source. Un programme source FORTRAN est
donc une séquence de lignes dans laquelle seuls les 72 premiers caractères sont retenus par le
compilateur. Les caractères après le 72ième sont ignorés !
Une instruction FORTRAN consiste en une ligne initiale suivie de zéro à dix-neuf lignes de suite.
Cette instruction peut contenir jusqu'à 1320 caractères dans les colonnes 7 à 72. L'instruction end doit
être la dernière instruction de l'unité de programme, placée sur une ligne d'instruction.
Pendant la compilation, chaque unité de programme est traduite en langage machine par le com-
pilateur, indépendamment des autres unités de programme. Il en résulte que les unités de programme
peuvent se trouver :
1. dans un fichier texte contenant le programme complet soit le programme principal et tous les
sous-programmes.
2. dans plusieurs fichiers texte contenant chacun une ou plusieurs unités de programme, ce grou-
pement étant laissé au choix du programmeur.
3. Le nom du fichier, conforme à la syntaxe du système d'exploitation, avec une extension signalant
la présence d'un texte en langage source FORTRAN , peut porter un identificateur différent de
l'identificateur de l'unité de programme.
Tableau 1.1
-8-
- 1. Introduction à Fortran 77 -
Les instructions du programme doivent se donner dans un ordre logique, le compilateur ne pou-
vant pas deviner la nature d'entités non reconnues. Le tableau 1.1 ci-dessus montre la disposition
générale d'un programme source avant compilation. Elle indique également la priorité des instructions
de spécification les unes par rapport aux autres. Les instructions exécutables comprennent toutes les
instructions du langage FORTRAN.
Les directives générales de compilation permettent de choisir certaines définitions particulières du
compilateur. La forme de ces instructions ne fait pas partie du langage FORTRAN et dépend donc de
l'implémentation dans le système d'exploitation de l'ordinateur. L'organisation proposée est à lire de
haut en bas.
Tableau 1.2
Le sufffixe *4 signifie une occupation de quatre octets en mémoire et *2 une occupation de deux
octets.
Tableau 1.3
INSTRUCTIONS DE SPÉCIFICATION
-9-
- Langage de programmation : Fortran 77 -
Tableau 1.4
L'instruction format peut apparaître à tout endroit dans l'unité de programme après l'en-tête et avant
l'instruction terminale end .
1.2.4.1 IDENTIFICATEURS
Les identificateurs ou noms symboliques sont employés en programmation FORTRAN pour dis-
tinguer les diverses entités telles que : unités de programme, variables simples et variables de ta-
bleaux, arguments et paramètres de liste, etc. L'identificateur est une suite de caractères, seulement
des lettres ou des chiffres, dont le premier caractère doit être absolument une lettre. Le nombre de
caractères est limité à 6 selon norme ANSI . Les fournisseurs de compilateurs ont étendu cette défi-
nition restrictive afin d'améliorer la lisibilité des programmes. Dans toutes les extensions, le premier
caractère doit rester une lettre.
DOMAIN
L'identificateur peut comprendre jusqu'à 32 caractères significatifs, lettres et chiffres, et en plus les
deux caractères : dollar $ et le caractère de soulignement _ .
MS-FORTRAN
Seuls les six premiers caractères, lettres ou chiffres, sont significatifs, les caractères suivants
étant ignorés par le compilateur.
- 10 -
- 1. Introduction à Fortran 77 -
VAX-11
L'identificateur peut comprendre jusqu'à 31 caractères, lettres ou chiffres, le caractère $ et le
caractère de soulignemenrt _ étant autorisé. Le caractère $ ne peut s'introduire que dans les
composantes DEC .
Il n'y a pas de confusion possible entre les mots de la syntaxe FORTRAN et les identificateurs
adoptés par le programmeur. Le compilateur est capable de distinguer ces entités en se servant du
contexte des instructions. Il est quand même recommandé de ne pas utiliser les mots du langage
comme identificateur des autres entités. Les identificateurs du langage source sont des interfaces
avec des places mémoires utilisées dans l'ordinateur.
Exemples d'identificateurs :
- selon norme ANSI :
antony nombre aligne ibarre
- en extension de la norme :
antoine_dupont nombre—de—mots ibarre—de—travers
Les identificateurs de variables doivent rester uniques dans chaque unité de programme et ne
peuvent donc pas s'employer pour deux ou plusieurs entités différentes.
program identif
avec :
identif l'identificateur donné à l'unité de programme principal.
Le programme principal se termine par l'instruction end . En l'absence de l'instruction initiale
program ... , le compilateur introduit habituellement un identificateur d'unité par défaut, le plus
souvent main .
1.2.4.3 SOUS-PROGRAMMES
Un sous-programme peut se composer d'une suite de commentaires, d'instructions de spécifi-
cation et d'instructions exécutables. Il débute toujours par l'une des instructions
subroutine
function
block data
Le sous-programme classique, effectuant une tâche multiple, commence par l'instruction
subroutine et contient des instructions exécutables. Pour trouver une seule valeur à partir d'une
définition extérieure à l'unité de programme, le programmeur utilise une fonction faisant partie soit de
la librairie du langage, soit écrite spécialement pour l'application. Tous les sous-programmes se
terminent par l'instruction end indiquant au compilateur la fin de la traduction de l'unité de programme.
- 11 -
CHAPITRE 2
EXPRESSIONS FORTRAN
Le type attribué à une donnée caractérise la place occupée par cette donnée en mémoire et la
manière dont cette donnée est stockée au moyen d'octets et de bits. Toutes les données sont
- 12 -
- 2.Expressions du langage Fortran 77 -
enregistrées sous forme de bits, valant 0 ou 1 , organisés par groupe de 8 bits pour former un octet et
finalement en long mot de 4 octets dans les processeurs à 32 bits.
Tout enregistrement d'une donnée numérique ou alphanumérique nécessite la traduction de cette
donnée, introduite par exemple par une frappe au clavier et apparaissant à l'écran, en une suite de
bits. La lecture d'une donnée stockée en mémoire s'effectue par l'opération inverse. A chaque
traitement e des données, il ne faut pas perdre de vue :
1. la représentation externe de la donnée de telle sorte qu'elle soit compréhensible pour l'utilisateur
du programme.
Exemple :
- donnée numérique : -3143.6543
- donnée alphanumérique : programmation
2. la représentation interne de la donnée qui peut dépendre du fabricant du compilateur ou d'une
normalisation de la transformation. Dans la plupart des applications, le programmeur n'a pas à
étudier cette représentation sous forme de bits, mais doit conserver cette notion importante de
transformation en évitant toute opération inutile dans le déroulement du programme.
Tableau 2.1
- 13 -
- Langage de programmation : Fortran 77 -
La représentation interne d'un entier de type integer, dans 4 octets contigus, est :
31 0
b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b
integer*4
Ce type est identique au type fondamental integer, avec les mêmes propriétés et possibilités de
représentation des entiers.
integer*2
Ce type occupe deux octets en mémoire et représente les entiers, en mémoire dans le système
binaire, dans le domaine compris entre :
15 0
b b b b b b b b b b b b b b b b
Octet 0 Octet 1
- 14 -
- 2.Expressions du langage Fortran 77 -
31 30 22 16 0
b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b
s exposant+127 Mantisse
real*4
Autre désignation pour le type real , d'où mêmes caractéristiques.
double precision
Ce type occupe 8 octets en mémoire et représente une donnée réelle au moyen de trois com-
posantes : le signe, l'exposant et la mantisse. Les données réelles peuvent se représenter dans les
domaines :
- valeurs positives 4.19E-307 à 1.67E+308
- valeurs négatives -1.67E+308 à -4.19E-307
- valeur nulle : 0
- nombre de chiffres significatifs : plus grand que 15.
La représentation interne d'une donnée de type double precision , selon norme IEEE, est implé-
mentée dans la plupart des compilateurs sous la forme suivante :
63 62 51 32
b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b
s exposant+1023 mantisse
Bits : de 31 à 0 : mantisse
Le bit 63 est le bit de signe qui vaut 1 si la donnée est négative, qui vaut 0 si la donnée est
positive. Les 11 bits suivants contiennent l'exposant plus 1023 (sous forme binaire). Les 52 bits
restants représentent la mantisse.
real*8
Autre désignation pour double precision , d'où mêmes caractéristiques.
Particularités VAX-11
double precision ou real*8 : en mode normal D : 16 chiffres significatifs dans la gamme des modules
compris entre 0.29D-38 et 1.7D+38. En mode G avec la directive de compilation /G–FLOATING, la
représentation se réalise selon la norme IEEE.
- 15 -
- Langage de programmation : Fortran 77 -
real*16 représentation des nombres réels jusqu'à 33 chiffres significatifs dans la gamme des modules
0.84Q-4932 et 0.59Q+4932. Ce type ne peut s'introduire que sur VAX-11 avec processeur arith-
métique à virgule flottante étendue.
63 62 54 32
b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b
s Exposant+127 Mantisse (partie réelle)
s Exposant+127 Mantisse (partie imaginaire)
complex*8
Ce type est une autre désignation pour le type complex , d'où mêmes caractéristiques.
complex*16
Ce type représente une donnée complexe au moyen de deux nombres de type double precision.
Il utilise 16 octets de mémoire. Le premier nombre est placé dans la partie réelle, le second dans la
partie imaginaire. Les limites de la représentation numérique sont identiques à celles des types
double precision. Ce type est hors norme ANSI.
31 0
b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b
Octet 0 Octet 1 Octet 2 Octet 3
Le bit 31 est mis à 1 si la valeur est vraie (= .true) et à 0 si la valeur est fausse (= .faIse). Tous les
autres bits sont normalement non définis.
logical*4
Ce type est identique à logical sur 4 octets, d'où mêmes caractéristiques.
logical*2
Ce type utilise 2 octets en mémoire, le bit 15 indiquant si la valeur est vraie ou fausse.
- 16 -
- 2.Expressions du langage Fortran 77 -
snn
avec :
s le signe de la constante, le signe + étant optionnel,
nn une suite de chiffres de 0 à 9.
Une constante entière ne peut pas contenir de signes spéciaux, en particulier ni virgule, ni point.
Les limites numériques de la représentation d'une constante entière sont :
type integer*4 -231 à +231-1
type integer*2 -215 à +215-1
Exemples :
type integer*2 ou integer*4 -1234 23678
seulement type integer*4 : 12345678
- 17 -
- Langage de programmation : Fortran 77 -
snn.nn
snn.nnEsnn
avec :
nn une suite de chiffres de 0 à 9,
s le signe + ou -, optionnel si la constante ou l'exposant sont positifs,
E le symbole pour la puissance de 10, la lettre E, suivi du signe ou d'une constante entière à 1 ou 2
chiffres représentant l'exposant de 10.
La partie entière et la partie fractionnaire comporte un ou plusieurs chiffres et le point décimal.
L'une des parties doit être au moins présente dans l'écriture de la constante. La partie exposant se
compose de la lettre E , signifiant 10 à la puissance, suivie d'un signe, optionnel si l'exposant est
positif, d'une constante de un ou de deux chiffres.
Le nombre de chiffres n'est pas limité dans la suite, mais seuls les 6 à 7 chiffres significatifs les
plus à gauche sont retenus dans la représentation interne de la constante. Il faut se souvenir que
l'introduction au clavier d'une constante réelle s'effectue par les opérations suivantes :
- écriture d'une chaîne de caractères selon la syntaxe proposée,
- transformation de cette chaîne en valeur numérique de type real et trois composantes : signe,
exposant et mantisse.
La transformation s'effectue presque toujours avec une modification de la valeur initiale de la
constante, en particulier avec les valeurs décimales.
Exemples :
123.456 12.3456E1 1.23456E+01
-0.09876 -.9876E-1 -9.876E-02
Dans l'écriture d'un programme, il est vivement recommandé d'écrire le zéro devant le point
décimal et le zéro derrière le point décimal à la place du point décimal seul. La lecture des valeurs
numériques à l'écran et surtout sur le papier est fortement facilitée.
snnDsnn
snn.nnDsnn
avec :
nn une suite de chiffres de 0 à 9,
s le signe + ou -, optionnel si la constante ou l'exposant sont positifs,
D le symbole de la puissance de 10 et de la constante en double précision, suivi du signe et d'une
constante entière de 1, 2 ou 3 chiffres représentant l'exposant de 10. L'exposant après la lettre D
ainsi que la lettre D ne peuvent pas être oubliés, même si l'exposant vaut zéro.
Exemples :
1.234567891D+10 -234.567890123D-124 0.0156D0
Particularités VAX-11 : voir description des types et symboles G et Q sous 2.1.4.
- 18 -
- 2.Expressions du langage Fortran 77 -
(snn.nn,snn.nn)
(snn.nnEsnn,snn.nnEsnn)
(snn.nnDsnn,snn.nnDsnn)
avec :
nn une suite de chiffres de 0 à 9,
s le signe + ou -, optionnel si la constante réelle ou l'exposant sont positifs,
E le symbole pour la puissance de 10, suivi du signe et d'une constante entière à 1 ou 2 chiffres
représentant l'exposant de 10 . Cette syntaxe est applicable aux constantes de type complex ou
complex*8.
D le symbole pour la puissance de 10, suivi du signe et d'une constante entière de 1, 2 ou 3 chiffres
représentant l'exposant de 10. Cette syntaxe n'est applicable qu'aux constantes complexes de
type complex*16 (hors norme ANSI).
Exemples :
(1.7864,-23.7652) (12.34E+15,-23.789E-6) (-1.0,+1.0)
(2.3456789O1D4,9.87654321098D-3)
2.2.5.1 DOMAIN
Les constantes octales et hexadécimales peuvent s'introduire chaque fois à la place d'une cons-
tante décimale, sauf pour les étiquettes. L'écriture des constantes suit la syntaxe particulière :
Constante octale Constante hexadécimale
8#cic2c3 ... cn 16#cic2c3 ... cn
avec :
ci un chiffre de 0 à 7 ci un chiffre de 0 à 9
une lettre de A à F ou de a à f
Exemples :
8#123 8#6732
16#ab121 16#fffa
2.2.5.2 MS-FORTRAN
Les constantes de bases différentes de 10 sont écrites au moyen d'une chaîne de caractères
comprenant : le signe, optionnel si la constante est positive, la base, le caractère # , la chaîne pouvant
comporter tous les chiffres de 0 à base-1 , les valeurs comprises entre 11 et 36 étant représentées
par des lettres de A à Z . La syntaxe générale est :
sbb#cl c2c3..cn
avec :
s le signe, optionnel si la constante est positive,
bb la base de numération,
ci un caractère, chiffre ou lettre conforme à la base adoptée.
- 19 -
- Langage de programmation : Fortran 77 -
Exemples :
2#101010 8#6234 -16#12ABC
2.2.5.3 VAX-11
.true.
.false.
Les points de part et d'autre de la constante logique font partie de l'écriture de chacune des
constantes logiques.
- 20 -
- 2.Expressions du langage Fortran 77 -
- 21 -
- Langage de programmation : Fortran 77 -
variable ne figure pas dans une instruction de spécification. La tendance actuelle est de déclarer les
variables de chaque unité de programme. Un problème important peut surgir dans les sous-
programmes lorsque les types integer*2 et integer*4 sont employés simultanément et sont passés
comme paramètres formels, affectés par des constantes entières.
Le langage FORTRAN fixe les déclarations implicites seulement pour les variables de type
integer et real . Il est possible de modifier cette convention implicite et d'étendre les spécifications
pour tous les types à disposition au moyen de l'instruction :
i,j,k,l,m,n
- 22 -
- 2.Expressions du langage Fortran 77 -
Si l'on désire utiliser d'autres lettres initiales ou déclarer explicitement les variables de type
integer , l'instruction de spécification peut prendre l'une des formes suivantes :
integer liste_de_variables
integer*2 liste_de_variables
integer*4 liste_de_variables
La première spécification déclare des variables de type integer occupant 4 octets chacune en
mémoire, à moins qu'une directive de compilation prévoit des entiers à 2 octets. Si l'on désire imposer
le nombre d'octets pour chaque variable, sans possibilité de modification par une directive générale, il
faut introduire alors dans l'instruction : integer*2 ou integer*4 .
Exemples de variables entières :
1. Sans déclaration explicite de type :
nouvea igloo mauve joujou libere
2. Avec déclaration explicite :
integer*2 neuf , noml1 , nul
integer*4 jeux , kilos , long
real liste_de_variables
real*4 liste_de_variables
Exemples de variables réelles :
1. Sans déclaration explicite de type :
bonne annee pauvre roue temps
2. Avec déclaration explicite de type :
real osibar , amaxl1 , aminl1
real*4 epsi , faveur , grands
Si dans l'unité de programme, on désire utiliser un identificateur dont la lettre initiale correspond à
celle d'une variable de type entier, il est possible de lui adjoindre un préfixe différent des lettres
réservées aux variables de type entier.
- 23 -
- Langage de programmation : Fortran 77 -
complex liste_de_variables
complex*8 liste_de_variables
complex*16 liste_de_variables
Exemples de variables complexes :
complex zerep , bonhar , crepe
complex*8 temps , tordre , tarot
logical liste_de_variables
logica1*2 liste_de_variables
logical*4 liste_de_variables
La première déclaration réserve 4 octets en mémoire par variable à moins qu'une directive de
compilation limite la place à 2 octets par défaut. Les deux autres spécifications fixent sans équivoque
l'occupation en mémoire, indépendamment de la présence ou non d'une directive particulière.
Exemples de variables logiques :
logical*4 lcomp bon44 , cvrai
logical vrais5 , cfaux , cmall
character*n liste_de_variables
character v1*n1,v2*n2, ... , vm*nm
avec :
n nombre maximal de caractères de la chaîne correspondant au nombre maximal d'octets réservé
en mémoire. Ce nombre ne doit pas dépasser la valeur maximale dépendant de l'implémentation
de FORTRAN .
vi identificateur de variable de type chaîne de caractères.
Exemples de variables chaîne de caractères
character*12 texte , page , ligne
- 24 -
- 2.Expressions du langage Fortran 77 -
character*(*) parametre_formel
Le nombre de caractères de la chaîne, qui peut varier d'un appel à l'autre du sous-programme,
dépend d'une définition des variable de type character située à un niveau directement supérieur.
Exemple d'un début de fonction programmée :
integer function imax (cvar)
character*(*) cvar
. . . . . . . .
end
Le nombre maximal de caractères de cvar ne peut pas dépasser la dimension maximale spécifiée
pour le paramètre effectif correspondant à cvar dans l'instruction d'appel de la fonction imax .
Une variable indicée ou de tableau (array) est un groupe de places consécutives en mémoire,
désigné par un identificateur commun. Chaque élément du tableau est repéré par un ou plusieurs
indices, placés entre parenthèses, séparés par la virgule, qui suivent directement l'identificateur. Une
variable indicée à une dimension est appelée vecteur. Celle à deux dimensions est dénommée
matrice ou tableau à lignes et colonnes, celle à trois dimensions à lignes, colonnes et pages pourrait
se désigner par volume, etc. FORTRAN admet des tableaux jusqu'à 7 dimensions.
Tous les éléments d'un même tableau doivent être obligatoirement du même type. La déclaration
d'une variable indicée doit s'effectuer dans chaque unité de programme où elle est employée au
moyen de l'une des instructions suivantes :
1. instruction de déclaration de type,
2. instruction dimension ,
3. instruction common .
Ces diverses instructions contiennent les spécifications des variables qui définissent les
identificateurs, suivis des dimensions et des limites des indices pour chaque dimension. La
classification des identificateurs de variables indicées obéit aux mêmes règles que celles des
variables simples. Le type d'une variable indicée est identifié soit implicitement à partir de la première
lettre du nom symbolique dans l'instruction dimension , soit explicitement dans une spécification de
type. Les variables simples et indicées peuvent se placer dans la même instruction.
- 25 -
- Langage de programmation : Fortran 77 -
dj peut spécifier soit la limite supérieure de l'indice, la limite inférieure étant 1 par défaut, soit les
limites inférieure et supérieure. La syntaxe d'une dimension est :
[ di ::] ds
di limite inférieure de l'indice,
ds limite supérieure de l'indice.
La limite inférieure de l'indice peut être négative, nulle ou positive. La limite supérieure de l'indice
doit être plus grande ou égale à la limite inférieure. Le nombre d'éléments d'une dimension est donné
par l'expression : ds - di + 1 . La limite supérieure du dernier indice peut être écrite par l'astérisque,
cette manière de procéder n'étant applicable qu'au dimensionnement dans les sous-programmes pour
des tableaux dont la dimension est fixée à un niveau supérieur.
Chaque limite est une expression arithmétique de type integer , dans laquelle chaque opérande
est une constante, un paramètre formel ou une variable d'un bloc common . L'instruction habituelle
fait mention des dimensions sous forme de constantes entières. VAX-11 admet des expressions de
type différent qui sont converties en type integer (hors norme). Le nombre total d'éléments pouvant se
stocker dans une variable de tableau est égal au produit des nombres d'éléments de chaque
dimension.
La spécification des dimensions de variables de tableaux dans un sous-programme peut être une
expression variable, voir chapitre 4 . L'identificateur de variable, avec ses dimensions, ne peut appa-
raître que dans une instruction de spécification dans l'unité de programme.
- 26 -
- 2.Expressions du langage Fortran 77 -
- 27 -
- Langage de programmation : Fortran 77 -
- 28 -
- 2.Expressions du langage Fortran 77 -
Dans cette dernière représentation, les éléments sont placées comme sur des pages.
Une expression FORTRAN se compose d'un ou de plusieurs opérandes reliés entre eux par des
opérateurs appropriés. Les expressions sont classées en :
1. expressions arithmétiques,
2. expressions chaînes de caractères,
3. expressions relationnelles,
4. expressions logiques.
- 29 -
- Langage de programmation : Fortran 77 -
Les expressions arithmétiques opèrent sur des données numériques, les expressions de type
caractère sur des valeurs de type character , les expressions logiques ou relationnelles produisent
des valeurs booléennes ou logical .
Tableau 2.2
OPÉRATEURS ARITHMÉTIQUES FORTRAN
La qualification numérique peut s'appliquer également aux valeurs logiques utilisées comme
valeurs entières dans une expression arithmétique, par exemple VAX-11 (hors norme). Les
opérateurs arithmétiques sont donnés dans le tableau 2.2 , classés par ordre de priorité.
Exemples :
2.0*tout-4.0*somme/nombre+0.1*reste
3.0*force*along**3/48.0
alarge*haut**2/6.0
Remarques :
1. Toute variable ou élément de variable indicée utilisé dans une expression arithmétique doit être
définie avant son évaluation dans cette expression. Si la variable n'a pas été affectée d'une valeur
numérique, cette variable vaut habituellement zéro sans que le programme signale une erreur. Si
une opération interdite intervient, comme par exemple une division par zéro, une erreur d'exé-
cution provoque l'arrêt du programme avec affichage d'un ou de plusieurs messages d'erreur.
2. Deux opérateurs arithmétiques ne peuvent pas se suivre : par exemple, l'écriture de a*-b est
incorrecte. Cette expression arithmétique doit s'écrire : a *(-b) .
3. En présence d'opérateurs de même priorité dans la même expression arithmétique, l'évaluation
numérique s'effectue de gauche à droite, sauf pour l'exponentiation qui est évaluée de droite à
gauche.
Exemple :
a**b**c est équivalent à : a**(b**c)
- 30 -
- 2.Expressions du langage Fortran 77 -
4. L'emploi de parenthèses peut modifier l'ordre d'évaluation d'une expression arithmétique. Une
expression avec parenthèses est calculée à partir de l'expression parenthésée la plus intérieure.
5. Il est recommandé de toujours vérifier le nombre de parenthèses gauches et le nombre de
parenthèses droites. Ces deux nombres doivent être égaux. Si l'on n'est pas très sûr de la syntaxe
d'une expression par priorité d'opérateurs, il est sage de parenthéser une expression arithmétique
un peu compliquée.
Tableau 2.3
NIVEAUX DES TYPES
Type Niveau
logical 1 (le plus bas)
integer*2 2
integer*4 3
real 4 4
real*4 4
double precision 5
real*8 5
complex*8 6
complex*16 7 (le plus haut)
Si tous les opérandes d'une expression arithmétique sont de même type, l'expression résultante
est également de ce type. Si les composantes sont de divers types, le résultat dépend du niveau
attribué à chaque type. En addition, soustraction, multiplication et division, le compilateur combine et
transforme les opérandes arithmétiques suivant le tableau 2.4 donnant les types du premier et du
second opérande, du résultat de l'opération effectuée.
Tableau 2.4
OPÉRATIONS ARITHMÉTIQUES
- 31 -
- Langage de programmation : Fortran 77 -
Remarques :
2.5.1.3 EXPONENTIATION
Les possibilités d'exponentiation des expressions arithmétiques sont limitées et données dans le
tableau 2.5.
Tableau 2.5
POSSIBILITÉS D'EXPONENTIATION EN FORTRAN
- 32 -
- 2.Expressions du langage Fortran 77 -
Remarques complémentaires :
Un opérande négatif peut être élevé seulement à une puissance entière. Un opérande valant zéro
ne peut pas être élevé à la puissance zéro. Si l'opérande est à élever à une puissance entière, pro-
grammez cet exposant en type integer plutôt qu'en type real .
2.5.2.1 CONCATÉNATION
La seule opération reconnue par FORTRAN , sur les opérandes de type character, est la conca-
ténation de chaînes, c'est-à-dire l'addition des suites de caractères. L'opérateur de concaténation est
la double barre oblique, sans espace.
Exemple :
nom//prenom//ville
identif ([prem]:[dern])
avec :
identif un identificateur de variable simple de type character,
un identificateur d'un élément de variable indicée de type character,
prem expression entière spécifiant la position la plus à gauche du premier caractère de la sous-
chaîne,
dern expression entière spécifiant la position la plus à droite du dernier caractère de la sous-
chaîne.
Les caractères de la variable ou de l'élément de la variable indicée chaîne de caractères sont
numérotés de gauche à droite, le premier caractère portant le numéro 1. Si les expressions pour prem
et dem ne sont pas de type integer, elles sont converties en type integer avant utilisation (VAX-11).
Les valeurs des expressions prem et dem doivent remplir les conditions suivantes :
1 <= prem <= dern <= len
len étant la longueur réelle de la chaîne attribuée à la variable ou à l'élément de tableau de type
character. Si la valeur prem est omise, prem = 1 par défaut et si la valeur dem est omise, alors dern =
len .
Exemples :
- 33 -
- Langage de programmation : Fortran 77 -
Tableau 2.6
OPÉRATEURS DE RELATION EN FORTRAN
- 34 -
- 2.Expressions du langage Fortran 77 -
longueurs différentes, l'opérande le plus court est étendu à la taille du plus long par adjonction de
caractères espace à droite.
Exemples de relations :
pomme+poire .gt. peche+orange
'abcdef' .lt. 'baba'
Dans le premier exemple, la relation est vraie si la somme des valeurs numériques affectées aux
variables pomme et poire est plus grande que la somme des valeurs affectées aux variables
peche et orange . Dans le cas contraire, le résultat de la relation est faux. Les variables utilisées
ici sont de type real en l'absence d'une déclaration particulière.
Dans le second exemple, la relation entre les deux constantes est vraie car une comparaison
caractère après caractère des deux chaînes montre que 'abcdef' possède le premier caractère
'a' qui précède le premier caractère 'b' de la seconde constante 'baba'.
Tableau 2.7
OPÉRATEURS LOGIQUES EN FORTRAN
Opérateurs logiques
Opérateur Exemples Signification
.and. a .and. b l'expression est vraie si et seulement
si a et b sont .true.
.or. a .or. b l'expression est vraie si soit a, soit
b, soit les deux sont .true.
.eqv. a .eqv. b l'expression est vraie si a et b ont
la même valeur logique, soit .true. ,
soit .false.
.neqv. a .neqv. b l'expression est vraie si a est .true.
et b est .false. ou vice versa; elle
est fausse si les deux opérandes ont
même valeur logique (= à .xor.)
.not. .not. b l'expression est vraie si b est .false.
ou elle est fausse si b est .true.
- 35 -
- Langage de programmation : Fortran 77 -
Tableau 2.8
PRIORITÉ DES DIVERS OPÉRATEURS FORTRAN
2.5.4.3 EXEMPLES
Les exemples partiels suivants montrent l'utilisation d'expressions logiques. L'utilisation de pa-
renthèses facilite très souvent la lecture de l'instruction.
Exemples :
a*b+c*abc .eq. x*y+dm/zz .and. .not. k*b .gt. tt
Cette instruction contenant plusieurs opérateurs logiques s'évalue selon la configuration suivante,
les parenthèses ayant été introduites pour montrer le principe du traitement de l'instruction. La partie
la plus parenthésée est calculée en premier :
(((a*b)+(c*abc)).eq.((x*y)+(dm/zz))).and.(.not.((k*b).gt.tt)
Dans certains cas, l'expression logique n'est pas entièrement évaluée si la condition logique
recherchée est déjà trouvée avant la fin des opérations sur l'instruction complète. Si dans l'exemple
qui suit a , variable logique, est affectée de la valeur .false. :
a .and. (f(x,y) .gt. 2.0) .and. b
- 36 -
- 2.Expressions du langage Fortran 77 -
alors la valeur de l'expression est déjà fixée par le test sur la valeur de a sans avoir à calculer la
valeur de la fonction f (x,y) ; ainsi, le sous-programme function f (x,y) n'est pas du tout appelé.
Exemple supplémentaire :
Le programme partiel suivant démontre l'utilisation des opérateurs logiques.
*
* Expressions logiques
*
logical stop , va , attend , a , b , c , d , e
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
*
* Les 2 instructions suivantes sont équivalentes
*
stop = a .and. b .and. c
stop = (a .and. b) .and. c
*
* Les 2 instructions suivantes sont aussi équivalentes
*
va = .not. a .or. b .and. c
va = ((.not. a) .or. b) .and. c
*
* Les 2 instructions suivantes sont aussi équivalentes
*
attend = .not. a .eqv. b .or. c .neqv. d .and. e
attend = ((.not. a) .eqv. (b .or. c)) .neqv. (d .and. e)
- 37 -
CHAPITRE 3
INSTRUCTIONS DE BASE
Ce chapitre traite des instructions de base du langage FORTRAN permettant de créer les struc-
tures séquentielles, sélectives et itératives. Les instructions nécessaires à la structuration des sous-
programmes et les vastes possibilités d'opérations en entrée - sortie (E/S ou en anglais I/O pour input
- output) seront décrites dans les deux chapitres 4 et 5 .
Une partie de programme à structure séquentielle est une suite d'instructions FORTRAN traitée
ligne après ligne, sans sauts ni répétitions. L'un des reproches fait au langage est l'utilisation abusive
de branchements et d'étiquettes afin d'atteindre des instructions déterminées dans le programme.
Dans les exemples de ce cours, nous voulons essayer de supprimer cette ancienne tradition en
décomposant le programme en tâches distinctes et en évitant les étiquettes.
- 38 -
- 3. Instructions de base en Fortran 77 -
Exemple :
character*(*) granmo
parameter (granmo = 'anticonstitionnellement')
var = expr
avec :
var une variable simple ou un élément de variable indicée, de type numérique,
expr une expression arithmétique.
- 39 -
- Langage de programmation : Fortran 77 -
Le caractère = placé entre var et expr ne signifie pas du tout "égal à" au sens mathématique
usuel, mais veut dire : affecte à la variable var la valeur de l'expression arithmétique expr .
Pour que la variable var puisse être affectée correctement, il faut que tous les opérandes de l'ex-
pression expr soient définis au moment de l'évaluation. Si la valeur de l'expression est du même
type que la variable à affecter, l'instruction transmet immédiatement cette valeur. Par contre, si
l'expression est d'un type différent comme c'est très souvent le cas, l'expression est tout d'abord
calculée suivant les règles données précédemment, puis transformée ensuite dans le type de la
variable à affecter et finalement transmise à var . La valeur de l'expression arithmétique doit pouvoir
se représenter dans le type adopté pour var . Le tableau 3.1 donne les règles de transformation pour
les types fondamentaux du langage.
Tableau 3.1
RÈGLES DE CONVERSION DANS L'AFFECTATION ARITHMÉTIQUE
integer Transforme PR
Assigne E Transforme E Transforme E de E en entier
ou à V en entier et en entier et
logical et affecte à V ;
assigne à V assigne à V PI et E est perdue
- 40 -
- 3. Instructions de base en Fortran 77 -
Exemples :
complex*8 correc,rare
.....
correc = (0.12324,5.56789)
rare = (987.654,1.3579E4)
varl = exprl
avec :
varl une variable ou un élément de tableau de type logical,
exprl une expression logique.
La variable ou l'élément de tableau, situé à gauche du caractère = doit être absolument de type
logical . Tous les opérandes de l'expression logique doivent être définis avant l'évaluation logique.
Exemples :
logical logi,lmax,lpage
integer*2 job
real*4 a,b,c
.....
lpage = .true.
logi = job .gt. 100 .and. .not. lpage
lmax = (a .lt. b) .or. ((a .gt. b) .and. (a .le. c))
En complément de cette programmation, certaines paires de parenthèses ont été introduites dans
le dernier exemple afin de faciliter la lecture des conditions logiques.
vara = expra
avec :
vara une variable, un élément de tableau ou une sous-chaîne de type character,
expra une expression de type character.
Si la longueur de l'expression est plus grande que celle de la variable, l'expression est tronquée à
droite. Si la longueur est plus courte que celle de la variable, l'expression est complétée par des
blancs ou espaces à droite. L'expression doit être de type alphanumérique. Il n'est pas possible d'af-
fecter une valeur numérique directement à une variable, un élément de tableau ou une sous-chaîne
de type character sans effectuer une conversion de type. L'utilisation des sous-chaînes permet d'af-
fecter une partie seulement de la chaîne complète.
Exemples :
Le premier exemple affecte les identificateurs des notes de la gamme et modifie la note « do » en
« ut ». Le deuxième exemple enregistre toutes les lettres de l’alphabet en minuscules. Il modifie
ensuite la suite par deux affectations successives.
- 41 -
- Langage de programmation : Fortran 77 -
*
* Exemple 2
* Affectation d'une chaîne de caractères
* et modification de cette chaîne
*
program exem02
character*24 gamme
*
gamme = 'do re mi fa sol la si do'
print *,'La gamme complète est : ',gamme
gamme(1:2) = 'ut'
gamme(23:24) = gamme(1:2)
print *,'La nouvelle gamme est : ',gamme
end
Résultat de l'exécution du programme :
La gamme complète est : do re mi fa sol la si do
La nouvelle gamme est : ut re mi fa sol la si ut
L'instruction print utilisée ici permet d'afficher des données à l'écran : constantes alphanumé-
riques ou numériques, variables de types divers.
L'affectation de caractères à une sous-chaîne, à partir de la même variable, s'effectue caractère
après caractère. Si les deux termes à gauche et à droite de l'affectation traitent les mêmes caractères,
il est certain qu'il y ait quelques problèmes de transmission correcte de ces caractères. L'exemple
suivant montre précisément ce genre d'opération sur des sous-chaînes de la même variable.
*
* Exemple 3
* Affectation d'une chaîne de caractères
* et modification partielle de la chaîne
*
program exem03
character*26 alfab
*
alfab = 'abcdefghijklmnopqrstuvwxyz'
print *,'Alphabet initial : ',alfab
alfab(7:10) = alfab(9:12)
print *,'Alphabet modifié : ',alfab
alfab(7:10) = alfab(6:9)
print *,'Alphabet modifié : ',alfab
end
- 42 -
- 3. Instructions de base en Fortran 77 -
read *, liste
avec :
* signifie unité de lecture par défaut : -----> actuellement le clavier.
liste liste des variables spécifiant l'ordre d'affectation des valeurs numériques et/ou des chaînes
de caractères. Les variables sont séparées les unes des autres par la virgule. La liste peut
contenir :
- un identificateur d'une variable,
- une référence à un élément de variable indicée,
- un identificateur de variable indicée,
- une référence à une sous-chaîne de caractères,
- une boucle do implicite contenant seulement les éléments cités ci-dessus.
L'exécution de l'ordre read provoque la lecture des données frappées au clavier et leur affecta-
tion successive aux entités citées dans la liste. Les valeurs entrées au clavier doivent être séparées
les unes des autres par une virgule ou par un espace. Une chaîne de caractères doit être encadrée
par des apostrophes, ce qui est très ennuyeux en pratique. Chaque constante introduite doit être du
même type que la variable devant recevoir la donnée.
Exemple :
integer annee
character*10 mot,lot
.....
read *,annee,mot,lot
A l'exécution de cette instruction de lecture, le programme attend l'introduction d'une constante
entière qui sera affectée à la variable annee , deux chaînes de caractères qui seront transférées dans
les variables mot et lot , chaque chaîne pouvant contenir jusqu'à 10 caractères. L'obligation de pla-
cer des apostrophes en début et fin des chaînes de caractères est peu favorable à l'entrée simple des
données. Il est possible de modifier légèrement l'instruction de lecture afin d'éviter cet inconvénient.
Les données logiques doivent également s'introduire correctement en lecture. La syntaxe pour la lec-
ture d'une donnée de type chaîne de caractères se transforme en :
- 43 -
- Langage de programmation : Fortran 77 -
Avec cette instruction, la chaîne de caractères peut s'écrire normalement, en oubliant la syntaxe
des constantes de type character, c'est-à-dire sans les apostrophes d'encadrement.
Si la donnée est de type logical , remplacez a par lc , c étant un entier positif fixant le nom-
bre de caractères à lire. Dans ce cas, le premier caractère T ou t de la chaîne frappée au clavier
affecte la valeur logique .true. à la variable logique de la liste, ou le premier caractère F ou f affecte
la valeur logique .false. , les autres caractères n'ayant aucune signification.
Exemple :
logical ljuste
.....
read (*,'(l4)') ljuste
Recommandations :
1. Toute entrée de données au clavier sera accompagnée d'un texte apparaissant à l'écran citant les
valeurs à introduire et si nécessaire, leur type.
2. Le nombre de données à introduire par ligne sera limité à des valeurs de même type. Evitez de
proposer des données de types mélangés.
3. La meilleure des méthodes consiste à introduire une seule donnée par ligne avec affichage en
clair de la fonction de cette donnée.
print *, liste
avec :
* unité de sortie par défaut : -----> l'écran de l'utilisateur,
liste une liste d'identificateurs de variables numériques ou alphanumériques, d'éléments de
variables indicées ou de constantes.
La liste peut contenir des expressions quelconques, le plus souvent des variables de type quel-
conque ou des chaînes de caractères. L'instruction permet l'affichage des données citées dans des
zones successives d'une même ligne, ou plus si la ligne à afficher est trop longue. Chaque instruction
print imprime une nouvelle ligne. Cette instruction est peu efficace et s'utilisera dans les affichages
simples et les premiers exemples. Le chapitre 5 traite plus en détail l'instruction d'écriture write avec
ses diverses possibilités.
Exemple :
*
* Exemple 4
* Lecture de deux valeurs réelles
* Affichage de chaque valeur, de son quintuple et de son quart
*
program exem04
real*4 val1,val2
*
print *,'Donnez deux valeurs réelles quelconques :'
read *,val1,val2
*
print *
print *,'Résultat pour la première valeur :'
print *,val1,5.0*val1,val1/4.0
print *,'Résultat pour la seconde valeur :'
print *,val2,5.0*val2,val2/4.0
print *
*
- 44 -
- 3. Instructions de base en Fortran 77 -
end
continue
C'est une instruction exécutable, mais sans effet sur les données du programme. Elle s'utilise prin-
cipalement comme instruction de fin de boucle do , même si la dernière instruction exécutable de la
fin de boucle n'est pas une instruction prohibée par cette structure. Elle est alors accompagnée d'une
étiquette.
Exemple :
do 10 i=1,10
a(i)=0.0
10 continue
end
Dans le programme principal, cette instruction termine l'exécution du programme. Dans un sous-
programme, l'instruction remplit deux fonctions :
1. fin de l'unité de programme,
2. correspond à l'instruction return .
L'instruction end indique au compilateur la fin de la traduction en langage machine.
pause [ n ]
- 45 -
- Langage de programmation : Fortran 77 -
avec :
n une constante de type character ou une constante entière de 0 à 99999.
L'instruction provoque l'affichage d'un message au terminal, dépendant du compilateur, mais con-
tenant en tout cas le mot pause . Si l'argument n est présent, il est affiché à l'écran. Pour poursuivre
le programme, il suffit de presser sur la touche <RET> dans la plupart des implémentations. Le pro-
gramme continue alors à l'instruction exécutable suivant immédiatement l'instruction pause.
Exemple :
Ce programme affiche des nombres entiers de 1 à une valeur choisie librement par l'utilisateur et
calcule la racine carrée de ce nombre en introduisant les deux fonctions sqrt et float de la librairie
FORTRAN .
*
* Exemple 5
* Ce programme calcule et affiche des nombres entiers
* entre 1 et une valeur choisie par l'utilisateur
* en bloc de 20 valeurs avec arrêt du programme
*
program exem05
intrinsic float,sqrt
integer*4 i,icompt,inomb
real*4 anomb,racine
*
icompt=0
*
print *,'Donnez un nombre réel positif :'
read *,anomb
inomb = anomb
*
print *
do 10 i=1,inomb
racine = sqrt(float(i))
write (*,'(1x,a,i5,a,f10.5)')
+ 'La racine carrée de ',i,' est : ',racine
icompt = icompt+1
if ((icompt .eq. 20) .and. (i .ne. inomb)) then
print *
pause 'Veuillez presser sur <RET>'
print *
icompt = 0
end if
10 continue
*
end
etc.
- 46 -
- 3. Instructions de base en Fortran 77 -
Dans cet exemple, l'écriture du texte s'effectue au moyen de l'instruction write accompagnée
d'une mise en forme. Cette mise en forme est donnée par une constante chaîne de caractères dans
laquelle :
1x saut du caractère de contrôle
a texte alphanumérique
i5 écriture d'une entité de type integer dans 5 colonnes
f10.5 écriture d'une entité réelle dans 10 colonnes, virgule fixe, avec 5 décimales.
stop [ n ]
avec :
n une constante de type character ou une constante entière de 0 à 99999.
Le programme s'arrête à l'exécution de cette instruction et affiche la constante si elle présente.
Cette possibilité s'introduit très souvent dans le développement du programme afin de repérer l'endroit
d'un arrêt d'exécution fautive. Il n'est pas recommandé d'utiliser cette instruction dans un programme
définitif.
Exemple :
real*4 a,b
.....
read *,a,b
if (a .lt. b) stop 'a est inférieur à b'
b = b-1.0
if (a .eq. b) stop 'a est égal à b'
Les instructions d'un programme FORTRAN sont exécutées ligne après ligne. Il est souvent dési-
rable de pouvoir rompre le déroulement séquentiel d'un programme au moyen d'ordres de contrôle. Il
existe deux catégories d'ordres de contrôle :
1. Ruptures de séquence inconditionnelles,
2. Ruptures de séquence conditionnelles.
Ces instructions nécessitent la présence d'étiquettes, entité que nous voulons si possible laisser
de côté. Dans les exemples qui vont suivre et qui démontrent l'emploi de ces instructions, nous de-
vrons introduire malheureusement des instructions avec étiquette. Il est possible de modifier ces
structures afin de les adapter au style actuel de programmation, c'est-à-dire d'éviter des sauts intem-
pestifs lors du déroulement du programme.
- 47 -
- Langage de programmation : Fortran 77 -
3.2.1.1 GO TO INCONDITIONNEL
Cette instruction transfère l'exécution du programme vers l'instruction portant le numéro d'éti-
quette spécifié. La syntaxe est :
go to etiq
avec :
etiq une constante entière, comprise entre 1 et 99999, correspondant à l'étiquette d'une instruction
exécutable dans la même unité de programme.
Le déroulement du programme s'effectue de la ligne contenant l'instruction go to etiq à la ligne
débutant par l'étiquette etiq . Cette instruction peut aussi s'écrire en un seul mot : goto .
Exemples :
go to 55
.....
go to 875
Attention ! deux instructions go to ne peuvent pas se suivre dans l'unité de programme. Evitez
cette instruction et contrôlez dans tous les cas que le saut inconditionnel n'engendre pas une boucle
fermée sans issue de sortie.
3.2.1.2 GO TO IMPOSÉ
Deux instructions au moins sont nécessaires pour former cette structure de saut : l'affectation d'un
identificateur à une étiquette et l'instruction d'utilisation du saut.
L'instruction assign relie une variable de type integer*4 avec une étiquette de la même unité de
programme, permettant d'introduire un identificateur alphanumérique dans l'instruction go to plutôt
qu'une étiquette numérique. La syntaxe est :
go to ivar [ [ , ] ( eliste ) ]
avec :
ivar une variable de type integer*4,
eliste une liste d'une ou de plusieurs étiquettes d'instructions exécutables, séparées par la virgule,
placées entre parenthèses, dans la même unité de programme. Cette liste décorative n'a pas
d'influence sur le déroulement du programme.
Exemple :
*
* Exemple 6
* Utilisation de trois instructions d'assignement d'identificateurs
* d'étiquette et sauts dans le programme
*
program exem06
integer*4 erreur,fini,itexte,nombre
*
- 48 -
- 3. Instructions de base en Fortran 77 -
assign 20 to itexte
assign 30 to erreur
assign 9999 to fini
*
10 print *
print *,'Introduisez :'
print *,'- un nombre entier compris entre 1 et 100'
read *,nombre
*
if ((nombre .lt. 1) .or. (nombre .gt. 100)) go to erreur
*
print *,'Merci pour votre participation !'
go to fini
*
20 format (i5,' n''est pas compris entre 1 et 100')
30 print itexte,nombre
go to 10
*
9999 end
Résultat de l'exécution du programme :
Introduisez :
- un nombre entier compris entre 1 et 100
123
123 n'est pas compris entre 1 et 100
Introduisez :
- un nombre entier compris entre 1 et 100
58
Merci pour votre participation !
3.2.1.3 GO TO CALCULÉ
L'instruction go to calculé transfère le déroulement du programme vers l'une des instructions à
étiquette selon la valeur prise par une expression arithmétique de type integer. La syntaxe est :
- 49 -
- Langage de programmation : Fortran 77 -
intrinsic mod
integer*4 nombre,npair
character*1 rep
*
10 print *
print *,'Entrez un nombre entier :'
read *,nombre
npair = mod(nombre,2)
*
go to (20,30) npair+1
*
20 print *,nombre,' est un nombre pair.'
go to 40
30 print *,nombre,' est un nombre impair.'
*
40 print *
print *,'Encore un nombre (o/n) ?'
read (*,'(a1)') rep
if ((rep .eq. 'o') .or. (rep .eq. 'O')) go to 10
*
end
Résultat de l'exécution du programme :
Entrez un nombre entier :
1234
1234 est un nombre pair.
La fin d'une séquence d'instructions impose un saut dans le programme, action réalisée généra-
lement par une instruction go to inconditionnel.
- 50 -
- 3. Instructions de base en Fortran 77 -
if (iexpr) 10,20,30
10 { instructions de la séquence 1 si iexpr < 0 }
go to 40
20 { instructions de la séquence 2 si iexpr = 0 }
go to 40
30 { instructions de la séquence 3 si iexpr > 0 }
40 { suite des instructions du programme ... }
- 51 -
- Langage de programmation : Fortran 77 -
IF ( lexpr ) instr
avec :
lexpr une expression de type logical ,
instr une instruction exécutable FORTRAN , sauf l'une des instructions suivantes :
- boucle do ,
- end ou end do,
- bloc if . . . , else if , else , end if ,
- une autre instruction if . . . logique.
L'expression logique, placée entre parenthèses, est tout d'abord évaluée. Si la valeur de l'expres-
sion logique est .true. , l'instruction instr est exécutée. Par contre, si l'expression logique est .false.
, le programme continue à la ligne suivante sans exécution de l'instruction proposée.
Cette instruction est à utiliser chaque fois que la structure sélective offre un seul choix possible.
L'instruction ne comprend jamais le mot then .
Exemples :
if (i .gt. 3) j = j+1
if (j .lt. 100) print *,'La valeur de j est inférieure à 100'
- 52 -
- 3. Instructions de base en Fortran 77 -
then écrite sur une nouvelle ligne est une instruction complémentaire optionnelle. La séquence j qui
suit cette instruction est exécutée si l'expression logique exprj prend la valeur .true. et si aucun
bloc précédent n'a été exécuté. L'instruction else , placée seule sur une nouvelle ligne, est aussi une
instruction optionnelle. La séquence suivant cette instruction est exécutée seulement si aucun autre
bloc if le précédent n'a été exécuté. Aucune autre instruction if . . . ou bloc if ne peut suivre cette
dernière séquence. La dernière instruction de la structure doit être : end if .
Lorsque la dernière instruction d'un bloc est exécutée, le déroulement du programme continue à
l'instruction suivant end if . En conséquence, un seul bloc if . . . est exécuté chaque fois.
Le transfert d'exécution du programme de l'extérieur vers un bloc if , c'est-à-dire vers une instruc-
tion étiquetée d'une séquence n'est pas autorisée. Nous voulons éviter toute utilisation d'étiquettes
dans cette structure. La forme générale peut se décrire par la configuration suivante :
if (a .gt. b) then
séquence 1
else if (a .gt. c) then
séquence 2
else if (a .gt. d) then
séquence 3
else
séquence 4
end if
L'écriture de cet exemple général montre le principe de la disposition des diverses séquences
d'instructions. Il est vivement recommandé d'utiliser l'indentation dans l'écriture des instructions afin de
faciliter la lecture et la compréhension du programme.
- 53 -
- Langage de programmation : Fortran 77 -
La séquence 1 d'instructions comprend toutes les instructions comprises entre la ligne if ( expr )
then et la ligne contenant else . La séquence 2 d'instructions part après la ligne else et se termine
avant la ligne de fin de bloc avec end if . Si l'expression expr prend la valeur logique .true. , la
séquence 1 est exécutée, sinon c'est la séquence 2 qui est prise en compte. La configuration générale
est :
if ( expr ) then
séquence 1
else
séquence 2
end if
Cette structure permet d'effectuer un choix en fonction de la valeur prise par l'expression logique.
- 54 -
- 3. Instructions de base en Fortran 77 -
if ... then , la séquence 3 entre le second else if ... then et else , la séquence 4 entre else et end
if .
Remarque importante :
Un seul bloc est évalué et comme l'instruction else est présente, le choix porte sur les tests suc-
cessifs des expressions, sinon le programme se déroule dans la séquence 4 .
- 55 -
- Langage de programmation : Fortran 77 -
Ce programme introduit d'une façon systématique les blocs if ... et déclare toutes les variables
utilisées.
*
* Exemple 8
* Equation du second degré : a x**2 + b x + c = 0
* Variables utilisées :
* a,b,c coefficients et constante de l'équation primitive
* bsur2a b divisé par 2 a
* csura c divisé par a
* discr discriminant : b**2-c
* racine racine carrée du discriminant
*
* Fonctions arithmétiques :
* sqrt racine carrée
* abs valeur absolue
*
program exem08
intrinsic abs,sqrt
real*4 a,b,c
real*4 bsur2a,csura,discr,racine
*
print *
print *,' EQUATION DU SECOND DEGRE'
print *;' a x**2 + b x + c = 0 .'
print *
print *,'Donnez les coefficients et constante a,b,c'
read *,a,b,c
*
* Bloc extérieur avec test de la valeur du coefficient a
*
if (a .ne. 0.0) then
bsur2a=0.5*b/a
csura=c/a
discr=bsur2a**2-csura
racine=sqrt(abs(discr))
*
* Solution de l'équation du second degré
*
if (discr .gt. 0.0) then
print *,'Deux racines réelles distinctes'
print *,'x1 =',-bsur2a+racine
print *,'x2 =',-bsur2a-racine
else if (discr .eq. 0.0) then
print *,'Deux racines réelles égales'
print *,'x1 = x2 =',-bsur2a
else
print *,'Deux racines complexes conjuguées'
print *,'x1 =',-bsur2a,' + j *',racine
print *,'x2 =',-bsur2a,' - j *',racine
end if
*
* Fin du premier ensemble des blocs intérieurs
* Calcul de l'équation du premier degré
* Nouvel ensemble de blocs intérieurs
*
- 56 -
- 3. Instructions de base en Fortran 77 -
else
if (b .ne. 0.0) then
print *,'L''équation est du premier degre'
print *,'x1 =',-c/b
else
print *,'L''équation est indeterminée'
end if
*
* Fin du second ensemble intérieur
*
end if
*
* Fin de l'ensemble extérieur
* Fin du programme
*
end
- 57 -
- Langage de programmation : Fortran 77 -
Le langage FORTRAN reconnaît deux structures itératives, la première avec un compteur d'ité-
rations, la seconde, hors norme ANSI, mais très utile, de genre tant qu'une condition est remplie,
exécute une séquence d'instructions.
end do
L'ensemble des instructions, débutant par l'instruction do ... et se terminant par l'instruction à
étiquette ou end do , fait partie de la structure de la boucle do .
- 58 -
- 3. Instructions de base en Fortran 77 -
- 59 -
- Langage de programmation : Fortran 77 -
do 10 i=1,5
do 10 j=1,5
v(i,j)=0.0
do 10 k=1,5
v(i,j)=v(i,j)+x(k,j)
10 continue
Il est possible de sortir d'une boucle do par une instruction de rupture de séquence. Par contre, il
est interdit d'entrer dans une boucle do par une autre instruction que celle contenant l'initialisation do
Certains compilateurs (DOMAIN et VAX-11) lèvent cette interdiction et comprennent la version dite à
boucle étendue. Il est alors possible de transférer le déroulement du programme vers l'extérieur de la
boucle do , et, postérieurement de revenir dans la même boucle do . Dans ce cas, il est interdit d'uti-
liser la variable de contrôle ou les expressions dans la partie extérieure de la boucle do . Ce mode de
programmation est à éviter à moins de réutiliser une ancienne version d'un programme FORTRAN
sans vouloir apporter de modifications.
*
* Exemple 9
* Introduction de nombres réels, au maximum 100 nombres
* Classement en ordre croissant et calcul de la moyenne
*
program exem09
integer*2 i,j,nombre
real*4 prov,somme,valeur(100)
*
print *
print *,'DETERMINATION D''UNE MOYENNE ARITHMETIQUE'
print *
print *,'Donnez la quantité de nombre à traiter (<=100)'
read *,nombre
*
print *
print *,'Introduisez des nombres réels quelconques'
print *
do i=1,nombre
write (*,'(5x,a,i4,a,$)') 'Nombre numéro :',i,' = '
read *,valeur(i)
end do
*
* Rangement en ordre croissant
*
do i=1,nombre-1
do j=i+1,nombre
if (valeur(i) .gt. valeur(j)) then
prov = valeur(i)
valeur(i) = valeur(j)
valeur(j) = prov
end if
end do
- 60 -
- 3. Instructions de base en Fortran 77 -
end do
*
* Calcul de la somme et de la moyenne, affichage des résultats
*
print *
print *,'Valeurs rangées en ordre croissant'
print *
somme = 0.0
do i=1,nombre
somme = somme + valeur(i)
write (*,'(5x,a,i4,a,f12.4)')
+ 'Valeur classée numéro :',i,' = ',valeur(i)
end do
print *
write (*,'(5x,a,f12.4)') 'Moyenne arithmétique :',somme/nombre
*
end
*
* Exemple 10
* Affectation d'un tableau par data
* Utilisation de la boucle do implicite
*
program exem10
integer*2 i,j,mat(5,5)
*
data ((mat(i,j), j=1,1), i=1,5) /5*11/
data ((mat(i,j), j=2,2), i=1,5) /5*22/
data ((mat(i,j), j=3,3), i=1,5) /5*33/
data ((mat(i,j), j=4,4), i=1,5) /5*44/
data ((mat(i,j), j=5,5), i=1,5) /5*55/
*
do i=1,5
print *,(mat(i,j), j=1,5)
end do
*
end
- 61 -
- Langage de programmation : Fortran 77 -
11 22 33 44 55
11 22 33 44 55
11 22 33 44 55
11 22 33 44 55
11 22 33 44 55
Remarque : Dans le cas particulier, l'affectation par data s'effectue colonne après colonne. Il est
aussi possible de simplifier l'affectation en programmant l'instruction suivante :
- 62 -
- 3. Instructions de base en Fortran 77 -
*
* Exemple 11 a
* Introduction d'un nombre entier positif
* Calcul de la somme des nombres et des carrés
*
program exem11
integer*4 carre,nombre,somme
character*1 rep
*
data rep /'o'/
*
do while ((rep .eq. 'o') .or. (rep .eq. 'O'))
print *
print *,'Donnez un nombre entier positif (<=500) :'
read *,nombre
somme = 0
carre = 0
do i=1,nombre
somme = somme + i
carre = carre + i*i
end do
print *
print *,'La somme des entiers vaut :',somme
print *,'La somme des carrés vaut : ',carre
print *
print *,'Encore une valeur (o/n) ?'
read (*,'(a1)') rep
end do
*
end
Si le compilateur n'admet pas cette structure itérative, il est possible d'obtenir le même résultat au
moyen d'une structure sélective avec étiquette. Le même programme aurait alors les instructions
suivantes:
*
* Exemple 11 b
* (variante sans do while et end do)
* Introduction d'un nombre entier positif
* Calcul de la somme des nombres et des carrés
*
program exem11
integer*4 carre,nombre,somme
logical*2 lcontr
character*1 rep
*
- 63 -
- Langage de programmation : Fortran 77 -
- 64 -
CHAPITRE 4
SOUS-PROGRAMMES FORTRAN-77
La figure montre la configuration générale d'un programme comportant cinq tâches distinctes,
atteintes à partir d'un menu principal, chaque tâche pouvant se décomposer en sous-tâches. En plus
de cette organisation à divers niveaux, le programme comprend également des procédures utilisables
dans chaque tâche comme par exemple les gestions d'écran ou des périphériques. Lors de l'appel
d'un sous-programme, le déroulement du programme passe de l'instruction d'appel à l'unité du sous-
programme, puis le contrôle d'exécution retourne à l'instruction d'appel s'il s'agit d'une fonction, ou à
l'instruction qui suit l'instruction d'appel dans le cas d'une procédure.
Le langage FORTRAN distingue les sous-programmes suivants :
1. fonctions de la librairie du langage;
2. les fonctions-formules dites uni-instructions,
3. les procédures de type subroutine;
4. les fonctions type function créées par le programmeur;
5. l'unité de déclaration block data.
A cette collection de sous-programmes s'ajoute quelques instructions de gestion de la mémoire
permettant le transfert des données.
- 65 -
- Langage de programmation : Fortran 77 -
- 66 -
4. Sous-programmes en Fortran 77 -
La fonction exponentielle possède l'identificateur général (generic) exp applicable aux types :
real*4 , real*8 , complex*8 et complex*16 . Si l'on désire limiter le champ d'application de l'identi-
ficateur à un type particulier, il faut alors programmer :
int(3.14159) donne 3
real(100) donne 100.0
Dans ce dernier cas, la fonction spécifique pour convertir une donnée de type integer*2 ou inte-
ger*4 en donnée real*4 serait float(100)).
- 67 -
- Langage de programmation : Fortran 77 -
1. Valeur absolue
Retourne la valeur absolue de l'expression : abs ( e )
Exemple :
abs(-7.85) donne 7.85
Cette fonction s'applique également aux grandeurs de type complex .
2. Troncature
Retourne dans la même précision que l'expression, la partie entière de l'expression real ou dou-
ble precision : aint ( e )
Exemples :
aint(4.278) donne 4.0
aint(-12.768) donne -12.0
3. Arrondi
Arrondit l'expression de type real ou double precision en conservant l'entier le plus proche de
même type : anint ( e )
Exemples :
anint(4.98) donne 5.0
anint(-4.87) donne -5.0
L'arrondi peut aussi s'effectuer, avec transformation de type, sur des expressions de type real ou
double precision, le résultat étant de type integer : nint ( e ) .
Exemples :
nint(3.897) donne 4
nint(7.345D01) donne 73
4. Reste de la division
Retourne le reste de la division entière de a par b (modulo); cette fonction possède deux argu-
ments qui peuvent être de type integer, real ou double precision : mod ( a , b ) avec b # 0 . Le
calcul effectué est : a - int ( a / b ) * b .
Exemples :
mod(5,3) donne 2
mod(5.0,3.0) donne 2.0
Les deux arguments doivent être de même type.
5. Transfert de signe
Retourne la valeur de a affectée du signe de b , soit : | a | si b > 0 ou encore -| a | si b < 0 :
sign ( a , b ) .
Exemples :
sign(5,-2) donne -5
sign(5.0,-2.0) donne -5.0
- 68 -
4. Sous-programmes en Fortran 77 -
Les deux arguments doivent être de même type : integer, real ou double precision, le résultat
étant de même type que les arguments.
6. Différence positive
Cette fonction retourne : a - b si a > b et 0 si a <= b : dim ( a , b )
Exemples :
dim(9,4) donne 5
dim(7.0,9.0) donne 0.0
Les deux arguments doivent être de même type : integer, real ou double precision, le résultat
étant de même type que les arguments.
aimag ( e ) retourne la partie imaginaire en type real d'une expression de type complex .
conjg ( e ) retourne la valeur complexe conjuguée de type complex d'une expression en
complexe.
abs ( e ) retourne la valeur de type real du module de l'expression de type complex , soit :
si eRe et eIm sont les parties réelles et imaginaires de l'expression primitive
alors :
abs (eRe,eIm) donne sqrt (eRe**2 + eIm**2) .
Pour les expressions de type complex*16, voir les fonctions données dans la tableau 4.2.
1. Racine carrée
Retourne la racine carrée de l'expression de type real, double precision ou complex : sqrt ( e )
avec e >= 0 ou complex .
- 69 -
- Langage de programmation : Fortran 77 -
Lorsque e est de type complex , sqrt ( e ) retourne la racine quand la partie réelle est plus
grande que zéro ou, si cette dernière est nulle, la racine de la partie imaginaire si cette dernière est
plus grande que zéro.
Exemple :
sqrt(25.0) donne 5.0
2. Fonction exponentielle
Retourne l'exponentielle à la puissance e , où e est une expression de type real, double preci-
sion ou complex : exp ( e )
Exemple :
exp(1.0) donne 2.718282
3. Logarithme naturel
Retourne la valeur du logarithme naturel de l'expression de type real, double precision ou com-
plex : log ( e )
Exemple :
log(1.0) donne 0.0
L'expression doit être positive et différente de zéro. Lorsque l'expression est de type complex ,
log ( exprcompl ) retourne la valeur principale, celle dont la partie imaginaire est inférieure à pi en
module.
4. Logarithme décimal
Retourne la valeur du logarithme décimal de l'expression de type real, ou double precision :
log10 ( e )
Exemple :
log10(10.0) donne 1.0
L'expression doit être positive et différente de zéro.
1. Fonctions trigonométriques
Les fonctions trigonométriques fondamentales à disposition sont sinus, cosinus et tangente. Ces
fonctions utilisent des arguments de type real, double precision ou complex . Les identificateurs de
ces fonctions sont :
sin ( e ) pour le sinus de l'expression,
cos ( e ) pour le cosinus de l'expression
tan ( e ) pour la tangente de l'expression.
Exemples :
pi=3.141593
sin(0.5*pi) donne 1.0
cos(pi) donne -1.0
tan(0.25*pi) donne 1.0
- 70 -
4. Sous-programmes en Fortran 77 -
1. Fonctions hyperboliques
Les fonctions hyperboliques à disposition sont :
sinh ( e ) pour le sinus hyperbolique,
cosh ( e ) pour le cosinus hyperbolique,
tanh ( e ) pour la tangente hyperbolique de l'expression.
Exemples :
sinh(1.0) donne 1.175201
cosh(1.0) donne 1.543081
tanh(1.0) donne 0.761594
1. Longueur de la chaîne
L'argument de cette fonction est de type character et le résultat de type integer . Cette fonction
compte le nombre de caractères contenu dans la chaîne. L'identificateur de cette fonction est :
len ( chaine_de_caractères )
- 71 -
- Langage de programmation : Fortran 77 -
- 72 -
4. Sous-programmes en Fortran 77 -
Tableau 4.1
FONCTIONS UTILITAIRES GÉNÉRALES : CONVERSION ET CHOIX
- 73 -
- Langage de programmation : Fortran 77 -
Tableau 4.2
FONCTIONS SUR LES EXPRESSIONS COMPLEXES
Tableau 4.3
FONCTIONS MATHÉMATIQUES GÉNÉRALES
Tableau 4.4
FONCTIONS TRIGONOMÉTRIQUES ET HYPERBOLIQUES
1. Fonctions trigonométriques
- 74 -
4. Sous-programmes en Fortran 77 -
2. Fonctions hyperboliques
Tableau 4.5
FONCTIONS COMPLÉMENTAIRES
- 75 -
- Langage de programmation : Fortran 77 -
Tout programme FORTRAN se compose au moins d'une unité de programme constituée par le
programme principal et optionnellement d'unités supplémentaires sous forme de sous-programmes :
subroutine , function ou block data . Chaque unité de programme peut se compiler séparément
sans tenir compte de sa position définitive dans le programme exécutable. La liaison entre les diver-
ses unités de programme est réalisée soit par l'intermédiaire des listes de paramètres, nommés aussi
arguments, soit par des définitions de zones communes de stockage des données en mémoire.
Les sous-programmes FORTRAN ne sont pas récursifs, c'est-à-dire qu'ils ne peuvent pas s'appe-
ler eux-même, ni directement, ni indirectement. Le sous-programme ne devient actif qu'au moment de
son appel à partir d'une autre unité de programme. Comme les sous-programmes généraux de type
subroutine ou function sont écrits une fois pour toute, les identificateurs des variables utilisées dans
ces procédures et fonctions ne sont pas nécessairement les mêmes que ceux de l'unité de program-
me appelante. Les données sont transférées de l'unité d'appel vers le sous-programme et vice versa
selon des règles strictes traitées dans ce sous-chapitre. Toute unité de programme commence à la
première instruction exécutable et tout programme débute à la première instruction exécutable du pro-
gramme principal, cette unité pouvant comporter une instruction program .
- 76 -
4. Sous-programmes en Fortran 77 -
- 77 -
- Langage de programmation : Fortran 77 -
paramètre effectif constitué par une constante ou une expression, ne peut pas subir de modification
dans le sous-programme.
Les paramètres formels correspondent un peu aux variables utilisées dans un formulaire mathé-
matique. A l'emploi du formulaire, il faut remplacer les variables du formulaire par les valeurs numéri-
ques du problème à résoudre. Les paramètres formels peuvent représenter :
- des variables simples,
- des variables de tableaux,
- des identificateurs de sous-programmes.
Chaque identificateur de paramètre formel doit rester unique dans la liste. Un paramètre formel,
déclaré comme variable de tableau dans le sous-programme, ne peut se relier qu'à un paramètre
effectif qui est aussi un tableau d'éléments de même type. Ce paramètre formel ne peut pas contenir
plus d'éléments que le nombre d'éléments déclarés pour le paramètre effectif. Par contre, il peut se
déclarer à dimensions ajustables.
La longueur d'un paramètre formel de type character ne peut pas être plus grande que la lon-
gueur du paramètre effectif qui lui est associé. Si la longueur du paramètre formel est déclarée par
*(*) , les deux longueurs sont alors égales. Les paramètres formels ne peuvent pas figurer dans une
instruction equivalence .
*
* Type des variables simples utilisées dans les unités :
*
implicit real*4 (a-h,o-y)
implicit integer*2 (i-n)
implicit complex*8 (z)
Donnons quelques listes d'appel et de sous-programmes en indiquant, si c'est nécessaire, les
erreurs éventuelles.
- 78 -
4. Sous-programmes en Fortran 77 -
* *
* Programme correct * Programme incorrect
* *
program princ1 program princ2
real*4 a(10),b(5,5) real*4 a(10),b(5,5)
..... .....
call soupr1 (a,b(1,2)) call soupr2 (a,b(1,2))
end end
- 79 -
- Langage de programmation : Fortran 77 -
Exemple :
Ce programme montre l'affectation de 2 tableaux à choix par une procédure genere et l'appel
d'une fonction qui calcule la somme des éléments placés dans les tableaux.
*
* Exemple 12
* Somme des valeurs des éléments de deux tableaux
* Ce programme utilise 2 sous-programmes : genere et somme
*
program exem12
integer i,m,n
real*4 a(50,50),b(50,50),somtot
character tablo*1,forme*30
external genere,somme
*
data forme /'(//,10x,a,//,5(5x,10f7.2,/))'/
*
do i=1,4
write (*,'(//,20x,a,//,5x,a,\)')
+ 'SOMME DES ELEMENTS D''UN TABLEAU',
+ 'Donnez le nom du tableau (a ou b) '
read (*,'(a1)') tablo
write (*,'(12x,a,\)') 'les dimensions ligne, colonne (<=50)
'
read *, m,n
if (tablo .eq. 'a') then
call genere (a,m,n)
somtot=somme(a,m*n)
else
call genere (b,m,n)
somtot=somme(b,m*n)
endif
write (*,'(/,5x,a,a1,a,f15.2,/)')
- 80 -
4. Sous-programmes en Fortran 77 -
- 81 -
- Langage de programmation : Fortran 77 -
Dans cet exemple, les éléments des deux variables indicées a et b sont définis dans la procé-
dure genere (...) . Les valeurs réelles stockées dans les éléments sont des entiers correspondant au
numéro de ligne, des centièmes correspondant au numéro de colonne, séparées par le point décimal.
Les éléments sont placés dans des places de mémoire contiguës, les indices dans les sous-pro-
gramme ne correspondant pas aux indices du programme principal. La fonction somme (...) travaille
sur un vecteur de dimensions m * n et non sur un tableau.
Le programme principal est au niveau supérieur, les deux sous-programmes au même niveau
inférieur. La transmission des données s'effectue par adresse et non par valeur. Le programme
prévoit encore l'affichage des deux tableaux, ligne après ligne, a (50,50) et b (50,50) dans le pro-
gramme principal afin de mettre en évidence la position des éléments dans ces tableaux complets.
L'affichage ci-dessus ne concerne qu'une très petite partie de l'affichage complet des 2500 éléments
des deux tableaux.
real*4 vect1(n)
la correspondance étant assurée.
Si l'indice du premier élément du vecteur vect2 ne commence pas à 1 mais à une valeur diffé-
rente, par exemple -5 , cette dimension doit figurer dans le dimensionnement du vecteur, la valeur
pouvant être une constante entière ou celle d'un paramètre formel :
real*4 vect2(-5:m)
Le stockage des données dans des vecteurs est la façon la plus simple et la plus sûre de trans-
mettre des informations entre les unités de programme.
*
* Affectation au niveau supérieur
*
program anivo1
integer*2 i,j
real*4 a(20,30)
*
.....
*
- 82 -
4. Sous-programmes en Fortran 77 -
do i=1,12
do j=1,16
print *,'Elément',i,j,'='
read *,a(i,j)
end do
end do
*
.....
Dans ce cas, l'enregistrement s'effectue ligne après ligne sur l'ensemble du tableau, le com-
pilateur calculant l'adresse en mémoire de chaque élément, compte tenu du rangement en colonne
dans 20 lignes. Dans ce cas, les 12 premiers éléments définis en mémoire sont : a (1,1), a (2,1), ... , a
(12,1) suivis de 8 places mémoire à 4 octets non définies, suivies de 12 éléments affectés de a (1,2) à
a (12,2) , etc.
*
* Exemple 13
* Affectation de valeurs aléatoires dans une procédure
* Lecture des valeurs numériques du tableau
*
program exem13
integer il,ic
real*4 a(50,50)
external affi,lire
*
write (*,'(//,15x,a,//,5x,a,\)')
+ 'AFECTATION ET EFFICHAGE DE VALEURS D''UN TABLEAU',
+ 'Donnez le nombre de lignes et colonnes (<=50) '
read *, il,ic
*
call lire (a,il,ic)
call affi (a,il,ic)
*
end
*
- 83 -
- Langage de programmation : Fortran 77 -
Dans cet exemple, les éléments du tableau a , affectés et lus dans des procédures, seront sto-
ckés dans des places mémoire contiguës, les indices utilisés dans les niveaux inférieurs n'étant pas
identiques à ceux du niveau du dimensionnement numérique du programme principal.
- 84 -
4. Sous-programmes en Fortran 77 -
Recommandation
Pour éviter toute difficulté de recherche d'éléments avec 2 indices et plus, il est avantageux de
prévoir les affectations, modifications et transformations de données aux mêmes niveaux des sous-
programmes.
Les dimensions ajustables doivent être identiques pour le premier indice, éventuellement variable
pour le second.
*
* Dimensionnement des variables indicées par parameter
*
program dimen1
integer*2 il,ic,jl,jc
parameter (il=20,ic=35,jl=10,jc=25)
real*4 a(il,ic),b(jl,jc)
.....
Cette programmation permet d'ajuster la place occupée par les données en mémoire à la taille du
problème à résoudre, mais impose une compilation de l'unité de dimensionnement à chaque modifi-
cation de l'instruction parameter .
*
* Exemple 14
* Démonstration du passage des paramètres, la dernière dimension
* du vecteur a dans affi ou du tableau a dans lire étant
* l'astérisque
* Attention !!!
* Si le nombre total d'éléments dépasse 2500, le système
* d'exploitation est mis hors service par exemple sous MS-DOS
*
program exem14
integer il,ic
- 85 -
- Langage de programmation : Fortran 77 -
real*4 a(50,50)
external affi,lire
*
write (*,'(//,7x,a,///,5x,a,\)')
+ 'AFFECTATION ET AFFICHAGE D''UN TABLEAU A DIMENSION PAR *',
+ 'Donnez le nombre de lignes : '
read *, il
ic=2500/il
*
write (*,'(/,5x,a,i4,/,5x,a,//,5x,a,\)')
+ 'Le nombre limite de colonnes est : ',ic,
+ 'Le nombre maximal d''éléments est 2500 !',
+ 'Donnez le nombre de colonnes désiré : '
read *, ic
*
call lire (a,il,ic)
call affi (a,il*ic)
*
end
*
* Sous-programme d'affectation des éléments
*
subroutine lire (a,m,n)
integer i,j,m,n
real*4 a(m,*),an
intrinsic abs
external alea
*
write (*,'(12x,a,\)') 'un nombre réel avec 5 décimales '
read *, an
an = abs(an)
do i=1,m
do j=1,n
an =alea(an)
a(i,j)=200.0*(an-0.5)
end do
end do
end
*
* Sous-programme d'affichage
*
subroutine affi (a,m)
integer i,m
real*4 a(*)
*
write (*,'(///,10x,a,//,5(1x,6f12.3,/))')
+ 'VALEURS CONTENUES DANS LES ELEMENTS',
+ (a(i),i=1,m)
end
*
* Fonction générant des nombres pseudo-aléatoires
*
real function alea (a)
real*4 a,b
intrinsic int
*
- 86 -
4. Sous-programmes en Fortran 77 -
b=29.0*a
alea=b-int(b)
end
Attention ! Le nombre total de places réservées en mémoire permet de stocker 2500 éléments de
type real , l'astérisque signifiant que toutes les places mémoire sont à disposition, mais pas plus ! Si le
produit du nombre de lignes par le nombre de colonnes dépasse cette valeur, l'exécution du program-
me peut créer une erreur fatale et grave sur le système d'exploitation.
int((m + 1 - n*carac)/carac)
Exemple de programme partiel :
character*16 noms(20)
.....
call subnom (noms(6))
.....
subroutine subnom (z)
character*16 z(1:*)
.....
- 87 -
- Langage de programmation : Fortran 77 -
2. Si le paramètre effectif est un élément de tableau, cité avec un indice ipf ,ce tableau étant di-
mensionné à ipd , le nombre d'éléments transmissibles vers le tableau déclaré comme paramètre
formel est : ipd + 1 - ipf .
Exemple :
real*4 table(5000)
call soupro (table(2000))
.....
subroutine soupro (b)
real*4 b(1:*)
Dans ce cas, la taille de la variable indicée b , déclarée dans le sous-programme soupro , est
(avec ipd = 5000 et ipf = 2000 ) :
return [ i ]
avec :
i un argument optionnel de type integer , constante ou expression, utilisable seulement dans les
sous-programmes subroutine avec retour sélectif sur l'étiquette de l'unité de programme
contenant l'appel call ... , voir ci-après 4.2.5.3 .
Lorsque l'instruction return est lue dans le sous-programme function , le contrôle de l'exécution
passe du sous-programme à l'instruction contenant la référence à la fonction dans l'unité de program-
me d'appel. Lorsque l'instruction return est lue dans un sous-programme subroutine , le contrôle
- 88 -
4. Sous-programmes en Fortran 77 -
passe à la première instruction exécutable suivant directement call ... , excepté si l'argument i est
présent. Les sous-programmes function et subroutine peuvent contenir plusieurs instructions return.
Aucune instruction return ne doit se trouver dans l'unité du programme principal. Dans un sous-
programme, l'instruction end remplit également le même rôle.
4.3 FONCTIONS-FORMULES
- 89 -
- Langage de programmation : Fortran 77 -
nomfonc ( liste_eff )
avec :
nomfonc l'identificateur de la fonction-formule,
liste_eff la liste des paramètres effectifs.
L'appel de la fonction-formule s'effectue toujours à l'intérieur d'une expression arithmétique ou lo-
gique. Lorsqu'une référence à la fonction-formule apparaît, les valeurs des paramètres effectifs sont
transmises aux paramètres formels de la définition de la fonction-formule. L'expression programmée
dans l'instruction de définition est évaluée et le résultat unique transmis au lieu d'appel afin de pouvoir
évaluer l'expression arithmétique ou logique en cours d'exécution.
Les règles d'emploi de la fonction-formule sont :
1. Une instruction de définition d'une fonction-formule peut retourner une donnée numérique ou
logique, mais pas de type character.
2. L'instruction de définition doit rester unique dans la même unité de programme, l'identificateur
étant local dans cette unité..
3. La fonction-formule doit être placée entre les déclarations ou spécifications et la première ins-
truction exécutable. Elle ne peut s'appeler que dans cette unité de programme.
4. La liste des paramètres formels doit contenir seulement des variables. La liste des paramètres
effectifs peut être constituée de constantes, variables ou expressions.
5. Le type des paramètres formels dans la fonction-formule est fixé soit implicitement, soit expli-
citement par une déclaration particulière ou dans une instruction implicit.
6. Une fonction-formule peut inclure une référence à une autre fonction-formule définie avant son
utilisation dans la même unité de programme.
7. Les paramètre formels utilisés dans la fonction-formule sont des variables locales dans l'unité de
programme.
*
integer i3,j,job
real*4 a,ach,b,gamma,r,rayon,x,zw
logical la,lb,lc,lex
complex ccosh,zh,ref(2,3),u(8,10)
intrinsic alog,iabs,mod,sqrt,tanh
*
* Définition des fonctions-formules
*
rayon(a,b) = sqrt(a*a+b*b)
ach(x) = alog(x+sqrt(x*x-1.0))
lex(la,lb) = (la .and. .not. lb) .or. .not. (la .and. lb)
job(j) = j+1-j/3*3
.......
*
* Exemple d'appel des fonctions-formules
*
r = zw*tanh(5.0*ach(gamma))
lc=lex(lc,mod(iabs(i3),7) .ne. 2)
- 90 -
4. Sous-programmes en Fortran 77 -
*
* Exemple 15
* Recherche des dimensions : hypothénuse, périmètre et aire
* dans un triangle rectangle
*
program exem15
real*4 cote1,conte2,d1,d2
real*4 aire,hypo,perim
character*1 rep
logical contro
intrinsic sqrt
*
* Programmation des 3 fonctions-formules
* hypo calcul de l'hypothénuse
* perim calcul du périmètre
* aire calcul de l'aire du triangle
*
hypo (d1,d2) = sqrt (d1**2+d2**2)
perim(d1,d2) = d1 + d2 + hypo(d1,d2)
aire (d1,d2) = 0.5*d1*d2
*
* Initialisation de la variable logique
*
data contro /.true./
*
* Structure itérative avec tant que
*
do while (contro)
write (*,'(//,10x,a,//,5x,a,$)')
+ 'DIMENSIONS DANS UN TRIANGLE RECTANGLE',
+ 'Donnez les 2 côtés de l''angle droit : '
read *, cote1,cote2
write (*,'(//,3(5x,a,f10.2,/),//,5x,a,$)')
+ 'L''hypothénuse vaut : ',hypo(cote1,cote2),
+ 'Le périmètre vaut : ',perim(cote1,cote2),
+ 'L''aire vaut : ',aire(cote1,cote2),
+ 'Désirez-vous un autre calcul (o/n) ? '
read (*,'(a1)') rep
contro = (rep .eq. 'o') .or. (rep .eq. 'O')
end do
*
end
- 91 -
- Langage de programmation : Fortran 77 -
Le sous-programme subroutine est une unité de programme effectuant une ou le plus souvent
de nombreuses tâches élémentaires ou complètes comme des opérations numériques, par exemple
les opérations matricielles, logiques et sur des chaînes de caractères. Ce genre de sous-programme
transforme les données transmises aux paramètres formels et retourne à l'unité appelante plusieurs
données et même des tableaux complets.
subroutine nomsub
Le sous-programme subroutine doit commencer toujours par l'instruction subroutine et se ter-
miner par l'instruction end . Il ne doit pas contenir les instructions : program , function , block data
ou une autre instruction subroutine . Il peut contenir toutes les autres instructions du langage y com-
pris plusieurs instructions return . Le sous-programme peut appeler d'autres sous-programmes, mais
pas lui-même. Cette unité de programme doit contenir toutes les spécifications nécessaires, comme
par exemple les diverses déclarations de type, de dimensions, de zones communes, de data, etc. .
A la compilation du sous-programme, il n'y a aucune liaison entre les identificateurs de variables
utilisées dans l'unité de programme appelant et le sous-programme subroutine . Par contre, il y a
liaison par adresse entre les paramètres effectifs et les paramètres formels des deux listes, ainsi que
par l'instruction common lors de l'assemblage et de l'exécution du programme complet. Les mêmes
identificateurs peuvent se retrouver dans plusieurs unités de programme tout en ayant ou non les mê-
mes valeurs, le même type ou la même signification. Le sous-programme subroutine peut contenir
une ou plusieurs instructions entry qui permettent une connexion à certains niveaux du sous-pro-
gramme. L'appel d'un sous-programme subroutine se fait au moyen de l'instruction call ... .
- 92 -
4. Sous-programmes en Fortran 77 -
Dans ce premier exemple, donnons la configuration générale des unités composant un program-
me complet. Ce programme se compose de trois unités distinctes : le programme principal princi ,
deux sous-programmes subroutine spro1 et spro2 .
*
* Programme principal partiel
*
program princi
integer i,j,k,n
real a(60,60),b(60,8),c(60,4),f(60)
external spro1,spro2
*
.....
read *, n
call spro1 (n,b,c)
.....
call spro2 (n,a,b,c,f)
.....
end
*
* Premier sous-programme partiel spro1
*
subroutine spro1 (n,b,c)
integer i,j,n
real*4 b(n,4),c(n,2)
.....
end
*
* Second sous-programme partiel spro2
*
subroutine spro2 (n,a,b,c,f)
integer i,j,k,l(60),m(60),n
real*4 a(n,n),b(n,5),c(n,4),d,f(n)
external minv
.....
call minv (a,n,d,l,m)
.....
end
Le programme principal prévoit le dimensionnement d'un tableau a avec 3600 éléments réels,
deux tableaux bidimensionnels b et c et d'un vecteur f . La variable entière n impose les dimen-
sions maximales réellement utilisées dans les sous-programmes au moment de l'exécution. Le pre-
mier sous-programme spro1 prévoit un dimensionnement des variables de tableau b et c , ces
dimensions dépendant directement de la valeur affectée à la variable n dans le programme principal.
L'affectation des variables indicées se réalise seulement sur une partie des tableaux, 4 colonnes pour
b , 2 colonnes pour c .
Le second sous-programme spro2 prévoit aussi un dimensionnement des variables de tableaux
à partir de la valeur actuelle attribuées à n . Dans ce sous-programme, les éléments de la matrice
carrée a (n,n) sont déjà placés dans les lignes et colonnes correctes. Ce sous-programme appelle
un autre sous-programme effectuant l'inversion de la matrice a : minv (a,n,d,l,m) en lui transmettant
les paramètres effectifs connus. Dans ce sous-programme , a est un vecteur de dimension n*n , d
est le déterminant , l et m sont deux vecteurs retenant les indices de ligne et de colonne des élé-
- 93 -
- Langage de programmation : Fortran 77 -
ments lors de la pivotisation complète de la matrice. Le dimensionnement de ces deux vecteurs peut
s'effectuer seulement au niveau du sous-programme d'appel.
Dans cet exemple général, la mise en place des divers éléments s'effectue à l'intérieur des sous-
programmes placés aux mêmes niveaux. De ce fait, les éléments sont rangés les uns à la suite des
autres suivant l'ordre de rangement usuel, c'est-à-dire colonne après colonne. Ce rangement permet
d'introduire un sous-programme d'une librairie extérieure à celle du langage travaillant sur des vec-
teurs sans introduire une transformation : matrice -----> vecteur .
Pour éviter toute erreur d'affectation et de transmission des données, il est vivement recommandé
de vérifier la position des données lors du contrôle du programme.
C=A*B
avec :
A matrice multiplicande
B matrice multiplicatrice
C matrice produit
Les éléments sont créés par une fonction alea générant des nombres pseudo-aléatoires compris
entre 0.0 et 1.0 afin de ne pas devoir introduire manuellement ces valeurs dans les tableaux A et B .
L'organisation générale du programme est représentée dans la figure suivante :
Le sous-programme affich affiche les valeurs générées dans les trois matrices ligne après ligne
à raison de 6 éléments par ligne. Le sous-programme matmul effectue la multiplication matricielle.
Ce programme utilise la mise en forme des données au moyen de l'instruction write .
*
* Exemple 16
* Multiplication matricielle : C = A * B
* Les valeurs numériques sont générées par une fonction
* créant des nombres pseudo-aléatoires
*
program exem16
integer id,nca,ncb,nla
external affect,affich,matmul
parameter (id=50)
real*4 a(id,id),b(id,id),c(id,id)
*
write (*,'(///,20x,a,//,5x,a,$)')
+ 'MULTIPLICATION MATRICIELLE : C = A * B',
+ 'Donnez le nombre de lignes pour A (<=50) : '
read *, nla
- 94 -
4. Sous-programmes en Fortran 77 -
- 95 -
- Langage de programmation : Fortran 77 -
MULTIPLICATION MATRICIELLE : C = A * B
Donnez le nombre de lignes pour A (<=50) : 16
le nombre de colonnes pour A (<=50) : 20
le nombre de colonnes pour B (<=50) : 25
MATRICE MULTIPLICANDE : A
Donnez la limite de génération : 100
un nombre réel avec 5 décimales : 1.23456
0.6045E+02 -0.4761E+02 0.3683E+02 0.6809E+02 -0.2553E+02 0.5957E+02
..........
MATRICE MULTIPLICATRICE : B
Donnez la limite de génération : 250
un nombre réel avec 5 décimales : 4.56789
-0.1559E+02 0.4782E+02 -0.1134E+03 0.2127E+03 0.1679E+03 -0.1306E+03
..........
MATRICE PRODUIT : C = A * B
- 96 -
4. Sous-programmes en Fortran 77 -
Le sous-programme function est une unité de programme permettant de déterminer une valeur
qui est retournée dans l'expression d'appel de la fonction.
- 97 -
- Langage de programmation : Fortran 77 -
Après l'exécution de l'instruction return ou end, la valeur assignée à la fonction est associée à
son nom dans l'unité de programme d'appel, là ou elle est citée dans une expression.
nomfonc [ ( liste_eff ) ]
avec :
nomfonc l'identificateur de la fonction connu du programme exécutable,
liste_eff la liste des paramètres effectifs transmis à la liste des paramètres formels dans l'unité
de programme servant de définition de la fonction.
La fonction est alors évaluée en remplaçant les paramètres formels par les paramètres effectifs, le
résultat de l'évaluation étant attribué à l'identificateur de la fonction placé dans l'instruction d'appel.
Les paramètres effectifs sont des paramètres d'entrée dans la définition de la fonction, bien que les
règles générales soient applicables au passage des données. On parle d'effet de bord si l'un des
paramètres est mixte ou de sortie, méthode de programmation à éviter si possible à moins de vouloir
réaliser des conditions particulières d'affectation.
Soit à écrire un programme permettant d'enregistrer jusqu'à 50 valeurs réelles dans deux vec-
teurs, d'en calculer la somme et la moyenne arithmétique.
*
* Exemple 17
* Calcul de la somme et de la moyenne de nombres réels
*
program exem17
integer i,na,nb
real*4 a(50),b(50),somme,somma,sommb
character*1 rep
external affect,somme
*
write (*,'(//,15x,a,//,10x,a,/)')
+ 'ENREGISTREMENT ET MOYENNE DE VALEURS REELLES',
+ 'TABLEAU A'
call affect (a,na)
write (*,'(//,10x,a,/)') 'TABLEAU B'
call affect (b,nb)
*
- 98 -
4. Sous-programmes en Fortran 77 -
somma = somme(a,na)
sommb = somme(b,nb)
write (*,'(//,2(5x,a,f10.3,/,5x,a,f21.3,/),//)')
+ 'Somme des éléments du tableau A : ',somma,
+ 'Moyenne arithmétique : ',somma/na,
+ 'Somme des éléments du tableau B : ',sommb,
+ 'Moyenne arithmétique : ',sommb/nb
end
*
* Sous-programme affect d'enregistrement
*
subroutine affect (d,m)
integer i,m
real*4 d(m)
*
write (*,'(/,10x,a,//,5x,a,$)')
+ 'Enregistrement des valeurs dans le tableau',
+ 'Donnez le nombre d''éléments désirés (<=50) : '
read *, m
do i=1,m
write (*,'(5x,a,i3,a,$)') 'Elément no. ',i,' = '
read *, d(i)
end do
end
*
* Fonction calculant la somme des éléments
*
real function somme (d,m)
integer i,m
real*4 d(m)
*
somme=0.0
do i=1,m
somme=somme+d(i)
end do
end
Dans cet exemple. le programme principal prévoit des vecteurs a et b avec 50 éléments, le
nombre réellement affecté étant déterminé dans le sous-programme affect . La somme des élé-
ments des deux tableaux est obtenue dans la fonction somme , le résultat étant affecté aux variables
somma et sommb dans le programme principal.
TABLEAU A
TABLEAU B
- 99 -
- Langage de programmation : Fortran 77 -
etc.
Ce sous-chapitre traite les instructions complémentaires d'entrées additionnelles dans les sous-
programmes subroutine et function , de sauvegarde des données, des zones communes en mé-
moire vive et de l'équivalence des places en mémoire. Il se termine par le sous-programme d'initia-
lisation block data .
- 100 -
4. Sous-programmes en Fortran 77 -
* *
* Programme principal * Sous-programme contro
* *
program princi subroutine contro (a,b,c)
real*4 x,y,z real*4 a,b,c
..... .....
call contro (x,y,z) if (a .gt. b) a = a - 0.5
..... .....
call direct (x,y) entry direct (a,b)
..... a = a - 2.0*b
end .....
end
La fonction proposée permet le calcul des trois fonctions hyperboliques : sinus, cosinus et tan-
gente sans faire appel aux fonctions existantes de la librairie FORTRAN. Cet exemple montre le prin-
cipe d'une programmation avec entrée secondaire. Pour ne pas introduire les identificateurs des fonc-
tions "intrinsic" , les identificateurs sont modifiés en leur adjoignant x .
*
* Exemple 18
* Utilisation d'entrées secondaires dans une fonction
*
program exem18
integer ipoint
logical lcont
real*4 fonc1,fonc2,x
character*1 rep
intrinsic sinh,cosh,tanh
external sinhx,coshx,tanhx
data lcont /.true./
do while (lcont)
write (*,'(//,10x,a,//)')
+ 'ACCES AUX ENTREES SECONDAIRES D''UNE FONCTION'
write (*,'(/,8x,a,//,3(5x,a,/),//,8x,a,$)')
+ 'Vous avez le choix entre les fonctions :',
+ '1. Sinus hyperbolique',
+ '2. Cosinus hyperbolique',
+ '3. Tangente hyperbolique',
+ 'Quel point adoptez-vous ? '
read *, ipoint
write (*,'(/,5x,a,$)') 'Donnez l''argument x : '
read *, x
- 101 -
- Langage de programmation : Fortran 77 -
- 102 -
4. Sous-programmes en Fortran 77 -
*
* Exemple 19
* Solution d'une équation différentielle par Runge-Kutta
* Ce programme comprend deux sous-programmes
* runge procédure de Runge-Kutta
* fonc fonction : y' = f(x,y) à programmer
*
program exem19
integer i,incr
real*4 deltax,x0,x1,xmax,xmin,y0,y1,ymin
external fonc
*
write (*,'(//,14x,a,/,25x,a,//,5x,a,$)')
+ 'SOLUTION D''UNE EQUATION DIFFERENTIELLE DU 1er ORDRE',
+ 'PAR LA METHODE DE RUNGE-KUTTA',
+ 'Donnez la valeur intiale pour x0 : '
read *, xmin
write (*,'(12x,a,$)') 'la valeur initiale y0 : '
read *, ymin
write (*,'(12x,a,$)') 'la borne supérieure xmax : '
read *, xmax
write (*,'(12x,a,$)') 'le nombre de pas de calcul : '
read *, incr
deltax = (xmax-xmin)/incr
y1 = ymin
*
write (*,'(///,15x,a,//,15x,a,9x,a,12x,a,//,i20,2f15.6,/)')
+ 'SOLUTION DE L''EQUATION DIFFERENTIELLE',
+ 'numéro','x =','y =',0,xmin,ymin
do i=1,incr
x0=xmin+(i-1)*deltax
y0=y1
call runge (x0,y0,deltax,fonc,x1,y1)
write (*,'(i20,2f15.6)') i,x1,y1
if (mod(i,5) .eq. 0) write (*,*)
end do
- 103 -
- Langage de programmation : Fortran 77 -
*
end
*
* Procédure de Runge-Kutta du 4ième ordre
*
subroutine runge (x0,y0,h,ff,x1,y1)
real*4 h,x0,y0,y1
real*4 a(4),delta
*
a(1)=ff(x0,y0)*h
do i=1,2
a(i+1)=ff(x0+0.5*h,y0+0.5*a(i))*h
end do
a(4)=ff(x0+h,y0+a(3))*h
delta=(a(1)+2.0*(a(2)+a(3))+a(4))/6.0
x1 = x0+h
y1 = y0+delta
end
*
* Fonction y'=f(x,y)
* Programmez la fonction fonc = y'
*
real function fonc(x,y)
real*4 x,y
fonc = x+y
end
Résultat de l'exécution du programme
0 1.000000 1.000000
1 1.050000 1.103813
...................................
40 3.000000 18.167170
- 104 -
4. Sous-programmes en Fortran 77 -
* *
* Transmission de fonctions * Sous-programme
* *
program transm subroutine calc (x,f,y)
real*4 x1,x2,x3,x4,y1,y2,y3,y4 real*4 f,x,y
intrinsic sin,cos,sinh,cosh y = 1.0+f(x)**2
..... end
call calc (x1,sin,y1)
.....
call calc (x2,cos,y2)
call calc (x3,sinh,y3)
call calc (x4,cosh,y4)
......
end
Dans cet exemple, l'appel du sous-programme calc transfère les fonctions déclarées comme
"intrinsic" au sous-programme calc en remplaçant f (x) par la fonction correspondante de la
librairie FORTRAN.
common liste
avec :
liste la liste des variables à placer dans la zone commune, les variables étant séparées les unes
des autres par la virgule.
Cette instruction de déclaration est appelée common blanc car elle définit une zone commune
sans identificateur de zone. Elle peut servir à dimensionner des variables de tableaux, mais le même
tableau ne peut être dimensionné qu'une seule fois dans la même unité de programme. Un paramètre
effectif ne peut pas figurer dans cette instruction et la même variable ne peut pas apparaître dans
plusieurs instructions common .
Exemples :
common a,b,f(12,5),g,h(6,4,10)
Cette instruction réserve donc une place commune unique aux variables citées dans la liste et les
places mémoire correspondantes peuvent stocker des données dans un format interne selon le type
de la variable. C'est la raison pour laquelle il est recommandé d'introduire une certaine systématique
dans la réservation de la place. Afin d'éviter tout mélange de variables de tailles différentes, il est utile
de ranger ces variables par ordre d'occupation décroissante, soit :
- complex*16 , complex*8
- real*8
- real*4
- integer*4 , logical*4
- integer*2 , logical*2
- character*n .
- 105 -
- Langage de programmation : Fortran 77 -
Les dernières classes vont présenter des difficultés de stockage si une directive de compilation
prévoit 2 octets pour le rangement des données logiques et entières. Le type character*n va aussi
compliquer le rangement, car les enregistrements de chaînes de caractères sont organisés en octets,
et non en mots. Dans ce cas, il est sage de prévoir un dimensionnement pour n multiple de 4 pour les
variables de type character .
Chaque unité de programme ne peut contenir qu'une instruction common blanc , le nombre de
variables citées dans la liste ne devant pas nécessairement être le même dans toutes les unités de
programme. La longueur maximale, y compris les extensions éventuelles par l'instruction equiva-
lence , doit figurer dans le programme principal.
Exemple général
*
* Programme principal
*
program execom
real*4 a,b,c,d,e,f,g,h
*
common /bloc1/a,b,c /bloc2/d,e,f
common g,h
*
* Sous-programme 1
*
subroutine sub1
real*4 x,y,z
common /bloc1/x,y,z
- 106 -
4. Sous-programmes en Fortran 77 -
.....
end
*
* Sous-programme 2
*
subroutine sub2
real*4 p,q,x,y,z
common /bloc1/x,y,z
common p,q
.....
end
Dans cet exemple général, le programme principal prévoit des blocs de zones communes dési-
gnées par bloc1 et bloc2 , chaque bloc permettant de stocker 3 variables de type real*4 et un
common blanc avec deux variables de type real*4 . Le premier sous-programme utilise le bloc
commun bloc1 , les variables citées étant x , y , z , situées dans les mêmes places mémoire que les
variables a , b , c du programme principal. Le sous-programme 2 utilise le bloc commun bloc2 , en
stockant les variables x , y , z , dans les mêmes places mémoire que d , e , f , du programme
principal. Enfin, les variables p et q , situées dans le common blanc, occupent les mêmes places
mémoire que les places réservées g et h dans le programme principal.
save liste_var
avec :
liste_var liste des variables locales au sous-programme : variables simples ou de tableaux, élé-
ments de tableaux, de sous-chaînes de caractères séparés par la virgule. La liste peut
comprendre un ou plusieurs blocs communs , placés entre barres obliques.
Les identificateurs de sous-programmes, d'entités citées dans les blocs communs et les paramè-
tres formels ne peuvent pas figurer dans la liste. Si un bloc commun est cité dans une liste de save
d'un sous-programme, l'instruction save doit s'introduire dans chaque unité de programme citant ce
bloc commun. L'instruction save se place après les déclarations, mais avant data .
- 107 -
- Langage de programmation : Fortran 77 -
Exemples :
real*8 dprem
integer*2 ivar(4)
equivalence (dprem,ivar(1))
Les quatre éléments de la variable entière ivar occupent 4*2 octets = 8 octets, soit exactement la
même portion de mémoire que la variable dprem en double précision, soit 8 octets.
character mot*16,nom*12
equivalence (mot,nom)
Les 12 premiers caractères des chaînes mot et nom occupent exactement la même position en
mémoire. La variable nom est dans ce cas équivalente à la sous-chaîne mot (1:12) . Une opération
intéressante est la séparation des parties réelle et imaginaire d'un tableau d'éléments de type
complex en les égalant à un tableau d'éléments réels.
Exemple :
real*4 a(10),b,x(4,5)
equivalence (a(2),x(2,2),b)
La position des éléments en mémoire peut se représenter par les éléments suivants :
x(1,1)
x(2,1)
- 108 -
4. Sous-programmes en Fortran 77 -
x(3,1)
x(4,1)
a(1) x(1,2)
a(2) x(2,2) b niveau de définition de l'équivalence
a(3) x(3,2)
a(4) x(4,2)
a(5) x(1,3)
................. etc.
Les spécificateurs d'une même liste ou de listes différentes ne doivent pas être contradictoires.
En particulier, il faut vouer un soin attentif aux variables de 2 octets équivalencées aux variables de 4
octets et se référer au mode de stockage des données.
Tout changement de la valeur d'une variable affecte aussi celles qui lui sont équivalencées. L'ins-
truction equivalence permet d'économiser de la place en mémoire, de donner plusieurs noms à une
même composante ou à simplifier la transformation d'un tableau unidimensionnel en tableau multi-
dimensionnel ou vice versa. Dans une instruction equivalence , une variable de tableau multidi-
mensionnel peut se désigner par un indice unique, de type integer , qui indique son numéro de ran-
gement. Par exemple, l'élément a (1,1) du tableau a (5,6) peut s'écrire a (1) et l'élément a (3,5)
devient a (23) .
Exemple :
character nom*16,mot*7
equivalence (nom(9:11),mot(3:5))
soit l'alignement ci-après :
9 11
nom : N N N N N N N N N N N N N N N N
mot : M M M M M M M
3 5
equivalence (nom(10:10),mot(4:4))
1. L'instruction equivalence peut agrandir la zone commune d'une instruction common blanc au-
delà de son dernier élément :
Exemple :
real*4 a(5),b,c,d(5,2),p(20)
common a(4),b,c,d(5,2)
equivalence (p(1),b)
- 109 -
- Langage de programmation : Fortran 77 -
equivalence (a(1),p(5))
2. La place occupée en mémoire par chaque bloc common identifié doit être égale dans toutes les
unités de programme. Si l'instruction equivalence est employée pour étendre un common
identifié dans une unité de programme, il faut ajuster cette zone commune de telle sorte que la
règle du nombre d'octets constant soit satisfaite.
3. Dans une même unité de programme, deux variables simples ou de tableaux citées dans un
common ne peuvent pas être équivalencées car il y aurait redondance. Exemple illégal :
character*16 mot1,mot2,motvid
common mot1,mot2,motvid
equivalence (mot1,motvid)
car mot1 et motvid sont définis dans 2 modes de stockage contradictoires.
4. Une instruction equivalence ne doit pas spécifier que des places mémoire consécutives soient
équivalencées en places non consécutives. Exemple illégal :
real*4 dvar(2)
real*8 douvar(2)
equivalence (dvar(1),douvar(1),dvar(2),douvar(2))
5. Il est interdit d'équivalencer des variables simples et de tableaux placées dans différents blocs
common . Cette opération est incompatible car l'instruction equivalence indique une occu-
pation superposée des données en mémoire, tandis que chaque bloc common impose un
stockage séparé.
Exemple :
Définition de valeurs numériques et de prénoms dans un block data.
- 110 -
4. Sous-programmes en Fortran 77 -
*
* Exemple 20
* Initialisation pas block data
*
program exem20
integer*4 i,nombre(10)
real*4 pi
logical vrai
character*16 prenom(6)
common /bloc1/pi,nombre,vrai,prenom
*
write (*,'(//,10x,a,//,5x,a,10i4,/,5x,a,f10.7,/,5x,a,l3)')
+ 'INITIALISATION PAR DATA DANS UN BLOC COMMON',
+ 'Le tableau contient : ', (nombre(i),i=1,10),
+ 'La valeur de pi est : ',pi,
+ 'La valeur logique est ',vrai
do i=1,6
write (*,'(/,5x,a,i2,a,a16)')
+ 'Le prénom stocké en ',i,' est : ',prenom(i)
end do
end
*
* Sous-programme block data d'initialisation
*
block data donnee
integer*4 i,nombre(10)
real*4 pi
logical vrai
character*16 nom(6)
*
common /bloc1/pi,nombre,vrai,nom
data pi,nombre,vrai /3.141593,1,3,5,7,9,11,13,15,17,19,.true./
data nom(1),nom(2),nom(3),nom(4),nom(5),nom(6)
+ /'Anne-Marie','Bertrand','Célestine','Francis',
+ 'Joséphine','Roger'/
end
Résultat de l'exécution du programme :
- 111 -
CHAPITRE 5
Le langage FORTRAN , bien que datant de plus de 30 ans, possède une collection d'instructions très
efficaces facilitant fortement la lecture et surtout l'écriture des données numériques et alphanumériques à
l'écran, dans les fichiers, sur les périphériques et dans les variables. L'entrée au clavier en mode direct
des valeurs à affecter aux variables, s'effectue par l'intermédiaire de l'instruction read *,... , et la sortie
directe des données par l'instruction print *, ... sans mise en forme. Nous avons utilisé l'instruction write
(*, ... ) dans les exemples précédents afin de faciliter les affichages.
La lecture des valeurs numériques ou des chaînes de caractères consiste à transférer d'un périphé-
rique, clavier, carte ou bande perforée, disque dur ou bande magnétique, de l'information vers la mémoire
vive de l'ordinateur tandis que l'écriture des données consiste à transférer l'information de la mémoire vive
vers les divers périphériques. Lecture et écriture de données exigent dans la plupart des cas une trans-
cription de l'information et une description rigoureuse de la configuration du texte. Quatre instructions sont
utilisées dans ce but en FORTRAN :
1. lecture : read
2. écriture directe : print
3. écriture élaborée : write
4. description du mode de transfert : format .
Ce chapitre traite des possibilités de mise en forme des données seulement dans les opérations
d'entrée / sortie. Il faut absolument se souvenir des genres de représentations : interne en mémoire vive,
externe sur les périphériques. Les particularités des échanges avec les fichiers seront décrites au chapitre
6 suivant.
L'instruction de configuration externe de l'information est fixée par le mot clef du langage : format .
Par abus de langage, on utilise très souvent l'expression formater (comme nous avons utilisé précé-
demment l’expression équivalencer) dans une opération de mise en forme.
- 112 -
5. Mise en forme des données en Fortran 77 -
Exemple :
*
* Avec l'instruction format sous VAX-11
*
write (*,110)
110 format (' Donnez le degré du polynôme : ',$)
*
* Sans instruction format
*
write (*,'(1x,a,f15.5)')
- 113 -
- Langage de programmation : Fortran 77 -
Tableau 5.1
CARACTÈRES DE CONTRÔLE DE MISE À LA LIGNE
- Caractère - Effet
(espace) avance d'une ligne .
0 (zéro) avance de deux lignes .
1 (un) saute au haut de la page suivante .
+ (plus) reste sur la ligne, donc permet
d'écrire sur la même ligne
(Hors norme ANSI).
$ (dollar) supprime le retour de chariot
(VAX-11 et DOMAIN).
\ supprime le retour de chariot
(MS-FORTRAN).
Tableau 5.2
CODES GÉNÉRAUX D'ÉDITION DES DONNÉES
- 114 -
5. Mise en forme des données en Fortran 77 -
Les termes d, c et m doivent être des constantes entières non signées, les dimensions maximales
étant limitées suivant les possibilités physiques des périphériques ou de l'ordinateur. Les possibilités
d'emploi de ces codes seront décrites sous 5.1.2 .
Tableau 5.3
DESCRIPTEURS DE MISE EN FORME DES DONNÉES
Ic [.m ]
avec :
I ou i descripteur des constantes ou variables de type integer , integer*2 ou integer*4 ,
c nombre de colonnes réservé au champ,
m paramètre optionnel permettant de fixer le nombre minimal de chiffres à écrire.
Les règles de lecture ou d'écriture des entiers sont :
- 115 -
- Langage de programmation : Fortran 77 -
1. le descripteur I c spécifie que c caractères doivent être lus ou écrits à partir d'une liste;
2. le cadrage du nombre de caractères se fait à droite du champ d'écriture;
3. suppressions des zéros à gauche du premier chiffre significatif; en lecture avec l'option BZ , les
blancs sont traités comme des zéros;
4. si le nombre entier est plus grand que c caractères, compte tenu du signe, il y a écriture de c asté-
risques dans le champ.
Exemples :
Exemple :
Gc .d
avec :
G ou g : descripteur pour les constantes et variables numériques non entières,
C nombre de colonnes réservé à la lecture ou à l'écriture,
D nombre de chiffres après le point décimal.
Tableau 5.4
ÉCRITURE D'UNE DONNÉE RÉELLE PAR G
- 116 -
5. Mise en forme des données en Fortran 77 -
La représentation d'une donnée réelle dépend de son ordre de grandeur. En lecture, le champ G est
identique aux champs F, E ou D. En écriture, le descripteur spécifie que la valeur numérique doit s'écrire
soit en virgule fixe, soit en virgule flottante, arrondie à d décimales et justifiée à droite, le champ d'impres-
sion ayant c colonnes. Le tableau 5.4 donne les divers modes de représentation.
Le signe + n'est pas imprimé et le nombre de colonnes réservé à l'impression doit être suffisant pour
écrire le signe - , le point décimal, l'exposant d'où : c plus grand ou égal à d + 7.
*
* Exemple 21
* Affichage au moyen du descripteur G
*
program exem21
integer i
real*4 anomb
data anomb /0.0001234567/
*
write (*,'(//,15x,a,//,2(5x,a,/),//,15x,a,10x,a,/)')
+ 'ECRITURE AU MOYEN DU DESCRIPTEUR G',
+ 'Le nombre initial vaut : 0.0001234567',
+ 'Il est multiplié chaque fois par 10',
+ 'Numéro','Valeur'
*
do 10 i=0,20
write (*,'(15x,i5,10x,g14.7)') i,anomb
if (mod(i,5) .eq. 0) write (*,*)
anomb=10.0*anomb
10 continue
*
end
Résultat de l'exécution du programme (MS-FORTRAN)
1 .1234567E-02
............................
8 12345.67
9 123456.7
............................
20 .1234567E+17
- 117 -
- Langage de programmation : Fortran 77 -
Fc .d
avec :
F ou f : descripteur en virgule fixe pour données numériques non entières,
c nombre de colonnes réservé à la lecture ou l'écriture,
d nombre de chiffres placés après le point décimal.
Le descripteur F est très avantageux lorsqu'il s'agit d'imprimer des résultats devant rester en colonnes
et alignés. Le nombre de colonnes prévu doit être suffisant pour placer le signe et le point décimal qui est
toujours écrit. Le signe + n'est pas écrit et un champ numérique vide en lecture est traité comme un zéro.
Le nombre de colonnes doit être égal ou supérieur à c +1 , c + 2 si le nombre est négatif.
Les règles complémentaires de l'impression sont :
1. Le cadrage de l'impression est à droite du champ imprimé,
2. En revenant vers la gauche, il y a d chiffres, le point décimal, les chiffres précédant le point décimal
et le signe - si la valeur est négative.
Exemples d'impression avec le format F12.5
0,0000012345 0.00000
0,0123456 0.01235
12.345678 12.34568
-12345.678 -12345.67800
12345678.0 ************
Le dernier exemple montre que si l'on choisit le descripteur F, il faut prévoir suffisamment de colonnes
pour imprimer les résultats les plus grands et le premier exemple suffisamment de chiffres après le point
décimal pour imprimer des valeurs différentes de zéro.
Ec .d [Ee ]
Dc .d
avec :
c le nombre de colonnes réservé à la lecture ou l'écriture de la donnée numérique non entière,
d le nombre de chiffres significatifs placés après le point décimal,
e paramètre optionnel fixant le nombre de chiffres de l'exposant, en introduisant des zéros si
nécessaire.
En opération d'entrée, les descripteurs E et D permettent de lire des données avec ou sans exposant
de 10. En opération de sortie, les descripteurs écrivent toujours les données numériques en exposant de
10. Les deux descripteurs sont identiques à part la présence de la lettre E ou D . Ils imposent :
- 118 -
5. Mise en forme des données en Fortran 77 -
1. la valeur numérique réelle ou double précision doit être transférée sous la forme d'une mantisse et
d'une puissance de 10, arrondie après d décimales et justifiée à droite du champ;
2. Si la valeur ne remplit pas les c colonnes prévues, des blancs sont insérés en complément à gauche;
3. Si la valeur à écrire dépasse c caractères, le champ entier est rempli d'astérisques;
4. le signe - est imprimé si la valeur est négative, suivi d'un zéro, du point décimal, de d chiffres
significatifs, de la lettre E ou D , du signe de l'exposant et de l'exposant à deux chiffres. Le signe +
n'est pas imprimé, à moins de l'utilisation du code SP.
5. Le nombre de colonnes à prévoir dépend du nombre de chiffres significatifs désirés dans la mantisse.
Il faut que :
c >= d + 7 si l'exposant est à deux chiffres,
c >= d + 8 si l'exposant est à trois chiffres.
6. l'écriture de la lettre E est à réserver aux données de type real , real*4 , la lettre D aux données de
type double precision ou real*8 .
Exemple :
*
* Exemple 22
* Affichage au moyen des descripteurs F et D
*
program exem22
integer i
real*4 anomb
data anomb /0.9876543E-06/
*
write (*,'(//,15x,a,//,2(5x,a,/),//,10x,a,2(7x,a),/)')
+ 'ECRITURE AU MOYEN DES DESCRIPTEURS F ET D',
+ 'Le nombre initial est 0.0000009876543',
+ 'Le nombre est multiplié chaque fois par 10',
+ 'Numéro','Forme F18.7','Forme E18.7'
*
do 10 i=0,20
write (*,'(10x,i5,1x,f18.7,e18.7)') i,anomb,anomb
if (mod(i,5) .eq. 0) write (*,*)
anomb=10.0*anomb
10 continue
*
end
Résultat de l'exécution du programme (MS-FORTRAN)
ECRITURE AU MOYEN DES DESCRIPTEURS F ET D
0 .0000010 .9876543E-06
1 .0000099 .9876543E-05
2 .0000988 .9876543E-04
........................................
8 98.7654300 .9876543E+02
........................................
20 ****************** .9876544E+14
- 119 -
- Langage de programmation : Fortran 77 -
L'avantage essentiel du descripteur E est de pouvoir fixer le nombre de chiffres significatifs et de con-
server pour toutes les valeurs numériques à peu près la même précision relative. Elle est par contre plus
difficile à lire. Elle peut s'utiliser également pour imprimer les parties réelle et imaginaire d'un nombre
complexe.
k P [ n ] Gc .d
k P [ n ] Fc .d
k P [ n ] Ec .d [Ee ]
k P [ n ] Dc .d
avec :
k facteur entier positif ou négatif,
P symbole pour l'opération de multiplication,
n facteur de répétition du descripteur, optionnel, entier positif non signé, indiquant au compilateur
d'utiliser n fois le descripteur de mise en forme.
Le descripteur k P indique le facteur à prévoir pour les descripteurs cités jusqu'au prochain descrip-
teur k P . Au départ de chaque instruction d'entrée / sortie, le facteur est initialisé à zéro.
En lecture ou en écriture, la représentation externe de la donnée numérique est égale à celle de sa
représentation interne multipliée par 10**k . Le facteur n'a pas d'effet si la valeur est exprimée avec un
exposant. En écriture avec les descripteurs E ou D , le compilateur multiplie la valeur par 10*k et sous-
trait k de l'exposant, ce qui change la représentation externe, mais pas du tout la valeur interne de la
donnée. En écriture avec le descripteur G , le compilateur utilise le descripteur F ou E , dépendant de la
valeur absolue de la donnée à afficher ou imprimer.
Exemple classique d'utilisation de ce descripteur : valeur en % :
Lc
avec :
L ou l : descripteur d'une donnée de type logical,
C le nombre de colonnes réservé à la lecture ou à l'écriture.
L'élément de la liste d'entrée ou de sortie doit être de type logical. Les règles applicables sont :
1. en lecture :
- 120 -
5. Mise en forme des données en Fortran 77 -
Exemple :
A [c ]
avec :
A ou a : descripteur pour chaînes de caractères,
C le nombre de colonnes réservé à la lecture ou l'écriture de la chaîne de caractères.
1. Lecture :
Le descripteur transfère c caractères de l'enregistrement externe et l'affecte à l'élément correspon-
dant de la liste. Le nombre de caractères pouvant être transféré dépend du type de l'élément de la liste :
variable ou chaîne de caractère -----> 1 caractère par octet. Si c est plus grand que le nombre de carac-
tères transférables dans l'élément de la liste, il y a troncature à gauche. Si c est plus petit que le nombre
de caractères transférables, la chaîne de caractères est justifiée à gauche.
2. Ecriture
Le descripteur spécifie que le contenu de l'élément de la liste doit être transféré vers l'extérieur sous
forme d'un champ de c caractères. Si c est plus grand que la chaîne, il y a justification à droite et com-
plément par des espaces à gauche. Si le champ est trop court, il y a troncature à droite.
Si c est absent du descripteur, la longueur du champ est ajustable et va dépendre du nombre d'oc-
tets contenu dans l'élément de la liste ou dans la donnée : chaînes de caractères ou sous-chaînes. Pour
lire un caractère ou une chaîne, il faut utiliser le descripteur a plutôt que devoir écrire la chaîne de carac-
tères encadrée d'apostrophes.
Montrons comment entrer un texte au clavier : introduire la date et l'afficher afin de contrôler la jus-
tesse de la frappe au clavier.
- 121 -
- Langage de programmation : Fortran 77 -
*
* Exemple 23
* Affichage de la date et de l'heure
*
program exem23
integer*2 annee,heu,jour,min,sec
character*10 mois
*
write (*,'(//,15x,a,//,5x,a,$)')
+ 'INTRODUCTION DE LA DATE ET DE L''HEURE',
+ 'Donnez le jour : '
read *, jour
write (*,'(12x,a,$)') 'le mois en toutes lettres : '
read (*,'(a)') mois
write (*,'(12x,a,$)') 'l''année : '
read *, annee
write (*,'(/,5x,a,/,12x,a,$)')
+ 'Donnez l''heure : ','heure, minute et seconde : '
read *, heu,min,sec
*
write (*,'(//,10x,a,i3,1x,a,1x,i5,/,10x,a,3(i3,1x,a),//)')
+ 'La date introduite est : ',jour,mois,annee,
+ 'L''heure actuelle est : ',heu,'h',min,'min',sec,'s'
*
end
Résultat de l'exécution du programme
n Hchaine
avec :
n nombre de caractères à transférer,
chaine une suite de caractères ASCII.
- 122 -
5. Mise en forme des données en Fortran 77 -
Le descripteur H ne peut plus s'utiliser dans une instruction read . Les deux instructions suivantes
sont équivalentes :
Zc [.m ]
avec :
c nombre de colonnes réservé à la lecture ou à l'écriture, entier positif non signé, indiquant aussi le
nombre maximal de caractères. Les données sont justifiées à droite dans le champ.
M paramètre optionnel permettant de fixer le nombre minimal de caractères à écrire, si nécessaire, avec
complément de zéros (pas reconnu par tous les compilateurs).
En lecture, l'enregistrement, écrit sous forme d'une constante, ne peut contenir que les chiffres de 0 à
9 et les lettres A (a) à F (f) , mais ni signe, ni point décimal, ni exposant. Un champ vide attribue zéro à la
variable. En écriture, le descripteur Z transfère la valeur hexadécimale justifiée à droite dans le champ.
C'est la suite de bits contenu dans l'élément qui est transformée en valeur externe hexadécimale. VAX-11
permet également la transcription des valeurs octales par Oc[.m] obéissant aux mêmes règles de syn-
taxe.
*
* Exemple 24
* Affichage décimal et hexadécimal
*
program exem24
integer*4 i,ifin,ifois,incr,init,nombre
*
write (*,'(//,15x,a,//,5x,a,$)')
+ 'AFFICHAGE DECIMAL ET HEXADECIMAL',
+ 'Donnez le nombre entier inférieur : '
read *, init
write (*,'(12x,a,$)') 'le nombre entier supérieur : '
read *, ifin
write (*,'(12x,a,$)') 'l''incrément de calcul : '
read *, incr
*
ifois = (ifin-init)/incr
write (*,'(//,12x,a,13x,a,9x,a,/)')
+ 'Numéro','Décimal','Hexadécimal'
do i=0,ifois
nombre = init+i*incr
write (*,'(1x,15x,i3,i20,12x,z8)') i,nombre,nombre
if (mod (i,5) .eq. 0) print *
end do
*
end
- 123 -
- Langage de programmation : Fortran 77 -
nX
avec :
n une constante entière non signée indiquant le nombre de colonnes à sauter en lecture ou en écriture.
En lecture, n colonnes sont ignorées, tandis qu'en écriture, n colonnes sont remplies de blancs ou
d'espaces.
Exemple :
write (*,'(/,4x,a,9x,a,7x,a,8x,a,15x,a,/)')
+ 'No','x','Flèche','Angle','Moment'
Cette instruction, employée en écriture, permet de placer les têtes de colonne. Le premier caractère
affiché, dans le cas particulier N , va se placer dans la colonne 4 , 3 espaces le précédant car le premier x
sert de caractère de contrôle. Nous avons placé chaque fois une virgule entre chaque descripteur d'édi-
tion, ce caractère pouvant être omis si la syntaxe reste encore claire. Afin d'éviter l'affichage d'erreurs à la
compilation ou l'exécution, nous introduirons chaque fois la virgule comme séparateur.
Exemple :
write (*.'(//,8x,a,//,2(13x,a,f15.3,/))')
- 124 -
5. Mise en forme des données en Fortran 77 -
5.1.3.3 TABULATEUR
1. Tabulation absolue
Le descripteur T sert de tabulateur et fixe la position absolue du pointeur dans la colonne spécifiée, la
première colonne étant numérotée 1 . La syntaxe est :
Tc
avec :
T ou t : descripteur du tabulateur absolu,
c une constante entière non signée indiquant la position c à partir du début de l'enregistrement. Cette
valeur doit être égale ou supérieure à 1 , mais pas supérieure au nombre de caractères alloué à l'en-
registrement.
En lecture, le tabulateur absolu indique la position du début de lecture. En écriture, le transfert externe
de la valeur s'effectue à partir de la position c dans l'enregistrement.
Exemple :
write (*,'(/,t20,a,t40,a,t60,a,/)')
+ 'Colonne 1','Colonne 2','Colonne 3'
Cette instruction a pour effet :
1. sauter une ligne
2. écrire Colonne 1 à partir de la colonne 20,
3. écrire Colonne 2 à partir de la colonne 40,
4. écrire Colonne 3 à partir de la colonne 60.
2. Tabulation relative
Les deux descripteurs complémentaires TLc et TRc sont à disposition : tabulation relative à gauche
ou à droite. Le déplacement relatif du pointeur s'effectue par la syntaxe :
TLc
TRc
avec :
T ou t : pour le descripteur de tabulation,
L ou l : pour une tabulation relative à gauche,
R ou r : pour une tabulation relative à droite,
- 125 -
- Langage de programmation : Fortran 77 -
c constante entière non signée indiquant au pointeur le nombre de colonnes à se déplacer vers la gau-
che ou vers la droite à partir de la position courante. La constante doit être égale ou supérieure à 1 .
En déplacement à gauche, si c est plus grand ou égal à la position actuelle du pointeur, le dépla-
cement s'effectue jusqu'au premier caractère de l'enregistrement. En déplacement à droite, c ne doit
pas dépasser le nombre de caractères de l'enregistrement.
write (*,160) 21
write (*,170) 47
160 format (6x,'Nombre 1 = ',i2,5x,'Nombre 2 = ',i2)
170 format (6x,'Nombre 3 = ',i2,:,5x,'Nombre 4 = ',i2)
Ces instructions permettent d'afficher les constantes à l'écran sous la forme :
Nombre 1 = 21 Nombre 2 =
Nombre 3 = 47
Dans le premier cas, l'exploration de format s'effectue jusqu'à la lecture du second texte, la seconde
valeur à afficher ne figurant pas dans la liste à écrire. Dans le second cas, l'exploration de format se ter-
mine au double point, car la constante numérique 47 est la dernière entité à traiter dans la liste.
Exemples :
- 126 -
5. Mise en forme des données en Fortran 77 -
S l'instruction de mise en forme contient des groupes de descripteurs entre parenthèses, la réexplo-
ation de l'instruction commence à la parenthèse gauche symétrique de l'avant dernière parenthèse droite
dans cette instruction. Il est possible de mettre un groupe de descripteurs entre parenthèses dans le seul
but de diriger vers une nouvelle exploration de l'instruction, ce qui permet de transmettre des com-
mentaires et plusieurs lignes de nombres avec un seul groupe de descripteurs.
Attention !
Si l'instruction de mise en forme ne suffit pas à l'exploration de la liste à traiter, le pointeur d'explora-
tion se repositionne au début de l'instruction.
Exemple :
Dans cet exemple, nous voulons créer un tableau simple de dimensions géométriques pour des sur-
faces circulaires et afficher ce tableau au moyen d'une seule instruction de mise en forme.
*
* Exemple 25
* Calcul des dimensions géométriques dans le cercle avec
* affichage d'un tableau de valeurs
*
program exem25
integer*2 i,j
real*4 a(46,4),pi,r,rmax,rmin
*
parameter (pi = 3.141593)
data rmin,rmax /10.0,100.0/
*
write (*,'(//,15x,a,//,2(10x,a,f6.1,/),///)')
+ 'CALCUL DES DIMENSIONS DANS LE CERCLE',
+ 'Rayon minimal des cercles = ',rmin,
+ 'Rayon maximal des cercles = ',rmax
*
do i=1,46
r = rmin+(i-1)*2.0
a(i,1) = r
a(i,2) = pi*r
a(i,3) = 2.0*pi*r
a(i,4) = pi*r*r
end do
*
write (*,'(9x,a,//,t10,a,t17,a,t26,a,t45,a,t62,a,//,
+ 5(9x,i2,f10.1,3f15.4,/))')
+ 'TABLE DES DIMENSIONS GEOMETRIQUES POUR SECTIONS CIRCULAIRES',
+ 'No','Rayon','Demi-cercle','Cercle','Aire',
+ (i-1,(a(i,j),j=1,4),i=1,46)
*
end
L'avant dernière parenthèse dans l'instruction write , située sur la seconde ligne, contient un groupe
de descripteurs :
5(9x,i2,f10,1,3f15.4,/)
Le facteur de répétition est 5, placé devant la parenthèse gauche. Le groupe de descripteurs est par-
couru cinq fois. Lorsque les cinq parcours sont effectués, il y a remise à la ligne en fin d'exploration et
- 127 -
- Langage de programmation : Fortran 77 -
nouvelle exploration du groupe de descripteurs du fait de la présence des divers éléments dans la liste et
de l'expression parenthésée dans l'instruction de mise en forme.
.....
character*1 rep
logical ltest
.....
write (*,'(6x,a,$)') 'Désirez-vous continuer (o/n) ? '
read (*,'(a1)') rep
ltest = (rep .eq. 'o') .or. (rep .eq. 'O')
if (ltest) then
* -----> action si réponse = oui
else
* -----> action si réponse = non
end if
Dans cet exemple, le descripteur de lecture a1 pour la variable rep de type character*1 évite de
devoir placer la réponse frappée au clavier encadrée d'apostrophes. Il est inadmissible d'exiger de la part
de l'utilisateur l'écriture de tout texte alphanumérique entre apostrophes.
- 128 -
5. Mise en forme des données en Fortran 77 -
Exemple :
real*4 b
.....
read *, a,b
Les données de type integer , real , double precision , complex ou logical doivent s'écrire dans la
forme imposée par le type. Les données doivent être séparées par la virgule ou par un blanc. Les don-
nées de type real , mais entières, peuvent s'écrire sans le point décimal tandis que le point décimal est
interdit dans l'écriture d'une donnée de type integer . Pour les données de type complex , les parties
réelle et imaginaire sont à placer entre parenthèses, séparées par la virgule, mais sans blancs. Pour les
données de type character , la chaîne à introduire doit être écrite encadrée d'apostrophes, méthode
vivement déconseillée.
Exemple :
- 129 -
- Langage de programmation : Fortran 77 -
Exemples :
- 130 -
5. Mise en forme des données en Fortran 77 -
*
* Exemple 26
* Utilisation de plusieurs mises en forme
*
program exem26
character*40 forme(2)
real*4 valeur
*
* Mise en forme enregistrée dans deux instructions data
* Chaque élément de forme(2) représente une mise en forme
*
data forme(1) /'(10x,''Nombre négatif = '',f16.3)'/
data forme(2) /'(10x,''Nombre positif = '',f16.3)'/
data valeur /1.0/
*
write (*,'(//,15x,a,//,5x,a,/)')
+ 'INTRODUCTION DE NOMBRES REELS QUELCONQUES',
+ 'Terminez en introduisant 0 (zéro)'
*
do while (valeur .ne. 0.0)
write (*,'(/,5x,a,$)') 'Donnez un nombre réel : '
read *, valeur
if (valeur .ge. 0.0) then
write (*,forme(2)) valeur
else
write (*,forme(1)) valeur
end if
end do
*
end
Résultat de l'exécution du programme
- 131 -
- Langage de programmation : Fortran 77 -
Dans le langage FORTRAN , l'instruction de lecture est read , l'instruction d'écriture est print ou
write. Ces trois instructions interviennent soit directement dans les opérations au terminal ou dans le
déroulement du programme, soit sur les divers types de fichiers. Dans ce sous-chapitre, nous traitons les
opérations d'entrée et de sortie sur la console de l'utilisateur.
( liste , i = e1 , e2 [ , e3 ] ... )
avec :
liste une liste d'éléments en entrée ou en sortie,
i une variable de boucle de type integer ,
e1,e2,e3 les paramètres de boucle, identiques à ceux de la boucle do ... fondamentale.
- 132 -
5. Mise en forme des données en Fortran 77 -
La variable de boucle et les paramètres e1, e2 et e3 remplissent les mêmes fonctions que dans
l'instruction do ... , voir sous 3.3.1 . Les éléments de la liste peuvent faire référence à la variable de
boucle, mais ne doivent en aucun cas la modifier.
Les règles à observer, dans la composition de cette structure, sont :
1. introduire une paire de parenthèses pour chaque boucle, même unique,
2. la variable de boucle la plus intérieure varie d'abord et le plus souvent,
3. une virgule doit précéder chaque variable de boucle,
4. les expressions contenant ou non la ou les variables de boucle sont admissibles comme indice,
5. chaque liste simple précédant une variable de boucle peut contenir plusieurs variables ou éléments,
6. l'imbrication de plusieurs boucles est possible.
Exemples :
do i=1,11,2
do j=1,10
write (*,'(1x,f14.5)') table(i,j)
end do
end do
On voit immédiatement la simplification d'écriture de l'instruction et la possibilité de nouvelle explo-
ration de l'instruction de mise en forme.
read *, (p(i),(q(i,j),j=1,10),i=1,5)
Cette instruction lit les éléments p (1),q (1,1), q (1,2), ... , q (1,10) avant d'incrémenter i à la valeur 2 .
Le seule inconvénient de cette structure est de devoir entrer 55 éléments au clavier sans texte intermé-
diaire. La boucle implicite en lecture est donc réservée au transfert de données d'un fichier externe ou
interne plutôt qu'aux entrées au clavier.
print *, (i,i=1,30)
Cette instruction écrit au terminal tous les nombres entiers de 1 à 30 avec la mise en forme par
défaut.
- 133 -
- Langage de programmation : Fortran 77 -
read *, a,b,c
read (5,*) a,b,c
La seconde variante s'introduit surtout si la donnée à lire nécessite un descripteur de type : types
character, logical.
Un texte doit toujours accompagner l'introduction d'une donnée en mode interactif car s'il est possible
d'affecter une constante entière, sans point décimal à une variable de type real , l'affectation d'une
constante réelle à une variable de type integer n'est pas acceptée pendant l'exécution du programme. Le
pointeur de ligne attend l'introduction de toutes les valeurs de la liste. Il est recommandé de prévoir l'intro-
duction d'une seule valeur par instruction read ... .
L'affectation d'une chaîne de caractères à une variable numérique n'est plus autorisée avec FOR-
TRAN-77. La plupart des fabricants ont conservé cette possibilité de lire des caractères et de les affecter
à des variables numériques afin de ne pas devoir modifier les programmes existants. Ce mode de pro-
grammation permet de loger un caractère par octet, comme le montre l'exemple ci-dessous.
- 134 -
5. Mise en forme des données en Fortran 77 -
print 110
read *, numero
110 format (10x,'Donnez le numéro de l''enregistrement : ',$)
- 135 -
- Langage de programmation : Fortran 77 -
Un exemple de programmation de ce type est donné dans l'exemple 6 avec une variable de type
integer*4 assignée à une étiquette. La méthode classique de programmation avec l'instruction write
serait
write (6,110)
read (*,*) numero
110 format (10x,'Donnez le numéro de l''enregistrement : ',$)
avec :
N(p) polynôme du numérateur en p, jusqu'au 32ième degré,
D(p) polynôme du dénominateur en p, jusqu'au 32ième degré.
avec : j = (-1.0)0,5,
ω = pulsation.
Le programme utilise des variables complexes et la méthode de Horner, ici une fonction polynomiale
en complexe, pour évaluer les deux polynômes.
*
* Exemple 27
* Calcul de la réponse harmonique d'un élément linéaire
* donné par sa fonction de transfert: G(p) = N(p)/D(p)
*
program exem27
integer i,ipn,m,n,np
complex horner,omega,pol
real*4 fac,om,ommax,ommin,phi,x,y
real*4 a(0:32),b(0:32),res(0:100,5)
intrinsic aimag,alog10,atan2,cmplx,real,sqrt
external lectur,horner
*
* Fonction-formule pour trouver le module
*
rayon(x,y)=sqrt(x*x+y*y)
*
write (*,'(//,18x,a,///,2(5x,a,/),/,3(5x,a,/),/,5x,a,$)')
+ 'REPONSE HARMONIQUE D''UN ELEMENT QUELCONQUE',
+ 'La fonction de transfert est donnée sous forme d''une fraction',
+ 'algébrique en p : G(p) = N(p)/D(p)',
+ 'Les coefficients des deux polynômes sont à donner comme suit :',
+ 'a(n), a(n-1), a(n-2), ... , a(2), a(1), a(0)',
+ 'b(m), b(m-1), b(m-2), ... , b(2), b(1), b(0)',
+ 'Donnez le degré n du polynôme du numérateur : '
- 136 -
5. Mise en forme des données en Fortran 77 -
read *,n
write (*,'(12x,a,$)') 'le degré m du polynôme du dénominateur : '
read *,m
*
write (*,'(/,20x,a,$)') 'Coefficients du numérateur'
call lectur (a,n)
write (*,'(/,20x,a,$)') 'Coefficients du dénominateur'
call lectur (b,m)
*
write (*,'(/,5x,a,$)') 'Donnez omega minimal : '
read *, ommin
write (*,'(12x,a,$)') 'omega maximal : '
read *, ommax
write (*,'(12x,a,$)')
+ 'le nombre de points par puissance de 10 : '
read *, np
*
* Initialisation des grandeurs
*
fac = 10.0**(1.0/np)
ipn = (alog10(ommax)-alog10(ommin))*np
om = ommin
if (n .eq. 0) then
a(1) = a(0)
a(0) = 0.0
n = 1
end if
if (m .eq. 0) then
b(1) = b(0)
b(0) = 0.0
m = 1
end if
*
* Calcul de la réponse harmonique
*
do i=0,ipn
omega = cmplx(0.0,om)
pol = horner(a,n,omega)/horner(b,m,omega)
res(i,1) = om
res(i,2) = real(pol)
res(i,3) = aimag(pol)
res(i,4) = rayon(res(i,2),res(i,3))
res(i,5) = 57.29578*atan2(res(i,3),res(i,2))
om = om*fac
end do
*
* Affichage des résultats dans un tableau
*
write (*,'(///,16x,a,//,3x,a,7x,a,10x,a,10x,a,7x,a,6x,a,//,
+ 5(1x,i4,f12.4,2f15.5,e15.5,f13.4,/))')
+ 'REPONSE HARMONIQUE EN FONCTION DE LA PULSATION',
+ 'No','omega','GRéel','GImag','Module','Angle en °',
- 137 -
- Langage de programmation : Fortran 77 -
+ (i,(res(i,j),j=1,5),i=0,ipn)
*
end
*
**********************************************************
* Sous-programme de lecture des coefficients
*
subroutine lectur (a,n)
integer i,n
real*4 a(0:n)
*
do i=0,n
write (*,'(10x,a,i3,a,$)')
+ 'Coefficient indice ',n-i,' = '
read *, a(i)
end do
end
*
**********************************************************
* Fonction calculant la valeur complexe du polynôme
*
complex function horner (a,n,om)
integer i,n
real*4 a(0:n)
complex om,prov
intrinsic cmplx
*
prov = cmplx(a(0))
do i=1,n
prov = prov*om+a(i)
end do
horner = prov
end
- 138 -
CHAPITRE 6
Les programmes écrits par le programmeur sont conservés sur l'un des disques durs de l'ordina-
teur ou éventuellement sur des bandes magnétiques ou sur des disques de type CD, les instructions
étant stockées sous forme d'une suite de caractères ASCII . Les programmes sont placés dans des
enregistrements appelés fichier, ayant un identificateur conforme aux règles d'écriture en vigueur dans
le système d'exploitation, pouvant se lire à l'écran ou s'écrire sur une imprimante externe au moyen
d'une des commandes appropriées au système d'exploitation.
Par contre, les programmes compilés et exécutables, c'est-à-dire traduits en langage machine,
constitués par l'ensemble des programme et sous-programmes, sont stockés sur les mêmes supports
codés sous forme binaire. Ils ne peuvent pas s'afficher à l'écran ou s'écrire sur une imprimante car le
codage binaire ne correspond pas aux caractères du code ASCII . Ces trois types de fichiers : source,
objet et exécutable, sont placés dans des enregistrements identifiables par un nom de fichier suivi
habituellement d'une extension. Le choix de l'extension, séparée par le point du nom de fichier, est
imposé soit par le compilateur, soit par le système d'exploitation.
Dans ce chapitre, nous désignerons fichier codé, un fichier composé de caractères ASCII lisibles
à l'écran ou sur l'imprimante et un fichier binaire, un fichier constitué d'octets non lisibles à l'extérieur
de l'exécution du programme.
Le langage FORTRAN reconnaît les fichiers suivants :
1. fichiers séquentiels : dans ce type de fichier, l'accès en écriture ou en lecture s'effectue depuis le
début jusqu'à la fin du fichier.
2. fichiers à accès direct : dans ce type de fichier, l'accès en écriture et en lecture est sélectif et
s'effectue par l'intermédiaire d'un numéro d'ordre.
3. fichiers internes : le transfert des données s'effectue entre des variables définies dans le pro-
gramme.
La composante de base d'un fichier est l'enregistrement. Un enregistrement est une suite de don-
nées numériques et/ou alphanumériques. Les fichiers séquentiel ou direct représentent des enre-
gistrements externes à la mémoire vive de l'ordinateur. Ils ne peuvent pas être écrits ou lus dans le
programme sans passer par une unité intermédiaire constituée par une mémoire tampon. La mémoire
tampon permet de stocker provisoirement des informations transmises du disque vers le programme
ou dans le sens inverse afin de ne pas interrompre le flux des données qui ne peut se réaliser que par
secteurs sur les disques durs.
La lecture et l'écriture de données dans un fichier se réalise par les deux instructions :
1. lecture de données dans le fichier : Instruction read ...
2. écriture de données dans le fichier : Instruction write ...
Ces deux instructions sont accompagnées d'un certain nombre de clauses ou options facilitant le
transfert et le déroulement des opérations.
- 139 -
- Langage de programmation : Fortran 77 -
6.1.1.1 ENREGISTREMENTS
Chaque instruction d'entrée / sortie transfère un enregistrement. Les instructions codées ASCII ou
binaires autorisent le transfert d'enregistrements supplémentaires. Si une instruction d'entrée n'utilise
pas tout les champs de données de l'enregistrement, les champs en surplus sont ignorés. Si l'instruc-
tion d'entrée exige plus de champs que ceux contenus dans l'enregistrement, une erreur apparaît et si
l'entrée est codée, tous les champs sont lus comme des espaces. Ces fonctionnalités peuvent dépen-
dre du compilateur.
Si l'instruction de sortie attend d'écrire plus de champs que ce que contient l'enregistrement, une
erreur intervient. Si l'instruction de sortie transfère moins de données que le nombre imposé par un
enregistrement à longueur fixe, l'enregistrement est remplit d'espaces s'il est codé, ou de zéro s'il est
binaire.
1. Organisation séquentielle
Les enregistrements d'un fichier à accès séquentiel sont organisés en séquences dites physiques,
chaque enregistrement, à part le premier, possède un enregistrement le précédent, et chaque enre-
gistrement, sauf le dernier, présente un enregistrement qui le suit. L'ordre dans lequel les enregis-
trements se trouvent dans le fichier est engendré lors de l'écriture du fichier. Les enregistrements
peuvent être de tailles différentes.
2. Organisation directe
Les enregistrements d'un fichier à accès direct possèdent tous la même longueur et sont ordon-
nés en séquences physiques. Ils sont numérotés à partir de 1 pour le premier enregistrement jusqu'à
n pour le dernier. La longueur des enregistrements se donne dans l'opération d'ouverture du fichier.
Chaque enregistrement possède son numéro d'ordre, attribué lors de l'écriture. L'organisation à accès
direct autorise l'écriture d'enregistrements dans un ordre quelconque. Il n'est pas possible de retirer un
enregistrement de l'ensemble, mais par contre il est possible de remplacer les données existantes par
de nouvelles valeurs.
- 140 -
- 6. Utilisation des fichiers en Fortran 77 -
1. Accès séquentiel
Un accès séquentiel signifie que les enregistrements sont traités en séquence, du début à la fin
du fichier. Il est possible d'accéder à un fichier direct en accès séquentiel. Dans ce cas, l'accès a lieu
dans l'ordre croissant des numéros d'enregistrement.
2. Accès direct
Un accès direct signifie que le programme spécifie l'ordre de traitement par un numéro d'enregis-
trement pour chaque instruction d'entrée / sortie. Pour pouvoir accéder directement à un fichier
séquentiel, il faut que tous les enregistrements aient même longueur donc même nombre d'octets.
6.1.2 CLAUSES
Le langage FORTRAN autorise de nombreuses clauses dans les instructions d'entrée / sortie. Ce
sous-chapitre les décrit par ordre alphabétique, certaines clauses étant applicables seulement à une
ou quelques instructions. Dans la description des instructions utilisées pour le traitement des fichiers,
les clauses applicables à ces instructions seront citées avec leurs diverses possibilités d'affectations.
Les instructions pouvant contenir une ou plusieurs clauses sont :
Tableau 6.1
CLAUSES DES INSTRUCTIONS D'ENTRÉE / SORTIE
- 141 -
- Langage de programmation : Fortran 77 -
access = mode
avec :
mode une constante chaîne de caractères fixant le mode d'accès :
'sequential' mode d'accès séquentiel,
'direct' mode d'accès direct.
La constante doit être placée entre apostrophes et peut se remplacer par une expression de type
character à droite du caractère = . La clause par défaut est 'sequential' . Lors de la création d'un
nouveau fichier, le mode d'accès est fixé soit pas défaut, soit par la clause explicite. Pour faciliter la
lecture et la compréhension d'un programme comportant de nombreuses ouvertures de fichier, il est
recommandé de citer cette clause dans l'instruction d'ouverture.
Si la clause access est utilisée dans l'instruction inquire , mode doit être une variable ou un élé-
ment de tableau de type character, car le compilateur affecte à cette variable la valeur 'sequential'
ou 'direct' . Le mode d'accès doit être conservé à toute ouverture d'un fichier. Certains compilateurs
admettent de lire un fichier créé en accès direct par une ouverture en mode d'accès séquentiel.
blank = blanc
avec :
blanc une constante de type caracter , soit :
'null' les blancs sont ignorés; c'est l'option par défaut,
'zero' les blancs sont considérés comme des zéros.
Avec l'instruction inquire , blanc doit être une variable ou un élément de tableau de type charac-
ter. Le compilateur affecte à cette entité l'une des deux constantes : 'null' ou 'zero' . Si la clause est :
form = 'unformatted' , alors la clause blank est indéfinie dans les opérations d'E/S .
direct = dir
avec :
dir variable ou élément de tableau de type character. FORTRAN affecte à cette entité l'une des
valeurs suivantes :
'yes' si le mode d'accès direct est autorisé,
'no' si le mode d'accès direct est interdit,
'unknown' si le mode d'accès ne peut pas être trouvé.
end = etiq
- 142 -
- 6. Utilisation des fichiers en Fortran 77 -
avec :
etiq une constante ou une expression entière positive correspondant à une étiquette existante
dans l'unité de programme.
Exemple :
err = etiq
avec :
etiq étiquette d'une instruction exécutable permettant de continuer le programme ou de traiter
éventuellement la cause de l'erreur.
Si la clause err est présente dans l'instruction d'entrée / sortie et qu'une erreur intervient, le pro-
gramme continue à l'instruction portant l'étiquette spécifiée. Si par contre, cette clause est absente, le
programme s'arrête et affiche un message d'erreur.
exist = lexis
avec :
lexis une variable de type logical. FORTRAN affecte à cette variable :
.true. si le fichier ou l'unité existe,
.false. si le fichier ou l'unité n'existe pas.
file = nomfich
avec
nomfich nom complet du fichier externe, conforme aux règles imposées par le système d'ex-
ploitation : chemin , identificateur et extension compris. Le nom doit être encadré
d'apostrophes.
Si le nom de fichier est placé dans une variable ou un élément de tableau de type character,
cette entité peut être placée à droite du caractère = . Dans la plupart des cas, le nom du fichier est
une constante chaîne de caractères. Les compilateurs de mini-ordinateurs admettent par exemple un
identificateur par défaut.
- 143 -
- Langage de programmation : Fortran 77 -
form = fcode
avec :
fcode une constante de type chaîne de caractères dans l'instruction open :
'formatted' codé ASCII,
'unformatted' codé binaire.
La constante doit être encadrée d'apostrophes et peut se remplacer par une variable ou un élé-
ment de tableau de type character, affecté de l'une des deux valeurs alphanumériques. Pour un
fichier à accès séquentiel, la forme de l'enregistrement est 'formatted' par défaut tandis que pour un
fichier à accès direct, la forme de l'enregistrement est 'unformatted' par défaut.
Lors de l'accès à un fichier existant, la clause par défaut ou explicitement déclarée dans l'instruc-
tion d'ouverture doit correspondre exactement à la nature du codage utilisé précédemment pour ce
fichier. L'introduction du code ASCII nécessite toujours une opération de transformation de la repré-
sentation interne en représentation externe et vice versa. Ces opérations consomment du temps
machine et provoquent très souvent une perte de précision numérique. De plus, l'utilisation d'une mise
en forme d'une grandeur numérique occupe plus de place en mémoire que le nombre d'octets alloué à
la représentation interne. Avant d'introduire les options par défaut, surtout pour l'accès séquentiel, il
est recommandé de conserver la structure binaire aux données d'un fichier utilisé seulement dans un
ou plusieurs programmes FORTRAN. Si par contre, le fichier doit être lisible au niveau du système
d'exploitation ou que ce fichier ait été écrit au moyen d'un éditeur de texte, il faut introduire le codage
ASCII, soit la clause 'formatted'.
Si la clause form est utilisée dans l'instruction inquire , fcode doit être une variable ou un élé-
ment de tableau de type character. FORTRAN affecte à cette variable soit 'formatted', soit
'unformatted' suivant le codage utilisé.
formatted = fmtd
avec :
fmtd une variable ou un élément de tableau de type character. Le compilateur FORTRAN affecte à
cette entité :
'yes' si une E/S codée ASCII est autorisée,
'no' si une E/S codée ASCII est défendue,
'unknown' si le compilateur ne peut pas déceler si une E/S codée ASCII est permise ou
non sur ce fichier.
fmt = dfmt
avec :
dfmt un des choix suivants :
- une étiquette d'une instruction format,
- une variable de type integer*4 assignée à l'étiquette d'un format,
- une constante de type character, décrivant la mise en forme, la chaîne devant être
encadrée d'apostrophes,
- 144 -
- 6. Utilisation des fichiers en Fortran 77 -
iostat = istat
avec :
istat une variable ou un élément de tableau de type integer*4 prenant la valeur :
0 si l'opération d'E/S s'est effectuée correctement,
... une valeur négative si une fin de fichier est atteinte,
... une valeur positive si une erreur est intervenue dans l'opération d'E/S.
La valeur retournée dépend du processeur et de la présence ou non de fichiers de traitement des
erreurs, du système d'exploitation et de l'implémentation du langage.
name = nom
avec :
nom une variable ou un élément de tableau de type character. FORTRAN affecte le nom complet
du fichier à cette entité.
La clause named permet de détecter si le fichier connecté à l'unité logique possède un nom ou
pas de nom, la syntaxe étant :
named = lnom
avec :
lnom une variable ou un élément de tableau de type logical. FORTRAN affecte la valeur .true. si le
fichier est nommé, .false. si le fichier ne l'est pas.
nextrec = next
avec :
next une variable ou un élément de tableau de type integer. FORTRAN affecte le numéro du
dernier enregistrement lu + 1 à cette entité, mais sans effectuer d'opération d'E/S. En accès
séquentiel, l'entité reste indéterminée.
- 145 -
- Langage de programmation : Fortran 77 -
number = num
avec :
num une variable ou un élément de tableau de type integer. FORTRAN affecte à cette entité le
numéro de l'unité logique connectée au fichier.
opened = lopen
avec :
lopen variable ou élément de tableau de type logical. FORTRAN affecte la valeur .true. si le fichier
est ouvert, la valeur .false. dans le cas contraire.
rec = recnum
avec :
recnum une expression de type integer , y compris une constante positive.
Cette clause ne peut pas s'introduire dans une opération d'E/S en mode séquentiel, ni dans les
fichiers internes.
recl = rlong
avec :
rlong une expression entière positive spécifiant la longueur en octets de l'enregistrement.
Pour les fichiers séquentiels, rlong doit être la longueur maximale des enregistrements. Pour un
nouveau fichier à accès direct, rlong doit être égal à la longueur de l'enregistrement + 1 octet. Pour
un fichier existant à accès direct, rlong peut être égal à la longueur des enregistrements existants.
Habituellement, pour un fichier binaire, rlong est exprimé en octets ou éventuellement en mots. Avec
l'instruction inquire , rlong est une variable ou un élément de tableau de type integer , FORTRAN
affectant à cette variable la longueur de l'enregistrement utilisé en accès direct.
- 146 -
- 6. Utilisation des fichiers en Fortran 77 -
sequential = seq
avec :
seq une variable ou élément de tableau de type character. FORTRAN affecte :
'yes' si l'accès séquentiel est autorisé,
'no' si l'accès séquentiel est défendu,
'unknown' si l'accès séquentiel ne peut pas se trouver sur ce fichier.
status = stat
avec :
stat une constante de type chaîne de caractères, soit lors de l'ouverture par open :
'old' le fichier existe à l'ouverture,
'new' un nouveau fichier est créé,
'scratch' un nouveau fichier sera créé et sera détruit lors de sa fermeture,
'unknown' crée un nouveau fichier s'il n'existe pas lors de l'ouverture, utilise le fichier existant
s'il est présent sur le disque.
La clause par défaut est 'unknown' ; pour cette clause, le programme essaie la variante 'old' et si
le fichier n'existe pas, il adopte la variante 'new'. Utilisez cette clause s'il y a des doutes sur la pré-
sence d'un fichier.
Certains compilateurs reconnaissent la clause 'append' (hors norme ANSI) qui, à l'ouverture du
fichier, est identique à 'unknown', mais place le pointeur d'enregistrement sur la fin du fichier. Les
autres clauses hors norme ANSI sont : 'write' , 'readonly' et 'overwrite' .
Dans l'instruction close , la clause par défaut est 'keep' à moins d'une ouverture avec l'option
'scratch' . Il est possible de remplacer la constante par une variable ou un élément de tableau de type
character affecté d'une des options.
unformatted = unf
avec :
unf une variable ou un élément de tableau de type character. FORTRAN affecte :
'yes' si une E/S binaire est autorisée,
'no' si une E/S binaire n'est pas autorisée,
'unknown' si le compilateur ne peut pas déterminer si une E/S binaire est permise ou non.
- 147 -
- Langage de programmation : Fortran 77 -
Pour relier un fichier externe à la mémoire centrale, il est nécessaire de fixer, par programmation,
les points suivants :
1. le nom du fichier externe, conforme aux règles imposées par le système d'exploitation, situé sur le
disque dur de l'ordinateur.
2. l'identificateur de la mémoire tampon servant au transfert des données entre le disque et le pro-
gramme : ce nom est constitué par un numéro de type integer. Cette unité porte la désignation
d'unité logique.
3. la nature de l'accès : accès séquentiel ou accès direct.
4. la nature du codage de l'information stockée dans le fichier : codée ASCII ou binaire.
5. la nature du fichier : nouveau fichier ou fichier déjà existant sur le disque, fichier à conserver ou à
détruire après édition ou modification.
6. des spécifications complémentaires concernant la lecture ou l'écriture, la longueur des enregis-
trements, le traitement des erreurs ou de la fin de fichier, etc.
Certaines de ces informations doivent être transmises obligatoirement, d'autres sont optionnelles
ou existent par défaut.
- 148 -
- 6. Utilisation des fichiers en Fortran 77 -
Les règles applicables aux unités logiques définies dans l'instruction open sont les suivantes :
1. l'unité logique est globale dans le programme exécutable. Sa validité se transmet également dans
tous les sous-programmes ou du sous-programme où se trouve l'instruction dans toutes les autres
unités du programme.
2. l'unité logique est connectée au programme par l'instruction open et se déconnecte par l'instruc-
tion de fermeture du fichier close ou par la fin d'exécution normale du programme.
3. un fichier ne peut être relié qu'à une seule unité logique à un moment donné du déroulement du
programme;
4. il est recommandé de conserver les numéros d'unités logiques 5, 6 et 7 pour les unités standards
d'entrée - sortie et de limiter la numérotation à deux chiffres. Le numéro maximal dépend de
l'implémentation du langage.
open (4,file='system.duf',status='old',access='sequential',
+ form='unformatted')
Cette instruction ouvre un fichier existant system.duf en accès séquentiel, les données étant bi-
naires, et le fichier se connecte à l'unité 4.
*
* Exemple 28
* Opération d'ouverture sur 2 fichiers à accès séquentiel
*
program exem28
integer ival,icont,jval
character*25 cnom,prenom,znom1,znom2
character*20 fich1,fich2
*
data fich1,fich2 /'DONNE1.DAT','DONNE2.TXT'/
*
write (*,'(//,15x,a,//)')
+ 'OUVERTURE DE DIFFERENTS FICHIERS'
write (*,'(5x,a,$)') 'Donnez un nombre entier : '
read *, ival
write (*,'(/,5x,a,$)') 'Donnez votre nom : '
read (*,'(a)') cnom
write (*,'(12x,a,$)') 'votre prénom : '
read (*,'(a)') prenom
*
open (1,file=fich1,iostat=icont,status='unknown',
+ access='sequential')
write (1,'(i8)') ival
- 149 -
- Langage de programmation : Fortran 77 -
rewind 1
read (1,'(i8)') jval
write (*,'(/,2(5x,a,i8,/))')
+ 'Le fichier 1 contient : ',jval,
+ 'L''état du contrôle des erreurs donne : ',icont
*
open (2,file=fich2,status='unknown',access='sequential')
write (2,'(a)') cnom,prenom
rewind 2
read (2,'(a)') znom1,znom2
write (*,'(/,3(5x,a,/)/)')
+ 'Les noms dans le fichier 2 sont : ',znom1,znom2
*
close (1)
close (2)
*
end
Résultat de l'exécution du programme
- 150 -
- 6. Utilisation des fichiers en Fortran 77 -
Dans les chapitres précédents, nous avons décrit les instructions d'écriture et de lecture appli-
cables aux données d'entrée - sortie sur le terminal. Ce sous chapitre présente toutes les possibilités
de ces deux instructions, complétées par l'instruction de contrôle inquire .
- 151 -
- Langage de programmation : Fortran 77 -
fmt = dfmt
iostat = istat
rec = recnum
L'instruction read transfère des données d'un fichier vers une représentation interne, conformé-
ment à la mise en forme ou le type de données. FORTRAN lit tous les éléments de la liste conformé-
ment aux règles de rangement, en particulier celui des tableaux. Si le compilateur rencontre une barre
oblique dans les spécifications de mise en forme, il utilise les descripteurs se situant à droite de la
barre / .
- 152 -
- 6. Utilisation des fichiers en Fortran 77 -
iostat = istat
err = etiq
Le numéro de l'unité logique spécifié dans l'instruction rewind se réfère à un fichier à accès sé-
quentiel placé sur disque. Le pointeur de fichier va se placer au point de départ du fichier, soit avant le
premier enregistrement.
endfile uni
endfile ( unit = uni [ , . . . ] )
avec :
uni numéro de l'unité logique connectée au fichier externe. La clause unit = est optionnelle si
uni est le premier argument de la liste et ne doit pas apparaître dans la première forme de
l'instruction.
Les clauses supplémentaires applicables à l'instruction endfile sont (description voir 6.1.2) :
iostat = istat
err = etiq
Cette instruction n'est applicable qu'aux fichiers séquentiels. Elle permet de réinitialiser un fichier
ouvert sûrement si ce fichier n'a pas été fermé et d'assurer qu'aucun enregistrement ne subsiste dans
le fichier. On peut également terminer l'écriture d'un fichier séquentiel plus court par cette instruction.
Exemple :
endfile (10,iostat=istat,err=250)
Cette instruction met une marque de fin de fichier à la position actuelle du pointeur et si une erreur
intervient, le programme continue à l'instruction exécutable étiquetée 250 , la variable entière istat
contenant le numéro de l'erreur ou zéro si l'opération s'est déroulée correctement.
- 153 -
- Langage de programmation : Fortran 77 -
backspace uni
backspace ( unit = uni [ , . . . ] )
avec :
uni numéro de l'unité dans laquelle il faut effectuer un recul d'un enregistrement. La clause unit =
peut être omise si c'est le premier argument de la liste entre parenthèses.
Les clauses supplémentaires applicables à l'instruction backspace sont (description voir 6.1.2) :
iostat = istat
err = etiq
L'instruction déplace le pointeur dans le fichier connecté juste avant celui qui a été lu ou écrit. Il
est aussi possible d'employer backspace pour positionner le pointeur juste avant la marque de fin de
fichier, afin d'enregistrer des données supplémentaires. Si le pointeur de fichier se trouve au début du
fichier, l'instruction n'a pas d'effet.
Le fichier doit être bien entendu ouvert avant de donner cette instruction. Le numéro de l'unité lo-
gique doit être spécifié et ne peut pas être l'astérisque * . Exemples :
backspace 8
backspace (unit=9,iostat=istret,err=1000)
La première instruction déplace le pointeur de -1 enregistrement dans le fichier connecté par
l'unité 8 , la seconde instruction dans le fichier connecté par l'unité 9 , avec affectation du numéro
d'erreur à la variable istret et saut à l'instruction étiquetée 1000 en cas d'erreur d'exécution.
L'accès séquentiel aux données d'un fichier permet de lire ou d'écrire ce fichier du début à la fin,
enregistrement après enregistrement, sans pouvoir sélectionner dans le fichier un enregistrement par-
ticulier à partir d'un numéro d'ordre. Ce sous-chapitre comprend deux parties : la structure des instruc-
tions adaptées à ce genre de fichiers et les algorithmes de programmation pour atteindre certaines
fonctionnalités.
- 154 -
- 6. Utilisation des fichiers en Fortran 77 -
open (1,file='fich1.dat',status='unknown',access='sequential',
+ form='formatted')
2. Fichier binaire :
open (2,file='fich2.duf',status='unknown',access='sequential',
+ form='unformatted')
Des clauses complémentaires peuvent se donner dans cette instruction, voir la description com-
plète de l'instruction d’ouverture. Il est recommandé de programmer les clauses par défaut afin de
reconnaître immédiatement la nature du fichier.
- 155 -
- Langage de programmation : Fortran 77 -
Les particularités de l'écriture des données de type character sont aussi applicables à la lecture de
ces données. Pour que la lecture codée s'effectue correctement, ces données étant stockées dans le
fichier sous forme de suites de caractères, donc non sous forme numérique, il faut que la mise en
forme de l'instruction de lecture soit absolument identique à celle employée lors de l'écriture. La
lecture binaire ne nécessite pas ces transformations, le nombre d'octets transférés étant imposé par le
type des variables à affecter.
- 156 -
- 6. Utilisation des fichiers en Fortran 77 -
*
* Exemple 29
* Essai d'un fichier à accès séquentiel avec génération d'un
* tableau de fonctions trigonométriques
*
program exem29
integer i,ioch,n,nunit
logical lexis,lnom,lopen
real*4 c,s,t,x
character rep*1,fiche*12,fich1*12
intrinsic cos,mod,sin,tan
*
write (*,'(//,20x,a,//,16x,a,//,5x,a,$)')
+ 'CREATION D''UN FICHIER A ACCES SEQUENTIEL',
+ 'Génération d''un tableau de fonctions trigonométriques',
+ 'Donnez le nom du fichier (8 caractères) : '
read (*,'(a)') fich1
fich1(9:12) = '.DUF'
write (*,'(/,5x,a,$)')
+ 'Donnez le nombre de valeurs à calculer : '
read *, n
*
open (8,file=fich1,status='unknown',access='sequential',
+ form='unformatted')
do i=0,n
x=0.01*i
s=sin(x)
c=cos(x)
t=tan(x)
write (8) i,x,s,c,t
end do
close (8)
write (*,'(//,10x,a,//,5x,a,$)')
+ 'FIN DE LA CREATION DU FICHIER',
+ 'Pressez sur <RET> '
read (*,'(a1)') rep
*
write (*,'(//,10x,a,/)') 'Lecture du fichier'
open (9,file=fich1,status='old',access='sequential',
+ form='unformatted')
20 read (9,end=100) i,x,s,c,t
write (*,'(1x,i10,f10.4,2f12.7,f16.7)') i,x,s,c,t
if (mod(i,5) .eq. 0) write (*,*)
go to 20
*
100 continue
inquire (unit=9,exist=lexis,named=lnom,iostat=ioch,
+ opened=lopen,number=nunit,name=fiche)
write (*,'(//,10x,a,//,2(5x,a,i5,/),3(5x,a,l5,/),5x,a,a,/)')
+ 'ETAT DU FICHIER LU AVANT CLOTURE',
+ 'Numéro de l''unité raccordée : ',nunit,
+ 'Etat des entrées/sorties : ',ioch,
+ 'Le fichier existe : T = oui : ',lexis,
+ 'Le fichier possède un nom : T = oui : ',lnom,
+ 'Le fichier est ouvert : T = oui : ',lopen,
+ 'Le nom du fichier est : ',fiche
- 157 -
- Langage de programmation : Fortran 77 -
*
close (9)
end
1. Fichiers permanents
Ces fichiers contiennent des données pratiquement invariables pendant toute leur durée de vie.
Ce sont des fichiers d'archives de données de l'état d'une utilisation, comme par exemple des
comptes financiers, des résultats d'observation ou des tables de constantes et propriétés physiques.
2. Fichiers dynamiques
Ces fichiers contiennent des données modifiables comme un état de stock de pièces, d'adresses
d'un groupe de personnes, etc.
3. Fichiers temporaires
Ce genre de fichier s'utilise pendant l'exécution du programme et sert à conserver provisoirement
des informations qui seront transférées par la suite dans un fichier soit dynamique, soit permanent
sous forme d'ajouts.
- 158 -
- 6. Utilisation des fichiers en Fortran 77 -
Afin de montrer le principe de la programmation d'une structure de ce genre, créons dans l'exem-
ple 30 un fichier à enregistrements variables. Les enregistrements du fichier se composent :
1. d'une partie fixe constituée par les données affectées aux variables :
i numéro de l'enregistrement, n'est pas absolument nécessaire dans ce cas,
n le nombre de valeurs créées pseudo-aléatoirement.
2. d'une partie variable, la valeur de n étant générée également pseudo-aléatoirement entre 1 et 10.
La partie variable comprend n valeurs réelles comprises entre -100.00 et +100.00 .
Après stockage de toutes les données dans le fichier, le pointeur est positionné au début du fi-
chier et les valeurs se trouvant dans chaque enregistrement sont affichées à l'écran.
*
* Exemple 30
* Création d'un fichier à accès séquentiel
* Enregistrements à dimension aléatoirement variable
*
program exem30
integer i,j,n,nomb
real*4 aini,alea,valeur,val(10)
character fiche*12,rep*1
intrinsic abs,int,mod
external alea
*
write (*,'(//,20x,a,//,5x,a,$)')
+ 'GENERATION D''ENREGISTREMENTS A TAILLE VARIABLE',
+ 'Donnez le nom complet du fichier (max. 12 caractères) : '
read (*,'(a)') fiche
write (*,'(12x,a,$)') 'un nombre réel avec 5 décimales : '
read *, valeur
aini=abs(valeur)
write (*,'(12x,a,$)') 'le nombre d''enregistrements désiré : '
read *, nomb
*
open (4,file=fiche,status='unknown',access='sequential',
+ form='unformatted')
*
* Ecriture des parties fixe et mobiles dans le fichier
*
- 159 -
- Langage de programmation : Fortran 77 -
do i=1,nomb
aini=alea(aini)
n=1+int(10.0*aini)
do j=1,n
aini=alea(aini)
val(j)=200.0*(aini-0.5)
end do
write (4) i,n,(val(j),j=1,n)
end do
*
write (*,'(///,10x,a,//,5x,a,\)')
+ 'FIN DE LA CREATION DU FICHIER',
+ 'Pressez sur la touche <RET> '
read (*,'(a1)') rep
*
* Lecture du fichier après positionnement du pointeur
*
rewind 4
write (*,'(//,10x,a,//)') 'LECTURE DU FICHIER'
30 read (4,end=100) i,n,(val(j),j=1,n)
write (*,'(10x,a,i4,5x,a,i3,/,(5x,5f13.5))')
+ 'Enregistrement : ',i,'Nombre : ',n,(val(j),j=1,n)
if (mod(i,5) .eq. 0) print *
goto 30
*
100 continue
write (*,'(//,10x,a,//)') 'FIN DE PROGRAMME'
close(4)
end
*
* Générateur de valeurs pseudo-aléatoires
*
real function alea (a)
real*4 a,b
intrinsic int
b=29.0*a
alea=b-int(b)
end
Résultat de l'exécution du programme
LECTURE DU FICHIER
Enregistrement : 1 Nombre : 3
-69.61127 -18.72663 56.92759
...................................... etc.
FIN DE PROGRAMME
- 160 -
- 6. Utilisation des fichiers en Fortran 77 -
read (iuni,clause)
dans laquelle :
iuni est le numéro de l'unité logique connectée au fichier,
clause est l'ensemble des clauses et les descripteurs de format si le fichier est codé.
Si le fichier est codé, la clause de mise en forme peut être '(1x)'
Les clauses utilisables sont : err = ... ou iostat = ... .
access = 'append'
pour positionner le pointeur en fin de fichier. C'est un cas particulier du mode d'accès séquentiel.
MS-FORTRAN possède une fonction logique très utile end of file , mais hors norme, eof(iuni ) qui
prend la valeur .true. seulement lorsque le pointeur se trouve en fin de fichier, sinon elle retourne la
valeur .false. . Le paramètre iuni est le numéro de l'unité logique.
Une autre possibilité élémentaire d'étendre un fichier est :
1. ouvrir le fichier à étendre et un nouveau fichier de même caractéristiques que le fichier existant,
2. copier le fichier à modifier dans le nouveau fichier,
3. procéder aux ajouts désirés en fin du nouveau fichier,
4. fermer l'ancien et le nouveau fichier,
5. effacer l'ancien fichier et le remplacer par le nouveau en lui donnant le même nom.
- 161 -
- Langage de programmation : Fortran 77 -
*
* Exemple 31
* Lecture d'un fichier texte à raison de 22 lignes par écran
*
program exem31
*
call efface
call ecran
call inform
call efface
end
*
* Effaçage de l'écran
*
subroutine efface
write (*,'(1x,a1,a2,a1,a3)') char(27),'[H',char(27),'[2J'
end
*
* Sous-programme de lecture des informations
* Le nombre de caractères est de 80 par ligne
*
- 162 -
- 6. Utilisation des fichiers en Fortran 77 -
subroutine inform
integer k
character fiche*32,texte*80
*
write (*,'(//,10x,a,\)')
+ 'Donnez le nom externe du fichier : '
read (*,'(a)') fiche
open (8,file=fiche,status='old')
*
k=0
call efface
10 read (8,'(a80)',end=15) texte
write (*,'(1x,a80)') texte
k=k+1
if (k .eq. 22) then
call touche
k=0
call efface
end if
goto 10
15 continue
*
write (*,'(///)')
close (8)
call touche
end
*
* Sous-programme d'initialisation de l'écran
*
subroutine ecran
*
call efface
write (*,'(///,20x,a,///)')
+ 'LECTURE D''UN FICHIER D''INFORMATIONS',
call touche
end
*
* Sous-programme d'arrêt et de pression sur la touche <RET>
*
subroutine touche
character*1 rep
write (*,'(/,10x,a,\)')
c 'Pour continuer, pressez sur la touche <RET> '
read (*,'(a1)') rep
end
Ce programme se compose d'un programme principal et des sous-programmes :
- efface effacement de l'écran;
- inform introduction du nom du fichier à lire, ouverture du fichier, lecture à raison de 22 lignes par
écran, fermeture du fichier;
- ecran affichage du titre (menu minimal);
- touche arrêt du programme et continuation par pression sur la touche <RET>.
Ce programme utilise la gestion de l'écran au moyen de séquences escape , conformément aux
normes ANSI . Le sous-programme inform réserve 80 caractères par ligne. L'affichage d'une ligne
complète peut présenter une petite difficulté si la gestion d'écran met le pointeur à la ligne lorsque la
- 163 -
- Langage de programmation : Fortran 77 -
colonne 80 est atteinte. Dans ce cas, il faut prévoir 79 caractères par ligne et ne pas dépasser cette
valeur dans le fichier texte.
Le nombre de lignes affichées est 22 , le compteur k incrémentant de 1 après l'écriture de la
ligne à l'écran. Si k = 22 , alors l'écran affiche :
open (3,file='prn:')
write (3,'(...)') liste de variables
Ici, l'unité logique connectée à l'imprimante porte l'identificateur 3 .
- 164 -
- 6. Utilisation des fichiers en Fortran 77 -
*
* Exemple 32
* Transformation de sommes d'argent en valeurs européennes
* avec écriture de la virgule et des zéros non significatifs
*
program exem32
real*4 somme
character transf*12,rep*1
logical lrep
*
data lrep /.true./
*
write (*,'(//,15x,a,//)')
+ 'ECRITURE D''UNE SOMME EN FRANCS AVEC LA VIRGULE'
*
do while (lrep)
write (*,'(/,5x,a,$)')
+ 'Donnez une somme en Frs avec point décimal : '
read *, somme
write (transf,'(f12.2)') somme
transf(10:10)=','
if ((somme .lt. 1.0) .and. (somme .ge. 0.0)) transf(9:9)='0'
write (*,'(5x,a,f12.2,2a,//,5x,a,$)')
+ 'La somme ',somme,' est transformée en : ',transf,
+ 'Désirez-vous une autre valeur (o/n) ? '
read (*,'(a1)') rep
lrep=(rep .eq. 'o') .or. (rep .eq. 'O')
end do
*
end
Cet exemple montre la possibilité de transformer une valeur numérique en chaîne de caractères
au moyen du fichier interne d'identificateur transf . Le fichier prend la place de l'unité logique dans
l'écriture de l'instruction.
Résultat de l'exécution du programme
- 165 -
- Langage de programmation : Fortran 77 -
Les fichiers à accès direct, en anglais informatique random-access files, permettent de sélection-
ner les enregistrements ordonnés et numérotés dans le fichier. Les enregistrements correspondent
approximativement aux éléments d'un vecteur, chaque ligne pouvant contenir des données de type
différent, mais de longueur maximale fixée lors de l'ouverture du fichier.
1. DOMAIN FORTRAN :
La longueur s'exprime en octets pour les fichiers à accès direct ou séquentiel, que les données
soient binaires ou codées. Le paramètre rlong doit être une expression entière. Pour les nou-
veaux fichiers à accès direct, la longueur est égale à la longueur prévue + 1 octet. Pour un fichier
existant à accès direct, rlong peut être toute dimension inférieure ou égale à la longueur actuelle.
Si la clause est absente à l'ouverture d'un fichier existant, FORTRAN admet la longueur du plus
grand enregistrement. Si la clause est omise à la création d'un nouveau fichier, la longueur par
défaut sera 256 octets.
2. MS-FORTRAN :
La longueur de chaque enregistrement s'exprime en octets, l'argument rlong doit se donner pour
les fichiers à accès direct, mais est ignorée pour les fichiers à accès séquentiel.
- 166 -
- 6. Utilisation des fichiers en Fortran 77 -
3. VAX-11 FORTRAN :
La longueur de l'enregistrement se donne en octets pour les fichiers codés, maximum 32766
octets, en longs mots de 4 octets, maximum 8191 mots sur disque. Les règles applicables sont :
- si la clause est absente lors de l'ouverture d'un fichier existant, la longueur spécifiée lors de la
création du fichier est valable.
- si le programme doit écrire un enregistrement plus grand que la valeur spécifiée, une erreur est
signalée.
- si le fichier contient des enregistrements à longueur fixe et et que la clause recl spécifie une di-
mension différente, une erreur est signalée.
Chaque implémentation présente donc ses propres caractéristiques qui rendent les programmes
difficilement portables d'une implémentation à l'autre. Les instructions générales sont données ci-
après.
1. fichier codé :
open (1,file='fich1.dat',status='unknown',access='direct',
+ form='formatted',recl=lf1)
2. fichier binaire :
open (2,file='fich2.duf',status='unknown',access='direct',
+ form='unformatted',recl=lf2)
Dans ces deux instructions, la longueur des enregistrements est donnée par la variable de type
integer selon les règles proposées : lf1 ou lf2 .
Des clauses complémentaires peuvent se donner, voir la description complète de l'instruction. Il
est recommandé de programmer les clauses par défaut pour les fichiers à accès direct afin de recon-
naître immédiatement la nature du fichier.
- 167 -
- Langage de programmation : Fortran 77 -
*
* Exemple 33
* Création d'un fichier à accès direct
*
program exem33
integer*2 i
real*4 a,ai,b,c,d
parameter (pi=3.141593)
intrinsic cos,real,sin
*
write (*,'(//,15x,a,//)') 'FICHIER A ACCES DIRECT'
open (8,file='enregi.duf',access='direct',status='unknown',
+ form='unformatted',recl=20)
*
do i=1,50
ai= real(i) * pi
a = 2.5 * ai
b = 10.0 * sin(0.05*ai)
c = 20.0 * cos(0.1*ai)
d = a - b + 2.0*c
write (8,rec=i) i,a,b,c,d
end do
*
print *,'--- Création du fichier : enregi.duf terminée ---'
close (8)
end
- 168 -
- 6. Utilisation des fichiers en Fortran 77 -
plémentaires et de la liste des variables à affecter. Dans les exemples suivants, nous avons conservé
la même liste de variables et la même longueur des enregistrements .
*
* Exemple 34
* Lecture d'un fichier créé en accès direct
*
program exem34
integer*2 i,ienr
logical lrep
real*4 a,b,c,d
character rep*1
*
data lrep /.true./
*
write (*,'(//,15x,a,//)') 'LECTURE D''UN FICHIER A ACCES DIRECT'
*
open (9,file='enregi.duf',access='direct',status='old',
+ form='unformatted',recl=20)
*
do while (lrep)
write (*,'(/,5x,a,$)')
+ 'Quel enregistrement désirez-vous (<=50) ? '
read *,ienr
- 169 -
- Langage de programmation : Fortran 77 -
1 *
2 * Exemple 35
3 * Traitement d'un fichier en accès direct
4 *
5 program exem35
- 170 -
- 6. Utilisation des fichiers en Fortran 77 -
6 integer*2 ipoint
7 external create,efface,inform,introd,lectur,menu,modif
8 *
9 10 call menu
10 read (*,*) ipoint
11 *
12 if (ipoint .eq. 1) then
13 call create
14 else if (ipoint .eq. 2) then
15 call introd
16 else if (ipoint .eq. 3) then
17 call lectur
18 else if (ipoint .eq. 4) then
19 call modif
20 else if (ipoint .eq. 5) then
21 call inform
22 end if
23 if ((ipoint .ge. 0) .and. (ipoint .le. 5)) goto 10
24 call efface
25 end
27 *
28 * Affichage du menu
29 *
30 subroutine menu
31 external efface
32 *
33 call efface
34 write (*,'(///,16x,a,//,2(14x,a,/)//,6(15x,a,/)//,18x,a,\)')
35 + 'CREATION ET GESTION D''UN FICHIER A ACCES DIRECT',
36 + 'Menu : Choisissez un des points du menu',
37 + ' ensuite pressez sur la touche <RET>',
38 + '1. Création du fichier',
39 + '2. Introduction des articles',
40 + '3. Lecture des articles',
41 + '4. Modifications des articles',
42 + '5. Informations sur le programme',
43 + '6. Fin de programme',
44 + ' Quel point adoptez vous ? '
45 end
47 *
48 * Sous-programme create engendrant le fichier
49 *
50 subroutine create
51 integer*2 n
52 logical*2 lfile,lmarq
53 character*12 fiche
54 external efface,touche
55 *
56 data lmarq /.false./
57 *
58 call efface
59 write (*,'(//,20x,a,//,5x,a,\)')
60 + 'CREATION DU FICHIER A ACCES DIRECT',
61 + 'Donnez le nom complet du fichier (<=12car) : '
- 171 -
- Langage de programmation : Fortran 77 -
- 172 -
- 6. Utilisation des fichiers en Fortran 77 -
- 173 -
- Langage de programmation : Fortran 77 -
- 174 -
- 6. Utilisation des fichiers en Fortran 77 -
1. Programme principal
2. Sous-programme menu
3. Sous-programme create
4. Sous-programme introd
5. Sous-programme lectur
L'existence du fichier est repérée sur le disque au moyen de l'instruction inquire . Lors de la
création du fichier, tous les débuts des enregistrements sont marqués par une valeur logique valant
.false. . Lors de l'enregistrement des valeurs introduites, le programme va tout d'abord lire ce mar-
quage et va changer l'état de cette donnée en .true. lorsque les données alphanumériques sont
transférées dans l'enregistrement. Si le marquage est .true. , il n'est pas possible de placer de nou-
velles données dans l'enregistrement. Le sous-programme modif devrait permettre de prévoir les
modifications sur les enregistrements présents.
- 175 -
CHAPITRE 7
REPRÉSENTATIONS GRAPHIQUES
Les constructions graphiques sur papier peut s'effectuer au moyen d'un traceur, d'un programme
et d'un protocole de communication entre ces composantes. Le but de ce sous-chapitre est de
présenter quelques caractéristiques du traceur, les commandes du langage du traceur et quelques
programmes d'application. Une description plus complète des possibilités de ce traceur, des
instructions du langage et des applications est donnée dans tous les manuels des constructeurs.
Certaines instructions ont des paramètres optionnels qui prennent des valeurs par défaut. L'ins-
truction d'écriture de texte alphanumérique LB doit s'achever par le caractère ASCII ETX, soit le
char(3) . Les zones de paramètres doivent se spécifier au format défini par la syntaxe de l'instruction.
1. entiers : entre -32768 et +32767, les parties décimales des paramètres étant tronquées;
2. décimal : entre -128.0000 et +127.9999 avec partie décimale ayant éventuellement plus de 4 chif-
fres significatifs;
3. décimal cadré : entre -32768.0000 et + 32767.0000 avec partie décimale ayant éventuellement
plus de 4 chiffres significatifs;
4. texte alphanumérique : toute combinaison de chaîne de caractères.
Les instructions, codées ASCII, doivent se transmettre vers le traceur .
- 176 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
1. Unités du traceur
L'unité traceur représente le plus petit déplacement incrémental de la plume, soit 0,024805 mm .
Les paramètres entiers des instructions en unité traceur sont compris entre -32768 et +32767.
2. Unités de l'utilisateur
L'utilisateur a la possibilité de fixer ses propres unités, unités qui peuvent prendre n'importe quelle
valeur pour autant que la gamme des valeurs décimales, dans tous les cas de définition, soit com-
prise dans la fourchette -32768.0000 et +32767.0000 .
Tableau 7.1
POINTS DE CADRAGE PAR DÉFAUT HP 7475 A
Le tableau 7.4 donne la syntaxe des diverses commandes du traceur. Ces instructions graphiques
sont données par ordre alphabétique avec la liste des paramètres et une brève description de leur
fonction.
Les mnémoniques des commandes, par exemple PU pour « pen up » en anglais, sont écrits en
caractères gras.
- 177 -
- Langage de programmation : Fortran 77 -
Tableau 7.2
SYNTAXE DES INSTRUCTIONS HP-GL POUR HP 7475 A
Instruction Signification
AA Arc absolu, centre à : x,y
x,y,ang[,angc] angle au centre : ang; angle corde : angc
AR Arc relatif, incréments du centre : x,y
x,y,ang[,angc] angle au centre : ang; angle corde : angc
CA Jeu de caractères secondaire, par défaut 0
N 0-4, 6-9 ou 30-39
CI Traçage d'un cercle
ray[,angc] rayon : ray ; angle au centre : angc
CP Déplace la plume de :
esp,lig espaces : esp; lignes : lig
CS Jeu de caractères standard, par défaut 0
M 0-4, 6-9 ou 30-39
DC Supprime la numérisation
DF Remet les fonctions aux valeurs par défaut
DI Définition de la direction d'écriture
horiz,vertic composantes : horiz et vertic
DP Place le traceur en mode numérisateur
DR Définition de la direction relative
horiz,vertic composantes : horiz et vertic
DT Définition du terminateur d'écriture
t symbole proposé par l'utilisateur : t
EA Traçage des côtés d'un rectangle absolu
x,y coordonnées absolues : x et y
ER Traçage des côtés d'un rectangle relatif
x,y incrément : x et y
EW Traçage des côtés d'un secteur circulaire
ray,ang0,angd de rayon : ray; angle initial : ang0;
angle décrit : angd
FT Définition du type de remplissage
[typ[,esp[,ang]]] sélection : typ , type de remplissage
IM Entrée du masque
valE[,valS[,valP]] contrôle des erreurs de masque
IN Initialisation les fonctions du traceur
IP Positionne les points de cadrage
p1x,p1y[,p2x,p2y] Positionne les points de cadrage
IW Définition de la fenêtre graphique
xa1,ya1,xs2,ys3 spécifie les coordonnées des coins
LB Ecriture d'un texte chaîne de caractères
LT Définition du type de ligne
num[,long] numéro du motif : num
OA Transmet la position réelle de la plume
OC Transmet la position commandée de la plume
OD Transmet l'état de la plume et le dernier point .
OE Transmet les erreurs HP-GL
OF Transmet les facteurs
OH Transmet les limites mécaniques
OI Transmet l'identification du traceur
OO Transmet les caractéristiques du traceur
OP Transmet les erreurs HP-GL
OS Transmet les facteurs
OW Transmet les limites mécaniques
- 178 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
Instruction Signification
PA Traçage absolu .
x1,y1, ... coordonnées : x1 et y1 , ... etc
PD Descend la plume
PR Traçage relatif
y1,y,1 ... incréments : x1,y1, ... etc
PS Modification du format du papier graphique
Param format du papier : param
PT Définition de la largeur de la plume
Larg espace entre les lignes : larg
PU Montée de la plume
RA Traçage des ombres d'un rectangle absolu
x,y coordonnées : x et y
RO Rotation du système de coordonnées
angle angle de rotation : 0 ou 90
RR Traçage des ombres d'un rectangle relatif
x,y incréments : x et y
SA Sélection du jeu de caractères secondaire
SC Cadrage : coordonnées de l'utilisateur
xmin,xmax,ymin,ymax limites sur l'axe Ox : xmin,xmax
limites sur l'axe Oy : ymin,ymax
SI Dimension absolue des caractères
larg,haut largeur : larg; hauteur : haut
SL Inclinaison des caractères
tang inclinaison : tangente de l'angle : tang
SM Traçage en mode symbole
carac caractère utilisé : carac
SP Sélection de la plume
nump numéro de la plume : nump (0 à 6)
SR Dimension relative des caractères
larg,haut largeur : larg; hauteur : haut
SS Sélection du jeu de caractères standard
TL Définition de la longueur des graduations
Tp[,tn] longueur des traits : tp et tn en %
UC Définition des caractères de l'utilisateur
x,y dessine les caractères utilisateur
VS Vitesse de la plume
param paramètre : param = de 0 à 127.9999
- 179 -
- Langage de programmation : Fortran 77 -
*
* Exemple 36
*
*************************************************************
*
* Sous programme d'initialisation du traceur HP 7475 A
* Les commandes graphiques sont transmises par l'unité logique 3
* Le nom du fichier est choisi par l'utilisateur conformément à la
* syntaxe du système d'exploitation.
*
subroutine initra
integer iforma
character fichi*32
*
* Effaçage de l'écran et affichage du titre de la tâche
*
write (*,'(2a1,a2,a1,a3,///,14x,a,///)')
+ ' ',char(27),'[H',char(27),'[2J',
+ 'INITIALISATION DU TRACEUR HP 7475 ET CHOIX DU FORMAT'
write (*,'(15x,a,//,6x,a,/,6x,a,//,9x,a,\)')
+ 'CHOIX DU FORMAT DU PAPIER','1. Format A3 : 420 x 297 mm',
+ '2. Format A4 : 297 x 210 mm','Quel point adoptez-vous ? '
read *, iforma
*
* Choix du nom du fichier : jusqu'à 32 caractères
*
write (*,'(/,6x,a,\)')
c 'Donnez le nom complet du fichier de commandes : '
read (*,'(a)') fichi
*
* Ouverture du fichier de commande
*
open (3,file=fichi,status='unknown',access='sequential',
+ form='formatted')
*
* Définition des points de cadrage pour formats A3 ou A4
* Unités utilisateur (correspondent aux mm sur format A3):
* Axe Ox : 0.00 à 385.00 (mm)
* Axe Oy : 0.00 à 270.00 (mm)
*
write (3,'(a)') 'IN;'
write (3,'(a)') 'VS 6;'
if (iforma .eq. 1) then
write (3,'(a)') 'PS 1;IP 318,77,15840,10962;'
else
write (3,'(a)') 'PS 4;IP 77,87,10962,7721;'
end if
write (3,'(a)') 'SC 0,385,0,270;'
- 180 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
*
end
*
*****************************************************************
*
* Subroutine move (x,y)
* Déplacement de la position actuelle à la position données par les
* coordonnées absolues x,y (traceur ou utilisateur)
*
subroutine move (x,y)
real*4 x,y
write (3,'(a)') 'PU;'
write (3,'(2(a,f8.2),a1)') 'PA ',x,',',y,';'
end
*
*****************************************************************
*
* Subroutine draw (x,y)
* Dessin d'un trait de la position actuelle à la position donnée
* par les coordonnées absolues x,y (traceur ou utilisateur)
*
subroutine draw (x,y)
real*4 x,y
write (3,'(a)') 'PD;'
write (3,'(2(a,f8.2),a1)') 'PA ',x,',',y,';'
end
Les unités utilisateurs peuvent être modifiées à volonté, soit en introduisant d'autres paramètres
numériques dans l'instruction, soit par l'intermédiaire de variables numériques réelles dont la valeur
est affectée en mode interactif.
*
* Exemple 37
* Programme graphique permettant de dessiner un texte sous
* plusieurs angles avec un incrément de 30°
*
program exem37
integer i,phideg
real*4 phi,co,si,x0,x,y0,y,r
parameter (pi=3.141593)
intrinsic cos,sin
external initra
*
call initra
write (3,'(a)') 'SP 1;'
write (3,'(a)') 'PU 10,10;'
write (3,'(a)') 'PD 10,260,370,260,370,10,10,10;'
write (3,'(a)') 'PU 190,135;'
- 181 -
- Langage de programmation : Fortran 77 -
- 182 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
*
* Exemple 38
* Programme graphique permettant de tracer la courbe sin(x)/x
* sur format A3 ou A4
*
program exem38
*
integer i
real*4 facx,facy,valeur
real*4 x,x0,xgraf,y,y0,ygraf,yprov
character*16 forme
parameter (pi = 3.141593)
intrinsic cos,sin
external initra
*
* Version utilisant une constante chaîne de caractères
* pour la mise en forme des données
*
data forme /'(2(a,f6.2),a)'/
*
call initra
write (3,'(a)') 'SP 1;'
write (3,'(a)') 'PU 10,10;'
write (3,'(a)') 'PD 10,260,370,260,370,10,10,10;'
write (3,'(a)') 'PU 60,50;'
write (3,'(a)') 'PD 60,250,360,250,360,50,60,50;'
write (3,'(a)') 'PU 60,100;'
write (3,'(a)') 'PD 360,100;'
write (3,'(a)') 'PU 210,50;'
write (3,'(a)') 'PD 210,250;'
write (3,'(a)') 'PU 60,100;'
write (3,'(a)') 'SR 1.5,3.0;'
*
x0=210.0
y0=100.0
yprov=y0
facx=300.0/(8.0*pi)
facy=100.0
*
do i=-80,80
x=i*pi/20.0+1E-10
y=sin(x)/x
xgraf=x0+x*facx
ygraf=y0+y*facy
write (3,forme) 'PD ',xgraf,',',ygraf,';'
write (3,forme) 'PU ',xgraf,',',y0,';'
write (3,forme) 'PD ',xgraf,',',ygraf,';'
end do
*
write (3,'(a)') 'PU 60,50;'
*
do i=-1,3
xgraf=60.0
ygraf=y0+i*50.0-1
valeur=0.5*i
write (3,forme) 'PU ',xgraf,',',ygraf,';'
- 183 -
- Langage de programmation : Fortran 77 -
x = 1,6 sin( t );
y = 1,2 cos(1,5 t ).
La courbe est construite pour un paramètre t variant de 0 à 4 pi par incrément de 0,02 pi . Afin d'as-
surer sûrement la fermeture de la courbe, le nombre d'incréments est choisi égal à 201.
- 184 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
*
* Exemple 39
* Programme permettant de tracer une courbe fermée par deux
* fonctions paramétriques
*
program exem39
integer i
real*4 xgraf,x0,ygraf,y0
real*4 facx,facy,t,valeur
intrinsic char,cos,sin
external draw,initra,move
*
call initra
write (3,'(a)') 'SP 1;'
write (3,'(a)') 'PU 10,10;'
write (3,'(a)') 'PD 10,260,370,260,370,10,10,10;'
*
write (3,'(a)') 'PU 60.0,25.0;'
write (3,'(a)') 'PD 60,235,340,235,340,25,60,25;'
*
facx=280/4
facy=210/3
x0=60.0+2.0*facx
y0=25.0+1.5*facy
write (3,'(a)') 'SR 0.7,1.4;'
*
do i=-3,3
xgraf=60.0
ygraf=y0+0.5*i*facy
valeur=0.5*i
call move (xgraf,ygraf)
write (3,'(a)') 'CP -4.5,-0.25;'
write (3,'(a,f4.1,a1)') 'LB',valeur,char(3)
call move (xgraf,ygraf)
xgraf=340.0
call draw (xgraf,ygraf)
end do
*
do i=-4,4
valeur=0.5*i
xgraf=x0+0.5*i*facx
ygraf=y0-1.5*facy
call move (xgraf,ygraf)
write (3,'(a)') 'CP -2.0,-0.9;'
write (3,'(a,f4.1,a1)') 'LB',valeur,char(3)
call move (xgraf,ygraf)
call draw (xgraf,235.0)
end do
*
call move (200.0,235.0)
write (3,'(a)') 'SR 1.5,3.0;'
write (3,'(a)') 'CP -11.5,0.5;'
write (3,'(a,a1)') 'LBEQUATIONS PARAMETRIQUES',char(3)
*
write (3,'(a)') 'SP 3;'
xgraf=x0
- 185 -
- Langage de programmation : Fortran 77 -
ygraf=y0+1.2*facy
call move (xgraf,ygraf)
*
do i=0,201
t=0.06283185*i
xgraf=x0+(1.6*sin(t))*facx
ygraf=y0+(1.2*cos(1.5*t))*facy
call draw (xgraf,ygraf)
end do
*
write (3,'(a)') 'SP 0;'
close (3)
*
end
- 186 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
Très important
Pour obtenir une représentation graphique à l’écran ou sur un imprimante,
Aucune erreur n’est permise dans le fichier texte.
Cette remarque n’est pratiquement jamais citée dans les ouvrages traitant du sujet.
- 187 -
- Langage de programmation : Fortran 77 -
sx sy scale
avec :
sx sy facteurs d’échelle sur l’axe Ox et sur l’axe Oy.
scale l’identificateur de la commande
Particularité PostScript
Dans les commandes PostScript, toutes les valeurs à affecter à la commande sont toujours pré-
fixées.
Exemples :
0.141732 0.141732 scale
Cette commande permet de modifier l’unité de base en une unité utilisateur, soit :
1 unité utilisateur axe O x = 0,35278 mm . 0,141732 = 0,05 mm.
1 unité utilisateur axe O y = 0,35278 mm . 0,141732 = 0,05 mm.
Nous utiliserons ce facteur ou sa moitié 0.070866 dans les exemples proposés ici sur un graphi-
que couvrant le format A4, 210 mm x 297 mm en position portrait ou paysage. Cette dimension
métrique permet de positionner les lignes, les textes et les surfaces avec une précision de 0,05 mm
en introduisant des coordonnées entières de type interger. En changeant manuellement ces deux
facteurs dans le fichier texte, il est ainsi possible de modifier toutes les dimensions des figures, sans
diminuer la précision du dessin.
3. Surface active
La construction graphique sur la feuille A4 ne doit en aucun cas dépasser la limite du papier. La
commande générale de limitation des tracés dans la surface rectangulaire est :
%%BoundingBox: x0 y0 x1 y1
avec :
x0,y0 position du point origine par rapport à la valeur par défaut en unité PostScript.
x1,y1 position du point diamétralement opposé en unité PostScript.
Pour occuper la plus grande partie de la surface de la feuille A4, les grandeurs entières des
coordonnées sont :
Point origine : x0 = 0 et y0 = 0 .
Point maximal : x1 = 590 et y1 = 840 .
Avec ces deux dernières valeurs, la surface active prend les dimensions :
Largeur du format sur A4 : (590 - 0) . 25,4 mm / 72 = 208,14 mm (210 mm).
Hauteur du format sur A4 : (840 – 0) . 24,5 mm / 72 = 296.33 mm (297 mm).
La directive de création de la surface active devient ainsi :
%%BoundingBox: 0 0 590 840
Cette directive se donne généralement sur la deuxième ligne des commandes.
- 188 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
Comme cet exposé sur PostScript se limite aux opérations élémentaires, il ne traitera pas en
détail les manipulations et les diverses instructions possibles sur la pile. Les opérateurs sur la pile
sont les suivants :
clear: Retire tous les objets de la pile.
dup Duplique l’objet situé au sommet de la pile.
pop Retire l’objet situé au sommet de la pile et rend accessible l’objet suivant.
roll permute le contenu de la pile.
pstack Affiche le contenu de la pile.
Tableau 7.3
OPÉRATEURS MATHÉMATIQUES POSTSCRIPT
Le langage PostScript utilise la représentation usuelle des nombres décimaux entiers ou réels, la
virgule étant remplacée par le point.
- 189 -
- Langage de programmation : Fortran 77 -
Tableau 7.4
OPÉRATEURS ÉLÉMENTAIRES DE DESSIN
- 190 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
- 191 -
- Langage de programmation : Fortran 77 -
80 0 rlineto
0 –80 rlineto
closepath
0.4 setgray
fill
Dans le cas particulier, PostScript dessine les trois carrés les uns à la suite des autres en les
superposant. Le deuxième carré recouvre partiellement le premier et le troisième recouvre partielle-
ment le deuxième. Les commentaires dans la programmation s’écrivent précédés du caractère %. Les
trois carrés se programment par les mêmes instruction de telle sorte que l’emploi de sous-program-
mes simplifierait la tâche du programmeur. PostScript comprend également ce type de structure.
7.2.1.5 SOUS-PROGRAMMES
Le dictionnaire PosScript du système associe les identificateurs des procédures aux variables du
programme. Le dictionnaire de l’utilisateur contient les définitions du programmeur. Ces deux diction-
naires sont placés dans une pile. Le dictionnaire au sommet de la pile est le dictionnaire courant.
1. Variables PostScript
Les variables PostScript sont placées, identificateur et valeur, dans le dictionnaire courant. La syn-
taxe d’une variable est la suivante :
/ cnom {val} def
avec :
/ barre oblique : point de départ de la définition d’une variable.
cnom identificateur attribué à cette variable.
{…} limite de la définition, optionnelle pour les nombres (nous l’utiliserons toujours).
val valeur attribuée.
def fin de la définition.
- 192 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
Exemple :
Ce exemple montre comment définir des opérandes au moyen d’une affectation de valeur
numérique à une variable. La commande scale permet de choisir ses propres unités. Affectons par
programme une des valeurs proposée, par exemple la valeur 0,070866 à la variable scl :
/scl {0.070866} def
scl est la variable. Utilisons cette valeur en cours de programme par l’instruction :
scl scl scale
ce qui correspond à 0.070866 0.070866 scale.
2. Procédures en PostScript
Une procédure correspond à un sous-programme contenant soit des variables, des opérateurs et
des variables groupés dans un bloc. La syntaxe générale de cette instruction est ;
/ pnom { proced } def
avec :
/ barre oblique : point de départ de la définition d’une procédure.
pnom identificateur attribué à cette procédure.
{…} limite de la définition des opérations dans la procédure.
proced instructions composantes de la procédure.
def fin de la définition.
L’interpréteur PostScript exécute toutes les instructions entre les deux accolades lors de l’appel de
la procédure. L’appel de la procédure s’effectue en écrivant son identificateur déclaré dans le corps de
l’instruction d’appel.
Exemple : La construction des trois carrés proposée sous 7.2.1.4 s’effectue en donnant trois fois
les mêmes tracés de ligne en déplacement relatif. Ces instructions peuvent se placer dans une pro-
cédure et s’appeler trois fois. Les instructions sont alors :
% --- Définition de la procédure Carre ---
/Carre
{ 0 80 rlineto
80 0 rlineto
0 –80 rlineto
closepath } def
- 193 -
- Langage de programmation : Fortran 77 -
Tableau 7.5
OPÉRATEURS COMPLÉMENTAIRES DE DESSIN
1. Systèmes de coordonnées
Les systèmes de coordonnées utilisés dans PostScript obéissent aux règles vues en mathé-
matique. Le système de coordonnées présente primitivement l’axe O x dans la direction horizontale
vers la droite, l’axe O y, perpendiculaire au premier, dans le direction verticale vers le haut. Les angles
de rotation sont en degrés, le sens positif étant le sens mathématique usuel, donc dans le sens
inverse des aiguilles d’une montre. Le système de coordonnées peut être modifié, soit en translation,
soit en rotation. Comme déjà cité précédemment, le point O se trouve à gauche au bas de l’espace de
travail. Comme les constructions graphiques doivent pouvoir se représenter à l’écran ou surtout sur
une imprimante, il ne faut pas oublier que cette dernière ne peut pas imprimer sur la totalité de la
feuille sans commande particulière de l’imprimante.
La commande permettant de déplacer le point origine de définition vers la zone imprimable prend
la syntaxe :
- 194 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
x1 y1 translate
avec :
x1,y1 Les deux déplacements du point origine exprimés en unité courante.
Il est vivement recommandé d’utiliser cette commande avant toute construction graphique. La
rotation du système de coordonnées s’effectue par la commande :
angle rotate
avec :
angle grandeur de l’angle de rotation en degrés, positif dans le sens mathématique.
Les exemples plus complets utiliseront très souvent les instructions suivantes :
1. Feuille A4 dans le sens portrait
/tranx { 50} def % Définition des variables tranx, trany, rot, scl
/trany { 25} def
/rot { 0.0} def
/scl {0.141732} def
. . . . . . . . . . . % Définitions complémentaires
tranx trany translate % Intoduction dans les commandes, unités PostScript
rot rotate
scl scl scale
2. Feuille A4 dans le sens paysage
/tranx { 550} def % Définition des variables tranx, trany, rot, scl
/trany { 60} def
/rot { 90.0} def
/scl {0.141732} def
. . . . . . . . . . . % Définitions complémentaires
tranx trany translate % Intoduction dans les commandes, unités PostScript
rot rotate
scl scl scale
Ces instructions imposent les déplacements suivants, l’unité primitive étant 1 pouce / 72 :
1. Feuille A4 dans le sens portrait
Déplacements du point origine : Δx = 0,35278 50 = 17,6 mm et Δy = 0,35278 mm 25 = 8,8 mm.
, ,
L’angle de rotation rot = 0.0 et la valeur des échelles vaut scl = 0.141732 = 0,05 mm.
2. Feuille A4 dans le sens paysage
Déplacement du point origine : Δx = 0,35278 , 550 = 194 mm et Δy = 0,35278 mm , 60 = 21,17
mm. L’angle de rotation rot = 90.0 et la valeur des échelles est la même que précédemment.
Ainsi, la feuille est tournée de 90°, l’axe O x est parallèle au plus grand côté, l’axe O y est perpen-
diculaire, parallèle au petit côté.
- 195 -
- Langage de programmation : Fortran 77 -
Exemple :
Le livre PostScript par l’exemple donne un programme permettant de construire une étoile à cinq
branches au moyen de changements du système de coordonnées.
/ContourEtoile
{ 72 0 lineto
currentpoint translate
-144 rotate } def
/Etoile
{ moveto
currentpoint translate
4 { ContourEtoile } repeat
closepath
gsave
.5 setgray fill
grestore
stroke } def
- 196 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
Tableau 7.6
CHOIX DE QUELQUES FONTES POSTSCRIPT
Les commandes nécessaires à l’utilisation d’une fonte déterminée consiste à trouver la police
désirée dans le dictionnaire, à déterminer sa taille et à la rendre accessible. Les syntaxes de ces trois
commandes sont les suivantes.
1. Trouver la police
/ police findfont
avec :
/ début de l’instruction
police identificateur de la police selon tableau 7.6.
2. Définir la taille de la police
taille scalefont
avec :
taille taille désirée en unité courante.
- 197 -
- Langage de programmation : Fortran 77 -
Ecole technique
Remarque pour les utilisateurs de Win-Word
Les fontes de PostScript portent les noms des identificateurs originaux et sont protégés. La dessin
de ces fontes est supérieur à celles employées dans Word. La fonte Helvetica, crée par la société
suisse Caractères SA La Chaux-de-Fonds, a été remplacée par Arial par Microsoft. Le code des
caractères ne contient pas les lettres accentuées !
- 198 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
avec taille la grandeur des caractères. L’opérateur scale permet de modifier soit la hauteur, soit la
largeur des caractères en supposant que l’une des dimensions soit 1, l’autre différent de 1. Il existe
une commande qui permet de modifier la taille et l’inclinaison des caractères. La syntaxe de cette
instruction est :
[ m 0 p n 0 0 ] makefont
avec :
[ … ] délimiteur de la matrice de transformation courante des caractères
m taille de la fonte dans la direction horizontale.
p pente de l’écriture, si l’écriture est verticale, alors p = 0.
Calcul de la pente : valeur = taille x tangente(angle)
n taille nominale de la fonte comme dans l’instruction scalefont.
Exemples
/Times-Roman findfont 12 scalefont
/Times-Roman findfont [12 0 0 12 0 0] makefont
Ces deux instructions sont identiques
/Times-Roman findfont [15 0 0 12 0 0] makefont
La largeur des cartères est augmentée de 25%.
/Times-Roman findfont [9 0 0 12 0 0] makefont
La largeur des caractères est diminuée de 25 %.
/Times-Roman findfont [12 0 6.93 12 0 0] makefont
L’écriture est inclinée de 30° car 6,93 = 12 x tan(30°) .
%!PS-Adobe-2.0 EPSF-2.0
%%BoundingBox: 0 0 590 840
%%DocumentFonts: Courier
/tranx { 50} def
/trany { 25} def
/rot { 0.0} def
/scl {0.070866} def
/M {moveto} def
/L {lineto} def
/RL (rlineto) def
/S {stroke} def
/SW {setlinewidth} def
/CP {closepath} def
/N {newpath} def
/G {setgray} def
/R {setrgbcolor} def
/F {fill} def
- 199 -
- Langage de programmation : Fortran 77 -
/SN {stroke
newpath} def
/FE {gsave
fill
grestore} def
/T00 {/Courier findfont
60 scalefont
setfont} def
/T0 {/Courier-Bold findfont
80 scalefont
setfont} def
/T1 {/Courier-Bold findfont
120 scalefont
setfont} def
/L0 {[] 0 setdash} def
/L1 {[10 5] 0 setdash} def
/R00 {1.000 1.000 1.000 setrgbcolor} def
/R01 {1.000 0.000 0.500 setrgbcolor} def
/R02 {1.000 0.000 1.000 setrgbcolor} def
/R03 {0.500 0.000 1.000 setrgbcolor} def
/R04 {0.000 0.000 1.000 setrgbcolor} def
/R05 {0.000 0.500 1.000 setrgbcolor} def
/R06 {0.000 1.000 1.000 setrgbcolor} def
/R07 {0.000 1.000 0.500 setrgbcolor} def
/R08 {0.000 1.000 0.000 setrgbcolor} def
/R09 {0.500 1.000 0.000 setrgbcolor} def
/R10 {0.700 0.700 0.000 setrgbcolor} def
/R11 {1.000 0.500 0.000 setrgbcolor} def
/R12 {1.000 0.000 0.000 setrgbcolor} def
/R13 {0.600 0.600 0.600 setrgbcolor} def
/R14 {0.300 0.300 0.300 setrgbcolor} def
/R15 {0.000 0.000 0.000 setrgbcolor} def
/ER {R00
clippath
F
SN
R15} def
/byte 1 string def
/byt3 3 string def
/unpack_colr 765 string def
/color_decode
{
currentfile byte readhexstring pop 0 get
/npix exch 3 mul def
currentfile byt3 readhexstring pop pop
/color_packet byt3 0 3 getinterval def
0 3 npix 1 sub
{
unpack_colr exch color_packet putinterval
} for
unpack_colr 0 npix getinterval
} bind def
/setup {save
/Courier findfont
60 scalefont
setfont} def
- 200 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
La partie terminale contient seulement 4 instructions, S pour stroke et showpage pour la trans-
mission de la figure vers l’écran ou le périphérique, retour aux commandes par défaut, fin.
S
showpage
restore
%%Trailer
- 201 -
- Langage de programmation : Fortran 77 -
Domaine de l'investigation :
Borne inférieure de calcul : 0.000
Borne supérieure de calcul : 8.000
Nombre d'intervalles 40
Nombre de points définis : 41
ÉVALUATION DES DEUX DÉRIVÉES AUX POINTS DE DÉFINITION
No Abscisse x(i) Ordonnée y(i) Dérivée y' Dérivée y"
0 0.00000 0.000000 12.566371 -1.005310
1 0.20000 2.452438 11.758002 -6.995712
2 0.40000 4.627644 9.819933 -12.211253
3 0.60000 6.318654 6.958420 -16.157437
.. .. .. .. .. etc.
RECHERCHE DE LA SOMME INTÉGRALE DE LA FONCTION DISCRÈTE
No Abscisse x(i) Fonction y(i) Delta Int. Intégrale
0 0.00000 0.00000 0.00000 0.00000
1 0.20000 2.45244 0.24795 0.24795
2 0.40000 4.62764 0.71448 0.96243
3 0.60000 6.31865 1.10419 2.06662
- 202 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
Pour le dessin des courbes, chaque tracé des trois courbes comporte 200 points de définition dé-
composé en groupes de 3 fois 60 points et une fois 20 points. Cette décomposition est nécessaire car
la pile de Postscript est limitée ! Le fichier Postscript occupe 12 229 octets !
La figure ci-dessous montre le résultat du calcul
Sur ce graphique, la fonction, sa dérivée et son intégration sont représentés à l’échelle 1 à 1, va-
leur donnée par le facteur de multiplication placé après le texte correspondant.
Dans ce sous-chapitre, nous voulons présenter les particularités de chacune des implémentations
du langage FORTRAN. Chaque constructeur de compilateur étend les possibilités de programmation
afin de faciliter la tâche des utilisateurs. Remarquons que les instructions de base sont portables sur
tous les systèmes et que les adjonctions rendent difficilement transportables les programmes écrits au
moyen d'instructions spécifiques à une implémentation.
- 203 -
- Langage de programmation : Fortran 77 -
DOMAIN FORTRAN
Language Reference
Order No. 000530
Revision 005
7.3.1.1 PARTICULARITÉS
Les particularités de l'implémentation sont écrites en rouge dans le manuel de référence du lan-
gage. Nous donnons ci-après la plupart de ces particularités.
1. Identificateurs
Les caractères admissibles sont : toutes les lettres majuscules et minuscules, les chiffres de 0 à 9,
le caractères de soulignement _ et le caractère dollard $ . Le nombre maximal de caractères est limité
à 32.
3. Types de données
Les types de données à disposition sont :
- entiers : integer, integer*2, integer*4
- réels : real, real*4, double precision, real*8
- booléens : logical
- complexes : complex
- caractère : character*lën
- tableaux : de types simples, jusqu'à 7 dimensions
- pointeurs admet une instruction pointer rendant l'interfçage possible.
4. Instructions
Le compilateur comprend quelques instructions hors norme ANSI :
- do while boucle tant que
- namelist définit un synonyme pour une liste de variables ou de tableaux
- decode transfert de données de la mémoire vers la liste d'E/S
- encode mise en forme des données et transfert vers la mémoire
- end do termine une boucle do ... ou do while
Les sous-programmes subroutine et function peuvent être récursifs, c'est-à-dire s'appeler eux-
mêmes, soit directement, soit indirectement.
Le descripteur d'édition $ empêche le retour à la ligne dans l'instruction write Les descripteurs a et
Z peuvent s'utiliser pour tout type de variable.
Le compilateur admet, dans la clause status les extensions suivantes : 'append' , 'write' ,
'readonly' , 'overwrite' .
Pour arrêter le déroulement d'un programme complètement, par exemple lorsqu'il effectue une
boucle sans issue de sortie, frappez : Ctrl-Q.
- 204 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
5. Fonctions "intrinsic"
Les fonctions fondamentales du langage sont présentes, complétées par des fonctions pour la
manipulation de type et de bits. Ces fonctions particulières sont les suivantes :
Fonctions de conversion de type :
int2 convertit en type integer*2
int4 convertit en type integer*4
Fonctions de manipulations de bits :
and , or , xor , not , rshft , Ishft ,
iaddr retourne l'adresse de l'argument qui peut être de tout type (y compris les tableaux et
les identificateurs de sous-programmes) , le résultat étant de type integer*4 .
Tableau 7.7
DIRECTIVES DE COMPILATION POUR DOMAIN FORTRAN
Directives Significations
- 205 -
- Langage de programmation : Fortran 77 -
2. Compilation
La compilation est obtenue simplement par la commande :
$ ftn nomfich –1
Dans cette commande, nomfich est le nom du fichier contenant le code source du programme, la
directive de compilation -1 indiquant au compilateur de créer un fichier : nomfich.lst contenant toutes
les instructions numérotées et les bilans de la compilation. Si la compilation s'effectue correctement,
cette commande engendre deux fichiers :
- fichier liste des instructions, avec l'extension .Ist , avec le bilan de la compilation
- fichier en langage machine, extension .bin
Voici quelques options complémentaires :
-dba génère un code non optimisé pour le débogueur
-dbs génère un code optimisé pour le débogueur
-i*2 introduit integer*2 par défaut pour le type integer
-i*4 introduit integer*4 par défaut pour le type integer (c'est l'option par défaut)
-l engendre un fichier liste de la compilation
-save réserve de la place pour les variables locales
-type introduit un message de mise en garde pour les variables non déclarées
-zero initialise à zéro tous les blocs communs et les variables statiques
3. Editeur de lien
L'éditeur de lien, servant à rendre le programme exécutable à partir du programme traduit en lan-
gage machine, est appelé par la commande :
$ bind nomfichl.bin [nomfich2 ...] -b nomexecut
Les fichiers en langage machine sont cités les uns à la suite des autres, nomexecut étant le nom
du fichier exécutable. Il n'est pas absolument nécessaire de donner une extension à ce nom car le
genre de fichier apparaît lors de l'affichage de la liste des fichiers : Id -a .
- 206 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
5.2 DOMAIN FORTRAN peut utiliser des parties de programme écrites dans un autre langage de
programmation :
- langage C ,
- langage Pascal
5.3 Graphique :
Comme les stations APOLLO sont dédicacées surtout aux représentations graphiques, le program-
meur a la possibilité d'accéder aux ressources des librairies graphiques 2D ou 3D du système. Nous
voulons présenter ici un programme, écrit en FORTRAN, permettant de tracer des cercles à l'écran.
*
• Exemple 40
• Dessin de cercles concentriques sur station APOLLO
• Librairie : GPR
*
program. exem40
%include '/sys/ins/bas.ins.ftn'
%include '/sys/ins/gpr.ins.ftn'
%include '/sys/ins/time.ins.ftn'
integer*2 size(2)
*
* description de la memoire d'ecran
*
integer*4 init_bitmap
integer*2 mode
*
integer*2 hi_plane_id
integer*2 center(2)
integer*2 radius,i
logical delete_display
*
integer*4 status
integer*2 pause (3)
*
center(1) = 350
center(2) = 350
size(1) = 700
size(2) = 700
mode = gpr_$borrow
hi_plane_id = 1
*
call gpr_$init(mode,int2(1),size,hi_plane–id,
+ init–bitmap,status)
do i = 1,10
radius = i*35
call gpr_$circle (center,radius,status)
pause(1) = 0
pause(2) = 5
pause(3) = 0
call time_$wait (time_$relative,pause,status)
end do
*
call gpr_$terminate (delete_display, status)
end
- 207 -
- Langage de programmation : Fortran 77 -
7.3.2.1 PARTICULARITÉS
Les particularités de l'implémentation sont écrites en bleu dans le manuel de référence du lan-
gage. Nous donnons ci-après la plupart de ces particularités.
1. Identificateurs
Les caractères admissibles sont les 52 lettres majuscules et minuscules, le caractère $ , les chif-
fres 0 à 9 , l'espace, le caractère tab et une collection d'autres caractères spéciaux. Le nombre de
caractères significatifs des identificateurs est limité à 31, ce nombre pouvant être limité à la valeur
normée de 6 caractères par une directive de compilation. Les identificateurs suivants sont prédéfinis
et ne peuvent pas s'utiliser dans le programme :
1. _main nom externe pour le programme principal quel que soit l'identificateur programmé dans
l'instruction program
2. COMMQQ nom pour les blocs de commun blanc.
3. BLKDQQ nom par défaut pour le sous-programme block data
- 208 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
3. Types de données
Les types de données à disposition sont :
1. entiers : integer, integer*1, integer*2, integer*4
integer*1 : domaine -128 à + 127
2. réels : real, real*4, double precision, real*8
3. complexes : complex, complex*8, double complex, complex*16
4. booléens : logical, logical*1, logical*2, logical*4
logical*1 contient 0 si .false. , 1 si .true.
logical*2 contient logical*1 dans le premier octet
logical*4 contient logical*2 dans les deux premiers octets
5. caractères : character*n avec 1 <= n <= 32 767
C strings : valeur pour langage C
6. tableaux : de type simple, le nombre de dimensions n'étant pas limité
les indices peuvent être des expressions arithmétiques converties en entier.
7. Enregistrements dont les variables sont définies dans le type : structure
4. Instructions
Les instructions selon norme ANSI sont applicables dans la programmation. Les instructions
propres à cette implémentation sont :
- allocate établit dynamiquement les dimensions d'un tableau
- automatic éclare une variable à placer sur la pile
- cycle passe à l'instruction terminale d'une boucle do
- deallocate libère la place mémoire allouée précédemment par allocate
- do while ... end do et do ... end do , hors norme ANSI, sont applicables dans la dernière version.
- interface déclare un sous-programme, ses attributs et ses paramètres formels
- include insère un fichier source en ce point
- locking verrouille l'accès direct au fichier ou à l’enregistrement pour d'autres utilisateurs
- map ... end map , délimite ou groupe de déclarations de types de variables
- namelist définit une liste de variables simples et de tableaux associées à une liste
- select case ... end select : définit une structure de sélection
- structure ... end structure : définit un nouveau type de variable, composé d'une collection d'autres
types de variables.
Le langage possède encore des attributs, hors norme, utilisés dans plusieurs instructions fonda-
mentales. Ce sont :
- allocatable attribue une dimension dynamique pour un tableau,
- alias attribue un nom externe à un sous-programme ou à un bloc common
-C attribue les conventions d'appel du langage C
- extern indique qu'une variable est placée dans une autre unité, dans un autre langage
- far argument à passer par adresse du segment
- huge spécifie qu'un paramètre formel se trouve dans plus d'un segment
- loadds spécifie un autre segment de données pour sous-programmes compilés
- near indique que le paramètre effectif se trouve dans le segment des données
- pascal identifie un argument ou sous-programme ayant les caractéristiques selon Pascal
Microsoft
- reference indique un passage de paramètre formel par adresse plutôt que par valeur
- value indique un passage par valeur d'un paramètre formel
- varying permet d'obtenir un nombre différent de paramètres formel et effectifs entre
- 209 -
- Langage de programmation : Fortran 77 -
5. Fonctions "intrinsic"
Les fonctions fondamentales du langage sont présentes, complétées par les fonctions pour les
types : type*1 et complex*16. Les fonctions supplémentaires sont citées comme suit :
Fonctions de conversion de type :
dcmplx , dreal , int1 , int2 , int4 , intC , hfix , jfix
Fonctions d'information sur les types :
allocated , epsilon , huge , maxexponent , minexponent , nearest , precision , tiny
Fonction absolue pour complex*16 :
cdabs(cmpl16) , résultat : fonction de type real*8
Fonctions d'opérateurs complexes :
imag(cmp) , dimag(cmpl16) , dconjg(cmpl16)
Fonctions mathématiques :
cdsqrt(cmpl16) , cdexp(cmpl16) , cdlog(cmpl16)
Fonctions trigonométriques :
cdsin(cmpl16) , cdcos(cmpl16) , cotan(real) , dcotan(dbl)
Fonctions sur les caractères :
len_trim(char) , scan(char,charset) , verify(char,charset)
Fonction fin de fichier :
eof(int) résultat de type logical
permet de détecter la fin de fichier.
Fonctions d'adresse :
locnear , locfar , loc
Fonctions de manipulation de bits :
btest , ior , ishl , ishft , isha , ishc , ieor , iand , not , ibclr , ibset , ibchng
Subroutines et fonctions d'accès à l'horloge du micro-processeur :
gettime(ihr,imin,isec,i100th) reçoit le temps du système subroutine
getdat(iyr,imon,iday) reçoit la date du système subroutine
settime(ihr,imin,isec,i100th) introduit le temps dans le système function
setdat(iyr,imon,iday) introduit la date dans le système function
Les deux fonctions sont de type logical, tous les arguments étant de type integer*2 soit :
ihr heure (0..23) iyr année (xxxx a.J.C)
imin minute (0..59) imon mois (1..12)
isec seconde (0..59) iday jour (1..31)
i100th centième de seconde (0..99)
Générateur de nombres pseudo-aléatoires
- 210 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
La subroutine random retourne une valeur réelle pseudo-aléatoire comprises entre 0 et 1 . La rou-
tine seed change le point de départ du générateur :
call random (ranval)
call seed (seedval)
avec : ranval valeur retournée de type integer*4
seedval argument de type integer*2 pour initialiser le générateur
- 211 -
- Langage de programmation : Fortran 77 -
par défaut : $LIST . Indique si une liste ou non de compilation doit être engendrée lorsque une option
est introduite dans la ligne d'appel du compilateur.
$LIST
Commence la génération d'informations à envoyer au fichier de listing. $NOLIST supprime cette
génération.
$LOOPOPT
Optimise le code des boucles itératives et $NOLOOPOPT supprime cette particularité.
$MESSAGE:string
Envoie un message à l'écran lors de la première passe de compilation.
$PACK:n
Introduit le nombre d'octets pour la définition de début de stockage (1 , 2 ou 4)
$PAGE
Commence une nouvelle page dans la liste de compilation.
$PAGESIZE:n
Introduit n lignes par page de compilation : n >=15 , par défaut 63.
$STORAGE:n
Définit le nombre d'octets, 2 ou 4, pour toutes les variables du fichier source de types integer et
logical, la valeur par défaut étant 4 .
$STRICT et $NOTSTRICT
par défaut : $NOTSTRICT . $STRICT n'accepte que la syntaxe de FORTRAN 77 selon la norme
ANSI sans les extensions ou implémentations particulières.
$SUBTITLE:subtitle
Introduit un sous-titre dans la liste de compilation.
$TITLE:title
Introduit un titre dans la liste de compilation.
$TRUNCATE et $NOTRUNCATE
par défaut : $NOTRUNCATE permet de rendre jusqu'à 31 caractères significatifs pour les identifica-
teurs, sinon seulement 6 caractères. Si $STRICT est présent, seuls 6 caractères sont actifs.
Certaines de ces directives peuvent se donner sur la ligne de commande d'appel du compilateur,
ce qui permet des compilations différentes. Les correspondances sont :
$DEBUG -4Yb
$NODEBUG -4Nb (défaut)
$DO66 -4Y6
$DECLARE -4Yd
$NODECLARE -4Nd (défaut)
$FREEFORM -4Yf
$NOFREEFORM -4Nf (défaut)
$STRICT -4Ys
$NOTSTRICT -4Ns (défaut)
$PACK[:{1|2|4}] -Zp[{1|2|4}]
$TRUNCATE -4Yt
$NOTRUNCATE -4Nt (défaut)
Les options -4 peuvent se combiner entre elles comme par exemple : -4Y4Nt.
Le développement d'un programme comprend toujours au moins trois opérations : l'édition du fi-
chier source comprenant les instructions, la compilation de ce fichier en langage machine et la liaison
avec la bibliothèque du langage. L'environnement MS-FORTRAN facilite fortement ce travail.
- 212 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
tion est à apporter au programme, il faut utiliser l'éditeur et appeler le fichier contenant les instructions.
L'extension du fichier est : .FOR . Exemple :
EDIT NOMFICH.FOR
Le compilateur reconnaît ce fichier comme un fichier du langage MS-FORTRAN.
- 213 -
- Langage de programmation : Fortran 77 -
bogueur CodeView
Le langage FORTRAN Microsoft possède des extensions hors norme ANSI . L'emploi de ces
instructions supplémentaires permet de mieux structurer la programmation et élimine presque en-
tièrement l'utilisation des étiquettes. Le principal inconvénient de ce mode de programmation est de
rendre le programme difficilement portable sur d'autres compilateurs (ce qui est l'une des qualités
fondamentale du langage). Nous voulons traiter ici les principales particularités.
1. Instruction de sélection
L'instruction de sélection transfère le déroulement du programme vers un bloc en fonction de la
valeur d'une expression. L'expression doit être de type integer , logical ou character*1 . La forme
générale de cette structure est :
select case (testexpr)
case (expressionlist)
bloc d'instructions
[case (expressionlist)
bloc d'instructions]
...................
[case default
bloc d'instructions]
end select
avec :
testexpr une expression de type integer , logicial ou character*1 ,
expressionlist une liste de valeurs qui doivent être constantes et de même type que test-
expr . Si testexpr correspond à l'une des valeurs citées dans la liste, le bloc
d'instructions suivant est alors exécuté.
Il existe deux possibilités pour inclure des valeurs dans expressionlist :
1. de donner la liste des valeurs individuelles, séparées par la virgule;
2. de donner le domaine de validité des valeurs, séparé par : comme par exemple 5:10 ou 'I':'N' la
première valeur devant être inférieure à la seconde exprimée par exemple dans le code ASCII. Si
la limite inférieure manque, comme par exemple :10 , toutes les valeurs inférieures ou égales à la
- 214 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
limite supérieure sont valables. Si la limite supérieure manque, comme par exemple 5: , toutes les
valeurs supérieures sont valables. Une valeur ne peut apparaître que dans une seule liste.
Le bloc d'instructions ne doit pas contenir nécessairement des instructions exécutables. Des blocs
vides peuvent s'introduire afin d'utiliser des valeurs particulières dans la sélection. L'instruction case
default est optionnelle et doit rester unique dans la structure. Si la valeur de testexpr ne correspond
à aucune valeur de expressionlist , le programme continue à l'instruction suivant end select . Les
blocs de select case peuvent être imbriqués, mais chaque structure doit avoir un end select . En
principe, toute boucle itérative ou autre sélection doit se contenir dans le même bloc. Il est interdit
d'entrer dans un bloc de l'extérieur ou de passer d'un bloc à l'autre par une instruction de saut.
Exemple :
*
* Définition d'une variable caractère
*
character*1 comcar
*
...................
*
select case (comcar)
case ('0')
write (*,*) 'Sélection selon 0'
case ('1':'9')
write (*,*) 'Sélection de 1 à 9'
case ('A','a')
call anticipation
case ('D','d')
call depart
case ('H','h')
call aide_totale
case ('S','s')
call stop_programme
case default
write (*,*) 'Commande non reconnue'
end select
*
- 215 -
- Langage de programmation : Fortran 77 -
structure / plein_nom /
character*15 prenom
character*20 nom
character*25 rue
integer*2 numero_postal
character*20 localite
end structure
*
record / plein_nom / nom1,nom2,nom3,nom_tout(50)
L'identificateur de champ à l'intérieur du bloc est local dans la structure. Il n'y a pas de conflit entre
identificateurs de champs et de variables. Un champ particulier est atteint en précisant l'identificateur
de variable, suivi d'un point et de l'identificateur de champ comme par exemple :
nom1.numero_postal .
Une structure ne peut pas dépasser 65536 octets. Les particularités complémentaires existant
dans la déclaration d'un type composé sont définies ci-après.
2.1 Instruction union . . . end union
Cette structure permet de stocker des groupes d'instructions, définis dans un bloc map , dans les
mêmes places en mémoire. Syntaxe :
union
map_statement
map_statement
..........
end union
avec :
map_statement une déclaration map selon syntaxe ci-dessous.
Un bloc union ne peut apparaître que dans un bloc structure . Chaque bloc union doit se ter-
miner par end union et cette instruction ne peut s'introdure qu'à la fin d'un seul bloc union .
L'instruction union est similaire à common mais les variables peuvent être contiguës ce qui aug-
mente la flexibilité des assignements. Exemple :
union
map
character*20 chaine1
character*10 chaine2(6)
end map
map
integer*2 number(10)
integer*4 intvar(10)
integer*2 date(10)
end map
end union
La directive de compilation $Pack ou -Zp contrôlent la manière d'aligner les variables de la struc-
ture à l'adresse d'octet.
2.2 Définition d'un groupe de types de variables par map
Pour effectuer une déclaration d'un groupe de variables dans une instruction structure , utilisez :
map
type_declaration(s)
..........
end map
avec :
type_declaration une déclaration de variable de tout type standard ou record .
- 216 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
Un bloc map . . . end map ne peut apparaître que dans un bloc union . . . end union . Les
variables sont stockées dans des places contiguës en mémoire dans l'ordre des déclarations. Il doit
exister au moins deux blocs map dans une union .
2.3 Spécification de variables structurées
La déclaration de variables de type composé s'effectue selon la syntaxe :
record / type_name / vname [ [ attrs ] ] [ (dim) ] [ , . . .
avec :
type_name identificateur du type composé défini dans structure ,
vname un identificateur de variable, de tableau, de ce type composé ,
attrs une liste d'attributs, séparés par la virgule,
dim dimension du tableau
Voir l'exemple ci-avant.
- 217 -
- Langage de programmation : Fortran 77 -
integer i2,i4,i6
real r2,r4,r6
complex z1,z2,z3
- 218 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
7.3.3.1 PARTICULARITÉS
Les particularités de l'implémentation sont écrites en bleu dans le manuel de référence du langa-
ge, l'implémentation étant la plus riche des langages présentés dans ce document. Nous donnons ci-
après quelques unes de ces particularités.
1. Identificateurs
Les caractères admissibles sont les 52 lettres majuscules et minuscules, les chiffres 0 à 9, les ca-
ractères $ et _ , le premier caractère devant être une lettre. L'identificateur peut comprendre jusqu'à
31 caractères. Les noms des entités suivantes doivent rester uniques dans tout le programme : sous-
programmes function et subroutine , blocs communs, programme principal, block data , points d'en-
trée additionnelle par entry .
3. Type de données
Les types de données à disposition sont :
1. entiers : integer , byte , integer*2 , integer*4
byte : domaine -128 à 127
2. réels : real , real*4 , real*8 , double precision , real*16
3. complexes : complex , complex*8 , complex*16 , double complex
4. booléens : logical , byte , logical*1 , logical*2 , logical*4
byte : peut contenir une des valeurs logiques : true. ou .false.
5. caractères : character*lën avec 1 £ len £ 65535.
6. tableaux : de type simple, le nombre de dimensions pouvant aller de 1 à 7
les indices peuvent être des expressions arithmétiques converties en entier.
7. Records : VAX-11 FORTRAN reconnaît cette structure hors norme.
4. Instructions
Les instructions selon norme ANSI sont applicables dans la programmation des instructions. Les
instructions supplémentaires à disposition sont données ci-après.
- namelist définit une liste de variables simples et de tableaux associées à une liste
- record crée une structure enregistrement, définie dans un bloc de déclarations
- volatile permet d'optimiser le code
- do while structure tant que
- end do fin de la structure itérative : do ... ou do while
- rewrite permet de transférer des données vers un fichier indexé
- 219 -
- Langage de programmation : Fortran 77 -
5. Fichiers
L'ouverture d'un fichier à accès séquentiel, direct ou indexé prévoit les clauses et les options sui-
vantes :
- access 'sequential' 'direct' , 'keyed' , 'append'
- blocksize espression numérique
- buffercount expression numérique
- carriagecontrol 'fortran','Iist','none'
- defaultfile expression chaîne de caractères
- dispose 'keep' ou 'save' 'delete' 'print' 'print/delete' , 'submit' 'submit/delete'
- maxrec expression numérique (seulement accès direct)
- organisation 'sequential' 'relative' 'indexed'
- readonly protection contre l'écriture
- recordtype 'fixed' 'variable' 'segmented' , 'stream' ,’ stream_CR' , 'stream_LF'
- shared accès mufti-utilisateurs autorisé
Les fichiers indexés sont des fichiers avec une organisation séquentielle. les enregistrements
étant classés selon une clef. Une table interne gère l'ensemble.
6. Fonctions "intrinsic"
Les fonctions fondamentales du langage sont présentes dans la librairie, complétées par les fonc-
tions pour les types supplémentaires. Dans la liste ci-après, nous laissons de côté les fonctions pour
le type real*16, nécessitant un processeur arithmétique supplémentaire.
Fonctions de conversion de type :
dcmplx , dreal , iint , jint , iidint , jidint , iifix , jifix
Fonctions absolue pour complex*16 :
cdabs(cmpll 6) , résultat : fonction de type real*8
Fonctions d'opérateurs complexes :
cdsqrt(cmpI16), cdexp(cmpll6) , cdlog(cmpI16)
Fonctions trigonométriques :
cdsin(cmpll 6) , cdcos(cmpll 6) , (les fonctions "generic" sin , cos sont également valables
pour le type complex*16)
Fonctions "generic" pour arguments en degrés, types real*4 et real*8
sind , cosd , tand , asind , acosd , atand , atan2d
Fonctions de manipulation de bits :
iand , ior , ieor , not , ishft , ibits , ibset , ibtest , ibcIr , ishftc
Génération de nombres pseudo-aléatoires (valeurs comprises entre 0 et < 1.0)
fonction : ran(i)
i est une expression entière de type integer*4 , choisir un nombre impair très grand.
Sous-programmes complémentaires :
call date (buf) buf chaîne de 9 caractères date dd-mmm-yy
call idate (i,j,k) i,j,k variables de type entier i mois, j jour, k année
call exit termine le programme
call time (buf) buf chaîne de 8 caractères hh:mm:ss
- 220 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
Instruction : INCLUDE
L'instruction include 'nomfich' permet d'appeler un fichier ou une librairie source lors de la compila-
tion. Cette instruction n'a pas d'effet sur l'exécution. Elle peut se compléter par les options à incorporer
: /list ou /nolist.
Instruction : OPTIONS
Cette instruction permet de confirmer ou remplacer les qualificatifs donnés dans la commande d'appel
de FORTRAN .
Instruction : DICTIONARY
Cette instruction incorpore le dictionnaire : VAX Common Data Dictionary dans le fichier source pen-
dant la compilation. Elle peut se donner n'importe où dans le programme.
- 221 -
- Langage de programmation : Fortran 77 -
liste_nomfich liste du ou des fichiers à introduire dans l'assemblage, séparés par la virgule. Sans
option complémentaire, l'éditeur de lien produit un fichier exécutable dont le nom est
celui du premier fichier de la liste.
Toujours pour le fichier précédent, la commande de l'assemblage se fait par :
$ link program1
le système produisant un fichier exécutable : PROGRAM1.EXE. Enfin, pour lancer le programme, il
faut donner la commande :
$ RUN nomfich
Les divers fichiers sont conservés sur le disque, chaque fichier ayant une version. Il est recom-
mandé d'effacer tous les fichiers inutiles, en particulier les fichiers .OBJ , et les anciennes versions.
- 222 -
- 7. Constructions graphiques et implémentation en Fortran 77 -
Tableau 7.8
SEQUENCES DE CONTROLE ANSI AU MOYEN D'ESCAPE
Symbole Fonction
Position du curseur
11,c1H déplace le curseur à la ligne 11, colonne c1
11A déplace le curseur en haut de 11 lignes
11B déplace le cruseur en bas de 11 lignes
c1C déplace le curseur à droite de c1 colonnes
c1D déplace le curseur à gauche de c1 colonnes
11,c1f déplace le curseur à la ligne 11, colonne c1
si 11 et cl sont absents, place à la position HOME
2J efface l'écran
K efface jusqu'à la fin de la ligne
---------- -------------------------------------------------------------
Choix des caractères graphiques (SGR)
Syntaxe générale : ESC[#; ...,#m où # représente un nombre
0 attributs d'écran par défaut, fond noir, lettres en blanc
1 lettres haute densité
4 souligné
5 intermittent
7 vidéo inverse
8 effaçage ON (invisible)
30 texte noir
31 texte rouge
32 texte vert
33 texte jaune
34 texte bleu
35 texte magenta
36 texte cyan
37 texte blanc
40 fond noir
41 fond rouge
42 fond vert
43 fond jaune
44 fond bleu
45 fond magenta
46 fond cyan
47 fond blanc
Exemple : ESC[32;40m texte vert sur fond noir
Utilisez des caractères haute densité pour la couleur correcte
---------------------------------------------------------------
Définition d'écran (Vectra)
Syntaxe : ESC[=#h avec : # une valeur numérique
0 écran blanc – noir 40 x 25
1 écran couleur : 40 x 25
2 écran noir – blanc 80 x 25
3 écran couleur : 80 x 25
4 écran couleur : 3 20 x 200
5 écran noir blanc 320 x 200
6 écran couleur : 640 x 200
- 223 -
- 224 -
- Code ASCII -
CODE ASCII
Code décimal : de 0 à 63
Code utilisé :
Déc code décimal
Oct code octal
hexa code hexadécimal
Car caractère
- 225 -
- Langage de programmation : Fortran 77 -
CODE ASCII
Code décimai : de 64 à 127
Code utilisé :
Déc code décimal
Oct code octal
hexa code hexadécimal
Car caractère
- 226 -
INDEX ALPHABETIQUE DES IDENTIFICATEURS
- 227 -
INDEX ALPHABETIQUE DES IDENTIFICATEURS
(SUITE)
- 228 -