Sei sulla pagina 1di 82

Fortran: il primo programma - 1

PROGRAM CIAO
C Il nostro primo programma fortran
WRITE(*,*) 'Ciao, mondo!'
STOP
END

 La linea di un programma fortran:


o È lunga 80 caratteri al più
o I primi 6 caratteri hanno speciali significati:
 Sono normalmente bianchi.
 Se il primo carattere è una ‘C’ la linea è un
commento.
 I caratteri da 1 a 5 possono contenere una
etichetta.
 Se il sesto carattere è diverso da un
bianco o uno zero la linea è prosecuzione
della precedente.
o I caratteri da 7 a 72 contengono l’istruzione
(‘statement’) fortran;
o I caratteri da 73 a 80 possono contenere un
numero di sequenza.

 L’alfabeto Fortran comprende i soli caratteri


alfanumerici MAIUSCOLI. Gli spazi sono ignorati.
Nei commenti e nella stampa di testo è ammesso
l’uso dell’intero set di caratteri del calcolatore.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 1 di 82


Fortran: il primo programma - 2

PROGRAM CIAO
C Il nostro primo programma fortran
WRITE(*,*) ‘Ciao, mondo!’
STOP
END

 Il programma stampa la linea ‘ciao, mondo!’

 L’istruzione WRITE(*,*) stampa sulla periferica di


uscita standard (il video) quello che la segue.

 Struttura di un programma:
PROGRAM nome
corpo del programma
STOP
END

 L’istruzione PROGRAM serve a dare un nome al


programma.

 I nomi (identificatori) Fortran sono stringhe


alfanumeriche MAIUSCOLE che iniziano con una
lettera e lunghe al più 6 caratteri.

 L’istruzione STOP arresta l’esecuzione del


programma.

 L’istruzione END informa il compilatore che il


codice è finito

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 2 di 82


Parole riservate (Keyword)
 Nei progettare i linguaggi di programmazione ad
alcune delle possibili parole viene associato un
significato specifico ed immutabile; tali parole
non possono quindi essere usate come nomi di
parti del programma. Sono le cosiddette parole
riservate, p.e. INTEGER, DO, DATA,
PARAMETER,…

 Le più importanti parole chiave sono:


CALL CHARACTER COMPLEX CONTINUE
DATA DIMENSION DO
DOUBLE PRECISION DO WHILE ELSE
ELSE IF END END IF EXTERNAL
FORMAT FUNCTION GOTO IF
INTEGER LOGICAL PARAMETER PRINT
PROGRAM READ REAL RETURN
SAVE STOP WRITE

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 3 di 82


Un programma più complesso - 1

PROGRAM SOM
C Programma fortran che legge due numeri e ne stampa la somma
REAL A, B, SOMMA
WRITE(*,*) ‘Immetti due numeri A e B separati da virgola’
READ(*,*) A, B
SOMMA = A+B
WRITE(*,*) ‘La somma di A e B è’, SOMMA
STOP
END

 In questo programma si impiegano delle variabili:


o Una variabile può essere pensata come una scatola cui sia stato dato
un nome, nella quale possano essere messi e dalla quale possano
essere recuperati dei valori.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 4 di 82


Variabili e loro tipi - 1
 Una variabile è l’astrazione di una cella di
memoria.
o Associa un valore ad una certa locazione di
memoria e ve lo rappresenta con una
codifica opportuna.

o deve essere dichiarata prima di poterla


utilizzare, specificando il tipo della variabile
seguito da una lista di variabili che debbano
essere di quel tipo.

 La dichiarazione di variabile:
o ha forma: nometipo nomevariabile

o ha tre scopi:
1. definire lo spazio riservato in memoria alla
variabile;

2. stabilire la codifica utilizzata per


rappresentarla: consente di tradurre i dati
da immagazzinare in stringhe di bit e di
interpretare i dati presenti in memoria.

3. associare al valore immagazzinato un


elenco di operazioni legali su di esso e
consentire al compilatore di effettuare
opportuni controlli diagnostici.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 5 di 82


o L’insieme di queste caratteristiche
costituisce il TIPO di una variabile.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 6 di 82


Variabili e loro tipi – 2
 Il Fortran è un linguaggio orientato al
calcolo ed ammette sei tipi:
INTEGER
REAL
DOUBLE PRECISION
COMPLEX
LOGICAL
CHARACTER

 P.e.: REAL A, B, PIPPO


Dichiara tre variabili reali A, B e PIPPO.

 Dopo che una variabile sia stata


dichiarata essa potrà essere valutata (l’
operazione di valutazione recupera il valore che vi
si è immagazzinato) oppure le si può assegnare
un nuovo valore con una operazione di
assegnamento.

 P.e.: A=1.0 assegna ad A il valore 1.0


X=A assegna alla variabile X il valore che
risulta dalla valutazione di A.

 Le variabili potranno poi essere


combinate con operatori, letterali e costanti
formando espressioni.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 7 di 82


Variabili e loro tipi – 3
 In assenza di dichiarazione in Fortran valgono le
regole della dichiarazione implicita (le variabili
sono intere se il loro nome comincia per I,…, N,
reali altrimenti).

 Di regola, dichiareremo SEMPRE tutte le


variabili.

 E’ possibile inizializzare (cioè, assegnare un


valore iniziale) alle variabili, oltre che con una
operazione di assegnamento, con la istruzione
DATA:

DATA nome1/valore1/nome2/valore2/…

Questa istruzione dichiara le variabili secondo le


regole della dichiarazione implicita e attribuisce
loro il valore specificato nell’enunciato.

 Se il tipo della variabile deve essere differente


occorre premettere alla istruzione DATA una
adatta dichiarazione di tipo. Noi premetteremo
SEMPRE ad una istruzione DATA tutte le
dichiarazioni di tipo, ad es:

IMPLICIT NONE
INTEGER A, DATA
REAL B, LATO
DATA A/1./DATA/3/B/10./LATO/0.7E2/

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 8 di 82


I letterali
 Sono valori noti al momento della scrittura
del programma ed incorporati esplicitamente nel
suo codice sorgente.

 Il loro tipo non viene esplicitamente


dichiarato: è il compilatore a deciderlo basandosi
sulla scrittura del letterale.

 Ad esempio, un letterale numerico privo di


punto decimale sarà considerato un INTEGER; se
invece contiene il punto decimale o il simbolo E
sarà considerato un REAL; se è racchiuso fra apici
un CHARACTER.

 I letterali LOGICAL sono le costanti .FALSE.


e .TRUE.

 Nella terminologia Fortran vengono anche


chiamati costanti.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 9 di 82


Le costanti
 Sono valori che non variano durante
l’esecuzione del programma; a differenza dei
letterali, ad essi viene assegnato un nome per:
- Rendere il programma più leggibile.
- Rendere facilmente modificabile (parametrico) il
programma.

 In Fortran si dichiarano con la parola chiave


PARAMETER, che deve precedere la prima
istruzione eseguibile:
PARAMETER (nome1=cost1, nome2=cost2,…)

Ad esempio:

PARAMETER (PI=3.14159265)

 Il tipo delle costanti aritmetiche è assegnato


dal compilatore seguendo le regole della
dichiarazione implicita delle variabili. Noi
premetteremo sempre una dichiarazione di tipo.

 Nella terminologia Fortran vengono anche


chiamate costanti con nome (o etichettate).

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 10 di 82


Operatori
 A una variabile è possibile applicare l’insieme di
operatori che sono ammessi dal suo tipo.
Ad ogni operatore è assegnata una particolare
precedenza nella valutazione delle espressioni:

Prec Operatore T Tipo Operazione


operandi eseguita
1 ** A Elevamento a
potenza
2 * A Aritmetico Moltiplicazione
2 / A Idem Divisione
3 + A Idem Somma
3 - A Idem Sottrazione
: INTEGER Intervallo
4 .LT. R Aritmetico Minore
4 .LE. R Idem Minore o uguale
4 .GT. R Idem Maggiore
4 .GE. R Idem Maggiore o uguale
4 .EQ. R Idem Uguale
4 .NE. R Idem Diverso
5 .NOT. L LOGICAL Not
6 .AND. L Idem And
6 .OR. L Idem Or
6 .EQV. L Idem Coincidenza logica
6 .NEQV. L Idem Or esclusivo
7 // CHARACTER Concatenazione

 La maggior parte degli operatori rientra nelle


categorie aritmetica, relazionale, logica.
Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 11 di 82
Le espressioni - 1
 Sono costituite da variabili, letterali e costanti
combinate, fra loro o con altre espressioni,
attraverso operatori.
Ad esempio:

E = A+ 3.*(D+7)**2

 Una espressione ha un tipo (il tipo del risultato


che viene prodotto)
Ad esempio, se la precedente espressione fosse
preceduta dalle dichiarazioni:

IMPLICIT NONE
REAL E
INTEGER A, D
DATA A/1./D/2/

produrrebbe il risultato REAL 244.

 Le espressioni aritmetiche
o combinano operandi e operatori di tipo
aritmetico; seguono regole analoghe alle
espressioni dell’algebra, sia per ordine di
valutazione dell’espressione che per
precedenza degli operatori.

o Producono un risultato il cui tipo, comunque


aritmetico, dipende da quello degli operandi

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 12 di 82


Le espressioni - 2
 Le espressioni relazionali combinano due valori
aritmetici (letterali, variabili o costanti) con un
operatore relazionale e producono un risultato di
tipo LOGICAL, vero o falso:

Ad esempio, 5.LE.3 produce il risultato .FALSE.

 Le espressioni logiche combinano operandi di


tipo logico e/o espressioni relazionali con
operatori logici e producono un risultato di tipo
logico.

Ad esempio,
IMPLICIT NONE
LOGICAL A
REAL B, C
DATA A/.TRUE./B/2/C/1.57/
A = A.AND.B.LE.C

produce il risultato .FALSE.

 In sintesi, nello scrivere espressioni occorre:


o ·Rispettare alcune regole sui tipi delle
variabili, costanti, letterali od espressioni
(anche le espressioni hanno un tipo!) che
vengono combinate.
o ·Ricordare la priorità degli operatori che si
utilizzano, utilizzando in caso di necessità o
dubbio le parentesi.
Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 13 di 82
Conversioni di tipo automatiche.
 Nella valutazione di una espressione i tipi
coinvolti devono, sottoespressione per
sottoespressione, essere omogenei;

 se questo non è vero, il compilatore tenta una


conversione automatica di tipo
(“promozione”) dell’argomento di tipo
meno”forte” verso quello di tipo più forte;
se questo non è possibile viene segnalato errore.

 Nelle espressioni miste le promozioni possibili


sono da INTEGER a REAL e da REAL a DOUBLE
PRECISION.

Nelle operazioni di assegnamento sono possibili


conversioni automatiche di tipo che comportano
perdita di informazione (p.e., un valore reale che
viene assegnato ad una variabile intera viene
troncato o un valore in virgola mobile convertito
erroneamente). Esempio:
REAL A, E
INTEGER B, C
DATA A/1./E/1E38/
WRITE(*,*) A, E
B = E
C = A
WRITE(*,*) C, B

stampa per B un valore negativo molto grande.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 14 di 82


Sottoprogrammi
 Sono parti di un programma dedicate ad una
specifica funzione; si basano sull’idea del
delegare un compito ad un sottoposto.

 Ad esempio, il linguaggio FORTRAN mette a


disposizione alcuni sottoprogrammi predefiniti
per il calcolo (p.e. SIN(), COS(), MOD()…) che
ritornano un valore utilizzabile in una istruzione
di assegnamento:

REAL A
A=SIN(0.5)

 Poiché il linguaggio non può mettere a


disposizione tutti i possibili sottoprogrammi,
viene data all’utente la facoltà di definirne di
propri.

 Come vedremo, sono particolarmente utili se


una parte del codice deve essere ripetuta più
volte, eventualmente a partire da punti diversi
del programma chiamante e/o operando su dati
diversi.

 Spesso, infatti, un sottoprogramma accetta uno


o più argomenti (o parametri) su cui opererà
nello svolgere i compiti per cui è stato
progettato.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 15 di 82


Funzioni interne
Si riporta, per comodità, la lista delle funzioni
interne messe a disposizione dal linguaggio.

ABS(X) Valore assoluto


ACOS(X) Arcoseno
ASENX(X) Arcseno
ATAN(X) Arctangente
COS(X) Coseno
COSH(X) Coseno Iperbolico
EXP(X) Esponenziale base e
INT(X) Segno di X per il più grande
intero non superiore a ABS(X)
LOG(X) Logaritmo naturale
LOG10(X) Logaritmo in base 10
MAX(X1, X2, …) Massimo di X1, X2, ...
MIN(X1, X2, …) Minimo di X1, X2, ...
MOD(X, Y) X-Y*INT(X/Y)
NINT(X) Arrotondamento al più vicino
intero
SIGN(X, Y) segno di Y per ABS(X)
SIN(X) Seno
SINH(X) Seno Iperbolico
SQRT(X) Radice quadrata
TAN(X) Tangente
TANH(X) Tangente iperbolica

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 16 di 82


Funzioni e procedure
 Abitualmente i sottoprogrammi possono essere
di due tipi:

o ·Le funzioni sono simili alle funzioni


matematiche: al termine del proprio lavoro
restituiscono un valore (e uno solo).
I sottoprogrammi predefiniti dal linguaggio
fortran sono funzioni, dette funzioni interne
in contrapposizione a quelle definite
dall’utente, le funzioni esterne.

o ·Le procedure al contrario non


restituiscono alcun valore: producono
invece degli effetti (p.e.,la stampa di un
valore a video, la modifica del valore di una
variabile…).

 In generale, un effetto che viene esercitato dal


sottoprogramma sul programma chiamante in
un modo diverso dalla restituzione esplicita di
un valore prende il nome di effetto collaterale.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 17 di 82


Dichiarare sottoprogrammi - 1
 In ogni caso, prima di essere utilizzato un
sottoprogramma deve essere definito (o
dichiarato); in questa fase occorre scegliere il
tipo di sottoprogramma, il tipo e il nome dei
parametri formali (segnaposto formali dei veri
valori dei parametri), il tipo del valore restituito,
se presente, e che cosa il sottoprogramma fa.

 Dopo che il programma è stato definito, esso


può essere usato (invocato, chiamato): se ne
richiede l’esecuzione come si farebbe per un
sottoprogramma predefinito, passandogli degli
effettivi valori numerici su cui operare (i
parametri attuali).

 In Fortran:
Una funzione si definisce facendo uso della
parola chiave FUNCTION:

FUNCTION NOMEF(arg1, …, argn)


dichiarazioni
:
:
istruzioni eseguibili
:
:
NOMEF=espressione
RETURN
END

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 18 di 82


Dichiarare sottoprogrammi - 2

PROGRAM AREAC
C Programma che calcola l'area di un
Pcerchio
IMPLICIT NONE
REAL R, AREA, ACIRC
DATA R/0/AREA/0/
WRITE(*,*) 'Immetti un valore
Preale'
READ(*,*) R
AREA = ACIRC(R)
WRITE(*,*) 'Il cerchio di raggio
P',R,' ha area ',AREA
STOP
END

REAL FUNCTION ACIRC(RAGGIO)


IMPLICIT NONE
REAL RAGGIO, PI
PARAMETER (PI=3.14159265)
ACIRC = PI*RAGGIO**2
RETURN
END

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 19 di 82


Dichiarare sottoprogrammi - 3
 Notiamo che:
o Nel programma chiamante occorre
dichiarare una variabile con lo stesso
nome (e tipo restituito) della funzione

o Nel programma chiamante occorre


dichiarare i parametri attuali che hanno
la forma di variabili di tipo opportuno;

o Nella funzione chiamata occorre dichiarare


i parametri formali: hanno la forma di
variabili con lo stesso tipo dei parametri
attuali corrispondenti in posizione.

o Nella funzione chiamata occorre dichiarare


il tipo di ritorno: ha la forma di una
variabile con lo stesso nome della funzione.
Si dichiara preferibilmente premettendo il
nome del tipo alla parola chiave FUNCTION,
oppure nel modo tradizionale. A questa
variabile, nell’ambito della funzione, sarà
assegnato il valore da restituire.

o L’ istruzione RETURN prende il posto di


STOP e conclude l’esecuzione della funzione,
restituendo al programma chiamante il
controllo ed il valore prodotto.
Sia il programma che il sottoprogramma
sono conclusi da una propria istruzione END.
Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 20 di 82
Legame dei parametri
 All’atto della chiamata di un sottoprogramma
avviene il cosiddetto legame dei parametri,
cioè l’associazione fra parametri attuali
(valori) e parametri formali (nomi).

 In generale, l’associazione avviene su base


posizionale, quindi i termini omologhi della lista
dei parametri attuali e dei parametri formali
devono avere gli stessi tipi.

 Il legame dei parametri può, in generale,


avvenire in due modi diversi, per valore e per
indirizzo (dipende dal linguaggio).

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 21 di 82


Legame per valore

 Nel legame dei parametri per valore (tipico


ad esempio di C e Java):

o si crea, all’interno del sottoprogramma


chiamato, una nuova copia del valore
contenuto nel parametro attuale passato
(che questo sia una variabile o che sia u
letterale o una espressione) e la si assegna
al parametro formale, che nel
sottoprogramma agisce come una variabile
locale a questo;

o dunque, una alterazione del parametro


formale all’interno del sottoprogramma
non si riflette sul valore del parametro
attuale.

o Il prezzo è un maggior uso di memoria (si


crea un duplicato dei dati).

o Si riduce il rischio di malfunzionamenti


del programma dovuto ad effetti collaterali
non previsti durante il suo sviluppo.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 22 di 82


Legame per indirizzo

 Nel legame dei parametri per indirizzo:

o si passa al sottoprogramma chiamato


l’indirizzo della cella di memoria in cui è
contenuto il valore del parametro attuale;

o il parametro formale diviene quindi il


secondo nome (alias) di una unica copia
dei dati su cui operano sia il programma
chiamante che il sottoprogramma.

o In questo caso si ha un risparmio di


memoria (c’è una unica copia del dato);

o Occorre prestare grande attenzione perché


una alterazione del parametro formale
altera anche il valore del parametro
attuale attraverso un effetto collaterale
che, se non considerato attentamente in
fase di stesura del programma, può
portare a malfunzionamenti.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 23 di 82


Il legame dei parametri in
Fortran - 1
 Cerchiamo di capire, eseguendo il programma
che segue, se il legame dei parametri in Fortran
avviene per valore o per indirizzo.

PROGRAM LEGAME
IMPLICIT NONE
INTEGER A, B, INC
DATA A/0/B/0/
WRITE(*,*) 'Prima di INC: A= ', A,
P' B= ', B
B = INC(A)
WRITE(*,*) 'Dopo INC: A= ', A,
P' B= ', B
STOP
END

INTEGER FUNCTION INC(DATO1)


IMPLICIT NONE
INTEGER DATO1
DATO1 = DATO1 + 1
INC = DATO1
RETURN
END

 Se il valore del parametro attuale, A, del


programma chiamante viene alterato durante
l’esecuzione (cambiato da zero ad 1) il legame
dei parametri è per indirizzo.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 24 di 82


Il legame dei parametri in
Fortran - 2

 L’output prodotto dall’esecuzione del


programma è:

Prima di INC: A = 0 B = 0
Dopo INC: A=1B=1

 In Fortran il legame dei parametri avviene


quindi per indirizzo. Per questo:

o ·Esiste una unica copia dei dati per il


programma chiamante e il
sottoprogramma.

o ·Il parametro attuale ed il parametro


formale sono due nomi diversi (alias)
per questa unica copia dei dati.

o ·Una alterazione del parametro formale


all’interno del sottoprogramma si
riflette in una alterazione del parametro
attuale (effetto collaterale).

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 25 di 82


Il legame dei parametri in
Fortran - 3
 ·Ogni parametro è bidirezionale, cioè oltre
che per passare un dato al sottoprogramma
chiamato, può anche essere usato per
restituire un valore dal sottoprogramma al
programma chiamante (effetto collaterale).

 Usare degli effetti collaterali quando si


scrivono delle funzioni è da considerarsi un
errore di programmazione, e deve essere
assolutamente evitato. Nel precedente
programma è stato fatto solo a fini didattici; in
un caso reale, la funzione INC scritta con uno
stile di programmazione corretto (priva di effetto
collaterale) sarebbe stata:

INTEGER FUNCTION INC(DATO1)


IMPLICIT NONE
INTEGER DATO1
INC = DATO1 + 1
RETURN
END

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 26 di 82


Dichiarare sottoprogrammi - 4
 Una procedura si definisce facendo uso della
parola chiave SUBROUTINE:

SUBROUTINE nome(arg1, …, argn)


dichiarazioni
:
:
istruzioni eseguibili
:
:
RETURN
END

 La dichiarazione dei parametri attuali e dei


parametri formali viene fatta come per le
funzioni;

 Non è più necessario dichiarare un tipo di


ritorno, visto che una subroutine non restituisce
alcun valore;

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 27 di 82


Dichiarare sottoprogrammi - 5
 La subroutine viene chiamata con una
istruzione di CALL:

CALL nomesub

e, al termine della sua esecuzione, una


istruzione RETURN al suo interno restituisce il
controllo al programma chiamante, la cui
esecuzione prosegue dalla linea successiva alla
CALL.

 Nel caso delle subroutine è perfettamente


lecito l’uso degli effetti collaterali, che
consentono di restituire al programma
chiamante tanti valori quanti sono i parametri.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 28 di 82


Dichiarare sottoprogrammi - 6
PROGRAM PACIRC
C Programma che calcola l'area del cerchio di
Praggio dato
IMPLICIT NONE
REAL RAGGIO, AREA
DATA RAGGIO/0/AREA/0/
CALL LEGGI(RAGGIO)
CALL CALC(RAGGIO, AREA)
CALL SCRIVI(RAGGIO, AREA)
STOP
END

SUBROUTINE LEGGI(R)
IMPLICIT NONE
REAL R
WRITE(*,*) 'Immetti un valore reale'
READ(*,*) R
RETURN
END

SUBROUTINE CALC(R, A)
IMPLICIT NONE
REAL R, A, PI
PARAMETER (PI=3.14159265)
A = PI*R**2
RETURN
END

SUBROUTINE SCRIVI(R, A)
IMPLICIT NONE
REAL R, A
WRITE(*,*) 'Il cerchio di raggio ',R,
P' ha area ',A
RETURN
END

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 29 di 82


Visibilità delle variabili
 Si parla di visibilità di una variabile (o di suo
scopo) intendendo la porzione di programma
in cui la variabile può essere utilizzata
(alterata o valutata, comunque accessibile).

 In Fortran tutte le variabili sono locali alla


porzione di programma in cui sono state
dichiarate (programma principale o
sottoprogramma che sia). Il tentativo di riferirsi
ad una variabile non visibile produce un errore
di compilazione.

 Fanno - in un certo senso - parziale eccezione i


parametri attuali, che sono a tutti gli effetti
variabili dichiarate nel programma chiamante e
locali a questo, ma i cui valori vengono resi
accessibili - con il nome dei parametri formali -
al sottoprogramma chiamato.

 In ogni caso, nel sottoprogramma occorre


dichiarare i parametri formali anche se questi
sono, in realtà, solo un alias dei parametri
attuali.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 30 di 82


Tempo di vita delle variabili.
 Per tempo di vita di una variabile si intende
l’intervallo temporale in cui questa
permane in memoria.

 In Fortran le variabili locali ad un sottoprogram-


ma permangono in memoria fino a quando
non viene eseguita l’istruzione RETURN per
rendere il controllo al programma chiamante; in
tal momento le variabili del sottoprogramma
cessano di esistere (vengono distrutte – si dice
che divengono indefinite - e la memoria loro
associata viene rimessa a disposizione delle
unità di programma in esecuzione).

 Se si desidera conservarne il valore di una


variabile per usarlo in un futuro rientro
nella stessa unità di programma (cioè, nel
sottoprogramma), occorre salvarlo con
l’istruzione SAVE:

SAVE nome1, nome2,…

Se non si specifica una lista di nomi di variabili


da salvare, vengono salvate tutte le variabili
locali (ad eccezione dei parametri formali, che
non vengono salvati).

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 31 di 82


Strutture di controllo - 1
 L’utilità dei sottoprogrammi è in gran parte
legata alla possibilità di eseguirli selettivamente
o ripetutamente al ricorrere di certe condizioni.

 Ciò è consentito dalle strutture di controllo


dell’esecuzione presenti nei linguaggi di
programmazione; queste si dividono in tre
gruppi: sequenza, selezione ed iterazione.

 Sequenza
E’ la struttura di controllo più semplice; modella
l’esecuzione sequenziale delle istruzioni propria
dell’architettura di Von Neumann e in Fortran si
ottiene giustapponendo le istruzioni una
dopo l’altra.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 32 di 82


Strutture di controllo - 2
Selezione
 Consente di selezionare - se una certa
espressione logica è verificata - uno fra più
percorsi di elaborazione alternativi, ciascuno
composto da una o più istruzioni (fra cui
eventuali chiamate a sottoprogrammi); in
Fortran si implementa con il costrutto IF:

IF (espressione logica) THEN


Istruzioni
ELSE IF (espressione logica) THEN
Istruzioni
:
:
(Altre clausole ELSE IF (espressione) e relative
istruzioni)
:
:
ELSE
Istruzioni
END IF

 Le clausole IF…THEN ed END IF sono


obbligatorie, tutte le altre opzionali; possono
esservi una o più clausole ELSE IF…THEN.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 33 di 82


Strutture di controllo - 3
 La forma più elementare di costrutto IF:

IF (Espressione logica) Singola istruzione

si dice IF logico; era la più efficace istruzione IF


prima della definizione del Fortran 77. Deve
occupare una singola riga.

 Scriviamo ad esempio un programma che, dati


tre numeri reali, verifica se esiste un triangolo
con lati di quella lunghezza e lo classifica
secondo la loro lunghezza. Un algoritmo di
soluzione può essere il seguente:

Leggi a, b, c;
SE non sono i lati di un triangolo (un lato di un
triangolo è sempre minore della somma degli
altri due) ALLORA stampa ‘Non è un triangolo’;
ALTRIMENTI SE i tre lati sono fra loro eguali
ALLORA stampa ‘Il triangolo è equilatero’
ALTRIMENTI SE due lati sono fra loro uguali
ALLORA stampa ‘Il triangolo è isoscele’
ALTRIMENTI stampa ‘Il triangolo è scaleno’
FINE dell’esecuzione

L’algoritmo si traduce nel programma Fortran:

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 34 di 82


Strutture di controllo - 4

PROGRAM TRIA
IMPLICIT NONE
REAL A, B, C
DATA A/0/B/0/C/0/
WRITE(*,*) 'Immetti le lunghezze dei tre lati separate da
Pvirgola'
READ(*,*) A, B, C
IF ((A.GT.(B+C)).OR.(B.GT.(A+C)).OR.(C.GT.(A+B))) THEN
WRITE(*,*) 'Non è un triangolo'
ELSE IF ((A.EQ.B).AND.(B.EQ.C)) THEN
WRITE(*,*) 'Il triangolo è equilatero'
ELSE IF ((A.EQ.B).OR.(B.EQ.C).OR.(C.EQ.A))THEN
WRITE(*,*) 'Il triangolo è isoscele'
ELSE
WRITE(*,*) 'Il triangolo è scaleno'
END IF
STOP
END

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 35 di 82


Strutture di controllo - 5
 Si noti l’uso degli operatori relazionali e degli
operatori logici per formare espressioni logiche
complesse. Gran parte delle parentesi (a parte
quelle più esterne, richieste dal costrutto if)
sono state inserite solo per migliorare la
leggibilità dell’espressione: le precedenze degli
operatori avrebbero comunque forzato il giusto
ordine di valutazione delle espressioni.

 L’incolonnamento è stato usato per evidenziare


la struttura del costrutto e migliorare quindi la
leggibilità del programma.

Iterazione

 Le istruzioni di iterazione permettono di ripetere


un certo segmento di codice, e le eventuali
chiamate di sottoprogramma che contiene, per
un numero predefinito di volte o finchè una
condizione è verificata.

 Il linguaggio Fortran prevede istruzioni di


controllo dell’iterazione diverse da quelle dei
linguaggi più recenti. Per facilitare la transizione
verso linguaggi più moderni, esporremo i
costrutti di controllo dell’iterazione più recenti e
vedremo poi come si implementano in Fortran.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 36 di 82


Strutture di controllo - 6

Il costrutto while:

 Nei linguaggi più recenti ha la forma:

while (espressione logica)


sequenza di istruzioni delimitata

Si valuta l’espressione logica e , se questa è


vera, si esegue la sequenza di istruzioni una o
più volte, fino a quando l’espressione logica
continua ad essere valutata vera.

 La espressione logica viene valutata prima


di eseguire la sequenza di istruzioni, che
quindi può non essere mai eseguita se la
condizione logica non è mai verificata.

 Il Fortran non offre questo costrutto di controllo;


esso deve essere simulato utilizzando una
clausola IF e l’istruzione GOTO etichetta:

(label) IF (espressione logica) THEN


sequenza di istruzioni
GOTO (label)
ENDIF

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 37 di 82


Strutture di controllo - 7

 L’istruzione GOTO (labeln) consente di trasferire


il controllo alla istruzione con etichetta labeln. A
questo proposito occorre notare che:

o Non è ammesso trasferire il controllo


all’interno di un costrutto IF;

o E’ cattiva prassi di programmazione (errore)


usare clausole GOTO in situazioni diverse
dalla simulazione di cicli while e do…while.

 Riportiamo, a titolo di esempio, un programma


che legge dati da tastiera, facendone l’eco,
finchè non incontra uno zero:

PROGRAM WHILE
IMPLICIT NONE
INTEGER A
A = 1
100 IF (A.NE.0) THEN
WRITE(*,*) 'Immetti un intero'
READ(*,*) A
WRITE(*,*) 'Hai immesso ',A
GOTO 100
ENDIF
STOP
END

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 38 di 82


Strutture di controllo - 8

Il costrutto do…while

 Nei linguaggi più recenti ha la forma:

Do
Sequenza di istruzioni delimitata
While(espressione logica)

È analogo al costrutto while, ma con la


(importante) differenza che la espressione
logica viene valutata per la prima volta dopo
aver eseguito la sequenza di istruzioni , che
viene quindi eseguita almeno una volta.

 Il Fortran non offre questo costrutto di controllo;


esso deve essere simulato utilizzando una
clausola IF logico e l’istruzione GOTO
etichetta:

(label) CONTINUE
sequenza di istruzioni
IF (espr. logica) GOTO (label)

 Modifichiamo, a titolo di esempio, il programma


che legge dati da tastiera prima visto con l’uso
di un ciclo do…while:

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 39 di 82


Strutture di controllo - 9

PROGRAM DOWHIL
IMPLICIT NONE
INTEGER A
100 CONTINUE
WRITE(*,*) 'Immetti un intero'
READ(*,*) A
WRITE(*,*) 'Hai immesso ',A
IF (A.NE.0) GOTO 100
STOP
END

 L’istruzione CONTINUE non ha in realtà alcun


effetto: è solo un segnaposto con etichetta e si
limita a marcare il punto a cui viene trasferito il
controllo e da cui l’esecuzione continua
sequenzialmente.

 Notiamo che il codice è più compatto ed


elegante: il costrutto do…while è più adatto del
costrutto while ad una situazione in cui occorre
aver letto un dato (e quindi aver eseguito il
ciclo) per poter decidere se ripeterlo.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 40 di 82


Strutture di controllo - 10

Il costrutto for

 For(Istruzione1; espr. Logica; istruzione2)


Sequenza di istruzioni delimitata

Gestisce in modo naturale la ripetizione di una


sequenza di istruzioni per un numero predefinito
di volte. Quando si incontra questo costrutto:

1. viene dapprima eseguita l’istruzione1 per


inizializzare la variabile di controllo del ciclo
(usata tipicamente come un contatore);

2. si valuta poi l’espressione logica: se questa è


falsa si termina il costrutto senza eseguire la
sequenza di istruzioni, se è vera si esegue la
sequenza;

3. Si esegue poi la istruzione2, che tiene traccia


dell’esecuzione (tipicamente incrementando la
variabile contatore). Si torna infine al punto 2.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 41 di 82


Strutture di controllo - 11

 In Fortran viene realizzato, sia pure in modo meno


sofisticato, con il costrutto DO loop:

DO labeln nomevar = espr1, espr2, espr3


sequenza di istruzioni
labeln CONTINUE

 In generale, il DO-loop:

DO 100 ITER = I1, I2, I3


Corpo del DO-loop
100 CONTINUE

equivale alla sequenza di istruzioni:

ITER = I1
100 IF(ITER.LE.I2)
Corpo del DO-loop
ITER = ITER + I3
GOTO 100
ENDIF

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 42 di 82


Strutture di controllo - 12
 Ad esempio, il programma che segue legge 10
numeri dalla tastiera e ne calcola e stampa la
somma a video:

PROGRAM FOR
C Dimostra il DO loop (for)
IMPLICIT NONE
INTEGER A
REAL B, C
C = 0
DO 100 A = 1, 10, 1
WRITE(*,*) 'Immetti un numero'
READ(*,*) B
C = C+B
100 CONTINUE
WRITE(*,*)'La somma è ', C
STOP
END

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 43 di 82


Array - 1
 Un array è una sequenza di variabili dello stesso
tipo; è l’astrazione del vettore matematico ed è
individuato da un unico nome di variabile. Ogni
elemento dell’array è poi distinto da un preciso
valore di indice. Come le variabili, prima di poter
essere usato (assegnando valori o valutando i suoi
elementi) deve essere dichiarato.

Dichiarazione di un array
 La dichiarazione di un array è l’insieme di una
dichiarazione di tipo e di una di dimensione.
Si fa indicando il tipo delle variabili componenti, il
nome dell’array e i valori minimo e massimo
dell’indice fra parentesi e separati da “:”; ad
esempio:

INTEGER ETA (-10:20)

Dichiara un array di 31 elementi interi con indice


da -10 a 20 e nome collettivo ETA.

 E’ comune la dichiarazione semplificata in cui si


omette il valore minimo dell’indice, sottintendendo
che l’indice parta da 1:

REAL A(20)

dichiara un array di 20 elementi reali con indice da


1 a 20.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 44 di 82


Array - 2
 Gli array devono essere dichiarati (anche nel caso
di uso della dichiarazione implicita) per consentire
al compilatore di:
1. riservare loro la memoria necessaria;
2. distinguere l’istruzione di accesso ad un
elemento dell’array dalla chiamata di una
funzione definita dall’utente. Ad esempio, nel
segmento di programma:

PROGRAM PIPPO
REAL TOPO
:
:
A = ABS(L)
B = PLUTO(I)
C = TOPO(J)
:
:
END

ABS(L) è una chiamata ad una funzione interna,


PLUTO(I) è una chiamata ad una funzione
definita dall’utente e TOPO(J) valuta un
elemento dell’array TOPO; queste due ultime
istruzioni hanno eguale sintassi e possono
essere distinte dal compilatore solo grazie alla
presenza della dichiarazione dell’array TOPO.
La stessa espressione ha quindi tre potenziali
interpretazioni.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 45 di 82


Array - 3
Uso degli array
All’elemento i-esimo di un array si accede con la
notazione A(I), dove I può essere un letterale o una
espressione intera; ad esempio, il tredicesimo
elemento dell’array PIPPO è PIPPO(13).
Un elemento di un array viene usato (assegnato,
valutato) come una variabile.
L’uso degli array è molto pratico in unione ai DO-
loop; in tal caso l’indice del loop può essere usato
come indice dell’array (o per calcolarlo); ad
esempio, questo segmento di programma legge dei
dati in ingresso e li memorizza in vettori:

PROGRAM SEARCH
IMPLICIT NONE
INTEGER N
PARAMENTER (N=100)
INTEGER SEX(N), AGE(N)
REAL HEIGTH(N)
DO 10 I= 1, N
READ(*,*) SEX(I), AGE(I), HEIGTH(I)
IF (SEX(I).EQ.9) GOTO 11
10 CONTINUE
11 :
:
END
NOTA: l’uso della costante simbolica N rende
parametrico il programma: cambiandone il valore si
modificano le dimensioni di tutti gli array e il
massimo indice del DO-loop.
Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 46 di 82
Array - 4
Il nome dell’array privo di indici si riferisce all’intero
array e può essere usato solo:
1. come argomento di un sottoprogramma;
2. nell’inizializzazione di un intero array, con
l’istruzione DATA;
3. con istruzioni di I/O, quando si legga o scriva
un intero array.

Array come argomenti di sottoprogrammi


Nel caso che si passi un array come parametro ad
un sottoprogramma, in questo si avrà necessità di
dichiarare l’array (nel parametro viene passato il
solo indirizzo di base dell’array e il sottoprogramma
non ne conosce la dimensione). Si hanno due
possibilità:
1. Si assegna all’array una dimensione fissa,
presumibilmente tale da soddisfare le possibili
necessità. Soluzione non consigliata.
2. Soluzione consigliata: si usa una
dichiarazione di array modificabile, in cui la
dimensione dell’array è un parametro formale.
Nei sottoprogrammi questo è consentito.

Scriviamo ad esempio un programma che acquisisce


da tastiera 20 interi che memorizza in un array e ne
calcola la media utilizzando una funzione reale che
accetta come parametri l’array di valori e la sua
dimensione:

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 47 di 82


Array - 5
PROGRAM ARRAY0
IMPLICIT NONE
INTEGER N
PARAMETER (N=20)
REAL A, MEDIA, X(N)
DATA A/0/X/N*0/
WRITE(*,*)'Immetti 20 valori'
READ(*,*) X
A = MEDIA(X, N)
WRITE(*,*) 'La media e''', A
STOP
END

REAL FUNCTION MEDIA(X, N)


IMPLICIT NONE
INTEGER N, I
REAL X(N)
MEDIA = 0
DO 10 I=1, N
MEDIA = MEDIA + X(I)
10 CONTINUE
MEDIA = MEDIA/N
RETURN
END

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 48 di 82


Array - 6
Inizializzare un array
1. Con l’istruzione DATA:

PROGRAM ARRAY1
IMPLICIT NONE
REAL A(20)
DATA A(1), A(2), A(3)/3*0./,A(20)/-1./

2. Uso dell’istruzione DATA con DO loop


implicito:

PROGRAM ARRAY2
IMPLICIT NONE
REAL A(20)
DATA (A(I),I = 1,3)/3*0./,A(20)/-1./

anche per inizializzazioni più sofisticate:

DATA(A(I), A(I+1),I = 1,19,3)/14*0.5/

3. Se l’array è inizializzato con tutti valori


uguali, basta usare nell’istruzione DATA il nome
dell’array seguito dai valori:

DATA A/20*0.0/

A titolo d’esempio riportiamo di seguito un program-


ma che gestisce piccoli database di dati antropome-

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 49 di 82


trici (età, peso, altezza, sesso) e consente di fare su
di essi diverse operazioni di ricerca e ordinamento.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 50 di 82


Esempio - 1
PROGRAM DATAB
IMPLICIT NONE
INTEGER N
PARAMETER (N=5)
CHARACTER OPCODE
CHARACTER*6 STR(4)
INTEGER ELEM, POS, SESSO(N), ETA(N)
REAL ALT(N), PESO(N)
DATA ELEM, POS/2*0/STR/' SESSO',' ETA',' ALT',' PESO'/
OPCODE = 'Z'
100 IF((OPCODE.GE.'A').AND.(OPCODE.LE.'Z'))THEN
WRITE(*,*) ''
WRITE(*,*) 'Batti A per popolare la base di dati'
WRITE(*,*) 'Batti B per ordinare i dati per selezione'
WRITE(*,*) 'Batti C per stampare la base di dati'
WRITE(*,*) 'Batti D per ricercare linermente un record'
WRITE(*,*) 'Batti E per trovare un record con RICBIN'
WRITE(*,*) 'Batti un numero per uscire'
WRITE(*,*) ''
READ(*,*) OPCODE
IF(OPCODE.EQ.'A') THEN
CALL LEGGI(SESSO, ETA, ALT, PESO, N)
Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 51 di 82
Esempio - 2
ELSEIF(OPCODE.EQ.'B') THEN
CALL SSORT(SESSO, ETA, ALT, PESO, N)
ELSEIF(OPCODE.EQ.'C') THEN
CALL STAMPA(STR, SESSO, ETA, ALT, PESO, N)
ELSEIF(OPCODE.EQ.'D') THEN
WRITE(*,*) 'CHE ETA'' CERCHI?'
READ(*,*) ELEM
CALL CERCAL(ETA, ELEM, N, POS)
IF(POS.LT.0) THEN
WRITE(*,*) 'Non trovato'
ELSE
WRITE(*,*) 'Trovato in posizione', POS
WRITE(*,*) SESSO(POS), ETA(POS), ALT(POS), PESO(POS)
ENDIF
ELSEIF(OPCODE.EQ.'E') THEN
POS = 1
WRITE(*,*) 'CHE ETA'' CERCHI?'
READ(*,*) ELEM
CALL CERCAB(ETA, ELEM, N, POS)
IF(POS.LT.0) THEN
WRITE(*,*) 'Non trovato'
ELSE
WRITE(*,*) 'Trovato in posizione', POS
WRITE(*,*) SESSO(POS), ETA(POS), ALT(POS), PESO(POS)
Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 52 di 82
Esempio - 3
ENDIF
ENDIF
GOTO 100
ENDIF
STOP
END

Il programma ripete ciclicamente (con un ciclo while) la visualizzazione di un


menù di scelta testuale, la lettura di un codice di operazione (un carattere che
individua l’operazione richiesta dall’utente) e la chiamata di quello dei
sottoprogrammi disponibili che svolge il compito desiderato, stampandone i
risultati.

Di seguito riportiamo anche i sottoprogrammi assieme ad un breve commento


sul loro funzionamento.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 53 di 82


Esempio - 4
SUBROUTINE LEGGI(A, B, C, D, N)
C
C Legge una tabella di record formati, nell'ordine,
C da due campi interi e due campi reali, organizzati
C in quattro array di eguali tipi. I dati sono ritornati
C per effetto collaterale al programma chiamante.
C La dimensione dei vettori (e quindi il numero di righe
C della tabella) è controllata dal parametro N.
C
IMPLICIT NONE
INTEGER I, N, A(N), B(N)
REAL C(N), D(N)
WRITE(*,*) 'Immetti i record: sesso, età, altezza, peso'
DO 100 I=1, N
WRITE(*,*) 'Immetti il record ',I
READ(*,*) A(I), B(I), C(I), D(I)
100 CONTINUE
RETURN
END

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 54 di 82


Esempio - 5
SUBROUTINE SSORT(A, B, C, D, N)
C
C Riceve una tabella di record formati,
C nell'ordine, da due campi interi e due
C campi reali e li ordina in senso crescen-
C te secondo i contenuti del secondo campo.
C La dimensione dei vettori (e quindi il
C numero di righe della tabella) è parame-
C trica e controllata dal parametro N.
C I dati sono restituiti al programma
C chiamante con effetto collaterale.
C
IMPLICIT NONE
INTEGER I, J, N, S, E, A(N), B(N)
REAL L, P, C(N), D(N)
DO 100 I=1, N-1
DO 100 J=I+1, N
IF(ETA(I).GT.ETA(J)) THEN
L = C(I)
E = B(I)
P = D(I)
S = A(I)
C(I) = C(J)
B(I) = B(J)
D(I) = D(J)
A(I) = A(J)
C(J) = L
B(J) = E
D(J) = P
A(J) = S
ENDIF
100 CONTINUE
RETURN
END

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 55 di 82


Esempio - 6
SUBROUTINE STAMPA(S, A, B, C, D, N)
C Accetta dal programma chiamante e stampa una linea di
C intestazione e una tabella di record avente, nell'ordine,
C due campi interi e due campi reali.
C La dimensione della tabella in linee ( e quindi la
C dimensione dei quattro vettori in cui è organizzata)
C è controllata dal parametro N.
IMPLICIT NONE
INTEGER I, N, A(N), B(N)
REAL C(N), D(N)
CHARACTER*6 S(4)
WRITE(*,5) (S(I), I=1,4)
DO 100 I=1, N
WRITE(*,10) A(I), B(I), C(I), D(I)
100 CONTINUE
RETURN
5 FORMAT(2A6, 3X, 2A6)
10 FORMAT(2I6, F9.1, F6.1)
END

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 56 di 82


Esempio - 7
SUBROUTINE CERCAL(B, E, N, I)
C Riceve dal programma chiamante un vettore intero B,
C di dimensione N e indici 0...N; vi ricerca linearmente
C l'elemento E e restituisce al programma chiamante l'indice
C I della prima occorrenza di E nel vettore, -1 se l'elemento
C non è presente.
IMPLICIT NONE
INTEGER I, E, N, B(N)
LOGICAL TROV
TROV = .FALSE.
DO 100 I=1, N
IF(B(I).EQ.E) THEN
TROV = .TRUE.
GOTO 200
ENDIF
100 CONTINUE
200 CONTINUE
IF(.NOT.TROV) I = -1
RETURN
END
Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 57 di 82
Esempio - 8

SUBROUTINE CERCAB(B, E, N, I)
C Implementa l'algoritmo di ricerca binaria in un vettore ordinato.
C Riceve dal programma chiamante un vettore intero B, di dimensione N
C e indici 0...N e l'indice I da cui iniziare la ricerca; se l'elemento
C E è presente nel vettore B(I)...B(N) restituisce in I al programma
C chiamante l'indice della prima occorrenza di E nel vettore,
C -1 se l'elemento non è presente.
IMPLICIT NONE
INTEGER E, I, N, P, Q, PM, B(N)
P = I
Q = N
100 CONTINUE
PM = (P+Q)/2
IF (B(PM).LT.E) P = PM+1
IF (B(PM).GT.E) Q = PM-1
IF ((B(PM).NE.E).AND.(P.LE.Q)) GOTO 100
IF (B(PM).EQ.E) THEN
I = PM
ELSE
I = -1
ENDIF
RETURN
END
Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 58 di 82
Operazioni di Input - Output - 1
 Avvengono con le istruzioni READ (ingresso) e
WRITE (uscita); entrambe possono essere usate in
due modi:

o a formato libero come fatto finora; le istruzioni


accettano allora come argomenti due asterischi
(il primo individua la periferica di default, la
tastiera per l’ingresso e il video per l’uscita) e
sono seguite dalla lista delle variabili interessate
(la lista di ingresso o la lista di uscita). Non è
necessaria alcuna altra informazione: il modo di
interpretare i dati e lo spazio loro riservato in
uscita sono determinati dal tipo delle variabili
che compaiono nelle liste di ingresso e di uscita..

o con formato. In questo caso le cose sono più


complesse. L’informazione da leggere
dall’ingresso o da scrivere sulla periferica di
uscita è costituita da un insieme di campi, in
generale non omogenei (di tipo diverso), ognuno
dei quali corrisponde ad una variabile o un
letterale all’interno del sistema. Il loro insieme
viene visto come un record di informazione,
dotato di un puntatore che individua il
prossimo carattere da leggere o da scrivere. Al
termine della lettura o scrittura di un campo, il
puntatore viene spostato a destra
(incrementato) di un numero di caratteri pari
alla larghezza del campo.
Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 59 di 82
Operazioni di Input - Output - 2
 Nel caso più generale di I/O con formato occorre
specificare un notevole numero di informazioni,
quali:

o Nella istruzione READ o WRITE, Il numero


della periferica interessata (normalmente 1 o 5
per l’ingresso, 2 o 6 per l’uscita; dipende dal
sistema. Vedremo poi anche come fare I/O su
file.), il riferimento (etichetta) di una
istruzione con informazioni sul formato del
record di informazione, una lista di
informazioni di ingresso o di uscita;

o Una istruzione FORMAT con etichetta; si tratta


di una istruzione non eseguibile, normalmente
posta prima della direttiva END, che ha per
argomento una lista di informazioni di
controllo, costituita da più specificatori di
formato, almeno uno per ogni informazione
presente nella lista di ingresso o di uscita.

 Per una operazione di READ la lista di ingresso


individua le celle di memoria destinazione dei dati
ed il loro tipo; gli specificatori di formato nella lista
di controllo consentono di interpretare i dati
presenti nel record di ingresso e determinano il
procedimento di transcodifica necessario per
convertirli nella loro rappresentazione interna al
calcolatore.
Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 60 di 82
Operazioni di Input - Output - 3
 Per una operazione di WRITE la lista di uscita
determina le celle di memoria origine dei dati ed il
loro tipo; gli specificatori di formato della lista di
controllo determinano poi il procedimento di
transcodifica cui sottoporli per ottenerne la
rappresentazione necessaria a soddisfare i requisiti
imposti dalla struttura voluta per il record di
uscita.

 Nella tabella sono riportati i più comuni


specificatori di formato. I formati F ed E (per
numeri reali) in ingresso coincidono (acquisiscono
comunque numeri in formato reale); in uscita
invece il formato F stampa il numero con un
numero fisso d di cifre decimali nel campo
assegnato, mentre il formato E lo stampa in
notazione scientifica con d cifre decimali dopo uno
zero e un esponente di quattro cifre del tipo Enn.

 I formati numerici (I, F, E) e alfabetici (A) sono


ripetibili (cioè, è possibile premettere un contatore
di ripetizione r che ripete il campo per r volte),
così come il formato X che impone di saltare un
carattere (spaziatura).

 I formati TC, TLn, TRn che spostano il puntatore


alla posizione C oppure di n posizioni a sinistra o a
destra non sono ripetibili.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 61 di 82


Operazioni di Input - Output - 4
Descrittore Significato in ingresso Significato in uscita
IW Leggi un intero nei prossimi W intero nelle successive W
caratteri posizioni
FW.d Leggi un reale nei prossimi W reale nelle successive W
caratteri; se manca il punto, posizioni, d cifre decimali
considera d cifre decimali
EW.d idem Formato scientifico su W
posizioni, d decimali
AW Leggi W caratteri alfanumerici Stringa su W posizioni
A Leggi tanti caratteri da riempire Stampa la voce della lista
la voce della lista d’ingresso come stringa
Nx Ignora i prossimi N caratteri Ignora le prossime N posizioni
TC Vai alla posizione C Vai alla posizione C
TLn Torna indietro di n posizioni Torna indietro di n posizioni
TRn Vai avanti di n posizioni Vai avanti di n posizioni
‘C1C2...CN’ Stampa la stringa fra apici
nHC1C2...CN Stampa gli n caratteri

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 62 di 82


Operazioni di Input - Output - 5
Alcuni esempi. Se si digita 123456789:

READ(*,103) K
103 FORMAT(4X, I5)
attribuisce a K il valore 56789

READ(*,104) I, J
104 FORMAT(I2, 3X, I3)
attribuisce a I il valore 12 e a J il valore 678.

Il codice:

I = 23
J = 715
K = -12
WRITE(*,201) I, J, K
201 FORMAT(3I5)
Stampa i valori ( simboleggia lo spazio):
23715-12

Le istruzioni:
X = 3.14159
Y = -275.3024
Z = 12.9999
WRITE(*,202) X, Y, Z
202 FORMAT(3F10.3)
Stampano i valori (il valore reale è arrotondato a d
cifre decimali!):
3.142-275.30213.000

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 63 di 82


Gestione delle stringhe - 1
Il Fortran consente di gestire dei dati di tipo
CHARACTER, che contengono un carattere del set
Fortran; è possibile dichiarare anche dei dati
CHARACTER di ampiezza multipla, in grado di
contenere stringhe, o array di caratteri o stringhe:

CHARACTER A dichiara A di un carattere


CHARACTER*6 A dichiara A stringa di 6
caratteri
CHARACTER*6 A(4) dichiara A array di quattro
stringhe, ciascuna di 6
caratteri.

Il set di caratteri FORTRAN è parzialmente ordinato:


la serie dei caratteri alfabetici è contigua e in ordine
crescente, così come la serie numerica 0 - 9, ma non
è definito - e dipende dal sistema - l’ordine relativo di
queste.

Pur essendo quindi possibile effettuare dei test di


ordinamento fra stringhe con i comuni operatori
relazionali (e verificare quindi che, ad esempio, A
precede C con il test A.LT.C, che viene valutato
TRUE) certi test (in particolare, quelli che
coinvolgono stringhe alfanumeriche) hanno un
risultato che dipende dal sistema.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 64 di 82


Gestione delle stringhe - 2
ATTENZIONE: se in una variabile stringa con una
certa ampiezza viene immagazzinata una stringa più
corta, questa viene estesa a destra con spazi che
rendono, a tutti gli effetti, la stringa lunga quanto la
variabile.

Sono disponibili alcuni operatori specifici per le


stringhe:

 L’operatore di concatenamento // consente


di concatenare due stringhe, ottenendo una
stringa di lunghezza pari alla somma delle due
componenti; ad esempio:
se A = ‘ABC’ e B = ‘DEF’, allora A//B vale
‘ABCDEF’.

 L’operatore di estrazione sottostringa : che


permette di estrarre da una stringa una sua
parte, o di assegnare ad una parte di una striga
un nuovo valore. Ad esempio, se:
A = ‘ABCDEF’, allora A(2:3) vale ‘BC’ e A(2:2)
vale ‘B’;

 L’operatore di assegnamento di stringhe o


sottostringhe =, opera analogamente
all’operatore di assegnamento numerico,
consentendo però di operare anche su
sottostringhe. Ad esempio, se:
B = ‘ABCDE’ e A = B(2:4), allora A vale ‘BCD’.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 65 di 82


Gestione delle stringhe - 3
ATTENZIONE: se una stessa stringa compare, in un
assegnamento, sia a sinistra che a destra del segno
di uguale, nessuna delle posizioni a cui è assegnato
un valore può comparire nell’espressione a destra.
Ad esempio:

A(4:6) = A(2:4) non è valida


A(4:6) = A(1:3) è valida

Sono poi disponibili alcune funzioni che operano sulle


stringhe, in particolare:

 LENGTH(A) restituisce la lunghezza di una


variabile stringa;

 INDEX(S1, S2) restituisce l’indice a cui compare


per la prima volta una stringa all’interno di una
altra stringa, 0 se non vi è contenuta. Ad
esempio, se:
S = ‘ABCDEFGH’, allora INDEX(S, ‘GH’)
restituisce 7, INDEX(S, ‘X’) restituisce 0.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 66 di 82


Esempio
PROGRAM STRING
C
C Programma che acquisisce da tastiera una
C stringa e la stampa in ordine inverso.
C
IMPLICIT NONE
CHARACTER*10 INSTR, OUTSTR, S*1
INTEGER I, J, L
DATA OUTSTR/''/L/0/
WRITE(*,*) 'Immetti una stringa senza
*spazi di al più 10 caratteri'
READ(*,*) INSTR
DO 5, I = 1, 10
IF (INSTR(I:I).NE.' ') THEN
L = L+1
ELSE
GOTO 6
ENDIF
5 CONTINUE
6 CONTINUE
DO 10 I = 1, L
J = L-I+1
OUTSTR(I:I) = INSTR(J:J)
10 CONTINUE
WRITE(*,*) OUTSTR
STOP
END

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 67 di 82


I file - 1
Un file è una sequenza di record; un file può essere
interno od esterno.

Un file interno è uno strumento di conversione dei


dati fra tipi diversi.

un file esterno è invece una raccolta di dati,


organizzati in record, memorizzati in modo non
volatile per un uso futuro (stampe, file su disco).

I file immagazzinati in una unità di memoria possono


essere sequenziali o ad accesso diretto.

I record, di cui i file sono costituiti, sono una


sequenza di campi di tipi differenti, ciascuno
contenente un valore. Si distinguono in formattati,
non formattati e di fine file.

Un record formattato può contenere solo caratteri


scelti fra i 49 del set Fortran e simboli speciali. Viene
usato soprattutto se il file deve essere usato per
scambiare dati con una altro computer.
Un record formattato viene scritto con una coppia di
istruzioni WRITE - FORMAT e letto con una coppia
READ - FORMAT.

WRITE(3, 200) A, B, N, M
READ(3, 200) A, B, N, M
200 FORMAT(2F10.3, 2I6)

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 68 di 82


I file - 2
La lunghezza del record, misurata in caratteri, è
determinata dalla somma delle ampiezze degli
specificatori di formato delle istruzioni FORMAT di
lettura e scrittura, che devono essere fra loro
compatibili.

E’ possibile usare anche un I/O guidato da lista, ma


in questo caso non è immediato determinare la
lunghezza del record (p.e. nel caso di specificatori ad
apici, e per la scrittura di valori numerici) e ciò può
dare problemi in fase di rilettura; in generale, lo I/O
guidato da lista non può essere usato se occorre
conoscere la lunghezza del record (p.e., nei file ad
accesso casuale).

Il record non formattato si usa quando i dati


devono essere riletti dallo stesso calcolatore e
programma. Ha il vantaggio che i dati vengono
memorizzati nello stesso formato interno al
calcolatore, evitando gli inevitabili errori commessi
nella conversione necessaria alla determinazione
dell’output formattato.
Il record in questo caso è quindi una successione di
valori la cui forma dipende dal calcolatore, dal
compilatore e dalla lista di variabili (cioè, dal
programma); per conoscerne la lunghezza occorre
conoscere la rappresentazione delle informazioni
all’interno della macchina.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 69 di 82


I file - 3
Il record non formattato viene scritto con una
istruzione WRITE priva dello specificatore di formato,
p.e:

WRITE(6) A, B, M, N
WRITE(UNIT=5, ERR=99) X, Y, Z

La lettura viene fatta con una analoga istruzione di


READ:

READ(6) A, B, M, N
READ(UNIT=5, END=98, ERR=99) X, Y, Z

All’interno delle istruzioni READ e WRITE possono


comparire, anche nei casi di semplice I/O verso video
o tastiera, o nel caso di record formattati, vari
specificatori di controllo; i più importanti sono:

UNIT = nunità
END = nlabel (solo per la READ)
ERR = nlabel
IOSTAT = ios (variabile intera)

Gli specificatori END e ERR dichiarano una etichetta a


cui far proseguire l’elaborazione in caso,
rispettivamente, di fine file o errore; IOSTAT dichiara
invece una variabile intera nella quale sono restituite
informazioni aggiuntive sugli errori, il cui significato
dipende però dal sistema.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 70 di 82


Il record di fine file
E’ un record speciale che marca la fine di un file.
E’ sempre utile, ma indispensabile in caso fi file ad
accesso sequenziale.

Si inserisce con l’istruzione ENDFILE:

ENDFILE u oppure ENDFILE(lista_specificatori)

Dove gli specificatori sono gli stessi dell’istruzione


WRITE.

Dopo l’istruzione ENDFILE il file resta posizionato


dopo il record di fine file e non sarà più possibile
leggere dal file o scrivervi finquando non si sarà
riposizionato il file con una istruzione REWIND o
BACKSPACE.
Il record di fine file non ha lunghezza definita;
protegge da errori che potrebbero impedire la
rilevazione della fine file provocando, se letto da una
istruzione di input, una condizione di fine file
gestibile con gli specificatori ERR e IOSTAT.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 71 di 82


Collegamento di un file esterno.
Prima di utilizzare una unità di I/O occorre
collegarla al programma in esecuzione usando la

istruzione OPEN: collega il file di nome fn al


programma, creando una connessione fra l’unità
logica di I/O e il file.
I record del file dovranno essere tutti formattati o
non formattati, secondo quanto previsto dallo
specificatore FORM della OPEN.

OPEN(lista_specificatori)
UNIT = u oppure u (obbligatorio)
FILE = nomefile
ACCESS = SEQUENTIAL|DIRECT
FORM = FORMATTED|UNFORMATTED
ERR = nlabel
IOSTAT = ios
RECL = lun

Gli specificatori ACCESS e FORM controllano il tipo di


accesso e formattazione del file, mentre RECL
dichiara la lunghezza del record del file (necessario
per i file ad accesso diretto).

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 72 di 82


Scollegare un file
Quando un programma termina la propria attività,
tutti i file collegati vengono automaticamente
scollegati conservandoli (nei casi visti).

E’ comunque possibile scollegare esplicitamente un


file con l’istruzione:

CLOSE(lista_specificatori)
UNIT = u (oppure u, obbligatorio)
STATUS = KEEP|DELETE
ERR = nlabel
IOSTAT = ios

Lo specificatore STATUS definisce la destinazione del


file (di default conservato (KEEP), altrimenti
cancellato), gli altri hanno i significati già visti.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 73 di 82


Utilizzo dei file sequenziali
I generale, l’operazione di scrittura o di lettura in un
file deve essere fatta in una opportuna posizione;
mentre nei file ad accesso diretto si può accedere
“senza formalità” ad un qualunque record, nei file ad
accesso sequenziale è necessario prima posizionarsi
immediatamente prima del record interessato con
uno dei comandi di posizionamento, che
posizionano il file immediatamente prima del record
corrente (che può così essere riletto) oppure subito
prima del primo record:

BACKSPACE u oppure BACKSPACE(lista_specificatori)


REWIND u oppure REWIND(lista_specificatori)

Dove la lista di specificatori comprende UNIT, ERR e


IOSTAT con i noti significati, solo UNIT è
obbligatorio.
ATTENZIONE: LA SOVRASCRITTURA DI UN RECORD
IN UN FILE SEQUENZIALE CAUSA LA DISTRUZIONE
DI TUTTE LE INFORMAZIONI (I RECORD) CHE LO
SEGUONO. E’ una pesante eredità dei drive a nastro.
La sovrascrittura selettiva dei record è possibile solo
per i file ad accesso diretto. Le istruzioni BACKSPACE
e ENDFILE permettono di posizionarsi dopo l’ultimo
record e aggiungere informazione al file:
:
20 READ(8, END = 21)
GOTO 20
21 BACKSPACE 8

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 74 di 82


Esempio
Un programma che crea un file contenente i numeri
interi da 1 a 40 in ordine crescente, organizzati in
dieci record di quattro elementi separati fra loro da
due spazi.

PROGRAM SF
INTEGER N, I
PARAMETER (N=40)
INTEGER DATI(N)
DO 10, I=1,N
DATI(I)=I
10 CONTINUE
OPEN(10, FILE='DATI.DAT')
WRITE(10,100) DATI
ENDFILE(10)
100 FORMAT(I9,1X,I9,1X,I9,1X,I9)
STOP
END

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 75 di 82


Uso dei file ad accesso diretto - 1
Consentono di:
 accedere ad un record specifico (individuato con
il numero progressivo dall’inizio del file) senza
dover riposizionare il file all’inizio e rileggerlo
tutto alla sua ricerca;
 sovrascrivere (modificare) uno specifico record
senza perdere tutta la parte di file che lo segue.

Richiedono che i record abbiano tutti la stessa


lunghezza massima predefinita: la posizione di inizio
record viene calcolata e non ricercata
sequenzialmente.

Il file ad accesso diretto viene sempre aperto dando


allo specificatore ACCESS il valore DIRECT e
dichiarando esplicitamente la lunghezza del record
con lo specificatore RECL = lun, lunghezza del record
misurata in caratteri per file formattati, in unità
dipendenti dal sistema per file non formattati.
Spesso i file ad accesso diretto sono non formattati
(risiedono sul disco rigido, che è fisso); l’apertura di
un file ad accesso casuale avviene di default come
file non formattato, diversamente occorre includere
esplicitamente all’apertura lo specificatore

FORM = FORMATTED

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 76 di 82


Uso dei file ad accesso diretto - 2
All’interno delle istruzioni READ e WRITE lo
specificatore REC = nrec consente di accedere in
lettura o scrittura ad un specifico record; il numero di
record può essere un letterale o una espressione
intera.

WRITE(7, REC = 20) A, B, C, D


READ(9, REC = I) X, Y, Z

Se in un file non formattato un record è più corto


della lunghezza massima prevista, esso viene
completato con valori finali indefiniti.

Nel caso di record formattati, il record viene invece


completato con spazi iniziali.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 77 di 82


Array multidimensionali
In Fortran è possibile usare array con fino a 7
dimensioni (cioè, con 7 indici).
Tali array vengono dichiarati in modo simile a
quanto avviene per gli array a una dimensione:
INTEGER MATRI1(-12:12, 3:9)
REAL TEMP(0:23, 365, 12)
REAL PROVA(12, 12, 8, 4)

L’inizializzazione dell’array può avvenire nei modi


visti per gli array monodimensionali, cioè leggendo
l’intero array con una READ (per l’ordine di lettura si
veda il paragrafo successivo), con una istruzione
DATA o, nel caso si voglia inizializzare solo una parte
dell’array, o si voglia seguire un ordine diverso, con
dei DO-LOOP impliciti, ad esempio:

READ (*,101) ((VOTO(I, J), J=1,M), I=1,N)

Legge l’array NxM VOTO per righe.


La memorizzazione dell’array avviene per colonne
(cioè, il primo indice è quello che varia più
rapidamente).
Questo è anche l’ordine usato anche nelle istruzioni
di I/O senza indici, in cui si acquisiscono o
stampano gli elementi dell’array. L’ordine in cui sono
dichiarati gli indici influenza quindi l’ordine di I/O e
deve essere attentamente pianificato. In alternativa,
è possibile forzare l’ordine di I/O usando dei DO-
LOOP impliciti.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 78 di 82


Array multidimensionali come
parametri formali - 1
Può essere fatta con una dichiarazione modificabile,
analoga a quella vista per gli array monodimensionali
(basta inserire nella lista dei parametri, oltre agli
array, tutte le loro dimensioni e usarle nel
sottoprogramma per dichiararne i parametri).
Il parametro formale può, sia per gli array mono che
pluridimensionali, avere dimensioni diverse e/o
inferiori ai parametri attuali; in questo caso, il
sottoprogramma opera solo su una parte degli
elementi del parametro attuale, localizzati in unico
blocco contiguo a partire dal suo indirizzo di base ed
interpretandoli in base alle dimensioni dichiarate per
il parametro formale. Ad esempio, dichiarando:

PROGRAM ESEMPI
INTEGER I, J
PARAMETER (I = 3, J = 3)
INTEGER A(I, J)
:
:
CALL PROC(A, I, J)
:
:
SUBROUTINE PROC(B, L, M)
INTEGER L, M, B(L-1, M)
:
:
END
Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 79 di 82
Array multidimensionali come
parametri formali - 2
La corrispondenza degli elementi è:
A(1,1) A(1,2) A(1,3) A(2,1) A(2,2) A(2,3) A(3,1)…
B(1,1) B(1,2) B(2,1) B(2,2) B(3,1) B(3,2)

Semplicemente, l’array attuale, memorizzato per


colonne in memoria secondo le dimensioni originali,
viene letto ancora per colonne (eventualmente in
modo parziale) ma interpretandolo secondo le nuove
dimensioni; se il parametro formale è un solo
elemento, questo corrisponderà al primo elemento
del parametro attuale.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 80 di 82


Variabili in doppia precisione
Memorizzano numeri in virgola mobile con un
maggior numero di cifre significative, utilizzando uno
spazio di memorizzazione doppio.
Dichiarano utilizzando la parola chiave
DOUBLE PRECISION:

DOUBLE PRECISION A, B(10)

Lo input-output viene fatto con gli specificatori F, ed


E con un adeguato numero di cifre significative.

I letterali vengono sempre scritti in formato


esponenziale, separando la mantissa dal campo
esponente con la lettera D:

16727D-3 232.957D0 1.297D7

Nelle espressioni miste con interi e reali questi


vengono promossi a double precision, quindi
l’espressione di double precision viene valutata con le
usuali regole.

Sottopongono il processore a un superlavoro, quindi


fanno crescere i tempi di esecuzione del 30% - 50%.

Le funzioni intrinseche hanno NOMI GENERICI: ciò


significa che possono accettare indifferentemente
argomenti interi, reali, in doppia precisione e,
spesso, complessi, restituendo valori di ugual tipo.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 81 di 82


Variabili complesse
Vengono immagazzinate in una coppia di valori reali
(REAL) posti in celle contigue come parte reale e
parte immaginaria. Si dichiarano con la parola chiave
COMPLEX seguita da una lista di nomi di variabili:

COMPLEX ZIN, ZOUT

L’ingresso-uscita viene fatto come coppie di valori


reali (cioè, con due specificatori F od E) per ogni
variabile complessa:

COMPLEX A
:
:
WRITE(6, 200) A
200 FORMAT(2F10.3)

Il letterale complesso viene scritto come una coppia


di letterali reali separati da virgola e racchiusi fra
parentesi:

(1.5, 7.3) (1.68E3, -15E-1)

Le quattro operazioni fra complessi vengono fatte


con le regole usuali dell’aritmetica complessa.
I numeri complessi possono formare espressioni
miste con i reali e gli interi, ma non con numeri in
doppia precisione. In espressioni miste i numeri sono
promossi a complessi con parte immaginaria nulla.

Informatica Grafica 2002 - 2003: Linguaggio Fortran - Pagina 82 di 82