Fortran per Ingegneri Lezione 4 A.A. 2014/2015 Marco Redolfi marco.redolfi@unitn.it Simone Zen simone.zen@unitn.it
Formati e Formattazione Finora abbiamo letto valori da tastiera e scritto sullo schermo usando le due istruzioni READ e WRITE. Il formato che abbiamo usato è detto free-format ed è specificato dal secondo * nelle espressioni READ(*,*) e WRITE(*,*) Come si è visto, il risultato dell'utilizzo del free-format, fa apparire spazi non necessari. 2
WRITE(*,100) i,risultato Formati e Formattazione 100 FORMAT ('Iterazione numero',i3,1x,'vale', F7.3 L'istruzione FORMAT contiene le istruzioni per la formattazione utilizzata dall'istruzione WRITE I3 e F7.3 sono descrittori di formato associati alle variabili i e risultato Iterazione numero 3 vale 3.142 (formatted) Iterazione numero 3 vale 3.141593 (unformatted) 3
INTEGER output: il descrittore I riw or riw.m r = repeat count numero di volte che deve essere usato il descrittore w = Field width numero di caratteri totali da usare m = Numero minimo di digits che devono essere visualizzati 4
INTEGER output: il descrittore I 5
REAL output: il descrittore F rfw or rfw.d r = repeat count numero di volte che deve essere usato il descrittore w = Field width numero di caratteri totali da usare d = Numero di digits a destra del punto decimale!!segno e PUNTO contano anch'essi un digit!!!! alcuni compilatori richiedono w>=d+3!! 6
REAL output: il descrittore F 7
REAL output: il descrittore E rew or rew.d r = repeat count numero di volte che deve essere usato il descrittore w = Field width numero di caratteri totali da usare d = Numero di digits a destra del punto decimale Notazione esponenziale 4096.0 ----> 0.4096*10^4 Attenzione il descrittore E normalizza i valori tra 0.1 e 1 8
REAL output: il descrittore E 9
REAL output: il descrittore ES (conventional scientific notation) resw or resw.d r = repeat count numero di volte che deve essere usato il descrittore w = Field width numero di caratteri totali da usare d = Numero di digits a destra del punto decimale Notazione esponenziale 4096.0 ----> 4.096*10^3 Attenzione il descrittore ES normalizza i valori tra 1.0 e 10 10
REAL output: il descrittore ES 11
CHARACTER output: il descrittore A ra or raw r = repeat count numero di volte che deve essere usato il descrittore w = Field width numero di caratteri totali da usare 12
CHARACTER output: il descrittore A 13
Posizionatori orizzontali: i descrittori X e T nx n = numero di blanks da inserire Tc c = numero della colonna a cui spostarsi 14
Cambiare linea di output: il descrittore / Il descrittore / fa saltare la scrittura alla linea successiva 15
Ripetizione di gruppi di formato 320 FORMAT (1x, I6, I6, F10.2, F10.2, I6, F10.2, F10.2) è analogo a 320 FORMAT (1x, I6,2(I6,2F10.2)) 16
Descrittori di fomato per la lettura (READ) I descrittori di formato per la lettura sono analoghi a quelli per la scrittura WRITE. Es: READ(*,'(3F10.4)') a,b,c dati di input sono 1.5 0.15E+01 15.0E 01 > tutte le 3 variabili lette hanno lo stesso valore pari a 1.5 17
Vettori o array Alcuni problemi di programmazione necessitano l'utilizzo di un'aggregazione di valori, piuttosto che di uno solo. Questo significa che è conveniente indicare l'insieme di valori con una sola variabile piuttosto che tante variabili. In FORTRAN questa problema è risolto utilizzando degli array. Memoria del computer... 5 12.5-25.5 13.6... Array a
Vettori o array Un array è un gruppo di variabili o costanti, tutte dello stesso tipo, che si riferiscono ad un singolo nome. Ogni singolo valore dell'array è detto elemento dell'array, ed è identificato dal nome dell'array e da un indice che punta ad una particolare posizione all'interno dell'array. Memoria del computer... a(1) a(2) a(3) a(4)... Array a
Vettori e Matrici (Terminologia) Un array (vettore o matrici a più dimensioni) permette di specificare con un nome ed un insieme di indici una serie di elementi in modo molto semplice. Ogni array ha un tipo ed ogni elemento è di tale tipo. La terminologia relativa agli array è la seguente: RANGO (RANK) LIMITI (BOUNDS) - Numero di dimensioni - Limite superiore ed inferiore di ogni dimensione ESTENSIONE (EXTENT) - Numero di elementi in ogni dimensione GRANDEZZA (SIZE) FORMA (SHAPE) - Numero totale di elementi - Rango ed estensione CONFORMI (CONFORMABLE) - Stessa forma
Dichiarazione INTEGER, DIMENSION(100) INTEGER :: vettore_i :: vettore_i(100) REAL, DIMENSION(100) REAL :: vettore_r :: vettore_r(100) CHARACTER(len=5), DIMENSION(100) :: cognome CHARACTER(len=5) :: cognome(100)
Visualizzazione degli array REAL, DIMENSION(15) :: A Gli elementi degli array sono semplici variabili INTEGER, DIMENSION(10) :: index REAL, DIMENSION(3) :: temp index(1) = 5 temp(3) = REAL(index(1))/5. WRITE(*,*) index(1),index(1)
Inizializzazione degli elementi degli array Problema: INTEGER, DIMENSION(10) :: j WRITE(*,*) j(1), j(1) L'array è stato dichiarato ma nessun valore è stato introdotto ancora
Inizializzazione degli elementi degli array Inizializzazione con delle istruzioni di assegnazione... REAL, DIMENSION(10) :: array DO i=1,10 array(i) = REAL(i) END DO
Inizializzazione degli elementi degli array Inizializzazione con delle istruzioni di assegnazione... 2 REAL, DIMENSION(10) :: array array=(/1.,2.,3.,4.,5.,6.,7.,8.,9.,10./)
Inizializzazione degli elementi degli array Inizializzazione con delle istruzioni di assegnazione... 3 REAL, DIMENSION(10) :: array array=0.
Inizializzazione degli elementi degli array Inizializzazione all'interno delle dichiarazioni INTEGER, DIMENSION(5) :: array2 = (/1,2,3,4,5/) DO implicito /(arg1,arg2,...,index = istart,iend,incr)/ INTEGER, DIMENSION(5) :: array2 = (/(i,i=1,5)/)
Cambiare il limite inferiore del range di un array REAL, DIMENSION(5) :: a1 REAL, DIMENSION( 2:2) :: b1 REAL, DIMENSION(5:9) :: c1 a1, b1, c1 sono array di 5 elementi!! P.S. Matlab non accetta indici negativi per gli array
Superamento del range di un array (out of bounds) INTEGER :: i REAL,DIMENSION(5):: a=(/1.,2.,3.,4.,5./) REAL,DIMENSION(5):: b=(/10.,20.,30.,40.,50./) DO i = 1,6 write(*,*) a(i) END DO
Superamento del range di un array (out of bounds) risultato dipende da tipo compilatore!! Bounds check on Bounds check off a(1) =1.0 a(1) =1.0 a(2) =2.0 a(2) =2.0 a(3) =3.0 a(3) =3.0 a(4) =4.0 a(4) =4.0 a(5) =5.0 a(5) =5.0 a(6 a(6) =10.0 Array subscript exceeds allocated area
Uso delle costanti nella dichiarazione di array INTEGER, PARAMETER :: max_size = 1000 REAL :: array1(max_size) REAL :: array2(max_size) REAL :: array3(2*max_size)
Operazioni sull'array globale condizione necessaria: gli array devono avere la stessa forma INTEGER :: i REAL, DIMENSION(4) :: a = (/1.,2.,3.,4.) REAL, DIMENSION(4) :: b = (/5.,6.,7.,8.) REAL, DIMENSION(4) :: c,d! somma elemento per elemento DO i=1,4 c(i) = a(i) + b(i) END DO write(*,*) c
Operazioni sull'array globale condizione necessaria: gli array devono avere la stessa forma INTEGER :: i REAL, DIMENSION(4) :: a = (/1.,2.,3.,4.) REAL, DIMENSION(4) :: b = (/5.,6.,7.,8.) REAL, DIMENSION(4) :: c,d! somma sull'array globale d = a + b write(*,*) d
Operazioni sull'array globale posso eseguire operazioni con costanti a livello globale INTEGER :: i REAL, DIMENSION(4) :: a = (/1.,2.,3.,4.) REAL :: cost=5.! somma sull'array globale DO i=1,4 a(i) = a(i) + /* cost END DO! equivalente a a = a + /* cost
QUANDO SI DEVONO USARE GLI ARRAY? 1) Non risolvere tutti i problemi con gli array!!!! (vedi esercizio lezione precedente!!!!!) 2) Si usano quando tutti, o la maggior parte dei dati, devono essere tenuti in memoria per risolvere in modo efficiente un problema. 3)Utilizzare array richiede memoria!!!
ESERCIZI 1) Assegnato un numero di dati N, calcolare la media e la deviazione standard 2) Trovare il max e il min di una serie di dati e la loro posizione (senza utilizzare le funzioni intrinseche MAXVAL e MAXLOC) 3) Assegnato un array di 10 numeri casuali, ordinarlo in senso crescente