Vous êtes sur la page 1sur 10

FORTRAN se caractrise par la ncessit de compiler les scripts, c'est dire transformer du texte en binaire.(transforme un fichier de texte en .f !

! en un executable (non lisible par un diteur" en .exe." A#ant de commencer, tout ce $ui est crit en bleu dsi%ne du #rai lan%a%e FORTRAN, ce $ui est en italique dsi%ne un truc %nral et une li%ne dbutant par && dsi%ne du '()**.

+. 'tructure d'un pro%ramme FORTRAN !


,'abord, ou#rir un diteur sous *-N./. ex. nedit ou %edit. && nedit 0 (*e 0 permet d'ou#rir l'diteur tout en laissant le terminal utilisable pour d'autres commandes" .n script FORTRAN se dcompose en1 pro%ram nom du programme Dclaration des variables instructions ventuellement des comentaires, prcds d'un 2 end pro%ram nom du programme O3, FORTRAN est un peu neuneu, alors il faut lui dire clairement au dbut du pro%ramme le nom et le t4pe des #ariables $ue l'on #a utiliser. A#ant de dclarer les #ariables, entrer implicit none, sinon FORTRAN attribuera automati$uement un entier aux #ariables nommes n, i, 5, 6... 7uis dclarer. 7ar exemple, pour dclarer l'entier a, le caract8re b, les rels a, toto et titi, entrer respecti#ement1 inte%er11a character11b real11a,toto,titi 9iennent ensuite les instructions1 a:+; toto:<.+ titi:a=toto )t toutes les oprations classi$ues1 = > ? @ : et ?? $ui si%nifie puissance. Aommande d'criture 7our B imprimer un truc l'cran C, utiliser la commande print1 print?, titi )t la #aleur de la #ariable titi (+<.+" s'affichera l'cran. Dais si l'on #eut crire bon5our, print?, bon5our ne donnera rien, car bon5our n'est pas une #ariable dclare... 7our afficher le mot bon5our, il faut taper1 print?, 'bon5our' (' ou B " Aommande de lecture 7our $ue le pro%ramme B lise C une #aleur ou des caract8res a#ant de les utiliser, emplo4er la commande read1 7our demander l'utilisateur d'entrer une #aleur pour a, et l'int%rer au pro%ramme, il suffit de1 print?, B entrer la #aleur de a C read?,a

7our compiler son pro%ramme (test.f !, par exemple", lancer dans le terminal *-N./1 && %fortran >o test.exe test.f ! Aeci cre un fichier excutable1 test.exe. 7our le lancer, taper && .@test.exe

<. Tests, -nstructions conditionnelles et Eoucles


*es instructions conditionnelles (if, then, else, en %ros." if (test 1" then instructions else if (test 2" then instructions else instructions end if *es tests... On dmarre a#ec les B oprateurs relationnels C & H &: H: :: @: ou .FT. .*T. .F). .*). .)I. .N). en FORTRAN GG

(%al" (non %al"

.n petit exemple pour la route1 un pro%ramme $ui donne le maximum entre deux rels1 pro%ram max implicit none real11a,b print?,'donner les < #aleurs' read?,a,b if (aHb" then print?,b else print?,a end if end pro%ram max

-dem a#ec les B oprateurs lo%i$ues C Aar il existe aussi des #ariables lo%i$ues, $ui prennent les #aleurs .TR.). et .FA*'). On peut mJme les dclarer...

inte%er11a,toto *OF-AA*11test+ test+:aH+ print?,test+ Aeci affichera T (true" si a est effecti#ement infrieur +, et F (false", sinon. On peut alors continuer en se contentant d'crire1 if (test+" toto:K else toto:>< endif )t les oprateurs lo%i$ues L ex. si on doit crire B si le test + et #rai et si le test < est #rai aussi, alors... C On doit dfinir1 .AN,. .OR. .NOT. .n p'tit exemple1 if ((test+" .AN,. (bH:!.M"" then ... )t pour s'#iter pas mal de boucles if, on se simplifie la #ie a#ec select case select case (variable" case (liste de valeurs qu'elle peut prendre" instructions case (une autre liste de valeurs possibles" instructions case default instructions end select (et" (ou inclusif" (et non"

.n petit exemple de pro%ramme1 mone4.f !, $ui con#ertit les euros en dollars ou en francs, et in#ersement, dans tous les sens souhaits1

2con#ertisseur euros>franc>dollars (cours au <N@<@;N" pro%ram mone4 implicit none character11de#+ character11de#< real11s print?,'entrer la somme, sa de#ise et la de#ise souhaite (f,e,O"' read?,s,de#+,de#< if (de#+::'O'" then if (de#<::'e'" then print?,s@+.!; elseif (de#<::'f'" then print?,(s@+.!;"?M.!! !G endif elseif (de#+::'e'" then if (de#<::'f'" then print?,s?M.!! !G elseif (de#<::'O'" then print?,s?+.!; endif elseif (de#+::'f'" then if (de#<::'e'" then print?,s@M.!! !G elseif (de#<::'O'" then print?,(s@M.!! !G"?+,!; endif endif end pro%ram mone4 *es boucles. -l 4 en a deux t4pes1 les boucles do, lors$ue l'on connait l'a#ance le nombre d'itrations effectuer, et les boucles Phile, lors$u'on #eut foncer, l'arrache. 7ar exemple, calculons la somme de +@iQ, pour i allant de + +;;1 real11sum inte%er11i sum:; do i:+,+;;,+ sum:sum=+@(i?i" enddo Autre exemple, cherchons partir de $uel n la somme prcdente de + n de#ient suprieure +.!1 sum:; i:; do Phile (sumH+.!" i:i=+ sum:sum=+@(i?i" enddo

*e (i>+" final nous donnera acc8s n... ATT)NT-ON, si on laisse tourner des boucles l'infini... (ex un Phile a#ec un test tou5ours #rai..." 7our casser la boucle, taper && Atrl A

R. )ntres et 'orties
Sus$u'ici, on a print et read des donnes $ue l'utilisateur doit fournir lui mJme, en direct, la main. Dais il est sou#ent prati$ue de lire des #aleurs en entre dans un fichier, et aussi d'crire les rsultats en sortie dans un fichier... ,ans les deux cas, il 4 a R tapes1 Ou#rir le fichier (open" *e fichier doit Jtre plac dans le mJme rpertoire $ue le script. -l faut lui assi%ner un numro, et prciser si c'est un fichier en binaire (unformatted" ou texte (formatted". 7our ou#rir le fichier texte toto.txt, entrer1 open(unit:+,file: B toto C,form: B formatted C,action: B read C,iostat:ios" Trifouiller le fichier (read ou Prite" 7our lire le fichier, il faut d'abord le dcrire. Aontient>il des entiers, des rels ou des caract8res (respecti#ement -, F et A" L Aombien de caract8res faut>il lire pour cha$ue t4pe L )xemple1 pour lire un fichier en colonnes listant des donnes sismi$ues (stations.txt, a#ec station, latitude, lon%itude et altitude de la station"1 N <N.;;+M; NK.M<R!; + G 'i l'on #eut lire la colonne de latitude (nombre rel", on #eut identifier N caract8res, dont ! apr8s la #ir%ule. -l faut alors crire FN.! )t pour tout lire1 character11sta real11lat,lon inte%er11alt open(unit:+,file: B stations.txt C,form: B formatted C,action: B read C" read(unit:+,fmt:'(A,FN.!,FN.!,-!"'" sta, lat, lon, alt FORTRAN lira le fichier de faTon s$uentielle, li%ne par li%ne.

7our crire des donnes dans un fichier, le principe est le mJme, il faut prciser le format dans le$uel on #a crire les #ariables1 Prite(unit:+,fmt:'( "'" variables

)xemple1 si i:+< et 5:+<RK1 inte%er11i,5 open(... Prite(unit:+,fmt:'(-!,-N"'" i, 5 #a crire1 >>>+<>>>>+<RK 7ar ailleurs, Prite(unit:+,fmt:'(B i: C,-!, B 5: C,-N"'" i, 5 #a crire1 i:>>>+<5:>>>>+<RK, ce $ui peut clarifier les choses... )nfin, surtout, ne pas oublier de fermer le fichier a#ec close 1 close(unit:+"

K. Notions sur les tableaux, AhaUnes de Aaract8res


.n tableau est une #ariable pou#ant stoc6er plusieurs #aleurs de mme type (entier, rel, caract8re...". 7ar exemple, si l'on dclare le tableau sui#ant comme un tableau d'entiers1 K >< M + ! N MNM +.G G -l 4 aura un bu% cause de la derni8re #aleur, relle. FORTRAN manipule des tableaux 5us$u' G dimensions (une matrice tant un tableau deux dimensions". Aomment les dclarer proprement L type ,dimension(expression1,expression2,...,expression n"11 nom du tableau ,clarons par exemple le tableau sui#ant, nomm titi (+/M", de trois faTons diffrentes, pour le fun1 K >+ < M R + inte%er, dimension(M"11titi inte%er, dimension(+1M"11titi inte%er, dimension(>+1K"11titi inte%er, dimension(;1!"11titi 7ar dfaut, le premier indice est +, mais on peut lui attribuer ;. 'i le tableau fait plus d'une dimension, on spare les dimensions par des #ir%ules1 real, dimension(K,M"11toto pour dclarer1 M!. MK. N R!. N R<.RK !K.! R!.; +R.K KR.M K!.! !.! !K!.R RK.! KR.R! <R.< KR.M !R.< K<.<K GN. RK.! R<K.RK <+<.R R<R.R KK.K <;.;N

.n peu de #ocabulaire1 *e rang d'un tableau : nombre de dimensions (ex. : < pour toto, :+ pour titi" *e profil d'un tableau : #ecteur a#ec le nombre d'lments dans cha$ue dimension (ex. VK,MW pour toto" *a taille d'un tableau : produit des lments du profil (ex. <K pour toto" ,eux tableaux sont conformants $uand ils ont le mJme profil. 7our tra#ailler sur des morTeaux de tableaux, partir de1 inte%er, dimension(K,M"11toto toto(<,R" ren#oie !.! toto(1,1" ren#oie toto en entier toto(+1R,<" ren#oie la portion1 !K.! R!.; +R.K On peut aussi extraire des donnes du tableau a#ec un pas choisi. 7ar exemple, pour isoler les lments de la +ere li%ne de deux en deux, entrer1 toto(+,<1M1<" ce $ui sortira 1 !K.! KR.R! <+<.R

)t pour effectuer des oprations sur les tableaux L FORTRAN effectue toutes les oprations membre membre (et non des produits matriciels, directement, par exemple". Remplir les tableaux (affectation, a#ec :"1 7our attribuer la #aleur + la case (<eme li%ne, Reme colonne"1 toto(<,R":+ Remar$ue... toto:+ est autoris, bien $ue toto et + ne soient pas conformants. Aette commande remplit toto de B + C, dans toutes les cases. Oprations di#erses... Tout est permis, mais terme terme1 = > @ ? sin cos ... )t les chaUnes de caract8res... Rappel1 pour dclarer un caract8re, il suffit d'entrer1 character11ch Dais pour une chaUne de caract8res1 character(*)N: longueur de la chane"11 nom de la chane

7ar exemple1 character(*)N:9"11 ch dclare ch comme un tableau de caract8res + li%ne et

colonnes.

Dais, %rande diffrence a#ec les tableaux, si on attribue ch: B bon5our C *a commande #a fonctionner, mJme si B bon5our C n'a $ue G lettres1 E O N S O . R ,es espaces seront automati$uement attribus aux cases non remplies. A part Ta, on peut raliser les mJmes oprations $ue sur les tableaux, par exemple transformer B bon5our C en B bonsoir C, en attibuant1 ch(K1G": B soir C Remar$ue chiante1 pour dsi%ner le i>8me caract8re d'une chaUne de caract8res, ch(i" ne marche pas. -l faut entrer ch(i1i" ...

!. *es 7rocdures
Aomment faire appel de nombreux petits pro%rammes secondaires au sein d'un pro%ramme principal L *e pro%ramme principal doit faire appel aux procdures a#ec des arguments (#ariables". On distin%ue deux t4pes de procdures1 .ne 'ubroutine1

A'est une procdure dite B non t4pe C, c'est dire $ui ne se dclare pas @ dont on ne dclare pas le t4pe. 7our l'appeler, emplo4er la fonction call... call nom de la subroutine (arguments" )xemple... crire un pro%ramme $ui demande d'crire des #aleurs dans un tableau et en affiche le maximum et la mo4enne au fur et mesure.

pro%ram meanmax implicit none real,dimension(+;;"11tab real11mo4,max inte%er11i do i:+,+;; print?, B entrer la nou#elle #aleur C read?,tab(i" call mm(tab,i,+;;,mo4,max" 2 la subroutine mm permet de calculer max et mo4 print?,max, mo4 enddo end pro%ram meanmax *a subroutine mm s'crit alors (pas de pro%ram ni de end pro%ram" subroutine mm(t,ind,n,mo4,max" 2 les noms des ar%uments de la subroutine 2 peu#ent Jtre diffrents de ceux du pro%ramme principal inte%er11ind,n,i real11mo4,max real,dimension(n"11t 2 dans une subroutine la dimension d'un tableau peut Jtre une #ariable mo4:; max:t(+" do i:+,ind if (t(i"&max" then max:t(i" end if mo4:mo4=t(i" end do mo4:mo4@ind end subroutine .ne fonction1 A'est une procdure type, donc dclarer. 7ar exemple, la fonction #aleur absolue (#:abs(>RM"". )lle est t4pe real, puis$u'elle admet en entre un rel pour ressortir un rel. -nutile d'appeler + fonction a#ec call, 5uste1 nom de la fonction ( arguments " 7ar exemple, reprenons le pro%ramme meanmax.f ! a#ec des fonctions1 *a dclaration est la mJme mais il faut en plus dclarer la fonction que l'on va utiliser. On #a crer une fonction pour donner le max d'un tableau (fmax" et une autre pour la mo4enne (fmean". dem que prcdent, dclaration!!! real11fmax,fmean do ... read ... max:fmax(t,i,+;;" mo4:fmean(t,i,+;;"

)cri#ons prsent fmax. ATT)NT-ON 2 Aonnerie du FORTRAN (..." il faut dclarer la fonction au sein mme du script de la fonction ! function fmax(t,ind,n" inte%er11ind,n real,dimension(+;;"11t real11fmax fmax:t(+" do i:+,ind if (t(i"&fmax" then fmax:t(i" end do end function )t enfin fmean. function fmean(t,ind,n" inte%er11ind,n real,dimension(+;;"11t real11fmean fmean:; do i:+,ind fmean:fmean=t(i" end do fmean:fmean@ind end function )t enfin pour conclure, comment compiler tout ce bordel de pro%rammes principaux, subroutines et autres fonctions L -l faut procder en < tapes1 *a compilation proprement dite, puis l'dition de liens (loader" entre les diffrents pro%rammes. +@ *a compilation indi$uera les #entuelles erreurs, traduira le texte en lan%a%e machine, et #a crer des ob5ets en B .o C dits B modules C. *a commande correspondante est && %fortran >c tous les programmes !f9" # compiler <@ *'dition de liens #a relier les fichiers entre eux et fabri$uer un executable (en B .exe C". 7our cela, taper1 && %fortran >o nom souhait pour l'executable .exe tous les modules crs prcdemment .o )xemple pour le pro%ramme meanmax.f ! a#ec les fonctions fmean.f ! et fmax.f ! 1 && %fortran >c meanmax.f ! fmax.f ! fmean.f ! && %fortran >o meanmax.exe meanmax.o fmax.o fmean.o