logical
do
... enddo
do
... while
goto
et continue
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.
Exécuter une séquence d'instructions si une condition logique est vérifiée, sinon en exécuter une autre.
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 :
|
On peut même enchaîner plusieurs conditions logiques :
|
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é.
Ce sont des objets de type logical
.
Ils ne peuvent prendre que deux valeurs
.true. |
.false. |
Une expression logique est en général le résultat d'une comparaison entre deux objets :
En maths | En FORTRAN | En Anglais |
x = y | x |
« equal » |
x |
« not equal » | |
x > y | x |
« greater than » |
x < y | x |
« less than » |
x |
« greater or equal » | |
x |
« less or equal » |
On peut combiner ces expressions entre elles avec les opérateurs logiques usuels :
Ou | .or. |
Et | .and. |
Ou exclusif | .xor. |
Négation | .not. |
Pour lire un caractère au clavier et agir en conséquence en tenant compte du
fait que l'utilisateur peut répondre « Oui » en tapant O
majuscule
ou o
minuscule, et idem pour non (avec N
ou n
) :
character rep
|
Pour tester le signe du discriminant d'une équation du second degré :
double precision a,b,c,delta,x1,x2
|
logical
On peut déclarer des variables de ce type et leur affecter comme valeur :
.true.
ou .false.
,
Cela sert parfois à améliorer la lisibilité des programmes.
Par exemple, pour l'équation du second degré :
double precision a,b,c,delta,x1,x2 |
Une boucle permet d'exécuter une séquence d'instructions plusieurs fois d'affilée.
Le nombre de boucles peut être déterminé :
do
... enddo
On effectue la boucle un nombre de fois prédéterminé.
|
|
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
.
L'entier pas
peut être omis et vaut 1 par défaut.
Si fin<deb et pas>0, la boucle n'est jamais exécutée.
Si fin>deb et pas<0, la boucle n'est jamais exécutée.
Somme des premiers nombres entiers jusqu'à n :
... ! affectation de n
|
ou bien encore :
... ! affectation de n
|
Somme des nombres impairs inférieurs à n :
... ! affectation de n
|
do
... while
On effectue la boucle tant qu'une condition logique est vérifiée.
|
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 .true.
à l'intérieur. Si ce n'est pas le cas, le programme
ne s'arrêtera jamais (Pensez-y !).
Sommation de la série jusqu'à ce que le terme général soit inférieur à fois la somme partielle courante :
integer n
|
Plus élégant, en utilisant une variable logical
:
integer n
|
goto
et continue
Il s'agit d'un archaïsme. À proscrire absolument, sauf si on ne peut pas faire autrement. Tout abus sera puni ! |
Les instructions de branchement conduisent à des programmes illisibles et difficiles à corriger. Certaines instructions du FORTRAN (voir « fichiers » 11) utilisent des branchements de manière implicite pour gérer des erreurs. Dans ce cas, et seulement dans celui-ci, le branchement est obligatoire.
|
En arrivant sur une telle ligne, le programme est branché directement
sur la ligne comportant le label mentionné. En général, pour faire
beau (il faut le dire vite...), cette ligne contient seulement
l'instruction qui ne fait rien continue
.
Pour vous donner des mauvaises idées :
character rep
|