Travaux dirigés de Fortran

Download Report

Transcript Travaux dirigés de Fortran

École normale supérieure
L3 géosciences
Travaux dirigés de Fortran
Lionel GUEZ
19 janvier 2015
Table des matières
1 Identificateurs
2
2 Seulement des calculs
2
3 Conversion entre francs et euros
3
4 Année bissextile
3
5 Nombre de jours d’un mois
3
6 Suite de Fibonacci
3
7 Somme d’une série
4
8 Quantième d’une date
4
9 Triangle de Pascal
4
1
Créez un répertoire où vous placerez vos programmes. Copiez dans ce répertoire le fichier :
~guez/Documents/Solutions_TD_Fortran_1/GNUmakefile
Si vous avez besoin de consulter la norme Fortran 95, par exemple pour
connaı̂tre la description d’une procédure intrinsèque, vous pouvez trouvez sa version quasi-définitive en ligne : http://j3-fortran.org/doc/standing/archive/
007/97-007r2/pdf/97-007r2.pdf.
Des solutions des exercices vous sont proposées dans le répertoire :
~guez/Documents/Solutions_TD_Fortran_1
1
Identificateurs
Voici une liste de mots. Pour chacun, dites si ce mot peut ou non être un
identificateur Fortran. Certains mots ci-dessous sont des identificateurs licites
mais déconseillés. Repérez-les et dites en quelques mots pourquoi ils sont déconseillés. Pour les mots qui ne peuvent pas être des identificateurs Fortran, dites
brièvement pourquoi.
– température
– pression1
– gcm_model_hybrid_sigma_pressure_coordinate
– 0_vector
– count
– _class
– i
– character
2
Seulement des calculs
Fichier long_line.f. Écrivez un programme qui effectue les affectations et
calculs suivants :
BVSEC = 10−5
TTLL = 260
TTLLM1 = 258
RD = 287
7
RCPD = RD
2
H0 = 7 · 103
ZHLL = 3 · 104
ZHLLM1 = 3,2 · 104
s
(TTLL + TTLLM1)RD2
TTLL − TTLLM1 RD
BVLL = max BVSEC,
−
ZHLL − ZHLLM1 H0
2 × RCPD × H02
et affiche la valeur de BVLL. Toutes les variables ci-dessus seront déclarées avec
le type réel. Le calcul de BVLL sera fait en une seule instruction Fortran, sur
2
plusieurs lignes pour ne pas dépasser 80 caractères par ligne (souci de lisibilité).
Vous devriez trouver :
bvll ≈ 2,178 14 · 10−2
3
Conversion entre francs et euros
1. Fichier currency_1.f. Écrivez un programme permettant de convertir les
francs en euros. La somme en francs sera demandée à l’utilisateur par le
programme. Le programme donnera la somme en euros. N’utilisez pas de
variable pour la somme en euros. Rappel : 1 e = 6,559 57 F.
2. Fichier currency_2.f. Modifiez le programme pour que l’utilisateur puisse
utiliser la conversion dans les deux sens (euros *
) francs). L’utilisateur doit
entrer une valeur suivie d’une devise, sous la forme de trois lettres : EUR ou
FRA. Le programme reconnaı̂tra la devise entrée et fera la conversion dans
l’autre devise. Le programme affichera un message d’erreur si la devise
entrée n’est pas une des deux attendues. Utilisez l’instruction select case.
4
Année bissextile
Fichier leap_year.f. Écrivez un programme permettant de vérifier si une
année est bissextile. L’utilisateur devra entrer une année et le programme devra
lui répondre si cette année est bissextile ou non.
Définition. Pour être bissextile, une année doit être divisible par 4. Toutefois,
une année divisible par 100 n’est bissextile que si elle est aussi divisible par 400.
Dans le programme, synthétisez le critère “année bissextile” en une seule
expression logique (sans variable intermédiaire), et utilisez cette expression logique dans un test unique. Procédure intrinsèque Fortran pouvant vous être
utile : modulo.
5
Nombre de jours d’un mois
Fichier month_length.f. Écrivez un programme indiquant, pour un numéro
de mois fourni par l’utilisateur, le nombre de jours dans ce mois (utilisez ici
l’instruction select case). Pour le mois de février, le programme répondra
simplement “28 or 29 days”. Le programme affichera un message d’erreur pour
un numéro de mois incorrect.
6
Suite de Fibonacci
La suite de Fibonacci est définie par :
u0 = 1
u1 = 1
un = un−1 + un−2
3
pour n ≥ 2
1. Fichier fibonacci_1.f. Écrivez un programme demandant un indice n et
écrivant la valeur de un . Après le calcul de un , le programme doit redemander une valeur de n à l’utilisateur, pour un nouveau calcul. Le programme
doit s’arrêter si l’utilisateur entre une valeur strictement négative.
2. Fichier fibonacci_2.f. Le calcul de un reste-t-il correct quand n est
grand ? Comment tester dans le programme la validité du calcul ? Si l’utilisateur demande une valeur de n trop grande, le programme fera le calcul
jusqu’au plus grand indice possible i, affichera un message pour signaler
que n est trop grand et le terme ui de la suite de Fibonacci qui a pu être
calculé. Le programme redemandera ensuite une valeur de n.
Procédure intrinsèque Fortran pouvant vous être utile : huge.
7
Somme d’une série
Fichier sum_series.f.
Soit la série de somme partielle :
Sn =
n
X
1
2
i
i=1
La somme de cette série est π 2 /6. Dans quel ordre vaut-il mieux sommer les
termes ?
Écrivez un programme qui calcule et affiche π 2 /6 et les valeurs de Sn pour n
donné, en sommant dans les deux sens. Comment éviter le dépassement de valeur
maximale d’un entier (est-il utile de calculer i2 exactement, c’est-à-dire comme
le carré d’un entier ?) ? Si on somme les termes dans l’ordre i croissant, quelle
est la valeur maximale de n donnant un résultat significatif ? Faites calculer et
afficher par le programme cette valeur maximale de n. Procédures intrinsèques
Fortran pouvant vous être utiles : sqrt, epsilon, real, acos.
8
Quantième d’une date
1. Fichier day_number_1.f. Écrivez un programme permettant de déterminer le quantième d’une date (c’est-à-dire le numéro du jour dans l’année).
Le programme demandera à l’utilisateur l’année, le mois et le jour dont
il veut connaitre le quantième. Tenez bien compte des années bissextiles.
Procédure intrinsèque Fortran pouvant vous être utile : sum.
2. Fichier day_number_2.f. Écrivez un programme permettant d’effectuer
l’opération inverse. L’utilisateur devra fournir une année et un quantième
et le programme devra indiquer le mois et le jour correspondant.
9
Triangle de Pascal
Le triangle de Pascal est une méthode pour obtenir les coefficients du développement de (a + b)n . Par exemple, pour n = 4, le développement s’écrit :
(a + b)4 = a4 + 4a3 b + 6a2 b2 + 4ab3 + b4
et les coefficients des monômes sont donc :
4
1 4 6 4 1
On obtient les coefficients du développement à la puissance i à partir des coefficients à la puissance i−1. Si cij représente le j-ième coefficient du développement
à la puissance i, on a :
cij = ci−1,j−1 + ci−1,j
Cf. figure (1) et tableau (1). On se donne comme but dans cet exercice d’écrire
puissance 4 :
1
4
6
4
1
addition
puissance 5 :
1
5
10
10
5
1
Figure 1 – Calcul d’une ligne du triangle de Pascal à partir de la ligne précédente.
n
0
1
2
3
4
coefficients du développement de (a + b)n
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
Table 1 – Triangle de Pascal jusqu’à n = 4.
un programme qui calcule le triangle de Pascal en utilisant le moins de mémoire
et en faisant le moins de calculs possibles. Les versions 1 à 3 du programme,
demandées ci-dessous, progressent vers ce but.
1. Écrivez un programme, que vous appellerez pascal_1.f, qui demande une
valeur de n ≥ 0 à l’utilisateur et trouve les valeurs du triangle de Pascal
jusqu’à la puissance n. Le programme affichera seulement la dernière ligne
du triangle correspondant à la puissance n. Dans cette première version
du programme, utilisez comme seuls tableaux deux vecteurs de tailles n et
n + 1, pour stocker les valeurs de deux lignes successives du triangle. Ces
vecteurs seront donc remplis seulement partiellement pour les premières
lignes du triangle. Le programme ne doit faire que i − 1 additions pour
obtenir les coefficients de la puissance i (et non n additions, n’additionnez
pas des zéros).
2. Dans une deuxième version du programme, que vous appellerez pascal_2.f,
n’utilisez plus qu’un seul vecteur de taille n + 1. Modifiez ce vecteur en
passant d’une ligne du triangle à la suivante, en choisissant bien l’ordre de
calcul des coefficients sur la ligne.
5
3. Dans une troisième version du programme, que vous appellerez pascal_3.f,
divisez par deux le nombre de calculs. Sur chaque ligne du triangle, la première moitié de la ligne est symétrique de la seconde moitié. Ne calculez
donc les coefficients que pour une moitié du vecteur ligne et copiez-les dans
la seconde moitié du vecteur. Utilisez pour la copie une affectation de section de vecteur à section de vecteur. Cherchez une formulation du calcul
valable aussi bien pour une ligne correspondant à une puissance i impaire
que pour une puissance i paire (c’est-à-dire sans distinguer explicitement
ces deux cas).
4. Dans une quatrième version du programme, que vous appellerez pascal_4.f,
ajoutez un test pour vérifier que vous ne dépassez pas, lors du calcul
des coefficients, la valeur maximale d’un entier. Si n est trop grand, le
programme doit s’arrêter avec un message d’erreur. Trouvez la puissance
n maximale pour laquelle vous pouvez calculer les coefficients. Exécutez
votre programme avec cette valeur maximale de n.
6