Académique Documents
Professionnel Documents
Culture Documents
Page 1
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
I.5.13.3 Boucles.................................................................................................................................. 24
Page 2
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Le calcul numérique connaît son premier véritable essor à partir du XVIIème siècle avec les progrès
fulgurants des Mathématiques et de la Physique. Plusieurs machines de calcul sont en effet construites,
comme la « Pascaline » inventée par B. Pascal en 1643, la DENO (« Difference Engine Number One »; voir
la figure I.1) de C. Babbage en 1834 mais qui fonctionnait mal, ou encore le tabulateur de H. Hollerith
spécialement conçu pour recenser la population américaine, vers 1890. Le manque de moyens de calcul
performants limite en fait l'expansion et la validation de certaines théories du début du XXème siècle. Ce fut
le cas en particulier de la théorie de la Relativité Générale due à A. Einstein.
La Seconde Guerre Mondiale et les progrès technologiques qu'elle engendre vont permettre au calcul
numérique d'amorcer un second envol. Les anglais mettent au point le premier ordinateur en 1939,
COLOSSUS, dont la mission est de décrypter les messages codés envoyés par l'émetteur ENIGMA de
l'Allemagne nazie.
Les calculateurs sont désormais entièrement électroniques. Autre machine qui fait date dans l'histoire,
l’ENIAC (Electronic Numerical Integrator And Computer) construit en 1946. Malheureusement, ce type de
machine ne dispose pas de mémoire interne et doit être en permanence reprogrammée.
Page 3
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
A la fin des années 1940, un certain J. Von Neumann (voir la figure I.2) repense l'architecture des
ordinateurs et introduit, entre autres, les mémoires permettant de sauvegarder les programmes, et les
concepts de hardware (matériel) et de software (logiciel). La première machine de calcul incluant les
concepts de Von Neumann est ainsi produite par la firme américaine IBM; elle s'appelle Mark I et pèse 5
tonnes. Les premières applications concernent tous les domaines scientifiques et techniques.
Vers la fin des années 1960, l'apparition progressive des transistors et de leur assemblage massif sur des
surfaces de plus en plus réduites augmente considérablement les performances des machines et permet des
simulations numériques de réalisme croissant. Apparaissent ainsi en 1970 les fameux microprocesseurs mis
au point par les firmes Intel et Motorola. Le calcul numérique devient rapidement une science à part entière.
Les années 70 marquent aussi le tournant pour les langages de programmation. Au début des années 1980,
l'ordinateur le plus puissant du monde s'appelle Cray I (voir la figure I.2). C'est aussi le début de
l'informatique familiale avec la mise sur le marché des Personal Computers d'IBM.
En une quinzaine d'années, la rapidité des calculateurs a été multipliée par plus de 10000. La vitesse
d'exécution des opérations élémentaires se compte maintenant en dizaines de millions de millions
d'opérations à la seconde. Les capacités de stockage ont gagné 7 ordres de grandeur au moins. Aujourd'hui,
toutes ces performances doublent tous les ans.
Page 4
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
On regroupe sous le terme générique de méthodes numérique, toutes les techniques de calcul qui
permettent de résoudre de manière exacte ou, le plus souvent, de manière approchée un problème donné. Le
concept de calcul est assez vaste et doit être pris au sens large. Il peut s'agir de déterminer l'inconnue d'une
équation, de calculer la valeur d'une fonction en un point ou sur un intervalle, d'intégrer une fonction,
d'inverser une matrice, etc. Bien que la mise en équation d'un problème et sa résolution passent naturellement
par les Mathématiques, les problématiques sous-jacentes concernent des disciplines variées (Mécanique,
Aéronautique,…). Il existe ainsi une grande variété de problèmes possibles avec pour chacun d'eux, des
méthodes très spécifiques. De fait, le nombre total de méthodes numériques dont nous disposons à l'heure
actuelle est vraisemblablement gigantesque.
Une méthode numérique met en œuvre une certaine procédure, une suite d'opérations, généralement en
très grand nombre, que l'on transcrira ensuite dans un langage de programmation. Bien qu'une méthode
numérique puisse s'effectuer mentalement (du moins avec un crayon et un papier) comme inverser une
matrice 2×2, résoudre tan x—1= 0, ou calculer √2, elle nécessite dans la majorité des cas un ordinateur qui
a l'avantage de la rapidité (mais pas de la précision). Il convient à ce niveau de bien différencier la partie
méthode numérique, souvent indépendante du calculateur et du langage, et la partie programmation qui met
en œuvre d'une part l'algorithme et d'autre part une suite d'instructions écrites dans un langage de
programmation.
Un langage est un chaînon entre l’homme et la machine, un langage commun. C’est le langage
informatique. Un langage est constitué par :
Programmer, c’est d’écrire un texte respectant les règles du langage, susceptible de résoudre un
problème donné.
Ce texte est ensuite vérifié et traduit en une suite de codes machines par l’intermédiaire d’un compilateur.
Si le texte est incorrect, le compilateur indique les erreurs de compilation, qu’on pourrait comparer à des
fautes d’orthographe et de grammaire dans un langage courant.
Exécuter le programme, c’est faire dérouler par la machine cette séquence de codes machines ainsi créée.
Page 5
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Le premier compilateur FORTRAN fut conçu et implémenté par John Backus (IBM Lab., San José
California) en 1954. Il s'agissait du FORTRAN I. L'objectif de Backus était de concevoir un langage de
programmation qui permettrait de réaliser des programmes en utilisant une syntaxe la plus proche possible de
la syntaxe mathématicienne. Le terme FORTRAN traduit cette ambition, puisqu'il signifie FORmula
TRANslation.
FORTRAN I était un peu primaire, mais quand même très supérieur aux assembleurs et langages
machines utilisés au début des années 50. Il évolua rapidement en FORTRAN II et III.
FORTRAN prit son essor dans les années 60, surtout à partir de 1966, date à laquelle l'ANSI (organisme de
standardisation américain) publia la norme ANSI66 qui normalisa le FORTRAN IV. A partir de cette date,
tous les compilateurs utilisaient la même syntaxe. Un chercheur pouvait donc utiliser un code source écrit en
FORTRAN IV sur n'importe quelle machine (bien qu'à l'époque, en calcul scientifique, en dehors des
machines IBM, il n'y avait pas vraiment de salut...)
Par la suite, FORTRAN subit plusieurs évolutions, marquées par la publication par l'ANSI de normes:
• 1978, la publication de la norme ANSI 77, qui donna le FORTRAN 77, encore largement utilisé
aujourd'hui (les exemples ci-dessous sont écrits en 77). Le FORTRAN 77 introduit la
programmation structurée dans les habitudes des programmeurs FORTRAN
• 1992, la publication de la norme ANSI 90, et pour la première fois la reconnaissance ISO
(normalisation internationale). Le FORTRAN 90, outre quelques améliorations dans la gestion de la
mémoire, amène essentiellement les outils nécessaires au calcul parallèle sur les machines
multiprocesseurs. Il se décline en une nouvelle norme, qui n'est pas ANSI, et que l'on rencontre chez
certains constructeurs, dont IBM, le HPF pour High Performance FORTRAN.
• 1997, la dernière norme en date, qui est une norme ISO: le FORTRAN 95.
Le FORTRAN est donc un langage qui a un demi-siècle d'existence, mais qui reste un des plus utilisés en
calcul scientifique
Comme tous les programmes, un programme FORTRAN est un ensemble organisé d'instructions données
par le programmeur à la machine.
Page 6
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Le programmeur écrit le fichier source à l’aide d’un éditeur de texte de son choix (Figure I.3). Il s’agit
d’un texte clair contenant les instructions du programme. Le fichier source doit ensuite compilé (c.-à-d.
traduire en langage machine). Le fichier obtenu après compilation est un fichier objet pas encore exécutable.
L’éditeur de lien se charge de le rendre exécutable. Toute modification, correction d’un programme passe
tout d’abord par la modification du fichier source. Ce fichier doit être ensuite recompilé, ce qui permet
d’obtenir un fichier objet mise à jour.
Un programme FORTRAN comporte généralement plusieurs modules. Ces modules peuvent figurer dans
un même fichier ou des fichiers différents. Un ensemble de modules doit, pour pouvoir être exécuté,
comporter un programme principal.
program ProgStr
! Partie déclaration
! Partie instructions
end
Les mots Program et End sont les mots clé FORTRAN qui délimitent le programme principal. Le nom de
ce programme sera ProgStr. Il n’existe qu’un seul programme principal. Ce programme principal se
découpe en deux parties distinctes successives détaillées ci-dessous.
a—Partie de déclaration
C’est dans cette partie qu’on définit les objets qui seront manipulés par le programme (Les paramètres, les
variables, Initialisation et déclaration particulière,….).
L’exécution d’un programme FORTRAN consiste à dérouler dans l’ordre toutes les instructions de la
partie exécutable du programme principal. La liste d'instructions bornée par Program et End forme un bloc
fonctionnel. Ce bloc fonctionnel forme un programme FORTRAN tout à fait correct qui pourrait être
compilé et exécuté. Evidement, il ne ferait pas grand chose...
Page 7
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Certaines instructions déroulent le pointeur de programme vers d’autres types blocs fonctionnels :
subroutine nom
! Liste d'instructions
end
Et :
Ces deux blocs sont utilisés pour alléger le programme principal de calculs ou de traitements répétitifs.
Un programme FORTRAN classique ressemble donc à quelque chose comme ça:
program ProgStr
! Partie déclaration
! Partie instructions
end
subroutine nom
! Liste d'instructions
end
Type function nom
! Liste d'instructions
end
Il reste maintenant le plus gros du travail: identifier et comprendre ce que l'on entend par < liste
d'instructions >.
Les contenu des lignes en Fortran (figure I.3) doit respecter les quelques règles suivantes :
Page 8
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Pour couper une instruction sur plusieurs lignes, on met un caractère quelconque (ex : &) en colonne
6 des lignes de suite.
1 2 3 4 5 6 7 72 73 74 75 76 77 78 79 80
c L i g n e d e c o m m e n t a i r e
R eal a
1 0 c ontinue
Lorsqu’on écrit un programme, on utilise de l’alphabet, les chiffres et quelques signes. En FORTRAN, les
caractères reconnus par le compilateur sont :
Remarque : chaque instruction ; sauf l’instruction d’affectation ; commence par un mot clé du FORTRAN.
( ) Les parenthèses : elles encadrent une liste, pour un indice associé à un mot clé ou un nom de variable
(dans le cas des tableaux)
Ex :
write(∗,∗) x
A(N)
Page 9
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
= Egal : il constitue de symbole d’affectation ; il procède la valeur dans la déclaration d’une constante ; il
introduit les paramètres dans une boucle.
Ex :
x = y + z
x = 5
/ / Les barres de fraction : elles encadrent une liste associée à certain mot clé.
Ex :
x = 1
y = 2
z = 3
data x, y, z / 1, 2, 3/
∗ Astérisque ou étoile : elle désigne la transmission hors format de données, ou l’utilisation d’un
périphérique standard d’entrée—sortie (input—output).
Ex :
write (∗,∗)
' ' Les apostrophes : elles encadrent les constantes de type alphanumériques.
Ex :
print∗, 'hello'
Remarque : le caractère espace ignoré par le compilateur, sauf s’il est situé dans une constante.
Ex :
total=prix∗nbre∗TVA
total = prix ∗ nbre ∗ TVA
Dans l’exemple ci-dessus, les trois lignes sont identiques et l’absence ou la présence d’espace laisse le
compilateur totalement indifférent.
Page 10
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Leur nombre est limité. Ils constituent le vocabulaire reconnu par le compilateur. Toute autre chaîne de
caractères est considérée comme : nom de procédure, de constante, de variable ou bien comme commentaire.
Si un des caractères (c,!,∗) figurent dans la première colonne indique que la ligne entière est supposée
être un commentaire et le compilateur l’ignore. Une ligne vide est généralement considérée comme
commentaire par le compilateur.
Il est conseillé de faire usage autant que possible des commentaires afin de rendre le programme plus clair
et visible.
Ex :
c----------------Lire la base:
read∗, x
if (x.lt.0) then ! Liste cas d’erreur
Un identificateur est un nom que le programme l’attribué à une constante ou une variable. Il s’agit d’une
suite de caractères alphanumériques (lettres non accentuées), des chiffres ou trait de soulignement. Le
premier caractère doit être une lettre. En principe, il ne peut comporter plus de 6 caractères, mais certains
compilateurs en admettant l’avantage (31 caractères).
Il ne faut pas choisir pour un nom de variable un mot réservé (mot clé). Les mots réservés sont les
instructions de structuration et les noms des fonctions standards.
Entiers integer
real
Grandeurs numériques Réels
double precision
Complexes complex
Caractères (chaîne de caractères) character
Grandeurs logiques (vraies ou fausses) logical
Page 11
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Un integer contient un entier et est représenté par son écriture en base 2 signée sur 4 octets (31 bits
pour la valeur plus un bit pour le signe). Ses valeurs possibles sont dans l'intervalle [-231; 231-1].
Un real contient un nombre réel et est codé en virgule flottante sur 4 octets. Chaque nombre est
représenté sous la forme x = ±0.m × 2e où m est la mantisse codée sur 23 bits et e est l'exposant codé sur 8
bits (-127 < e < 128). Les valeurs (en valeur absolue) sont comprises dans l'intervalle [1.401×10-45; 3.403 ×
1038] et il stocke environ 7 chiffres significatifs.
Le double precision est un real plus précis, codé en virgule flottante sur 8 octets dont une mantisse codée
sur 52 bits et un exposant codé sur 11 bits (-1023 < e < 1024). Les valeurs (en valeur absolue) sont comprises
entre [4.941×10-324; 1.798×10308] avec 15 chiffres significatifs.
Remarque :
Un octet est égal à 8 bits. Et 1 bit est une valeur que l’on appel binaire, qui vaut soit 0 ou 1. D’où
l’interprétation du terme « traitement numérique », qui signifie que l’on ne traite essentiellement que des
valeurs binaires. Un octet est donc une succession de 8 bits.
Les constantes apparaissent dans un programme sous la forme d’une valeur (on ne peut pas les attribue un
nom).
Une constante de type integer est écrite sans point décimal. C’est une suite de chiffres précédée ou non
d’un signe, ne pouvant comporter aucun autre caractère.
Ex :
1
123
-28
Page 12
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
soit le point décimal, même s'il n'y a pas de chiffres après la virgule ;
soit le caractère e pour la notation en virgule flottante.
Pour les nombres écrits 0.xxxxx, on peut omettre le 0 avant le point décimal.
Ex :
0.
1.0
1.
31415e4
1.6e-19
-36.
Une constante double precision doit obligatoirement être écrite en virgule flottante, le e étant
remplacé par un d.
Ex :
1.d0
1d0
3.1415d0
31415d-4
Une constante de type complex est obtenue en combinant deux constantes réelles entre parenthèses
séparées par une virgule. 2.5 + i s'écrira (2.5, 1.)
Ex :
(0.,0.)
(1.,-1.)
(1.34e-7, 4.89e-8)
Elles sont constituées par une série de caractères encadrés par des apostrophes.
Ex :
'Chimie'
'L''eleve'
b—Définition des constantes symboliques : Elles permettent de référencer une constante à l'aide d'un
symbole. Elles ne peuvent être modifiées au milieu du programme et sont affectées une fois pour toutes avec
le mot-clé parameter dans la section déclaration.
Ex :
parameter (pi=3.141592654)
c—Déclaration des constantes : le type de chaque constante doit être déclaré explicitement ou en suivant les
mêmes règles de typage automatique que les variables (à voir ultérieurement). Une constante est toujours
locale à un bloc fonctionnel.
Ex :
real pi
parameter (pi=3.141592654)
parameter (vrai=.true.,faux=.false.)
Une variable est un emplacement en mémoire référencée par un nom, dans lequel on peut lire et écrire des
valeurs au cours du programme.
Page 14
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
C'est la déclaration. Elle doit être écrite dans la première partie (la partie déclaration) d'un bloc
fonctionnel (programme principal, Subroutine ou fonction) dans lequel intervient la variable.
Dans les langages modernes, toute variable doit être déclarée. En FORTRAN, il y a des exceptions
obéissant à des règles bien précises.
a—Déclaration des variables : une variable doit être déclarée entre (Program, Subroutine, Function)
et la première instruction exécutable.
Syntaxe :
type var1,var2,var3
On peut déclarer plusieurs variables du même type sur une même ligne.
Ex :
integer i,j,k
real alpha,beta
Caractères autorisés :
Toutes les lettres,
Tous les chiffres,
Le caractère «blanc » (déconseillé),
Le caractère «_ » (« underscore » ≠ «moins ») ;
Le premier caractère doit être une lettre ;
Seuls les 6 premiers caractères sont significatifs : epsilon1 et epsilon2 représentent la même variable;
(Rappel) pas de différence minuscules majuscules.
Page 15
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
La déclaration integer indique que les variables sont des données de type entier, et peuvent être définies
par :
Syntaxe :
integer(1) var1,var2,var3
integer(2) var1,var2,var3
integer(4) var1,var2,var3
integer var1,var2,var3
Le tableau suivant présente les différents types des données entières : la mémoire occupée et le domaine
d’utilisation de chaque type.
Remarque—ASCII (American Standard Code for Information Interchange) est la norme de codage de
caractères en informatique la plus connue. Elle définit 128 caractères numérotés de 0 à 127 et codés en
binaire sur 7 bits de 0000000 à 1111111.
Les déclarations real et double precision indiques que les variables sont des données de type réel,
simple ou double précision. Elles peuvent être définies par :
Syntaxe :
real var1,var2,var3
Page 16
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
real(4) var1,var2,var3
real(8) var1,var2,var3
real∗4 var1,var2,var3
real∗8 var1,var2,var3
La déclaration complex indique que les variables sont des données de type complexe, simple ou double
précision. Elles peuvent être définies par :
Syntaxe :
complex var1,var2,var3
complex(4) var1,var2,var3
complex(8) var1,var2,var3
Syntaxe :
character∗n var1,var2,var3
character(n) var1,var2,var3
Où n représente la longueur de la chaîne. Cette déclaration réserve n octets en mémoire pour y stocker n
caractères.
Ex :
Character∗15 nom
Character∗100 chimie
Page 17
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
On peut ensuite affecter ces variables avec l’opérateur = comme pour toute autre variable :
nom='Louisnard'
chimie='filiere des sciences de la matieres'
Comme la chaîne 'Louisnard' ne contient que 9 caractères, les 6 derniers caractères de nom sont affectés
avec le caractère blanc.
Ex :
Character∗20 nom,prenom
Ex :
Character∗8 nom1,nom2,prenom∗15,nom3
nom1, nom2 et nom3 : sont des chaînes de caractères, leurs longueur ne dépasse pas 8 caractères ; alors que
prenom∗15 : est défini comme étant de longueur 15. Si on ignore la longueur de la chaîne, on peut écrire :
Syntaxe :
character∗(∗) var1,var2,var3
La déclaration logical indique que les variables sont des données de type logique, et peuvent être
définies par :
Syntaxe :
logical(1) var1,var2,var3
logical(2) var1,var2,var3
logical(4) var1,var2,var3
logical var1,var2,var3
Les variables de type logique sont constitués de deux valeurs : .true. ou .false. (Voir I.5.10.1 : a—5).
Page 18
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Une variable dont le nom commence par i,j,k,l,m,n est automatiquement de type integer.
Une variable dont le nom commence par z est automatiquement de type complex.
Une variable commençant par toute autre lettre (de a à h et de o à y) est automatiquement de type
real.
On peut toutefois modifier ces règles en utilisant la directive implicit. La modification est de manière
locale à un bloc fonctionnel.
Syntaxe :
Toute variable commençant par une lettre comprise entre lettre1 et lettre2 ou par lettre3 sera par
défaut du type indiqué. Cette directive (implicit) doit être écrite juste après : program, subroutine ou
function.
Ex :
implicit none
Cette directive spécifie que toutes les variables doivent être déclarées. Dans un même programme implicit
none doit être précédé parameter.
Ex :
program nom
Implicit none
real pi
parameter (pi=3.141592654)
Page 19
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Le tableau I.3 donne la liste des opérateurs arithmétiques de Fortran. Ils sont listés par ordre de priorité
croissante. Dans une expression, on évalue donc d'abord ∗∗ puis /, puis ∗, et en enfin + et -. On peut aussi
grouper des sous-expressions entre parenthèses.
Ex :
x=a+b/c-d ! Évalue + −
x=(a+b)/(c+d) ! Évalue
Lorsque deux opérandes de types différents interviennent de chaque coté d'un opérateur :
l'opérande de type le plus faible est converti dans le type de l'autre opérande
l'opération est effectuée, et le type du résultat est le type le plus fort
Les types sont classés dans l'ordre suivant (du plus fort au plus faible) :
complex
double precision
real
integer
1
logical
Ex :
1
.true. est converti en 1 et .false. en 0
Page 20
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Si a et c sont real, et b double precision, le résultat de b∗∗2-4∗a∗c sera double precision, mais
attention, le produit a∗c sera effectué en simple précision, d'où une perte de précision possible.
Attention !
2/3 sera du type integer. Autrement dit la division effectuée sera une division entière, et le résultat sera 0.
Pour calculer effectivement deux tiers en réel, écrire : 2./3, 2/3. ou 2./3.
Une fonction FORTRAN est une boite dans laquelle rentre un ensemble de grandeurs d'un type donné (les
arguments) et de laquelle sort une grandeur d'un type donné.
Certaines fonctions mathématiques sont prédéfinies dans le langage (Tableaux I.4 et I.5). On n'utilisera
pas la même fonction selon le type de l'argument. Par exemple la fonction sinus sera sin pour un argument
réel, dsin pour un argument double precision, csin pour un argument complexe.
Important :
Page 21
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Ex :
z=(a∗sin(x)+b∗cos(y))/(a∗sinh(x)+b∗cosh(y))
Ex :
min(x1,x2) ! minimum de 2 réels
max(x1,x2) ! maximum de 2 réels
Un programme enchaîne les instructions qu'on lui donne une à une dans l'ordre. Pour réaliser un vrai
programme, il faut tout de même disposer de moyens pour faire des tests et des boucles : on appelle cela le
contrôle d'exécution.
a—Objectif
Exécuter une séquence d’instructions si une condition logique est vérifiée, sinon en exécuter une autre.
b—Syntaxe
Pour exécuter une série d'instructions uniquement si une condition logique est vraie :
On peut aussi spécifier une autre série d'instructions à exécuter si la condition logique est fausse :
Page 22
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Le programme exécute le bloc d'instructions suivant la première condition logique vraie puis reprend
après endif. Si aucune condition logique n'est vraie, le bloc else est exécuté.
Une expression logique est en général le résultat d'une comparaison entre deux objets :
On peut combiner ces expressions entre elles avec les opérateurs logiques usuels :
Opérateur En Fortran
Ou .or.
Et .and.
Ou exclusif .xor.
Négation .not.
Page 23
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
I.5.13.3 Boucles
a—Objectif
Une boucle permet d'exécuter une séquence d'instructions plusieurs fois d'affilée. Le nombre de boucles
peut être déterminé :
À l’avance,
Par le basculement d'une condition logique.
a—Syntaxe
b—Fonctionnement
var est une variable de type integer et deb, fin et pas sont des objets de type integer (constantes
ou variables).
La variable var prend d'abord la valeur de deb et est augmenté de pas à chaque boucle. Dès que var>
fin, la boucle s'arrête et l'exécution continue après le enddo.
Somme=0
do i=1,n
somme=somme+i
enddo
Page 24
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
a—Syntaxe
b—Fonctionnement
On rentre dans la boucle seulement si la condition logique vaut .true. et on exécute la boucle tant
qu'elle reste à .true.. Dès qu'à la fin d'une boucle, la condition est .false., l'exécution reprend après
enddo.
Pour pouvoir sortir de la boucle, il faut que la condition logique puisse devenir .false. à l'intérieur. Si
ce n'est pas le cas, le programme ne s'arrêtera jamais.
Ex : Sommation de la série ∑ 1/ jusqu'à ce que le terme général soit inférieur à ! fois la somme
partielle courante :
integer n
double precision somme,epsilon
n=1
somme=0
c-----boucle:
do while (1d0/n∗∗2.gt.epsilon∗somme)
somme=somme+1d0/n∗∗2
n=n+1
enddo
a—Syntaxe
En arrivant sur une telle ligne, le programme est branché directement sur la ligne comportant le label
(l’étiquette) mentionné. En général, pour faire beau, cette ligne contient seulement l'instruction qui ne fait
rien continue.
Page 25
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Ex :
character rep
...
10 continue
write(∗,∗) 'Reponder oui ou non'
read(∗,∗) rep
if (rep.ne.'o'.and.rep.ne.'n')
goto 10
endif
On appelle < Entrées / Sorties >, tout ce qui permet à un programme de dialoguer avec l'extérieur :
Le langage FORTRAN permet d'écrire ou de lire des données sur différentes choses. Pour écrire, on
utilise l'instruction write :
à l’écran,
sur un fichier,
dans une chaîne de caractères.
sur le clavier,
dans un fichier.
dans une chaîne de caractères.
Formatées : c'est à dire organisée en lignes de caractères. C'est le cas des lectures clavier et des écritures
écran, des lectures/écritures de fichiers texte et de chaînes.
Non-formatées : qui signifient transfert octet par octet. C'est le cas des lectures/écritures sur fichiers
binaires.
Page 26
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
a—Syntaxe
L'unité d'écriture est un entier (écriture sur fichier). Pour l'écran, on utilise ∗.
Le formatage indique sous quelle forme on va écrire les données. Il existe un formatage par défaut
qui laisse FORTRAN écrire comme il veut : le format libre ∗.
Ex :
write(∗,∗) i,j,x,y
écrit les valeurs des variables i,j,x,y sur une ligne, séparées par des blancs.
Un format est une série de codes, chaque code définissant le format d'écriture d'un élément d'une donnée.
a—Définition du format
Deux solutions :
Cette solution permet d'utiliser le même format dans plusieurs instructions write.
Dans un format, la notation in permet d'afficher un entier. L'entier est écrit sur n caractères en tout :
Page 27
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Ex :
i=11
j=20312
write(∗,'(i6,i6)') i,j
Cela donne :
1 1 2 0 3 1 2
6 caractères 6 caractères
10 format (i6,i6)
i=11
j=20312
write(∗,10) i,j
Dans un format, la notation en.m permet d'afficher un réel en virgule flottante sur n caractères en tout
avec m chiffres significatifs, c'est à dire :
±0. E±
m caractères
n caractères
Ex :
x=-1456.2
y=1.6e-19
write(∗,'(e14.5,e14.5)') x,y
Page 28
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
- 0.. 1 4 5 6 2 E + 0 4
5 caractères
14 caractères
Si n est spécifié, la chaîne est écrite sur n caractères en tout, en ajoutant des blancs à gauche pour
compléter.
Si n n'est pas spécifié, la chaîne est écrite avec son nombre de caractères total.
Ex : formats mixtes
i=36
x=-1456.2
write(∗,'(a,i4,a,e12.5)') 'i vaut:',i,'et x vaut:',x
Affichera :
En conclusion, les formats doivent être utilisés si c'est absolument nécessaire. Dans la plupart des cas le
format par défaut ou libre (∗) suffit largement, et il est inutile de perdre du temps à formater les sorties écran.
a—Principe
On lit une ligne de caractères d'un seul coup, la lecture étant validée par :
Les données sur une même ligne doivent être séparées par des blancs.
a—Syntaxe
Page 29
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
L'unité de lecture est un entier (lire d’un fichier). Pour le clavier, on utilise ∗.
Le formatage indique sous quelle forme on va lire les données (voir write).
Le plus simple est d'utiliser tout le temps le format libre ∗. L’exception est pour lire des variables
caractères ou chaînes de caractères, le format libre ne fonctionne pas. Utiliser le format chaîne a.
Ex :
real a,b,c
...
read(∗,∗) a,b,c
A partir des types simples du FORTRAN, on peut former des vecteurs, des matrices, et même des
tableaux à plusieurs indices.
I.5.15.1 Déclaration
type var(m1,m2,…)
m1, m2,... déterminent la taille du tableau. Elles doivent être des constantes entières. Il est interdit de mettre
des variables entières. Autrement dit : la taille d'un tableau FORTRAN est fixée une fois pour toutes.
Ex :
real v(100)
double precision a(100,100)
integer i(20)
Conseils :
Pour créer des tableaux, il est conseillé de déclarer les tailles dans des constantes symboliques :
Avant de déclarer un tableau, pensez à la taille mémoire qu'il va occuper. Le tableau a ci-dessus
occupe par exemple 100×100×8 = 80000 octets.
Page 30
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Ex :
parameter (max=100)
double precision a(max,max)
real v(max)
C'est une extension très pratique pour lire des matrices au clavier ou les écrire à l'écran. Il s'agit en
quelque sorte d'une boucle do ... enddo combinée à un read ou un write.
a—Syntaxe
read(∗,∗) (var(i),i=i1,i2,i3)
write(∗,∗) (var(i),i=i1,i2,i3)
i représente une variable entière, var(i) une expression ou un tableau dépendant de cette variable i. i1,
i2 et i3 ont le même sens que pour les boucles do.
Page 31
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Ex : Lire les n premières composantes d'un vecteur sur une même ligne au clavier
read(∗,∗) (v(i),i=1,n)
Ex : Ecrire les n premiers termes de la jème ligne d'une matrice à l'écran, séparés par le caractère <!>
write(∗,∗) (a(i,j),'i',j=1,n)
La taille de déclaration des tableaux définit la taille mémoire réservée pour stocker le tableau. En général,
on choisit cette taille comme étant la taille maximale du problème que l'on veut traiter, mais il se peut que
pour un problème particulier, on utilise seulement une partie du tableau.
Dans l'exemple de l'addition, supposons que nous utilisions les tableaux FORTRAN a(100,100) et
b(100,100) pour stocker des matrices 3×3. La structure de a sera la suivante :
' 0 … … … 0
& ' 0 … … … 0 -
% ,
% ' ' '' 0 … … … 0 ,
% 0 0 0 0 … … … 0 ,
% . . . . . ,
% . . . . . ,
$0 0 0 0 … … … 0+
et de même pour b. Pour faire la somme des deux matrices, il est inutile d'additionner les 0, et les boucles
doivent être effectuées de 1 à 3 plutôt que de 1 à 100.
Lorsqu'on utilise un tableau FORTRAN, il faut stocker ses dimensions réelles dans des variables en plus
de sa taille de déclaration. Dans l'exemple de l'addition précédent, on utilisera une variable n si on somme
des matrices carrées, ou deux variables nligne et ncolon si on somme des matrices rectangulaires.
Ex : Ecrire un programme complet qui lit au clavier deux matrices de même taille m×n et effectue leur
somme. On part du principe que ces matrices ont au plus 50 lignes et 80 colonnes. On déclare donc 3
tableaux 50×80, et on utilise deux variables nligne et ncolon pour stocker les tailles réelles des matrices
que l'on traite. Ces tailles réelles sont bien sûr demandées à l'utilisateur.
Page 32
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
integer nligne,ncolon
c--------- écrire et lire des paramètres des matrices
write(∗,∗)'nombre de lignes des matrices'
read(∗,∗)nligne
write(∗,∗)'nombre de colonnes des matrices'
read(∗,∗)ncolon
c--------- écrire et lire matrice a
write(∗,∗)'matrice a'
do i=1,nligne
read(∗,∗) (a(i,j),j=1,ncolon)
enddo
c--------- écrire et lire matrice b
write(∗,∗)'matrice b'
do i=1,nligne
read(∗,∗) (b(i,j),j=1,ncolon)
enddo
c--------- somme des deux matrices a et b
do i=1,nligne
do j=1,ncolon
c(i,j)=a(i,j)+b(i,j)
enddo
enddo
end
Il arrive fréquemment que l'on doive faire plusieurs fois la même chose au sein d'un même programme,
mais dans un contexte différent. Par exemple :
litmat
x f(x)
f
Page 33
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Exemple : écrire un programme qui lit trois matrices au clavier, en fait le produit, puis affiche le résultat. On
écrira trois blocs de base :
m
litmat
m
affmat
Les objets FORTRAN correspondants à ces blocs sont les subroutines ou les fonctions. On voit que
chacun de ces blocs peut être écrits séparément, et qu'il est relie à l'extérieur par des portes d'entrée/sortie
repérées par un nom.
Persuadons-nous que ce nom n'a de sens que pour le bloc, et qu'il est là pour identifier une entrée ou une
sortie. Les connexions des boites avec l'extérieur sont appelées en FORTRAN paramètres formels, et seront
traités comme des variables dans les instructions exécutables.
Avant d'aller plus loin, montrons comment utiliser les trois blocs définis ci-dessus pour résoudre le
problème proposé :
Symboliquement cela revient à connecter les blocs comme la montre la figure I.4.
Page 34
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
2014
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre
Année III
Départements de Chimie Méthodes Numériques et Programmation
Une subroutine est une séquence d'instructions appelable d'un point quelconque du programme. Elle peut
être appelée depuis le programme principal ou depuis une autre subroutine ou fonction.
un nom
des paramètres formels, qui ont comme les variables :
un nom
un type
Les instructions de la subroutine ne peuvent pas manipuler les variables locales du programme principal
ou d'une autre subroutine ou fonction.
subroutine nomsub(pf1,pf2,…)
sub(pf1,pf2,…)
type pf1
type pf2
...
! Déclaration des variables locales
...
Page 35
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
L'appel d'une subroutine se fait depuis un bloc fonctionnel quelconque (programme principal, subroutine,
fonction) avec l'instruction call.
call nomsub(v1,v2,…)
Important. Les types des arguments v1, v2,... doivent correspondre exactement à ceux des paramètres
formels pf1,pf2,...
Ex : Ecrire une subroutine qui calcule les coordonnées polaires associées à des coordonnées cartésiennes
( , ).
1=9 +
: = 12; | / | > 0
: = − 12; | / | < 0
: = </2 = 0 =; > 0
: = −</2 = 0 =; < 0
subroutine polar(x,y,r,theta)
double precision x,y,r,theta
double precision pi
double precision temp
pi=4∗datan(1d0)
r=dsqrt(x∗∗2+y∗∗2)
temp=datan(y/x)
if (x.gt.0d0) then
theat=temp
Page 36
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
program
...
double precision a,b,rho,phi
...
call polar(a,b,rho,phi)
...
end
Les variables a,b,rho et phi sont des variables locales du programme principal : elles n'ont aucun
sens pour la subroutine polar.
Les variables pi et temp sont des variables locales de la subroutine polar : elles n'ont aucun sens
pour le programme principal.
x,y,r et theta sont les paramètres formels de la subroutine polar. Ce sont les portes de
communication de la subroutine et leurs noms n'ont aucun sens à l'extérieur de la subroutine.
En particulier, s'il y a dans le programme principal des variables locales appelées x,y,r ou theta, elles
n'ont rien à voir avec les paramètres formels de la subroutine. En revanche, il est possible de passer ces
variables locales en tant qu'arguments d'appel à polar :
call polar(x,y,rho,phi)
La variable locale x du programme principal est alors passée à la subroutine via son premier paramètre
formel, qui incidemment s'appelle aussi x, mais les deux objets sont bien distincts.
Page 37
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Une fonction est en tout point identique à une subroutine, mais son nom contient en plus une valeur.
C'est-à-dire qu'au lieu de l'appeler par call, on l'utilise à droite du signe = dans une instruction d'affectation.
a—Valeurs de retour
Puisque le nom de la fonction contient une valeur, cette valeur doit être typée. Par exemple datan
renvoie une valeur double precision. En plus du type de ses paramètres formels, la définition d'une
fonction doit donc décrire le type de la valeur qu'elle retourne.
La valeur de retour de la fonction sera affectée dans le corps de la fonction, comme si le nom de la
fonction était une variable ordinaire.
Le type peut être omis auquel cas le type de la fonction est fixé par les règles par défaut.
Une fonction est utilisable dans tout autre bloc fonctionnel, comme une variable qui aurait des arguments.
Comme pour les subroutines, il est indispensable de respecter la correspondance entre les arguments passés à
la fonction et ses paramètres formels.
Attention : il faut non seulement déclarer le type de la fonction lors de sa définition, mais aussi dans tous les
blocs fonctionnels où on l'utilise. Si cette déclaration est absente, les règles de typage automatiques du bloc
fonctionnel courant s'appliquent.
Page 38
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
program test
double precision abscis,cordonn,r
double precision rayon
On a vu que par défaut les variables d'un bloc fonctionnel lui étaient locales, donc inconnues des autres
blocs. Il existe un moyen d'étendre la portée d'une variable à plusieurs blocs fonctionnels : le common.
Un common comporte un nom et une liste de variables. Les variables de cette liste seront connues dans
tous les blocs fonctionnels où l'on écrit le common.
a—Syntaxe
common/nomcom/v1,v2,v3
b—Remarques :
Page 39
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Tout ce que vérifie le compilateur, c'est que la longueur totale en octets de chaque common est la
même dans tous les blocs fonctionnels où il apparait. On a donc le droit de changer le nom des
variables entre deux utilisations d'un même common, mais cela est déconseillé.
Ex : Dans l'exemple suivant, on voit que les noms des variables du common bidon sont différents dans le
programme principal et dans truc.
Mais cela est correct puisqu'il y a 2 reals de chaque coté. u et a représentent exactement le même objet car
ils correspondent à la même zone mémoire. Cela dit, il vaut mieux garder les mêmes noms partout.
program test
double precision pi
real a,b
common/trig/pi
common/bidon/a,b
pi=4∗datan(1d0)
...
end
subroutine truc(x,y)
common/trig/pi
common/bidon/u,v
double precision pi
real u,v
...
y=x∗tan(pi∗u/v)
...
return
end
a—Objectif
Utiliser le nom d'une fonction ou d'une subroutine comme argument d'une autre fonction ou subroutine.
Examinons le problème suivant : Ecrire une subroutine qui calcule l'intégrale > .( ) pour une fonction
. quelconque. Que faudra-t-il faire entrer et sortir de la subroutine ?
La fonction . ;
Page 40
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Or quel est le moyen en FORTRAN de programmer une fonction .( ) ? C'est d'utiliser une fonction
FORTRAN, qui renverra par exemple une valeur real.
subroutine integ(a,b,f,valint)
Les paramètres formels a,b et valint seront double precision, mais de quel type est f ? C'est le nom
d'une fonction FORTRAN, et pour déclarer un paramètre formel aussi bizarre, on écrira :
external f
Et aussi :
real f
Car f renvoie une valeur real. On peut aussi déclarer des paramètres formels de type subroutine, en
utilisant simplement external. Dans le corps de la subroutine, on fera bien sûr appel à cette fonction f pour
calculer l'intégrale. Pas de difficulté ! On fait comme si elle existait et on écrira des choses du style :
valint=valint+[h/2*(f(x1+h)+f(x1))]
Maintenant ma subroutine d'intégration est écrite. Je souhaite l'appliquer à une fonction que j'ai écrite en
FORTRAN, du style :
Je veux appeler la subroutine integ pour calculer l'intégrale de cette fonction entre disons 1 et 2. J'écrirai :
call integ(1.0,2.0,truc,somtruc)
1.0 et 2.0 sont des constantes real, somtruc une variable real qui me renverra la valeur de l'intégrale...
Et truc ? C'est le nom d'une fonction FORTRAN.
Page 41
Université Hassiba Benbouali de Chlef Année Universitaire: 2014—2015
Faculté des Sciences Exactes et Informatique Niveau: 2ième Année—Semestre III
Départements de Chimie Méthodes Numériques et Programmation
Ai-je le droit de passer ce genre de chose en argument à une subroutine ? La réponse est oui, si je la déclare :
external truc
Dans le bloc fonctionnel d'où je fais le call. De plus, comme cette fonction renvoie une valeur real,
j'ajouterai :
real truc
Le programme suivant récapitule tout ce que l'on vient d'expliquer. Remarquons que la structure de truc
est imposée par la subroutine qui demande que la fonction représentée par son paramètre formel f ait un
argument réel et renvoie une valeur réelle. Nous ne pourrions donc pas par exemple déclarer :
program test
real somtruc
external truc
real truc
call integ(1.0,2.0,truc,somtruc)
end
subroutine integ(a,b,f,valint)
real a,b,f,valint
external f
real f
valint=valint+[h/2*(f(x1+h)+f(x1))]
return
end
En général, les subroutines du type integ sont des boites noires toutes faites (par des spécialistes), et on
vous indique juste le type de ses paramètres formels. Lorsque l'un d'entre eux est une fonction ou une
subroutine, on vous indique en plus la liste des paramètres formels que doit avoir cette fonction ou
subroutine.
Page 42