Elementi di base del linguaggio Fortran

Transcript

Elementi di base del linguaggio Fortran
Elementi di base del linguaggio Fortran
Paolo Bison
Fondamenti di Informatica
Ingegneria Meccanica
Università 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
a le
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 introduce
costrutti per la programmazione strutturata
1991 Fortran 90, standard ISO 1539:1991, che introduce ulteriori
miglioramenti (ricorsione, strutture dinamiche)
1993 Proposta di standardizzazione HPF (High Performance
Fortran) 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 caratteri
alfanumerici (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
identificatori
R304
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
is
R202
is
or
R1101
is
R1102
is
R1103
is
program
program-unit
[ program-unit ] ...
program-unit
main-program
module
main-program
program-stmt
[ use-stmt ] ...
[ intrinsic-stmt ] ...
[ other-type-declaration-stmt ] ...
[ execution-part ]
end-program-stmt
program-stmt
PROGRAM program-name
end-program-stmt
END PROGRAM program-name
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.6
programma minimo
program mini
end program mini
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.7
Sezione esecutiva - 1
istruzioni
sintassi
R208
is
R215
is
or
or
or
or
execution-part
[ executable-construct ] ...
executable-construct
action-stmt
case-construct
do-construct
if-construct
where-construct
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.8
Sezione esecutiva - 2
sintassi
R216
is
or
or
or
or
or
or
or
or
or
or
or
or
or
or
or
or
or
or
action-stmt
allocate-stmt
assignment-stmt
backspace-stmt
call-stmt
close-stmt
cycle-stmt
deallocate-stmt
endfile-stmt
exit-stmt
inquire-stmt
nullify-stmt
open-stmt
pointer-assignment-stmt
print-stmt
read-stmt
return-stmt
rewind-stmt
stop-stmt
write-stmt
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.9
Stop
terminazione esplicita del programma
sintassi
R840
stop-stmt
is
STOP
program mini
stop
end program mini
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.10
Print
visualizzazione del valore di espressioni
sintassi
R911
is
R913
is
or
R915
is
R420
is
print-stmt
PRINT format [ , output-item-list ]
format
char-expr
*
output-item
expr
char-literal-constant
" [ rep-char ] ... "
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.11
Espressioni - 1
sintassi
R723 expr
is [ expr defined-binary-op ] level-5-expr
..
.
R713
R714
level-4-expr
is [ level-3-expr rel-op ] level-3-expr
rel-op
is
==
or
/=
or
<
or
<=
or
>
or
>=
..
.
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.12
Espressioni - 2
sintassi (cont.)
R706
R707
R709
R710
..
.R703
R701
add-operand
is [ add-operand mult-op ] mult-operand
level-2-expr
is [ [ level-2-expr ] add-op ] add-operand
mult-op
is
*
or
/
add-op
is
+
or
level-1-expr
is [ defined-unary-op ] primary
primary
is constant
or variable
.
.
.
or
( expr )
costanti intere
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.13
Stampa numeri
!
! printnum.f90
! stampa dei numeri a terminale
!
program printnum
print *,3,8,0
end program printnum
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.14
Stampa espressioni
!
! printexp.f90
! stampa il valore di una espressione
!
program printexp
print *,5 + 3 / 2
end program printexp
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.15
Variabile
individuata attraverso un identificatore
associata univocamente ad un tipo
linguaggio tipizzato
esplicita dichiarazione del tipo associato alla variabile
Fortran 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
sintassi
R501
is
R502
is
or
or
or
or
or
R504
is
R505
is
type-declaration-stmt
type-spec [ , attr-spec ] ... :: entity-decl-list
type-spec
INTEGER [ kind-selector ]
REAL [ kind-selector ]
CHARACTER char-selector
COMPLEX [ kind-selector ]
LOGICAL [ kind-selector ]
TYPE ( type-name )
entity-decl
object-name [ initialization ]
initialization
= initialization-expr
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.18
Integer
sottoinsieme finito degli interi I
operatori
+ - * / **
costanti
sequenza di cifre (es. 300 -234 )
rappresentazione finita
min=-2147483648 max=2147483647
es.
integer :: a,b=45,d
d+b*89
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.19
Istruzione di assegnazione
sintassi
R735
assignment-stmt
is
variable = expr
compatibilità di tipo
tipo espressione deve corrispondere al tipo associato alla
variabile
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.20
assign
!
! assign.f90
! esempi di istruzioni di assegnazione
!
program assign
integer :: a,b,c=30
a=c; b=a*56-c*7;
c=a>b ! e’ corretta?
print *,a,b,c
end program assign
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.21
Lettura
sintassi lettura
R909
is
or
read-stmt
READ ( io-control-spec-list )
[ input-item-list ]
READ format [ , input-item-list ]
input-item-list
lista 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 piu
integer :: m,n,s
read *,m,n
s = m+n
print *,s
end program piu
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.23
Strutture di controllo
struttura sequenziale
block
struttura di selezione
if
struttura iterativa
do
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.24
block
sequenza di istruzioni
sintassi
R801
is
block
[ executable-construct ] ...
esempio
a=b+c
print *,a
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.25
if
selezione/condizionale
sintassi
R802
is
R803
is
R804
is
R805
is
R806
is
if-construct
if-then-stmt
block
[ else-if-stmt
block ] ...
[ else-stmt
block ]
end-if-stmt
if-then-stmt
IF ( logical-expr ) THEN
else-if-stmt
ELSEIF ( logical-expr ) THEN
else-stmt
ELSE
end-if-stmt
ENDIF
corrisponde al if then else
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.26
esempi if
if (i>5) then
print *,i
end if
if (k==l) then
x = k*3
else
x = l*3
end if
if a > 6 then ! ?
a=a*a
end if
if (i>5) then; print *,i; end if
if (a==0) then
k = k+1
else if (b==0) then
k=0
else
k=1
end if
end 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 piuabs
Basic 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-control
do 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 è 0 se exp1 > exp2 e exp3 >0 oppure exp1 < exp2 e exp3 <0
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.30
Esempi DO
do
print *,3
end do
do i=1,10
print *,i
end do
do k=20,10,-2
print *,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 multi
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.32
Fattoriale
n! =
(
n(n − 1)(n − 2) · · · 2 · 1 n > 0
1
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 fatt
integer :: i,n,r
read *,n
if (n<0) then; stop; endif
r = 1
do i = 2,n
r= r*i
end do
print *,r
end program fatt
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.34
Terminazione DO
• CYCLE
- passa all’iterazione successiva
- sintassi:
R834
is
cycle-stmt
CYCLE [ do-name ]
• EXIT
- termina il ciclo DO
- sintassi:
R835
is
exit-stmt
EXIT [ do-name ]
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.35
DO come while
while P do
S
do
′
if (P ) then
exit
end if
S
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. cycle
program somma_npari
integer :: i,n,s
read *,n
if (n<1) then; stop; end if
s = 0
do i = 1,2*n
if ((i-(i/2)*2)!=0) then; cycle; end if
s = s + i
end do
print *,s
end 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 1
Sia m ≥ n, con ciclo da 2 a n si verifica quali sono i numeri
che dividono esattamente sia m che n. Il MCD è il massimo
di tali numeri.
Nota: un numero è divisibile per un altro se il resto della
divisione è 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 mcd1
Basic Fortran, Paolo Bison, FI08, 2008-09-30 – p.41
Massimo Comun Divisore - 2
metodo 2 - Metodo di Euclide
Dato m ≥ n, qualunque numero che divide sia m che n
divide anche il resto della divisione m/n
m = qn + r
m - qn = r ≥ 0
qm k - qqn k = r
k(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 passo
precedente.
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-n
altrimenti è n che diventa n - m, e si ricontrolla l’eventuale
uguaglianza 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

Documenti analoghi

Elementi di Fortran 90

Elementi di Fortran 90 Nel Fortran alle variabili non dichiarate esplicitamente viene assegnato un tipo implicito che dipende dalla prima lettera del nome della variabile: - I, J, K, L, M e N => la variabile è di tipo in...

Dettagli

Appunti di FORTRAN 77

Appunti di FORTRAN 77 per tener conto delle tante importanti estensioni del FORTRAN 66 fiorite in quegli anni e anche del fatto che nel frattempo erano nati altri linguaggi, fra cui il C, che erano decisamente avanti ri...

Dettagli