Types de bases de Fortran 90 : Integer, Real, Double Precision et
Transcription
Types de bases de Fortran 90 : Integer, Real, Double Precision et
Types de bases de Fortran 90 : Integer, Real, Double Precision et Logical integer permet de représenter des nombres entiers Les limitations dépendent de la machine : -32 768 à 32 767 -2 147 483 648 à 2 147 483 647 ou constante entière : sous la forme décimal : -647 499 il est également possible de fournir des constantes écrites en base : 2 (binaire) B’101101’ 8(octale) O’56027’ 16(hexadécimale) Z’7A8BF’ Le type real : permet de représenter des nombres réels. Domaine couvert et précision De 10-78 à 1075 avec une précision relative de l’ordre de 10-6. Notation de constantes de type réel - Décimale Exponentielle 24.789 4.25 e-6 -.98 623.2 E11 Le type double precision : plus grande précision (précision relative de l’ordre de 10-15) Les constantes du type double précision doivent s’écrire sous forme exponentielle en utilisant la lettre D (ou d) à la place de la lettre E (ou e) : 1.2d-6 Le type logical : Deux valeurs possible :vrai et faux program valeur_logique integer :: n,p logical :: range print *, ‘donnez deux nombres entiers’ read *, n, p range= n<p print *, ‘valeur = ‘, range end donnez deux nombres entiers 27 valeur = T range = .true. donnez deux nombres entiers 22 7 valeur = F range = .false. CONVERSIONS IMPLICITES Opérateurs sur deux opérandes de types différentes : dans ce cas le compilateur met en place de conversion de l’un des opérandes dans le type de l’autre. Hiérarchie : integer -> real -> double precision integer :: real :: double precision :: n1, n2 x1, x2 z n1+x1 (n1 est convertie en real, avant d’être ajoutée à x1. Le résultat est de type real). x1/x2+z (le quotient x1/x2 est d’abord évalué en real. Le résultat est convertie en double precision pour être ajouté à la valeur de z. Le résultat est de type double precision) CONSTANTE SYMBOLIQUE Symbole auquel on attribue une valeur qui ne pourra pas être modifiée par le programme. Pour cela on ajoute l’attribut parameter dans une déclaration de type. integer, parameter :: iter=5 En Fortran 77 : parameter (iter=5) integer iter Le type complexe Une variable de type complexe est représentée en mémoire sous la forme de deux nombres de type real, avec les limitations inhérentes à ce type. Constantes de type complexe : s’écrivent sous la forme de deux nombres (entiers ou réels en notation décimale ou exponentielle) séparées par une virgule et placés entre parenthèses. (2.3e2 , -45.) (0 , 1) correspond à 230 – 45 i correspond à i Les opérations mixtes Dans ce cas il y a conversion d’un des deux opérandes de type entier ou réel en complexe (…partie imaginaire nulle). Les fonctions usuelles relatives aux complexes CMPLX x=4; y=2 z= cmplx(x,y) REAL real(z) AIMAG aimag(z) CNJG donne le complexe conjugué du complexe fournit en argument. Les instructions de contrôle (choix, boucles : répétitions) Instruction simple conditionnée if (expression à valeur logique) instruction simple l’instructions est exécutée si et seulement si l’évaluation de l’expression donne la valeur « vrai » if ( nbre > max) max=nbre Séquence conditionnée : if (…) then / end if if ( expression à valeur logique) then séquence d’instructions exécutables endif L’alternative : if (…) then/else/endif if (condition) then séquence 1 else séquence 2 endif exemple: contrôle des dimensions d’un paquet-poste: Un paquet est accepté si ses trois dimensions (Longueur, largeur, hauteur) vérifient les conditions suivants : - un rectangle de 10cmx7cm doit pouvoir s’inscrire dans une face au moins ; - L+l+h ≤ 100 cm - plus grande dimension (L) ≤ 60 cm program paquet_poste integer, parameter :: maxlong=60, & minlong=10, & minlarg = 7, & maxsom = 100 integer :: long, larg, haut print *, ‘ donner les dimensions ( & &longueur, largeur, hauteur) ‘ read *, long, larg, haut if (long <= maxlong .and. long >= minlong.and. larg >= minlarg .and. long+larg+haut <= maxsom) then print *, ‘paquet accepté” else print *, ‘paquet refusé’ end if end program & & & Choix multiple: If…then/elseif/…endif if (explog1) then séq1 ! explog1 est vraie else if (explog2) then séq2 !explog1 est fausse et explog2 est vraie else if (explog3) then séq3 !explog1 et explog2 sont fausses et explog3 est vraie else séq4 ! explog1, explog2 et explog3 sont fausses end if cherchons pour une suite numérique les extrema (max et min) if (nbre > max) then max = nbre elseif (nbre < min) then min = nbre end if (si la séquence n+1 est vide, le ELSE final disparaît. Les alternatives imbriquées if (explog1) then séquence1 ! exécutée si explog1 est vraie if (explog2) then séq2 ! exécutée si explog1 et explog2 sont vraies else séq3 ! exécutée si explog1 est vraie et explog2 est fausse end if else séq4 !exécutée si explog1 est fausse end if La Boucle avec compteur do i=a,b séquence end do répéter le bloc en donnant successivement à i les valeurs a, a+1, a+2, …b Il est possible de préciser un « incrément » différent de 1 : do i = a , b , 3 print * , i, i*i, sqrt(real(i)) end do syntaxe: [nom : ] do var = debut, fin, [, pas] bloc end do [nom] var: variable de type integer debut, fin et pas : expressions de type integer si le pas est omis, il est pris égal à 1. La Boucle « tant que » : do while - répétition conditionnelle syntaxe : [nom : ] do while (exp_logique) bloc end do [nom] exp_logique doit être définie avant de commencer la boucle. (« danger »: boucle infinie …) program exemple_do_while implicit none integer :: n, somme somme=0 do while (somme < 100) print *, ‘donnez un nombre entier’ read *, n somme = somme + n end do print *, ‘somme obtenue : ‘, somme end la boucle étiquetée do 10 i = 1, 10 bloc 10 continue Les instructions exit et cycle L’instruction EXIT permet de quitter une boucle : CYCLE, elle, permet de court-circuiter la fin d’une itération particulière (pour passer à la suivante) sans quitter la boucle. somtot : do i = 1, 1000 somme = … if (somme >= sommax) exit … sompart : do k = 1, kmax … if (valeur > valseuil) exit if (valeur > valmax) exit somtot … enddo sompart … enddo somtot do j=0, jmax if (x(j) <= 0.) cycle xlo(j)=log (x(j)) … end do L’instruction select case select case (exp) case (s1) séquence1 case (s2) séquence2 … case (sn) séquence_n case default séquence n+1 end select (le choix complémentaire DEFAULT peut être omis si la séquence (n+1) est vide. Exp : expression scalaire de type integer, logical ou character select case (mois) case (1,3,5,7,8,10,12) nbjours=31 case (4,6,9,11) nbjours=30 case(2) if (mod(ianne,4) = = 0) then nbjours=29 else nbjours=28 end if case default print *, ‘erreur’ end select print *, ‘nombre de jours du mois ‘, mois, ‘ = ‘, nbjours select case (reponse) case (‘oui’) …. case (‘non’) … case (default) … end select Les instructions go to et stop go to etiquette Pour terminer l’exécution d’un programme : end if (….) go to 2000 … 2000 end il existe aussi l’instruction stop if (…) stop ou bien if (…) then print *, ‘erreur dans …’ stop end if