Programmation FORTRAN
Transcription
Programmation FORTRAN
Entrées / Sorties Par défaut: Programmation FORTRAN – Saisie read (*,*) VARIABLE – Affichage write (*,*) expression [,expr…] write (*,*) ’message’ [,expr…] La 1ère * indique le périphérique par d éfaut – read : saisie au clavier – write : affichage à l’écran La 2ème * indique un format libre pour la saisie ou l’affichage des donn ées. Entrées / Sorties Échanges avec l’extérieur – Saisie read (*,format[,iostat=VAR1]) VAR2,… – Affichage write (*,format[,iostat=VAR1]) VAR2,… format : label où est défini le format des données à saisir ou à afficher. iostat (I/O status ) : variable indiquant le statut de l’opération d’entrée/sortie. Formatage Contenu de l’instruction format – Chaînes de caractères entre ’’ – Codes de format pour contrôler la présentation: nX n: entier >0 Crée n espaces après la position courante Positionnement relatif Tn n: entier >0 Place le curseur à la colonne n (tabulation) Positionnement absolu Formatage write(*,100) 100 format( … ) Le format est spécifié après un label: – étiquette numérique de 5 chiffres maximum – repère dans le programme Ce label est situé au début d’une autre ligne de programme. Formatage Code de format pour un entier Iw[.d] w (width) : nombre de caractères pour écrire les entiers, cadrés à droite d : sert à contrôler la possibilité de placer des 0 à gauche 1 Formatage Code de format pour un entier Iw[.d] Exemple: N=123 write(*,100) N 100 format(’ Résultat:’,I7) sortie: ‘Résultat:’ puis 4 espaces puis 123: Résultat: 123 Formatage Code de format pour un entier Iw[.d] Si le nombre ne peut être représenté avec le format donné: – Exemple : 1234 avec format(I3) Message d’erreur %FOR-E-OUTCONERR à l’exécution (Fortran : output conversion error) Erreur non fatale: la valeur ne peut être affichée, mais le programme continue son exécution. Formatage Code de format pour un entier Iw[.d] on doit écrire au minimum d chiffres, et au maximum w. Exemple: valeur 12 avec I6.3 sortie: 3 espaces puis 012 Par défaut: Iw óIw.1 le 0 n’est affiché que pour n=0 Iw.0 si n=0, la valeur n’est pas affichée. Formatage Code de format pour un r éel Fw[.d] w : taille d’affichage = nombre de chiffres entiers + 1 (pour le point) + nombre de décimales d : nombre de décimales Exemple: valeur 12.34 avec format(F7.3) – sortie : 1 espace puis 12.340 – 7 caractères ó 3 chiffres maximum avant la virgule (2 pour les nombres négatifs) et 3 décimales. – Ici, un nombre plus de 3 décimales est arrondi à 3 décimales. – Un nombre positif dont la partie entière contient plus de 3 chiffres ou un nombre négatif à plus de 2 chiffes ne peut être écrit: %FOR-E-OUTCONERR% Formatage Code de format pour un nombre à exposant Ew[.d] – w: taille d’affichage – d: nombre de décimales Le nombre est toujours affiché avec une mantisse inférieure à 1, donc 0,xxEyy Exemple: E8.2 (8 caractères au total) – espace après le E si l ’exposant est positif 0,25E 12 – Signe – si l ’exposant est négatif 0,25E-12 Formatage Chaînes de caractères A[w] – w: longueur facultative Valeurs entières en octal Ow[.d] Valeurs entières en hexadécimal Zw[.d] Le fonctionnement du format est le même pour les entiers en décimal, en octal et en hexadécimal. 2 Carriage control character Caractère servant à commander le comportement du retour chariot (retour à la ligne) lors de l’affichage d’une ligne. Le 1er caractère d’une ligne écran n’est jamais affiché, mais interprété comme un saut de ligne: Espace simple interligne 0 double interligne 1 saut de page + surimpression autre simple interligne Carriage control character Pour ne pas passer à la ligne suivante après l’affichage d’un message: write (*,300) 300 format (’Entrez N: ’,$) read (*,*) N La saisie de N se fait alors sur la même ligne que l’affichage du message précédent. Exemple Affichage des nombres de 1 à 99 et de leurs carrés: do I=1,99 write (*,100) I, I*I 100 format(I2,5X,I4) end do 2 caractères pour I, puis 5 espaces, puis 4 caractères pour I2. Exemple Affichage des nombres de 1 à 99 et de leurs carrés: 100 format(I2,5X,I4) Résultat: 1 1 1er caractère: carriage control character L’espace indique un simple interligne … 10 100 Problème de carriage control character ! … Le 1 indique un saut de page Solution : mettre un espace en début de format 100 format(X,I2,5X,I4) Exemple Affichage des nombres de 1 à 99 et de leurs carrés: 100 format(I2,5X,I4) Résultat: 1 1 2 4 … 10 100 … 99 9801 5 espaces Contrôle d’erreur Le contrôle d’erreur est particulièrement utile pour vérifier le format d’une saisie, et éviter l’interruption du programme en cas d’erreur. Le statut d’erreur est indiqué par une variable iostat, de type entier. 3 Contrôle d’erreur Sans contrôle d’erreur: integer*4 N … read (*,*) N – Si la saisie est correcte (ici, des chiffres seulement), N prend la valeur saisie. – En cas d’erreur (ici, des lettres ou autres caractères), le programme s ’arrête. Contrôle d’erreur et formatage Il est possible d’utiliser le formatage et le contrôle d’erreur ensemble: – Pour vérifier que les données saisies correspondent à une syntaxe donnée – Pour vérifier que les données peuvent être affichées avec le format demandé sans erreur Contrôle d’erreur Avec contrôle d’erreur: integer*4 N,IOS … read (*,*,iostat=IOS) N – Si la saisie est correcte (chiffres seulement), N prend la valeur saisie, et IOS=0. – En cas d’erreur de saisie, le programme peut continuer, mais N ne change pas de valeur, et IOS prend une valeur supérieure à 0. – En cas d’annulation de la saisie (avec la touche F10), N ne change pas de valeur, et IOS=-1. Tableaux (arrays) Un tableau est une variable contenant des valeurs multiples de même type. Le nombre de valeurs doit être connu à l’avance, dès la déclaration. integer*4 T(10) – Tableau de 10 entiers de 4 octets chacun Un tableau peut avoir plusieurs dimensions: integer*4 M(10,20) – Matrice à 2 dimensions : 10 lignes et 20 colonnes. – Un tableau peut avoir jusqu’à 7 dimensions. Tableaux Tableaux Chaque élément d’un tableau est référencé par un indice (numéro de l’élément dans le tableau). Par défaut: integer*4 T(10)contient 10 éléments numérotés de 1 à 10. On peut spécifier une autre numérotation: real*4 X(-5:4) La numérotation peut être différente pour chaque dimension real*4 Y(-3:2,-5:4) 1ère dimension de -3 à 2 2ème dimension de -5 à 4 10 éléments réels, numérotés de -5 à 4 4 Tableaux (arrays) Pour désigner un élément d’un tableau – Dans une expression, T(I) désigne l’élément d’indice I du tableau – L’indice (subscript) I est toujours un entier – S’il y a dépassement d’indice: %SYSTEM-F-SUBRNG : subscript out of range Erreur fatale: le programme s’arrête Tableaux Initialisation integer*4 T(3) /2,-1,1/ T contient 2 , -1 , 1 T(1)=2 T(2)=-1 T(3)=1 Par défaut, tous les éléments d’un tableau sont initialisés à 0. integer*4 T(3) T contient 0, 0 , 0 Si l’initialisation est incomplète, le tableau est complété par des 0. integer*4 T(3) /2,-1/ T contient 2 , -1 , 0 Tableaux Initialisation d’un tableau à 2 dimensions integer*4 T(3,2) /1,2,3,4,5,6/ Tableaux Mise à 0 de tous les éléments d’un tableau à deux dimensions: real*4 T(10,20) … do I=1,10 do J=1,20 T(I,J)=0 end do end do Tableaux Mise à 0 de tous les éléments d’un tableau à une dimension: real*4 T(10) … do I=1,10 T(I)=0 end do Produit de matrice integer*4 I,J,K real*4 A(10,10) real*4 B(10,10) real*4 C(10,10) On veut que la matrice C soit le produit des matrices A et B: n cij = ∑ aik .bk j k =1 5 Produit de matrice Paramètres de programme do I=1,10 do J=1,10 C(I,J)=0 do K=1,10 C(I,J)= C(I,J)+A(I,K)*B(K,J) end do end do end do Lors des déclarations, il est possible de définir des paramètres, qui sont des constantes utilisables dans tout le programme. integer*4 N parameter (N=10) La valeur de N ne peut plus être changée dans les autres instructions du programme. Paramètres de programme Paramètres de programme integer*4 N parameter (N=10) Ce type de paramètre est à utiliser pour des valeurs qui interviennent à plusieurs endroits du programme. – Exemple: taille d’un tableau integer*4 T(N) Produit de matrice En utilisant des paramètres: integer*4 M,N,P,I,J,K parameter(M=10) parameter(N=10) parameter(P=10) real*4 A(M,N) real*4 B(N,P) real*4 C(M,P) Avantage: si l’on a besoin de modifier la valeur du paramètre, une seule ligne est à modifier. Sans paramètre, il faudrait rechercher toutes les lignes où la taille apparaît «en dur» (sous forme de constante numérique): èRisque de ne pas modifier les bonnes lignes, ou d’en oublier. èCause de bugs du programme. Produit de matrice do I=1,M do J=1,P C(I,J)=0 do K=1,N C(I,J)= C(I,J)+A(I,K)*B(K,J) end do end do end do 6