I/O dei dati
In questa sezione si vede come fare I/O dei dati da dispositivi standard (tastiera/monitor).
Il comando base che permette di effettuare l'output in Fortran è:
PRINT*, output
dove output sono i valori da visualizzare separati da virgole (,).
Esempi:
PRINT*,X,Y,Z visualizza i valori di X, Y e Z
PRINT*,'Data =',D
visualizza Data = seguito dal valore di D
Ogni istruzione di output viene visualizzata su una riga diversa dello
schermo. Delle istruzioni del tipo:
PRINT*,5,7.2
PRINT*,'Ora =','18:45'
restituiranno:
5
7.2
Ora = 18:45
Un valore di tipo LOGICAL in output
restutuirà o T o F (TRUE, FALSE).
Un valore INTEGER o
REAL viene invece visualizzato secondo il
formato standard definito dall'implementazione, per poter adoperare un'altra
formattazione si utilizza il comando FORMAT.
Il comando per poter effettuare l'input in Fortran è:
READ*, input
dove input è la lista degli identificatori
per i valori da inserire separati da virgole (,).
Esempio:
READ*,X,Y,Z
richiede i valori di X, Y e Z
È conveniente inserire prima dell'istruzione di input un
output con i valori richiesti. Così il precedente esempio diventa:
PRINT*,'X,Y,Z'
READ*,X,Y,Z
Per le variabili di tipo LOGICAL, se il primo carattere fornito dall'utente è T o .T, allora la variabile assume il valore .TRUE., invece, se il primo carattere è F o .F, allore la variabile assume il valore .FALSE., altrimenti viene segnalato l'errore.
Per poter specificare il formato di I/O dei dati si adopera
il seguente metodo:
PRINT etichetta1, output
READ etichetta2, input
e1 FORMAT(formati1)
e2 FORMAT(formati2)
dove e1 ed e2 sono rispettivamente etichetta1 ed
etichetta2.
L'etichetta è un numero intero compreso tra 0 e 9999 che deve essere inserita (nei casi e1 ed e2) nelle colonne tra la 1 e la 5 (vedi Struttura di un programma).
Le etichette e1 ed e2 mettono correlano i rispettivi FORMAT rispettivamente con PRINT e READ. Non è necessario che il FORMAT segua l'istruzione che lo ha richiamato, questa infatti può essere messa in un qualsiasi punto del programma, anche se per una maggiore leggibilità del codice si preferisce o farli seguire alle istruzioni che li richiamano o raggrupparli alla fine del programma prima dell'END.
formati1 e formati2 sono rispettivamente la formattazione per il PRINT e per il READ.
I formati sono quattro: X, I, F, E.
La X è utilizzata per generare degli spazi in uscita.
PRINT e,output
e FORMAT(nX,formati)
indica che l'istruzione PRINT prima di visualizzare i dati di output
secondo formati, lascia n spazi vuoti (n intero positivo). Il
numero n prima di X non può mai essere omesso, anche quando questo è uno. Nel precedente
esempio X è posto prima degli altri formati, ad ogni modo questo può trovarsi in
qualsiasi altro punto dell'elenco formati. La sua posizione dipende da come
vogliamo visualizzare l'output.
La I è adoperata per specificare l'ampiezza delle variabili
di tipo INTEGER.
PRINT e,output
e FORMAT(In,formati)
In
indica che il primo output è un INTEGER, per
visualizzare il quale sono stati riservati n spazi. Se il numero delle
cifre c dell'intero è uguale a n (c = n), allora
tutti gli spazi saranno occupati dalle cifre; se c < n, allora il
numero verrà visualizzato allineato a destra, i restanti n - c
resteranno vuoti; se c > n, allora il numero di spazi riservati è
insufficiente e l'output sarà una serie di asterischi (*******).
Ad esempio:
I=1500
J=2450000
K=-33
L=1000
PRINT 1, I,J
PRINT
1, I,K
PRINT 2, K
PRINT 2, L
PRINT 3,I,L
1
FORMAT(I5,I7)
2 FORMAT(I3)
3
FORMAT(2I5)
restituirà in output:
°15002450000
°1500°°°°-33
-33
***
°1500°1000
dove ° indica uno spazio vuoto.
2I5 significa I5,I5.
La F è adoperata per specificare l'ampiezza delle variabili
di tipo REAL.
PRINT e,output
e FORMAT(Fn1.n2,formati)
Fn1.n2
indica che il primo output è un REAL, per
visualizzare il quale sono stati riservati n1 spazi. n2 è il
numero di cifre da visualizzare dopo il punto decimale. Da ciò segue che n1
deve essere maggiore di n2, più precisamente n1 > n2 + 1
(l'uno è il punto decimale). n2 può essere zero. Da quanto detto segue
che se n2 sono gli spazi riservati per le cifre decimali, allora gli
spazi riservati per le cifre intere sono n = n1 - n2 - 1. Se il numero delle
cifre c dell'intero è uguale a n (c = n), allora
tutti gli spazi saranno occupati dalle cifre; se c < n, allora il
numero verrà visualizzato allineato a destra, i restanti n - c
resteranno vuoti; se c > n, allora il numero di spazi riservati è
insufficiente e l'output sarà una serie di asterischi (*******). Vediamo cosa
accade con n2:
sia 15.9627483 il numero da visualizzare:
n1.n2 | output |
7.4 | 15.9627 |
10.6 | °15.962748 |
8.6 | ******** |
Esempio:
X=1.57
Y=2.45
Z=-3.5
PRINT 1,
X,Y
PRINT 2, Z
1
FORMAT(2F5.2)
2 FORMAT(F4.1)
restituirà in output:
°1.57°2.45
-3.5
2F5.2 significa F5.2,F5.2.
La E è adoperata per specificare l'ampiezza delle variabili
di tipo REAL espresse con notazione
esponenziale.
PRINT e,output
e FORMAT(En1.n2,formati)
En1.n2
indica che il primo output è un REAL, per
visualizzare il quale sono stati riservati n1 spazi. n2 è il
numero di cifre da visualizzare dopo il punto decimale. Da ciò segue che n1
deve essere maggiore di n2, più precisamente n1 > n2 + 6
(il 6 sono: il segno del numero, il punto decimale, il simbolo E prima
dell'esponente, il segno dell'esponente, e due spazi per l'esponente). Lo spazio
riservato per il segno del numero è utilizzato solo se questo è negativo (il
segno dell'esponente è sempre indicato). n2 può essere zero. Da quanto detto segue
che se n2 sono gli spazi riservati per le cifre decimali, allora gli
spazi riservati per le cifre intere sono n = n1 - n2 - 6. Se il numero delle
cifre c dell'intero è uguale a n (c = n), allora
tutti gli spazi saranno occupati dalle cifre; se c < n, allora il
numero verrà visualizzato allineato a destra, i restanti n - c
resteranno vuoti; se c > n, allora il numero di spazi riservati è
insufficiente e l'output sarà una serie di asterischi (*******). Vediamo cosa
accade con n2:
sia -15.7325892 il numero da visualizzare:
n1.n2 | output |
14.4 | °°°-0.1573E+02 |
8.2 | -.16E+02 |
7.2 | ******* |
Esempio:
X=1.5783
Y=-2.4511
PRINT 1,
X,Y
1
FORMAT(2E10.2)
restituirà in output:
°°0.16E+01°-0.25E+01
2E10.2 significa E10.2,E10.2.
Esempio:
PRINT 1, I,X,J,Y,K,Z
PRINT 2,A,B
1
FORMAT(1X,3(I3,3X,F10.4)
2 FORMAT(1X,F8.2/2X,F15.5)
il gruppo I3,3X,F10.4 viene ripetuto 3 volte. In 2 la / indica che viene
visualizzato A dopo uno spazio e con F10.2, e a capo viene visualizzato B
preceduto da due spazi e con F15.5.
Negli esempi fatti si è utilizzato il comando FORMAT prevalentemente per l'output, ad ogni modo tutto il discorso vale anche per l'input.