linguaggio f sottoinsieme del fortran 90 - cnrpaolo/didattica/fi08/doc/pdf/f... · evoluzione...
TRANSCRIPT
Elementi di base del linguaggio Fortran
Paolo Bison
Fondamenti di InformaticaIngegneria MeccanicaUniversità di Padova
A.A. 2008/09
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.1
Linguaggio F
� sottoinsieme del Fortran 90
� solo costrutti “moderni” senza duplicazioni
� sintassi descritta da BNFa
ale produzioni relative al linguaggio F presenti in questi appunti sono tratte da
“BNF Syntax of the FT M Programming Language”,Copyright (C) 1996 by Imagine1,
Inc.
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.2
Evoluzione storica
1954 primo sviluppo presso IBM
1958 Fortran II con procedure, funzioni e common
1962 IBM introduce Fortran IV
1978 Fortran 77, standard ANSI ANSI X.39-1978, che introducecostrutti per la programmazione strutturata
1991 Fortran 90, standard ISO 1539:1991, che introduce ulteriorimiglioramenti (ricorsione, strutture dinamiche)
1993 Proposta di standardizzazione HPF (High PerformanceFortran) per il calcolo parallelo
1995 Fortran 95, standard ISO/IEC 1539-1:1997
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.3
Formato sorgente
� formato libero del Fortran 90
� insieme dei caratterialfanumerici (a ... z, A ... Z, 0 ... 9)( ) . = , $ % : < > ? _ " !
� una istruzione per linea (max 132 caratteri)
� commento! fino a fine linea
� Fortran90& concatenazione di linee; separazione di istruzioni
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.4
Simboli
� singoli/concatenazioni di caratteri non alfanumerici* ** / ==
� parole chiave (keywords)simboli costituiti da lettere (if, do, ...)riservate in F
� identificatoriR304 name
is letter [ alphanumeric-character ] ...
R302 alphanumeric-character
is letter
or digit
or underscore
R303 underscore
is _
Constraint:The maximum length of a name is 31 characters.
Constraint:The last character of a name shall not be _ .
Constraint:Names may be in mixed upper and lower case, however all
references to the names shall use the same case convention.Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.5
Programma
� unità di programmazione� sintassi
R201 program
is program-unit
[ program-unit ] ...
R202 program-unit
is main-program
or module
R1101 main-program
is program-stmt
[ use-stmt ] ...
[ intrinsic-stmt ] ...
[ other-type-declaration-stmt ] ...
[ execution-part ]
end-program-stmt
R1102 program-stmt
is PROGRAM program-name
R1103 end-program-stmt
is END PROGRAM program-name
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.6
programma minimo
program miniend program mini
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.7
Sezione esecutiva - 1
� istruzioni
� sintassi
R208 execution-part
is [ executable-construct ] ...
R215 executable-construct
is action-stmt
or case-construct
or do-construct
or if-construct
or where-construct
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.8
Sezione esecutiva - 2
� sintassiR216 action-stmt
is allocate-stmt
or assignment-stmt
or backspace-stmt
or call-stmt
or close-stmt
or cycle-stmt
or deallocate-stmt
or endfile-stmt
or exit-stmt
or inquire-stmt
or nullify-stmt
or open-stmt
or pointer-assignment-stmt
or print-stmt
or read-stmt
or return-stmt
or rewind-stmt
or stop-stmt
or write-stmtBasic Fortran, Paolo Bison, FI08, 2008-09-30 – p.9
Stop
� terminazione esplicita del programma
� sintassi
R840 stop-stmtis STOP
� program ministopend program mini
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.10
� visualizzazione del valore di espressioni
� sintassi
R911 print-stmt
is PRINT format [ , output-item-list ]
R913 format
is char-expr
or *
R915 output-item
is expr
R420 char-literal-constant
is " [ rep-char ] ... "
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.11
Espressioni - 1
� sintassiR723 expr
is [ expr defined-binary-op ] level-5-expr
...R713 level-4-expr
is [ level-3-expr rel-op ] level-3-expr
R714 rel-op
is ==
or /=
or <
or <=
or >
or >=
...
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.12
Espressioni - 2
� sintassi (cont.)R706 add-operand
is [ add-operand mult-op ] mult-operand
R707 level-2-expr
is [ [ level-2-expr ] add-op ] add-operand
R709 mult-op
is *
or /
R710 add-op
is +
or -...R703 level-1-expr
is [ defined-unary-op ] primary
R701 primary
is constant
or variable...or ( expr )
� costanti intereBasic Fortran, Paolo Bison, FI08, 2008-09-30 – p.13
Stampa numeri
!! printnum.f90! stampa dei numeri a terminale!program printnumprint *,3,8,0end program printnum
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.14
Stampa espressioni
!! printexp.f90! stampa il valore di una espressione!program printexpprint *,5 + 3 / 2end program printexp
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.15
Variabile
� individuata attraverso un identificatore
� associata univocamente ad un tipolinguaggio tipizzato
� esplicita dichiarazione del tipo associato alla variabileFortran 90 - implicit none
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.16
Tipo
� elemento del linguaggio che definisce:� un insieme di valori� un insieme di operatori applicabili a tali valori� notazione per le costanti
� usato per caratterizzare variabili e espressioni
� compatibilità/conversioni tra tipi
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.17
Dichiarazione di tipo
� sintassiR501 type-declaration-stmt
is type-spec [ , attr-spec ] ... :: entity-decl-list
R502 type-spec
is INTEGER [ kind-selector ]
or REAL [ kind-selector ]
or CHARACTER char-selector
or COMPLEX [ kind-selector ]
or LOGICAL [ kind-selector ]
or TYPE ( type-name )
R504 entity-decl
is object-name [ initialization ]
R505 initialization
is = initialization-expr
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.18
Integer
� sottoinsieme finito degli interi I
� operatori+ - * / **
� costantisequenza di cifre (es. 300 -234 )
� rappresentazione finitamin=-2147483648 max=2147483647
� es.integer :: a,b=45,dd+b*89
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.19
Istruzione di assegnazione
� sintassi
R735 assignment-stmtis variable = expr
� compatibilità di tipotipo espressione deve corrispondere al tipo associato allavariabile
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.20
assign
!! assign.f90! esempi di istruzioni di assegnazione!program assigninteger :: a,b,c=30a=c; b=a*56-c*7;c=a>b ! e’ corretta?print *,a,b,cend program assign
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.21
Lettura
� sintassi lettura
R909 read-stmtis READ ( io-control-spec-list )
[ input-item-list ]or READ format [ , input-item-list ]
� input-item-listlista di variabili separate da ,
� test sui valori letti
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.22
piu
!! piu.f90!! calcola la somma di due numeri!program piuinteger :: m,n,sread *,m,ns = m+nprint *,send program piu
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.23
Strutture di controllo
� struttura sequenzialeblock
� struttura di selezioneif
� struttura iterativado
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.24
block
� sequenza di istruzioni
� sintassi
R801 block
is [ executable-construct ] ...
� esempio
a=b+c
print *,a
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.25
if
� selezione/condizionale� sintassi
R802 if-construct
is if-then-stmt
block
[ else-if-stmt
block ] ...
[ else-stmt
block ]
end-if-stmt
R803 if-then-stmt
is IF ( logical-expr ) THEN
R804 else-if-stmt
is ELSEIF ( logical-expr ) THEN
R805 else-stmt
is ELSE
R806 end-if-stmt
is ENDIF
� corrisponde al if then elseBasic Fortran, Paolo Bison, FI08, 2008-09-30 – p.26
esempi if
� if (i>5) thenprint *,i
end if
� if (k==l) thenx = k*3
elsex = l*3
end if
� if a > 6 then ! ?a=a*a
end if
� if (i>5) then; print *,i; end if
� if (a==0) thenk = k+1
else if (b==0) thenk = 0
elsek = 1
end ifend if
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.27
piuabs
! piuabs.f90
!
! somma al primo numero il valore assoluto
! del secondo
program piuabs
integer :: m,n,s
read *,m,n
if (n>0) then
s = m+n
else
s = m-n
end if
print *,s
end program piuabsBasic Fortran, Paolo Bison, FI08, 2008-09-30 – p.28
do
� ciclo iterativo� sintassi
R817 do-construct
is do-stmt
block
end-do
R818 do-stmt
is [ do-name : ] DO [ loop-control ]
R821 loop-control
is int-variable = int-expr, int-expr [ , int-expr ]
R824 end-do
is ENDDO [ do-name ]
� int-variable non può essere modificata nel block
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.29
semantica do
� senza loop-control ciclo infinito
� con loop-controldo var = exp1, exp2, [exp3]
block
end do
if c’è la expr3 then
inc← expr3
else
inc← 1
cnt← MAX((exp2 - exp1 + inc)/inc,0)a
var← exp1
while cnt 6= 0
block
cnt← cnt -1
var← var+ inc
a cnt e 0 se exp1> exp2 e exp3>0 op-
pure exp1< exp2 e exp3<0
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.30
Esempi DO
� doprint *,3
end do
� do i=1,10print *,i
end do
� do k=20,10,-2print *,k
end do
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.31
moltiplicazione
! multi.f90
! calcolo di m x n come addizioni ripetute
!
program multi
integer :: m,n,ris
read *,m,n
if (m<0) then; stop; endif
if (n<0) then; stop; endif
ris=0
do i=1,n
ris=ris+m
end do
print *,ris
end program multiBasic Fortran, Paolo Bison, FI08, 2008-09-30 – p.32
Fattoriale
n! =
{
n(n−1)(n−2) · · ·2·1 n > 01 n = 0
Ciclo che moltiplica tutti i numeri tra n e 1
1×n× (n−1)× (n−2)×·· ·×2
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.33
Programma fattoriale
! fatt.f90! calcola fattoriale di n!program fattinteger :: i,n,rread *,nif (n<0) then; stop; endifr = 1do i = 2,n
r= r*iend doprint *,rend program fatt
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.34
Terminazione DO
• CYCLE- passa all’iterazione successiva- sintassi:
R834 cycle-stmtis CYCLE [ do-name ]
• EXIT- termina il ciclo DO- sintassi:
R835 exit-stmtis EXIT [ do-name ]
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.35
DO come while
� while P doS
doif (P
′) then
exitend ifS
end do
� P′è la negazione di P
se P=cnt > 0 P′=cnt <= 0
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.36
somma_n
! somma_n.f90
! somma i primi n numeri positivi
!
program somma_n
integer :: i,n,s
read *,n
if (n<1) then; stop; end if
s = 0 ; i=1
do
if (i>n) then; exit; end if
s = s + i
i = i + 1
end do
print *,s
end program somma_n Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.37
somma_npari
! somma_npari.f90
! somma i primi n numeri pari
!
program somma_npari
integer :: i,n,s
read *,n
if (n<1) then; stop; end if
s = 0; i=1
do
if (i>2*n) then; exit; end if
if ((i-(i/2)*2)==0) then
s = s + i
end if
i = i+1
end do
print *,s
end program somma_npari
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.38
somma_npari variante
! somma_npari_var.f90! somma i primi n numeri pari! variante con istr. cycleprogram somma_npariinteger :: i,n,sread *,nif (n<1) then; stop; end ifs = 0do i = 1,2*n
if ((i-(i/2)*2)!=0) then; cycle; end ifs = s + i
end doprint *,send program somma_npari
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.39
Massimo Comun Divisore - 1
Dati due numeri m,n > 0 trovare MCD
� metodo 1Sia m ≥ n, con ciclo da 2 a n si verifica quali sono i numeriche dividono esattamente sia m che n. Il MCD è il massimodi tali numeri.Nota: un numero è divisibile per un altro se il resto delladivisione è zero.
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.40
programma MCD 1
! calcola massimo comun divisore
! algoritmo 1 - max dei divisori comuni tra 0 e n
program mcd1
integer :: i,m,n,mcd,tmp
read *,n,m
if (m<1) then; stop; endif
if (n<1) then; stop; endif
if (m < n) then
tmp = m; m = n; n = tmp
end if
mcd = 1; i = 1
do
if (i>n) then; exit ;end if
if ((m-(m/i)*i)==0) then
if ((n-(n/i)*i)==0) then
if (i > mcd) then
mcd = i
end if; end if; end if
i= i+1
end do
print *,mcd
end program mcd1Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.41
Massimo Comun Divisore - 2
� metodo 2 - Metodo di EuclideDato m ≥ n, qualunque numero che divide sia m che ndivide anche il resto della divisione m/n
m = qn + rm - qn = r ≥ 0qmk - qqnk = rk(qm - qqn) = r
Si calcola il resto r di m/n. Se tale resto è zero n è il MCD,altrimenti n e r diventano m e n e si riapplica il passoprecedente.
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.42
programma MCD 2
! mcd2.f90
! calcola massimo comun divisore
! algoritmo 2 - metodo di Euclide
program mcd2
integer :: r,m,n,tmp
read *,n,m
if (m<1) then; stop; endif
if (n<1) then; stop; endif
if (m < n) then
tmp = m; m = n; n = tmp
end if
r = m-(m/n)*n
do
if (r == 0) then
exit
end if
m = n; n = r; r = m-(m/n)*n
end do
print *,n
end program mcd2
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.43
Massimo Comun Divisore - 3
� metodo 3 - Metodo di Euclide (senza divisione)Se m=n il MCD è m, altrimenti se m >n m diventa m-naltrimenti è n che diventa n - m, e si ricontrolla l’eventualeuguaglianza di m con n
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.44
programma MCD 3
! mcd3.f90
! calcola massimo comun divisore
! algoritmo 3 - metodo di Euclide (senza divisione)
program mcd3
integer :: m,n
read *,n,m
if (m<1) then; stop; endif
if (n<1) then; stop; endif
do
if (m == n) then; exit; end if
if (m > n) then
m = m - n
else
n = n - m
end if
end do
print *,m
end program mcd3
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.45
numero primo
! primo.f90
! dato n stampa T se e’ primo, F altrimenti
!
program primo
integer :: n,r,div
read *,n
if (n<1) then; stop; endif
div=n / 2
r = n-(n/div)*div
do
if (r == 0) then ; exit; end if
div=div-1
r = n-(n/div)*div
end do
print *,div==1
end program primo
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.46