TP6 : Entrées/Sorties Vous devez à la fin de la séance savoir compiler à la main et utiliser un makefile pour compiler. Vous trouverez un exemple de makefile à l adresse suivante : http://www.math.ubordeaux1.fr/ dobj/f90/makefile 1 Ecran et clavier Exercice 1 : Le but de cet exercice est d écrire un programme qui affiche de différentes manières les valeurs d une matrice carrée 2 2. 1. Dans un fichier libre.f90, créer une subroutine permettant d afficher à l écran une matrice carrée 2 2 en format libre. 2. Dans un fichier flot.f90, créer une subroutine permettant d afficher à l écran une matrice carrée 2 2 avec des nombres flottants comportant 2 chiffres après la virgule et 4 chiffres en tout, 3. Dans un fichier sci.f90, créer une subroutine permettant d afficher à l écran une matrice carrée 2 2, en notation scientifique avec 3 chiffres après la virgure. 4. Dans un fichier prog.f90, créer un programme qui appelle les 3 subroutines précédentes et testez-le avec les matrices ci-dessous ( ) ( ) ( ) 3.444 2.34 378.444 29.34 3 2,,. 10.555 89.9 100.555 89122.9 100000 1 Exercice 2 : Ecrivez un programme qui affiche à l écran le vecteur suivant : ( 1 20 300 40000 50000 60 7 8 9 10 ) Pour cela, vous définirez et utiliserez un format qui affiche 10 fois un entier composé de 5 chiffres suivis de 2 espaces. 2 Fichiers Exercice 3 : Cet exercice fait suite à l exercice 3 du TP5. 1. Dans un fichier lagrange.f90, écrivez une subroutine qui prend comme arguments d entrée un entier n, un vecteur de réel y et comme argument de sortie un vecteur de réel poly de même taille que y. Calculez pour tout i le polynome d interpolation de Lagrange à n points 1
en x = y(i) de la fonction f(x) = 1 et stockez pour chaque i la valeur de ce polynôme 1 + x2 dans le vecteur poly. 2. Dans un fichier prog.f90, définissez un vecteur y de taille 51 et initialisez-le avec des valeurs équiréparties entre [ 1, 1]. Déclarez un vecteur pol de même taille. Appelez la subroutine lagrange avec comme argument (4,y,pol) puis affichez à l écran pour tout k : y(k) pol(k). NB : la subroutine lagrange est une subroutine externe, n oubliez pas de définir une interface dans votre programme. 3. Compilez votre programme en nommant l exécutable exo3 4. Exécutez votre programme en tapant./exo3 > data4. Vérifiez grâce à gnuplot que vous obtenez le bon résultat. 5. Dans un fichier ecriture.f90, écrivez une subroutine writepoly qui prend comme arguments d entrée un vecteur x, un vecteur f et une chaine de caractère filename. Dans cette subroutine, ouvrez un fichier dont le nom est contenu dans filename et qui n existe pas. Ecrivez dedans pour chaque i : x(i) f(i). NB : pour déclarer comme argument d entrée une chaine de caractère de taille quelconque : character(len=*),intent(in)::filename 6. Appelez la subroutine write dans votre programme en donnant comme nom de fichier poly4. Compilez, exécutez et vérifiez en traçant le contenu du fichier poly4 avec gnuplot que votre résultat est juste. 7. Exécutez une seconde fois votre programme. Que constatez-vous? Proposez une modification de votre programme pour palier ce problème. 8. On veut maintenant pouvoir lire les valeurs du vecteur y dans un fichier non formatté (i.e. binaire). Ces fichiers ont été écrit par le programme fortran ci-dessous. Copiez ce programme dans un fichier, compilez-le et exécutez-le afin de créer les fichiers 10points contenant 10 points et 101points contenant 101 points. Essayez d ouvrir les fichiers 10points et 101points avec emacs, que constatez-vous? program bin implicit none character(len=20)::filename real,dimension(:),allocatable::y real::inter integer::n,j,i print*, donner un nom de fichier read*,filename print*, donner le nombre de point 2
read*,n allocate(y(n)) inter = n-1 y=(/(-1.+2.*j/inter,j=0,(n-1))/) open(file=filename,unit=10,status= unknown,form= unformatted ) write(10) size(y) do i=1,size(y) write(10) y(i) end do close(10) deallocate(y) end program bin 9. Dans le fichier prog.f90, lisez un nom de fichier au clavier puis initialisez un vecteur de points à l aide de ce fichier. Appelez ensuite les subroutine lagrange et writepoly avec ce vecteur. Exécutez votre programme avec les fichiers 10points. Vérifiez à l aide de gnuplot que votre résultat est correct. Faites de même avec le fichier 101points. NB : Pour pouvoir comparer tous vos résultats, vous pouvez modifier votre programme pour demander à l utilisateur le nom du fichier dans lequel sera écrit le polynome d interpolation. Exercice 4 : Définissez un format qui permette 4 fois l affichage d une chaine de caractère de 40 caractères suivie d un retour à la ligne. Utilisez ce format pour afficher à l écran le texte suivant 1 : Sables Il n est pas de desert si vaste Que ne puisse traverser Celui que porte la musique des etoiles 3 Modules Exercice 5 : OBLIGATOIRE Cet exercice fait suite à l exercice 5 du TP4. On représente toujours le polynôme P (x) = n i=0 a ix i par un type dérivé polynome composé : d un entier degre qui représente le degré du polynôme d un tableau de réels coefficients à une dimension contenant 101 cases numérotées de 0 à 100, représentant les coefficients du polynôme (on suppose que le degré du polynôme est au maximum 100). 1 Ce poème a été écrit par M. LE SAINT qui a remporté un prix lors du 5e concours de poésie RATP. 3
Exemple : Pour P, l entier degre vaut n et le tableau coefficients est (\a 0, a 1,..., a n, 0,..., 0\) Dans un fichier modpoly.f90, créer un module contenant : 1. le type dérivé polynome. 2. la fonction initialize pol 3. la subroutine print pol 4. la subroutine cree monome 5. la fonction copie pol 6. la fonction add pol 7. la subroutine mult pol 8. la fonction derivpol Dans un fichier poly.f90, faites appel à ce module et tester que tout marche correctement. 1. Ecrivez sur papier l algorithme effectuant la division euclidienne de deux polynômes 2. En se servant des sous-programmes écrits dans les questions précédentes, toujours dans le module modpoly, écrire une subroutine divisioneucl qui effectue la division euclidienne de 2 polynômes. Cette subroutine prend comme paramètres : deux polynômes, le reste de la division, le quotient de la division. 4 Encore des exercices sur les fichiers et les formats Exercice 6 : Le but de cet exercice est de se familiariser avec des programmes qui lisent et écrivent des fichiers. 1. Voici un premier programme : http://www.math.u-bordeaux1.fr/ dobj/f90/exformatte.f90 Télécharger-le ainsi que le fichier : http://www.math.u-bordeaux1.fr/ dobj/f90/bat.amdba Dans ce programme, on veut lire un fichier dont le nom est donné par l utilisateur et écrire dans un fichier nommé toto. Lisez le programme, compilez-le (en corrigeant bien sur les différentes erreurs qui apparaissent) et faites le tourner deux fois. Tout se passe-t-il bien? Pourquoi? 4
2. Télécharger le programme suivant : http://www.math.u-bordeaux1.fr/ dobj/f90/exerreur.f90 ainsi que les fichiers : http://www.math.u-bordeaux1.fr/ dobj/f90/ficherr http://www.math.u-bordeaux1.fr/ dobj/f90/bat.amdba Dans ce programme, on veut gérer correctement les erreurs. Assurez-vous que vous comprenez tout ce qu il y a écrit dans le programme, compilez et executez-le avec les fichiers télécharger. Que se passe-t-il? Pourquoi? 5