Il 0% ha trovato utile questo documento (0 voti)
10 visualizzazioni47 pagine

Fortran 2

Il documento descrive le operazioni di input e output in FORTRAN, in particolare l'uso dei file come dispositivi di input e output, la sintassi degli enunciati WRITE e READ per leggere e scrivere dati su file, e le specifiche di formato per gestire i dati in input.
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
10 visualizzazioni47 pagine

Fortran 2

Il documento descrive le operazioni di input e output in FORTRAN, in particolare l'uso dei file come dispositivi di input e output, la sintassi degli enunciati WRITE e READ per leggere e scrivere dati su file, e le specifiche di formato per gestire i dati in input.
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 47

OPERAZIONI DI

INPUT E OUTPUT

1
Il FILE come dispositivo di input o output
Gli enunciati WRITE e READ consentono al calcolatore di scrivere in
un dispositivo di output o di leggere da un dispositivo di input

Nelle applicazioni scientifiche usuali il dispositivo più utilizzato sia


come dispositivo di input che come dispositivo di output è il

FILE

Per FILE intendiamo:


1) O un archivio già contenuto nella memoria del calcolatore nel
quale possono essere contenute informazioni necessarie per
l’esecuzione di un programma FORTRAN (DISPOSITIVO DI INPUT)
2) O un archivio che viene creato nella memoria del calcolatore
dal programma stesso e nel quale vengono conservati i risultati
delle operazioni eseguite dal calcolatore
2
SINTASSI DEGLI ENUNCIATI WRITE E READ
Gli enunciati WRITE e READ possono essere utilizzati sia per leggere e
scrivere da e in dispositivi di input output tradizionali
(lettura da tastiera o da lettore di nastro magnetico etc) (scrittura su
schermo o su stampante o su nastro magnetico)
sia per leggere e scrivere in un FILE

Nei precedenti enunciati di input/output:

READ *,A,B,C
PRINT *,A,B,C
Il dispositivo di input/output è fissato in modo univoco dal simbolo *.
Esso dice al calcolatore che l’input è la tastiera del calcolatore e
che l’output è lo schermo

3
SINTASSI DEGLI ENUNCIATI WRITE E READ
Per consentire agli enunciati di input e output di leggere o scrivere i
risultati su un dispositivo diverso dal dispositivo di default (tastiera
per l’input e lo schermo per l’output) essi sono stati progettati con la
seguente forma sintattica:

READ(spec1,spec2)
WRITE(spec1,spec2)

dove spec1 specifica il dispositivo di input o output. Su spec2


torneremo fra un attimo. Per la lettura o scrittura in formato libero
Spec2=*

Nei calcolatori degli anni 70 si utilizzavano le seguenti specifiche:


spec1=1 nastro magnetico spec1=5 lettore di schede
spec1=6 stampante spec1=7 perforatrice di schede
4
SINTASSI DEGLI ENUNCIATI WRITE E READ
Nei calcolatori più recenti
spec1= n
dove n è un numero intero che identifica univocamente un
assegnato file presente sul calcolatore

Consideriamo ad esempio il programma visto in


precedenza che legge da input 2 numeri interi, ne
calcola somma, sottrazione e prodotto e restituisce i
risultati in output

5
SINTASSI DEGLI ENUNCIATI WRITE E READ

In questo programma la specifica di input è * -> il calcolatore legge


i dati (j,k) forniti da tastiera
Inoltre:
la specifica di output è * -> il calcolatore stampa i risultati (j,k,l,m,n)
su schermo
6
L’enunciato OPEN
Supponiamo ora di voler modificare questo programma per
consentire al calcolatore di leggere da un archivio di memoria
denominato
DATI.txt
i numeri interi j e k

Occorre allora disporre di un enunciato che renda


disponibile al calcolatore l’archivio di memoria DATI.txt
L’enunciato che fa questa operazione è il seguente:

OPEN (n, file=‘DATI.txt’)


dove n è un numero intero positivo (es. n=10). In tal modo il dispositivo di
input diviene DATI.txt che viene identificato univocamente dal numero
intero positivo n presente nell’enunciato di OPEN

7
OPERAZIONI DI INPUT-OUTPUT
Per consentire al calcolatore di leggere i dati j,k in DATI.txt occorrerà
usare il seguente enunciato:

READ(10,*) j,k
dove 10 specifica il dispositivo di INPUT rappresentato dal file DATI.txt

8
OPERAZIONI DI INPUT-OUTPUT
Supponiamo ora di voler modificare questo programma per
consentire al calcolatore di SCRIVERE IN un archivio di memoria
denominato
RESULTS.txt
i numeri interi j, k,l,m,n

Occorre allora di nuovo utilizzare l’enunciato OPEN di modo


da rendere disponibile al calcolatore l’archivio di memoria
RESULTS.txt
Nel programma precedente è sufficiente aggiungere l’istruzione
OPEN (20, file=‘RESULTS.txt’)
dove n=20 identifica univocamente il FILE RESULTS.txt all’interno del
programma e modificare l’istruzione di scrittura in:
WRITE(20,*)J,K,L,M,N
9
OPERAZIONI DI INPUT-OUTPUT

10
INPUT A FORMATO- SPECIFICHE DI CAMPO
Nei ragionamenti precedenti non abbiamo richiesto che i numeri di
input avessero un particolare formato. Gli enunciati di READ e
WRITE in cui la seconda specifica spec2 è posta eguale a *
realizzano tale tipo di esigenze.

Nel caso in cui si desideri che il calcolatore legga i dati di


input in modo che questi abbiano un certo formato
occorrerà utilizzare la coppia di enunciati:
READ(spec1,m)lista variabili
m FORMAT(lista dei FORMATI)
dove m nell’enunciato di READ indica la label della riga
dove è contenuto il corrispondente enunciato FORMAT di
formato
11
INPUT A FORMATO- SPECIFICHE DI CAMPO
Il FORMAT è un enunciato che specifica il formato dei numeri.
Pertanto non è un enunciato eseguibile e può essere posto in
‘’qualunque’’ parte del programma

Nel caso in cui si desideri che il calcolatore legga i dati di


input in modo che questi abbiano un certo formato,
occorrerà utilizzare la coppia di enunciati:
READ(spec1,m)lista variabili
m FORMAT(lista dei FORMATI)
dove m nell’enunciato di READ indica la label della riga
dove è contenuto il corrispondente enunciato FORMAT di
formato
12
INPUT A FORMATO- SPECIFICHE DI CAMPO
La lista dei formati è rappresentata da una serie di specifiche di
campo
LISTA DEI FORMATI=W1,W2,…,WN

dove per campo intendiamo lo spazio occupato da un insieme di


caratteri

Ad esempio il numero 1543 è costituito da 4 caratteri, quindi ha una


larghezza di campo pari a 4 o equivalentemente occupa un
campo costituito da 4 caratteri.

Esistono diverse specifiche di campo. Ciascuna di queste


serve ad identificare il tipo di variabile posta in quel campo
(reale, intera o alfanumerica) e le cifre di cui questa
variabile è costituita oppure il numero di spazi vuoti tra una
variabile e l’altra o il numero di righe di cui bisogna
avanzare nel file. 13
CODICE I: SPECIFICHE DI CAMPO INTERE
Il codice che specifica la lettura o la scrittura di un numero intero è
Iw

dove I indica che il numero da leggere o scrivere è intero


e w specifica la larghezza del campo

Consideriamo ad esempio gli enunciati

READ(10,20)J,K
20 FORMAT(I3,I5)
Questa coppia di enunciati dice al calcolatore di leggere nel dispositivo
identificato da 10 due numeri interi J e K con il formato descritto
dall’istruzione di FORMAT identificata dalla label 20. L’istruzione di
FORMAT dice che il numero intero J deve essere associato alle prime tre
cifre poste nel dispositivo 20 mentre il numero intero K deve essere
associato alle cifre poste nelle successive 5 colonne 14
CODICE I: SPECIFICHE DI CAMPO INTERE

Se il file di input è quello riportato sotto il calcolatore


associa 3 al primo intero e 4 al secondo. Con x sono state
per semplicità evidenziate le cifre usate nella scrittura del
file di input (le x non esistono nel file di input)

15
CODICE I: SPECIFICHE DI CAMPO INTERE
Se il file di input è quello sotto, il calcolatore non funziona.
Infatti solo le prime 4 cifre della prima riga sono state
utilizzate nella scrittura del file e quindi la larghezza
complessiva di campo utilizzata nella scrittura del file è di 4
caratteri mentre l’enunciato di FORMAT ne richiede
complessivamente 8

16
CODICE I: SPECIFICHE DI CAMPO INTERE

In tal caso l’output è


-3 45678

17
CODICE I: SPECIFICHE DI CAMPO INTERE

In tal caso l’output è


-31 45678

18
CODICE I: SPECIFICHE DI CAMPO INTERE

In tal caso l’output è


-31 4567
19
CODICE I: SPECIFICHE DI CAMPO INTERE

In tal caso in output avremo un messaggio di errore


Difatti al primo intero i3 il calcolatore cerca di associare la
stringa -3+ che non è un numero intero 20
CODICE I: SPECIFICHE DI CAMPO INTERE

In tal caso in output avremo


-3 4568
Lo spazio bianco esistente tra 6 e 8 viene letto ma
ignorato dal calcolatore nella definizione dell’intero I5.
PUO’ VARIARE DA MACCHINA A MACCHINA!!!!
21
CODICE X: SPECIFICHE DI CAMPO VUOTO
Il codice per separare con w spazi vuoti due parti di una stringa di
caratteri è:
wX

In tal caso l’enunciato di FORMAT contiene la seguente


lista: I3, 2X, I5.
Pertanto a J verranno assegnati i primi 3 interi posti nella
prima riga del file (I3)
Verranno poi SALTATI DUE SPAZI (2X).
Infine a K verranno assegnati i primi 5 interi posti nella
prima riga del file (I5) 22
CODICE X: SPECIFICHE DI CAMPO VUOTO
FILE DATI

OUTPUT:
J=-10 K=70908
23
CODICE F: SPECIFICHE DI CAMPO REALI
Il codice per specificare la lettura o la scrittura di un numero reale è
Fw.d

dove F indica che il numero da leggere o scrivere è reale, w


specifica la larghezza del campo e d specifica il numero di cifre
decimali
Consideriamo ad esempio gli enunciati:
READ(10,20)A
20 FORMAT(F6.2)
print *,A
Questa coppia di enunciati dice al calcolatore di leggere nel dispositivo
identificato da 10 un numero reale A con il formato descritto
dall’istruzione di FORMAT identificata dalla label 20. L’istruzione di
FORMAT dice che il numero reale A deve essere associato alle prime 6
cifre poste nel dispositivo 20 e ha 2 cifre decimali
24
INPUT

F6.2

OUTPUT:
-10.4700003
25
CODICE F: SPECIFICHE DI CAMPO REALI
Se, nell’eseguire l’istruzione di formato FORMAT(Fw.d) il numero
presente nelle w colonne ha un punto decimale in posizione
diversa dalla posizione che precede le ultime d colonne allora il
numero viene letto con IL SUO FORMATO.

Viene ignorata la specifica


secondo la quale il numero
deve avere 2 cifre decimali
F6.2

OUTPUT:
-1.04700005

26
CODICE F: SPECIFICHE DI CAMPO REALI
Occorre però che siano presenti cifre sino alla colonna w, altrimenti
si avrà un messaggio di errore:

La larghezza di campo w è pari a 6


ma in colonna 6 non è
presente alcun numero

F6.2

OUTPUT:
Messaggio di errore
27
CODICE F: SPECIFICHE DI CAMPO REALI
Nel caso in cui nel file di input non vi sia il punto decimale il
calcolatore, con una specifica di formato FORMAT Fw.d
leggerà w caratteri, d dei quali saranno considerati come parte
decimale. Inserirà automaticamente un punto decimale tra i
primi w-d caratteri e i restanti d.

INPUT

Vengono lette le 6 cifre e posto il


punto decimale prima delle F6.2
ultime 2

OUTPUT:
-100.4700001
E’ comunque buona regola evitare di scrivere nei files dei numeri reali
senza il punto decimale
28
CODICE E: SPECIFICHE DI CAMPO REALI
Il codice per specificare la lettura o la scrittura di un numero reale in
forma esponenziale è
Ew.d

dove E indica che il numero da leggere o scrivere è reale, w


specifica la larghezza del campo e d specifica il numero di cifre
decimali
Consideriamo ad esempio gli enunciati

READ(10,20)A
20 FORMAT(E11.2)
Questa coppia di enunciati dice al calcolatore di leggere nel dispositivo
identificato da 10 un numero reale A con il formato descritto
dall’istruzione di FORMAT identificata dalla label 20. L’istruzione di
FORMAT dice che il numero reale A deve essere associato alle prime 11
cifre poste nel dispositivo 20 e ha 2 cifre decimali
29
CODICE E: SPECIFICHE DI CAMPO REALI

OUTPUT:
1.23454001E+20

30
CODICE E: SPECIFICHE DI CAMPO REALI

Viene ignorato lo 0 in colonna 11

OUTPUT:
123.454002

Non è definita la potenza di 10

OUTPUT:
MESSAGGIO di ERRORE
31
CODICE E: SPECIFICHE DI CAMPO REALI

Vengono ignorate le 5 cifre


decimali della specifica E10.5

OUTPUT:
-1.23400002E+20

32
CODICE E: SPECIFICHE DI CAMPO REALI

FILE DI INPUT

In singola precisione il massimo


numero calcolabile è 10^(+38)

Output:
Messaggio di errore

33
CODICE E: SPECIFICHE DI CAMPO REALI

FILE DI INPUT

In doppia precisione il massimo


numero calcolabile è
10^(+308)
Output:
-1.14E+201
34
SEQUENZA OPERAZIONI DI LETTURA
Occorre osservare che ogni qualvolta viene eseguito un enunciato
di READ in un file il puntatore della posizione all’interno del file
viene portato automaticamente alla riga successiva.

FILE DI INPUT

Output:
-100 7388

35
SEQUENZA OPERAZIONI DI LETTURA

FILE DI INPUT

Output:
-100 1234

36
ENUNCIATO WRITE A FORMATO
Così come la lettura a formato avviene attraverso la coppia READ-
FORMAT la scrittura a formato avviene attraverso la coppia
WRITE-FORMAT
WRITE (M,N) LISTA DELLE VARIABILI
N FORMAT (LISTA DEI FORMATI)

M specifica il dispositivo di output


N la label della riga in cui è riportato il formato da
utilizzare

Nella lista delle variabili compariranno le variabili


intere o reali da stampare

Nella lista dei formati compariranno le specifiche di


campo intero (Iw) o reale (Fw.d o Ew.d)
37
ENUNCIATO WRITE A FORMATO
La lista delle variabili è in corrispondenza biunivoca con quella dei
formati. Ad esempio:
WRITE (10,20) IUM, ALFA,KUN
20 FORMAT (I5,F8.2,I3)

In tal caso IUM <->I5

ALFA <->F8.2

KUN <->I3

Questo enunciato dice di stampare l’intero IUM nei


primi 5 campi, il reale ALFA nei successivi 8 (con 2
cifre decimali) e l’intero KUN nei successivi 3. E’
quindi fondamentale che venga rispettato la
corrispondenza tra il tipo di numero (intero o reale)
nella lista delle variabili e in quella dei formati 38
ENUNCIATO WRITE A FORMATO
E’ tuttavia possibile che tra le diverse specifiche di campo si utilizzino
altri simboli che consentono:

1 Di porre degli spazi bianchi in assegnati campi (codice wX)


2 Di scrivere delle informazioni aggiuntive in assegnati campi
3 Di avanzare di una o più righe tra una scrittura e l’altra

1 Per inserire w spazi bianchi tra un numero e l’altro si


utilizza il codice di spazio vuoto già visto in precedenza
wX
Ad esempio
WRITE (10,20) IUM, ALFA,KUN
20 FORMAT (I5,3x,F8.2,7x,I3)

Dice al calcolatore di stampare l’intero IUM nei primi 5 campi, di lasciare 3


spazi, di stampare il reale ALFA nei successivi 8 (con 2 cifre decimali), di
lasciare 7 spazi e di stampare e l’intero KUN nei successivi 3 39
ENUNCIATO WRITE A FORMATO

Si noti che i numeri vengono allineati a destra nel


campo (ad esempio 44 viene scritto usando le colonne
2 e 3) 40
ENUNCIATO WRITE A FORMATO

41
ENUNCIATO WRITE A FORMATO

42
ENUNCIATO WRITE A FORMATO
E’ tuttavia possibile che tra le diverse specifiche di campo si utilizzino
altri simboli che consentono:

1 Di porre degli spazi bianchi in assegnati campi (codice wX)


2 Di scrivere delle informazioni aggiuntive in assegnati campi
3 Di avanzare di una o più righe tra una scrittura e l’altra

1 Per scrivere delle informazioni aggiuntive in un


campo è sufficiente, nella specifica dei formati porre
l’informazione aggiuntiva tra virgolette
Ad esempio
WRITE (10,20) AMED
20 FORMAT (‘la media dei voti della classe est=‘,F8.2)

Dice al calcolatore di stampare il contenuto delle virgolette nella prima riga


del file (10) seguito da un reale posto nel campo dei successivi 8 caratteri
con 2 cifre decimali 43
ENUNCIATO WRITE A FORMATO

44
ENUNCIATO WRITE A FORMATO
3 Nella lista dei formati è possibile utilizzare anche la
specifica che consente di avanzare di una riga prima di
scrivere una informazione. Tale specifica è rappresentata
dal simbolo /
Ad esempio
WRITE (10,20) ALFA
20 FORMAT (/F6.2)

Dice al calcolatore di saltare la prima riga e scrivere nelle prime 6 colonne


del campo di riga 2 il reale ALFA con due cifre decimali

45
ENUNCIATO WRITE A FORMATO

46
ENUNCIATO WRITE A FORMATO

47

Potrebbero piacerti anche