Title: Cicli in Fortran
1Cicli in Fortran
I cicli consentono di eseguire una sequenza di
istruzioni più di una volta
due tipi
Cicli iterativi
Cicli while
2Ciclo Iterativo
DO indiceinizio,fine,incremento
istruzione 1 istruzione 2
blocco
END DO
indice è una variabile intera ed è utilizzatata
come contatore del ciclo
inizio, fine, incremento sono parametri incremento
è facoltativo se è omesso si assume
che è uguale a 1
3Ciclo Iterativo
1) inizio, fine, incremento possono essere
costanti, variabili o espressioni se
sono variabili o espressioni devono essere
valutate prima del ciclo
2) allinizio del ciclo il programma pone
indiceinizio se indiceincremento lt
fineincremento il programma esegue le
istruzioni allinterno del ciclo
4Ciclo Iterativo
3) eseguite le istruzioni allinterno del ciclo
il programma pone indiceindiceincrement
o se indiceincremento lt fineincremento
vengono eseguite nuovamente le istruzioni del
ciclo
4) si ripete il punto 3) finchè
indiceincremento lt fineincremento quando
questa condizione non è più vera viene
eseguita la prima istruzione dopo il ciclo
5) Si eseguono n.iter. (fine-inizioincrem
ento)/incremento
5Ciclo Iterativo (esempi)
DO i1,10,2
istruzione
5 iterazioni
END DO
DO i3,-3,-2
istruzione
4 iterazioni
END DO
6Istruzione CYCLE
Istruzione CYCLE interrompe lesecuzione
delle istruzioni del ciclo e fa ritornare
allinizio del ciclo
Lindice del ciclo viene incrementato e
lesecuzione delle istruzioni del ciclo riprende
se lindice non ha raggiunto il suo valore
7Istruzione CYCLE (esempio)
PROBLEM esempio INTEGER I DO i1,10 IF (
i 3 ) CYCLE WRITE(,) i END DO END
PROGRAM esempio
Si stampano tutti i numeri interi compresi tra 1
e 10 Escluso il numero 3
8Istruzione EXIT
Istruzione EXIT interrompe lesecuzione
delle istruzioni del ciclo, fa uscire dal ciclo
Viene eseguita la prima istruzione dopo END
DO del ciclo
9Istruzione EXIT (esempio)
PROBLEM esempio INTEGER I DO i1,10 IF (
i 3 ) EXIT WRITE(,) i END DO END
PROGRAM esempio
Si stampa solamente il numero 1
10Ciclo while
DO WHILE (espressione logica)
istruzione 1 istruzione 2
blocco
END DO
quando lespressione logica è .TRUE. il blocco
delle istruzioni del ciclo vengono ripetute
quando lespressione logica è .FALSE. viene
eseguita la prima istruzione dopo END DO
11Ciclo while
DO
... IF (espressione logica) EXIT
blocco
END DO
quando lespressione logica è .TRUE. il blocco
delle istruzioni del ciclo vengono ripetute
quando lespressione logica è .FALSE. viene
eseguita la prima istruzione dopo END DO
12Ciclo while
PROBLEM esempio DOUBLE PRECISION
var,eps eps1.D0 DO var1.D0eps IF (
var.EQ.1.D0) EXIT epseps/2.d0 END
DO WRITE(,) eps , eps END PROGRAM esempio
13Cicli DO con nome
nome
DO indice inizio, fine, incremento
... ... IF (espressione logica)
CYCLE
nome
nome
END DO
14Cicli DO con nome
nome
DO
... IF (espressione logica) CYCLE
nome
... IF (espressione logica) EXIT
nome
nome
END DO
15SUBROUTINE
SUBROUTINE nome_subr ( lista_argomenti )
sezione dichiarativa
sezione esecutiva
RETURN
END SUBROUTINE nome_subr
16SUBROUTINE
PROGRAM nome_prog
CALL nome_subr ( lista_argomenti )
END PROGRAM nome_prog
17SUBROUTINE
1) ogni subroutine è compilata separatamente dal
programma principale e da altre subroutine
quindi può usare le stessi nomi delle variabili e
le stesse etichette utilizzate dal
programma principale o da altre subroutine
2) lordine e il tipo degli argomenti della
chiamata devono corrispondere a quelli della
definizione
18SUBROUTINE
PROGRAM main
INTEGER, PARAMETER n2 DOUBLE PRECISION
f,x(n)
CALL funct( n,x,f )
END PROGRAM main
SUBROUTINE funct(n,x,f ) INTEGER n
DOUBLE PRECISION f,x(n)
19Istruzione INTENT
INTENT(IN) largomento è un dato di input
INTENT(OUT) largomento è un dato di output
INTENT(IN OUT) largomento è sia un dato di
input che di output
se listruzione INTENT è assente largomento è
sia un dato di input che di output
20Istruzione INTENT
SUBROUTINE funct(n,x,f ) INTEGER, INTENT(IN)
n DOUBLE PRECISION, INTENT(IN) x(n)
DOUBLE PRECISION, INTENT(OUT) f
21FUNCTION
FUNCTION nome_funct ( lista_argomenti )
sezione dichiarativa
sezione esecutiva nome_functespressione
RETURN
END FUNCTION nome_funct
22FUNCTION
PROGRAM nome_prog
varnome_funct( lista_argomenti )
END PROGRAM nome_prog
23Calcolo del gradiente approssimato
24Calcolo del gradiente approssimato
25Calcolo del gradiente approssimato
per valori di sufficientemente piccoli
Forward formula
Backward formula
Symmetric formula
26 subroutine gradapp(n,x,f) .......................
.......... call funct(n,x,f) do
i1,n zx z(i)x(i)eps
call funct(n,z,fp) g(i)(fp-f)/eps
end do return end subroutine gradapp
27Generatore di Numeri Pseudo-casuali
RANDOM_NUMBER(x) x è un REAL
ritorna un valore estratto da una sequenza di
numeri pseudo-casuali il valore restituito
nella variabile x è compreso tra 0 (incluso) e 1
(escluso)
28Gen. di Num. Cas. (esempio di numero in l,u) )
PROGRAM num_cas implicit none real
num double precision, parameter l-10,
u10 double precision dnum,x call
RANDOM_NUMBER(num) dnumdble(num)
xldnum(u-l) stop end program num_cas
29Sequenza pesudo-casuale
circa 1018 numeri
circa 1018 numeri
s
s
s
seed della sequenza
30Inizializzazione della sequenza
RANDOM_SEED()
imposta linnesco della sequenza random s ad un
valore ottenuto sulla base del tempo di sistema.
se CALL RANDOM_SEED() precede listruzione
CALL RANDOM_NUMBER(num) ad ogni esecuzione del
programma vengono generati numeri
differenti altrimenti vengono generati gli stessi
numeri
31(No Transcript)