You are on page 1of 210

l

"
I
,Il
I
, l
, (
i
l.
GIANNI AGUZZI
MARIA GRAZIA GASPARO
MARIA MACCONI
FORTRAN 77
Uno strumento
per il calcolo scientifico
PITAGORA EDITRICE BOLOGNA
PARTE J - CONCETTI FONDAMENTALI
I. GLI ALGORITMI E LA LORO DESCRIZIONE
1.1. Introduzione............................................ 3
1.2. Il linguaggio dei diagrammi a blocchi. . . . . . 9
1.3. Il linguaggio delle funzioni ricorsive . . . . . . . . . . . . . . . . . . . . . . . . . 14
000355
AIiIUUI/Gup."o
M.cc:onl
FORTRAMn
PIi.gora Edit.
ISBN88-371-0378-6
Copyright 1987 Pitagore Editrice s.r.l., Via del Legatore 3, Bologna
Tutti i diritti riservati Riproduzione vietata.
Composizione e stampa: Tecnoprint. ViD del Legatore 3, Bologna
Codice: 21/211
..
Indice
Prefazione . . . . . - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2. DAL LINGUAGGIOMACCHINA ALLA REALIZZAZIONE DEI LINGUAGGI
SIMBOLICI
2.1. Introduzione .
2.2. Unit hardware di un elaboratore convenzionale .
2.3. 11 linguaggio macchina .
2.4. I linguaggi simbolici .
2.5. La realizzazione di un linguaggio simbolico .
2.6. Il sistema operativo - .
3. RAPPRESENTAZIONE DEI NUMERI
3.1. Numeri interi .
3.2. Numeri reali. . . . . . . . . . . . . . . . . . . . . . . .
3.3. Rappresentazione finita ed errori di arrotondamento .
PARTE JJ IL FORTRAN 77
4. IL LINGUAGGIOFORTRAN
4.1. Introduzione .
4.2. Alfabeto
4.3. Costanti, nomi simbolici e parole chiave .
4.4. Frasi eseguibili e non eseguibili. .
4.5. Etichette - .
4.6. Il formato delle linee .
5. COSTANTI E VARIABILI: ELEMENTI FONDAMENTALI DI OGNI ISTRUZIONE
5.1. Le costanti ed il loro tipo .
XI
21
22
23
25
28
30
33
37
39
47
48
48
49
49
50
53
f
VI
VII
6.
7.
5.2. Le variabili ed il loro tipo .
5.3. L'istruzione IMPUCIT .
LE ESPRESSIONI
6.1. Espressioni aritmetiche .
6.2. Espressioni reiazionali .
6.3. Espressioni logiche .
6.4. Espressioni costanti .
Esercizi .
LA FRASE DI ASSEGNAZIONE
7.1. Introduzione
7.2. Assegnazione aritmetica .
7.3. Assegnazione logica .
Esercizi .
56
58
61
76
77
79
80
83
83
86
87
11. LE VARIABILI DIMENSIONATE
Il.1. Introduzione .
Il.2. Nomi di variabili dimensionate e istruzione DlMENSION .
Il.3. Nomi di elementi di variabile dimensionata .
IlA. Disposizione in memoria degli elementi di una variabile dimensionata .
11.5. Esempi di utilizzazione delle variabili dimensionate .
Esercizi .
12. ELABORAZIONE DELLE INFORMAZIONI DI TIPO CARATTERE
12.1. Memorizzazione dei caratteri .
12.2. Le costanti e le variabili di tipo carattere .
12.3. Sottostringhe ed espressioni carattere .
12A. Assegnazione fra stringhe di caratteri. .
12.5. Lettura e scrittura dei dati di tipo carattere .
12.6. Confronto tra espressioni carattere .
12.7. Funzioni intrinseche perla manipolazione dei caratteri .
Esercizi .
151
153
156
160
164
171
173
174
178
180
183
185
187
191
8. ALCUNI SEMPLICI PROGRAMMI
8.1. Introduzione .
8.2. Frasi di ingresso/uscita guidate dalla lista .
8.3. Le istruzioni PROGRAM, STOP e END .
8A. L'istruzione PARAMETER .
8.5. Altri esempi .
Esercizi .
9. SCELTE E DECISIONI
9.1. Controllo esplicito dell'esecuzione: !'istruzione GOTO-incondizionato .
9.2. Costrutto IFTHENELSE .
9.3. Strutture decisionali annidate .
9 A. Strutture decisionali concatenate .
9.5. Riepilogo .
9.6. If-logico: una struttura particolarmente semplice .
9.7. GOTO-calcolato .
9.8. IF-aritmetico .
Esercizi .
lO. CICLI
10.1. Strutture di ripetizione .
10.2. Istruzione DO .
10.3. Il cclo-Do .
10.4. Cicli e strutture decisionali .
10.5. Trasferimento ad istruzioni fuori del rango .
10.6. Cicli-D) annidati. .
Esercizi .
89
89
92
95
97
98
101
102
105
111
114
116
120
121
121
125
132
133
140
143
145
148
13. OPERAZIONI DIINGRESSO/USCITA CON FORMATO
13.1. Alcune considerazioni sulle frasi di ingresso/uscita guidate dalla lista .
13.2. Specificazioni di formato .
13.3. Rappresentazione dei dati numerici sui records di l/O .
BA. Il descrittore Iw per dati di tipo intero .
13.5. I descrittori Fw.d, Ew.d, DW.d per dati di tipo reale e doppia precisione .
13.6. I descrittori ripetibili per dati di tipo complesso .
13.7. I descrittori ripetibili per dati di tipo carattere .
13.8. Istruzioni di ingresso/uscita con formato relative ai mezzi standard .
13.9. Interazione fra lista di ingresso/uscita e specificazione di formato .
13.10. Controllo della spaziatura verticale su stampante .
13.11. I principali descrittori non ripetibili .
13.12. La lista di ingresso/uscita .
13.13. Le frasi READ (u, f) e WRITE (u, f) .
13.14. Esempi di stampa di variabili dimensionate .
13.15. Altri descrittori .
Esercizi
....................................................
]4. DEFINIZIONE E UTILIZZAZIONE DEI SOTTOPROGRAMMI
14.1. Programma principale e sottoprogrammi .
14.2. La prima istruzione di un sottoprogramma .
14.3. Il corpo di un sottoprogramrna e l'istruzione RETURN .
14.4. I sottoprograrnm SUBROUTINE e la frase CALL .
14.5. I sottoprogrammi FUNCTION .
14.6. Le funzioni definite da una frase .
14.7. Le funzioni intrinseche .
Esercizi .
193
194
197
198
199
202
203
205
208
214
215
219
222
223
228
234
239
243
244
245
252
259
261
271
VIII
IX
381
384
389
392
395
397
Differenze con il subset 1anguage .
Prncipali differenze fra il FORTRAN 77 e il FORTRAN 66 .
Ordinamento delle istruzioni F77 .
La codifica dei caratteri in ASCII e EBCDl' .
.......................
APPENDICI
Al.
A2.
A3.
A4.
Bibliograflll .
Indiceanalitim .
...........................
...................... .
15. ARGOMENTI MUTI ED ARGOMENTI ATTUALI
15.1. Associazione tra argomenti muti ed argomenti attuali. 275
15.2. Le variabili non dimensionate come argomenti muti " 275
15.3. Le variabili dimensionate come argomenti muti. " 277
15.4. Dimensionamento variabile e dimensionamento indefinito " 280
15.5. Argomenti muti di tipo carattere. . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 289
15.6. l nomi di sottoprogrammi come argomenti muti. Le frasi EXTERNAL e
INTRINSIC " 292
15.7. Asterischi come argomenti muti. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 299
Esercizi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 301
16. USO FLESSmlLE DELLA MEMORIA
16.1. L'istruzione COMMON. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 307
16.2. Utilizzazione dei blocchi COMMON " 309
16.3. L'istruzione EQUlVAlENCE " 316
16.4. Interazione fra istruzioni COMMON ed EQUIVALENCE " 319
16.5. La frase DATA 321
16.6. Sottoprogrammi BLOCK DATA " 325
Esercizi " 327
17. USO FLESSmlLEDEI SOTTOPROGRAMMI
17.1. Punti di ingresso secondari: l'istruzione ENTRY " 331
17.2. Punti di ingresso secondari di un sottoprogramma SUBROUTINE " 334
17.3. Punti di ingresso secondari di un sottoprogramma FUNCnON " 337
17.4. Le variabili interne di un sottoprogramma e l'istruzione SAVE " 341
17.5. I blocchi COMMON etichettati e l'istruzione SAVE " 347
Esercizi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 349
18. TRATTAMENTO DEI FILES
18.1. Introduzione..................................... 351
18.2. Records e files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 351
18.3. La forma generale delle frasi di I{O . . . . . . . . . . . . . . . . . . . . . . . 355
18.4. Connessione di un file esterno: frasi OPEN e CLOSE . . . . . . . . . . . . . . 359
18.5. Frasi di posizionamento: BACKSPACE e REWIND . . . . . . . . . . . . . . 365
18.6. Files ad accesso diretto. . . . . . . . . . . . . . . . . . . . . . . . . . . 368
18.7. Indagine sulle unit dillO e sui files: frase INQUIRE . . . . . . . . . . . . . . 371
18.8. Files interni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Esercizi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
I
\ \
Prefazione
In questo volume descritta l'ultima versione del linguaggio FORTRAN nota
come FORTRAN 77 e definita nel documento X3.9.1978 dell'American National
Standard Institute. Questa versione, ormai disponibile nella maggior parte degli
elaboratori elettronici, costituisce un importante strumento per la realizzazione
di programmi direttamente utilizzabili su sistemi di calcolo anche molto diversi
tra loro.
E' noto che le principali applicazioni del linguaggio FORTRAN sono di tipo
numerico ed per questo motivo che il testo rivolto principalmente a chiun-
que abbia interesse ad utilizzare un elaboratore per risolvere problemi di natura
scientifica o tecnica. Va per osservato che il FORTRAN 77 allarga le possibi-
lit di applicazioni anche a problemi di carattere gestionale in quanto permette
sia la manipolazione dei caratteri che l'utilizzazione di [iles di dati ad accesso
diretto. In ogni caso, una corretta utilizzazione del FORTRAN non pu prescinde-
re dalla conoscenza di alcuni prerequisiti che, secondo gli autori, devono far parte
del bagaglio culturale di chiunque utilizzi Wl elaboratore elettronico. Per questo
il testo diviso in due parti. La prima parte pu non interessare il lettore gi
esperto nell'uso dei linguaggi di programmazione ed costituita da tre capitoli
nei quali si danno le nozioni di base su alcuni argomenti fondamentali quali gli
algoritmi e la loro descrizione (capitolo 1), la struttura degli elaboratori elet-
tronici e la realizzazione dei linguaggi simbolici (capitolo 2), le modalit di rap-
presentazione dei numeri e gli errori di arrotondamento (capitolo 3J.
La descrizione del FORTRAN, oggetto della seconda parte del libro, orga-
nizzata in modo da fornire il pi rapidamente possibile gli strumenti necessari per
poter scrivere alcuni semplici programmi. Per questo, dopo aver descritto nei
capitoli 4, 5 e 6 gli elementi di base del linguaggio, le modalit di definizione
delle variabili e delle costanti e le caratteristiche della formalizzazione e valuta-
zione delle espressioni, nei capitoli 7 e 8 vengono presentate le istruzioni che
consentono di scrivere alcuni programmi completi comprendenti frasi di asse-
gnazione, di lettura dei dati e scrittura dei risultati.
...
XII
Nei due capitoli successivi vengono analizzati i costrutti che permettono di
realizzare in FORTRAN gli schemi teorici che stanno alla base della programma-
zione strutturata: nel capitolo 9 viene presentato il costrutto decisionale IF-
THEN-ELSE e nel capitolo lO quello di ripetizionecontrollato dalla istruzione DO.
Nel capitolo Il sono descritte le modalit di utilizzazione delle variabili di-
mensionate mediante le quali possibile tradurre in FORTRAN la notazione vet-
toriate comunemente usata nei problemi di natura scientifica, mentre il capitolo
12 dedicato alla descrizione delle possibilit offerte dal FORTRAN 77 per la
manipolazione di stringhe di caratteri.
Nel capitolo 13 vengono presentate le operazioni di ingresso/uscita con forma-
to. Questo argomento, estremamente vario in quanto il FOR TRAN 77 offre al
riguardo moltissime possibilit. viene affrontato cercando di fornire prima le
nozioni elementari e poi quelle pi sofisricate in modo da distinguere le cono-
scenze basilari da quelle necessarie solo per particolari operazioni di ingres-
so/uscita.
Nei capitoli 14, 15. 16 e 17 si trattano gli argomenti legati all'uso dei sottopro-
grammi ovvero alla possibilit di decomporre un programma in pi unit ciascuna
delle quali pu essere scritta e compilata in modo autonomo. Il testo si chiude
con il capitolo 18 nel quale vengono descritti il trattamento e la gestione dei
files di dati.
Nel testo l'iene rigorosamente descritta la sintassi delle istruzioni FORTRAN,
il significato e l'uso di ogni istruzione inoltre spiegato tramite numerosi e-
sempi. Sono anche sottolineate le differenze rispetto al FORTRAN 66 in modo
da rendere il libro utile a chi abbia a disposizione un sistema di calcolo che realiz-
za una versione del FORTRAN precedente al FORTRAN 77. Ogni capitolo
accompagnato da esercizi che permettono al lettore di verificare immediata-
mente il lil'ella di apprendimento raggiunto.
La stesura dei capitoli 2, 8, 16, 18 stata curata dal primo autore che si
anche occupato del trattamento della ricorsivu ( 1.3) e delle funzioni intrin-
seche ( 14.5). Il pro! Aguzzi si anche assunto il compito di verificare la
correttezza di tutti i programmi presentati nel testo, utilizzando a tale scopo un
elaboratore IBM PC AT con compilatore PROFORT 77 e un elaboratore VAX
11/730 con compilatore VAX-ll FORTRAN V 3.0. Il secondo autore ha curato
la stesura dei capitoli 1,4,11,13,14,15,17, mentre il terzo autore ha curato
quella dei rimanenti capitoli.
L'impostazione usata in questo testo stata seguita per insegnare il linguaggio
FORTRAN agli studenti dei corsi di Calcolo numerico tenuti a Firenze nel Corso
di laurea in Matematica e nella Facolt di Ingegneria, coinvolgendo, oltre agli
autori, i pro! F. Fontanella, A. Pasquali, P. Costantini e la d.ssa R. Morandi.
ai quali vanno i pi sinceri ringraziamenti per i numerosi e utilissimi consigli
e suggerimenti.
I
Concetti fondamentali
Il
,
1
Gli algoritmi
e la loro descrizione
1.1. Introduzione
Con il termine intende una successione finita di istruzioni, asse-
gnate in modo non ambiguo, tali che la loro esecuzione consenta di passare,
in un tempo finito, da una assegnata situazione iniziale (problema) ad una situa-
zione finale (risultato). L'esecuzione delle istruzioni di un algoritmo presuppone
un insieme di dati che individuano, nella classe di problemi risolubili mediante
l'algoritmo, il problema da risolvere e la di un esecutore capace
di effettuare, nell'ordine prestabilito, le azioni indicate dalle istruzioni. AI termine
dell'esecuzione si ottiene il che deve essere univocamente determinato
dall'insieme dei dati. Da quanto detto segue che un algoritmo non altro che
la descrizione del calcolo di una funzione che associa, in modo univoco, il risul-
tato all'insieme dei dati.
Nella stesura di un algoritmo devono essere tenute ben presenti le capacit
dell'esecutore per evitare istruzioni che non possono essere eseguite. In altri
termini, un algoritmo deve essere costituito da una successione di istruzioni
realizzabili mediante operazioni che l'esecutore sa eseguire (operazioni primitive).
L'ordine in cui devono essere eseguite queste operazioni, detto anche [lusso,
di solito quello sequenziale a meno di esplicite indicazioni contenute nelle istru-
zioni stesse. Gli esempi seguenti mostrano come sia possibile risolvere alcuni
problemi matematici supponendo di avere a disposizione un esecutore che possa
eseguire istruzioni formulate in lingua italiana ed in particolare sappia leggere,
scrivere, eseguire le operazioni aritmetiche e confrontare tra loro due numeri.
La numerazione progressiva che precede la descrizione di ciascuna istruzione
definisce, visualizzandolo, il flusso sequenziale dell'algoritmo. Inoltre l'istru-
zione poni v = e significa che, una volta determinato il valore di e, lo si indica
con il simbolo Ogni istruzione di questo tipo verr chiamata nel seguito istru-
zione di assegnazione.
Esempio 1.1. Si vuoI determinare il pi piccolo di una tema di valori.
4
Indicati con al' a
2
e a
3
i tre numeri assegnati, possibile ottenere il risultato
r =min {al' a
2
, a
3
} eseguendo quanto specificato nel seguente algoritmo:
Algoritmo 1.1.
1. Leggi: al' a
2
, a
3
2. confronta al con a
2
Se al > allora: poni m = a
2
ed esegui 3.
altrimenti: poni m = al ed esegui 3.
3. confronta m con a
3
Se m> a
3
allora: poni m = a
3
ed esegui 4.
altrimenti: esegui 4.
4. poni r =m
5. scrivi: r
6. stop.
La prima istruzione impone l'acquisizione dei dati del problema. Supponendo
che essi siano i valori {3, 2, l} l'esecuzione delle successive istruzioni avviene nel
modo seguente:
si confronta 3 con 2 e, siccome 3> 2, si ha m = 2;
si confronta m con a
3
ovvero 2 con 1 e, siccome 2 > 1, si ha m = 1;
il risultato r posto uguale al valore di m ovvero, in questo caso, r = 1.
Se la tema di valori fosse stata {3, 2, 4} il confronto previsto dall'istruzione 3.
tra m = 2 ed a
3
= 4 non avrebbe provocato nessuna modificazione di m ed il
risultato sarebbe stato r = 2.
Il significato delle istruzioni 5. e 6. intuitivo: la prima fornisce il risultato
r dell'algoritmo mentre la seconda impone la fine dell'esecuzione delle istruzioni.
Si osservi che l'algoritmo 1.1 applicabile ad una qualunque tema di valori
in quanto stato scritto indipendentemente dai dati effettivi del singolo pro-
blema.
Esempio 1.2. Si vuol determinare il pi piccolo tra n numeri reali.
Indicati con a a
2
a gli n valori assegnati, il risultato r = min {a
k
}
l' , ..., n l .. k" n
pU essere ottenuto con un algoritmo basato, come quello dell'esempio pre-
cedente su confronti successivi tra il valore m = min { ed ai con
, l .. k" i - l
2 i n. Il numero di confronti necessari per determinare il risultato dipende
ovviamente da n in quanto, fissato il primo valore di m (m = al)' il risultato r
ottenuto dopo aver ripetuto n - l volte l'operazione di confronto. Le consi-
derazioni fatte permettono di scrivere il seguente algoritmo che prevede tra i dati
del problema oltre ai valori al' a
2
, ..., a
n
anche il valore di n; esso quindi appli-
cabile ad una qualsiasi n-pla di valori, qualunque sia il numero n, n > l, di ele-
menti che la compongono.
5
Algoritmo 1.2.
I. Leggi: n; al' a
2
, ., a
n
2. poni m =al;
3. ripeti per i =2, 3, ..., n:
3.1. confronta m con ai' Se m> ai allora: poni m = ai ed esegui 3.2
altrimenti: esegui 3.2
3.2. continua il procedimento ripetitivo
4. poni r = m
5. scrivi: r
6. stop.
In questo algoritmo e nel seguito le istruzioni che devono essere ripetute
sono scritte pi a destra delle altre ed evidenziate da una doppia numerazione.
Applichiamo l'algoritmo 1.2 per determinare r = min {6, 3, 3, J}. In questo
caso n = 4, al = 6, a
2
= 3, a
3
= 3, a
4
= l costituiscono i dati del problema che
vengono acquisiti con l'esecuzione della prima istruzione. L'istruzione successiva
inizializza il valore di m imponendo m = 6. Le istruzioni 3.1 e 3.2 vengono quindi
eseguite in sequenza tre volte. La prima volta si pone i = 2 ed il confronto pre-
visto dall'istruzione 3.1 avviene tra m ed a
2
ovvero tra 6 e 3; siccome 6 > 3
si modifica il valore di m che diventa 3. La seconda volta si ha i = 3 e, siccome
m ed hanno lo stesso valore, si effettua un altro confronto senza modificare m.
Il confronto successivo, l'ultimo, avviene tra m ed a
4
ovvero fra 3 ed l e, siccome
3 > l, si ha m = I. Avendo esaurito il numero di ripetizioni previste dalla istru-
zione 3. il valore di m rappresenta il risultato ed infatti, con l'istruzione 4., si
pone r = m ovvero r = l. Le istruzioni 5. e 6. hanno il significato gi visto nel-
l'algoritmo 1.1.
Si osservi che, specificando n = 3, l'algoritmo 1.2 permette di risolvere il pro-
blema posto nell'esempio precedente; esso quindi pi generale dell'algoritmo
1.1.
Esempio 1.3. Assegnati n numeri reali se ne vuol calcolare la somma.
Indichiamo con al' a
2
, ..., a
n
gli Il valori da sommare. Supponendo n> 2, il
n
risultato r = 1: a ottenuto eseguendo successive operazioni di somma tra due
i= l l
addendi nel modo seguente: detto s il risultato della somma tra al ed a
2
ad esso si
aggiunge a
3
ovvero si esegue l'operazione: s + a)' Indicato ancora 1:011 s 11 risul-
tato di questa operazione ad esso possiamo sommare a
4
e cos via fino ad esau-
rire tutto il numero di addendi. Basandosi su questo procedimento si pu allora
scrivere il seguente algoritmo in cui, ripetiamo, si suppone n> 2.
I

I
6
Algoritmo 1.3.
1. Leggi: n; al' a
2
, ..., a
n
2. poni s = al + a
2
3. ripeti per i =3, 4, ..., n:
3.1. poni m =s + ai
3.2. poni s = m
4. poni r = s
5. scrivi: r
6. stop.
n
Si osservi che, qualunque sia n, la quantit r = a. pu essere pensata come
i= l I n
il risultato della somma di due addendi, uno uguale a zero e l'altro uguale a ai'
i=l
Usando questa osservazione allora possibile scrivere un algoritmo pi generale
del precedente in quanto applicabile qualunque sia il numero n di addendi.
Algoritmo 1.4.
l. Leggi: n; al' a
2
, . , a
n
2. poni s =O
3. ripeti per i = I, 2, ..., n:
3. 1.poni m = s + ai
3.2.poni s =m
4. poni r = s
5. scrivi: r
6. stop.
Esempio 1.4. Assegnati n numeri reali se ne vuoI calcolare il prodotto.
Se al' a2' ... , a
n
rappresentano i valori dati, considerazioni analoghe a quelle
svolte nell'esempio precedente permettono di scrivere il seguente algoritmo ap-
n
plicabile per calcolare r = n a. qualunque sia il numero n dei fattori.
i= l I
Algoritmo 1.5.
l. Leggi: n; al' a
2
, . " a
n
2. poni p = l
3. ripeti per i = 1,2, ..., n:
3.l.poni m = p' ai
3.2.poni p = m
4. poni r = p
5. scrivi: r
6. stop.
7
Esempio 1.5. Si vuoi determinare il massimo ed il minimo fra n numeri reali as-
segnati.
Indicati con a) . a
2
..., a
n
gli n numeri dati si tratta di scrivere un algoritmo
il cui risultato costituito dalla coppia di valori R = max {a i ed r = min {a l
l <;; i <; n I l <; i .. n I
Tenendo presente le considerazioni svolte nell'esempio 1.2 ed osservando che R
pu essere determinato con un procedimento analogo a quello descritto per il
calcolo di r, si giunge al seguente algoritmo.
Algoritmo 1.6.
l. Leggi: n; al' a
2
, .. , a
n
2. poni m = al
3. ripeti per i = 2, 3, ..., n:
3.1. confronta m con ai' Se m > ai allora: poni m = ai ed esegui 3.2
altrimenti: esegui 3.2
3.2. continua il procedimento ripetitivo
4. poni r = m
5. scrivi: r
6. poni m = al
7. ripeti per i = 2,3, ..., n:
7.1. confronta m con ai' Se m > ai allora: esegui 7.2
altrimenti: poni m = ai ed esegui 7.2
7.2. continua il procedimento ripetitivo
8. poni R = m
9. scrivi: R
lO. stop.
L'impostazione data al problema ha portato ad un algoritmo chiaramente di-
visibile in due parti: la determinazione di r, che avviene con l'esecuzione delle
prime cinque istruzioni, e quella di R che avviene dalla sesta istruzione in poi.
Si osservi inoltre che per portare a termine questo procedimento sono necessari
2( n - l) confronti e che l'unica differenza, per altro fondamentale, tra la prima
e la seconda parte si presenta al momento del confronto tra m ed ai' Quando non
si abbia interesse a mantenere nettamente distinte la determinazione di R da
quella di r possibile risolvere lo stesso problema utilizzando un altro algoritmo
che prevede meno confronti del precedente.
Algoritmo l. 7.
l. Leggi: n; al' a
2
, . " a
n
2. poni m = al
3. poni M = al
4. ripeti per i = 2, 3, ... , n:
8 9
Questo modo di affrontare la soluzione di un problema mediante la scomposi-
zione in sottoproblemi quello comunemente usato nella pratica e sta alla base
della tecnica nota come programmazione strutturata ( 1D.
1.2. II linguaggio dei diagrammi a blocchi
La descrizione discorsiva adottata fino ad ora per la formulazione degli algo-
ritmi sicuramente la pi naturale. Essa, per, pu non essere sufficiente a
descrivere con la dovuta chiarezza le azioni che devono essere compiute e sicura-
mente non consente una immediata visualizzazione del flusso dell'algoritmo.
Adoperando opportuni simboli per rappresentare le istruzioni e la loro succes-
sione, possibile descrivere graficamente un algoritmo mettendone in evidenza
i singoli comandi e le loro interrelazioni. Tale descrizione grafica, detta diagram-
ma a blocchi. realizzata mediante una concatenazione di simboli (blocchi)
che, di solito, hanno forma diversa a seconda del tipo di istruzione da essi indi-
cata. Dentro ciascun simbolo vengono poi descritte le azioni che devono essere
compiute dall'esecutore dell'algoritmo. I blocchi pi comunemente usati e le
operazioni che essi indicano sono i seguenti:
simbolo terminale. Rappresenta il punto in cui un algo-
ritmo inizia (start) o finisce (stop);
)
c__
Come si vede anche dall'esempio precedente, la risoluzione di un problema
pu essere effettuata mediante algoritmi diversi ciascuno dei quali corrisponde
ad una diversa analisi del problema e del procedimento risolutivo. Si osservi
inoltre che di solito utile determinare la soluzione di un problema mediante
quella di opportuni sottoproblemi per i quali sia disponibile un algoritmo.
4.1. confronta m con ai' Se m> ai allora: poni m = ai ed esegui 4.3
altrimenti: esegui 4.2
4.2. confronta Mcon ai' Se M < ai allora: poni M = ai ed esegui 4.3
altrimenti: esegui 4.3
4.3. continua il procedimento ripetitivo
5. poni r = m
6. poni R =M
7. scrivi: r ed R
8. stop.
Esempio 1.6. Assegnati n numeri reali positivi che indichiamo con al' a
2
, ... , a
n
si vuoI calcolare l'area del quadrato che ha come lato la loro media aritmetica.
Indicata con m la media aritmetica degli n valori dati, il risultato rappresen-
tato dal valore r =m
2
. Una prima analisi del problema conduce quindi al seguente
algoritmo:
Algoritmo 1.8.
I. Leggi: n; al' a
2
, ... , a
n
I n
2. calcola la media aritmetica m =- I: ai
n i= l
3. poni r =m
2
4. scrivi: r
5. stop.
/
simbolo di direzione. Indica il flusso dell'algoritmo
collegando tra loro tutti i blocchi;
simbolo di ingresso/uscita. Rappresenta il punto in cui
viene acquisito l'insieme dei dati (operazione di ingres-
so) oppure viene fornito il risultato (operazione di u-
scita);
la cui esecuzione presuppone la possibilit di utilizzare un altro algoritmo per cal-
colare il valore m come indicato dall'istruzione 2. Supponendo disponibile l'al-
goritmo che permette di calcolare la somma di n numeri si ottiene la formula-
zione seguente:
Algoritmo 1.9.
I. Leggi: n; al' a
2
, ., a
n
n
2. calcola s = I: ai
i= l
3. poni m = sin
4. poni r = m
2
5. scrivi: r
6. stop.
Intestazione
simbolo di decisione. Viene usato per indicare un punto
da cui, in base al verificarsi o meno della condizione spe-
cificata al suo interno, possibile passare all'esecuzione
di parti distinte dell'algoritmo. Se la condizione risulta
vera il flusso procede nella direzione indicata da V, altri-
menti in quella indicata da F;
simbolo di ripetizione. Viene usato per indicare che le
operazioni in esso descritte vanno ripetute secondo le
specifiche date nella intestazione;
simbolo di operazione, Viene usato per descrivere ope-
razioni di qualsiasi natura diversa dalle precedenti;
IO
Il
L 'operazione di assegnazione corrispondente alla locuzione poni J! = e
indicata con la scrittura: v+- e.
Per esemplificare come si utilizza il formalismo dei diagrammi a blocchi si ri-
porta in fig. 1.1 la descrizione, mediante questo linguaggio, dell'algoritmo 1.1,
in fig. 1.2 quella dell'algoritmo 1.2 ed in fig. 1.3 quella dell'algoritmo 1.7. Dal-
per i = 2, 3..... n
per i = 2.3..... n
F
simboli di connessione. Vengono usati per evidenziare
parti diverse di un algoritmo In modo da potervi fare
riferimento. Se tali parti sono descritte sullo stesso fo-
glio di carta si utilizza il primo simbolo; in caso contra-
rio il secondo.
o o
Figura 1.1. Diagramma a blocchi che de-
scrive un algoritmo per il calcolo di
r = min {al' a
2
a
3
}
Figura 1.2. Diagramma a blocchi che
descrive un algoritmo per il calcolo di
r = min {a.}.
I c i c n I
Figura 1.3. Diagramma a blocchi che descrive un algoritmo per il calcolo di r = 1 n{ai} ed
R= max {a.}(cfr. algoritmo 1.7).
l''i<n I
Figura 1.5. Diagramma a blocchi che descrive il procedimento risolutivo dell'esempio 1.7.
12
l'esame di queste figure risulta evidente come il linguaggio dei diagrammi a blocchi
permetta di evidenziare il flusso di un algoritmo: mediante il simbolo di direzione
viene infatti chiaramente indicata la sequenza in cui le azioni descritte all'interno
dei singoli blocchi devono essere eseguite. Per questo motivo i diagrammi a bloc-
chi sono anche detti diagrammi di flusso.
Si osservi che utilizzando il linguaggio dei diagrammi a blocchi risultano facil-
mente individuabili alcune situazioni particolari del tipo indicato in fig. lA.
Queste situazioni che chiameremo cicli iterativi prevedono la ripetizione di una
o pi istruzioni in base al verificarsi o meno della condizione specificata nel bloc-
co di decisione.
Esempio 1.7. Indicando con X
o
ed h due valori reali assegnati e supponendo di
saper valutare la funzione sen x, si vuoi calcolare il valore della funzione f(x) =
x sen x nei punti Xi = X
o
+ih, i O, fino a che non si verifichi la condizione
f(x
k
) =Oper qualche k.
In fig. 1.5 riportato il diagramma a blocchi di un procedimento che risolve
questo problema. Si osservi che il procedimento termina soltanto se verificata
la condizione se x sen x =Oaltrimenti esso continua, dopo il blocco di deci-
sione. nella direzione indicata da F. In altre parole, se la condizione x sen x = O
non risultasse mai verificata, come ad esempio accadrebbe ponendo X
o
= - l ed
h = 0.4, il procedimento non avrebbe mai fine.
La presenza di un ciclo iterativo pu essere allora molto pericolosa perch
il diagramma di flusso che lo contiene pu non rappresentare un algoritmo. Si-
tuazioni di questo tipo richiedono quindi una analisi particolare e verranno nuova-
mente discusse nel cap. lO.
A conclusione di questo paragrafo va osservato che il linguaggio dei diagrammi
F
13
v
L
F
F
Figura 1.4. Alcuni esempi di ciclo iteranvo,

a blocchi ha la seguente fondamentale propriet: dato un qualunque problema


di natura scientifica o meno che ammetta almeno una soluzione, possibile co-
struire un opportuno diagramma di flusso la cui esecuzione fornisce il risultato
corrispondente ad ogni possibile insieme di dati: questa affermazione, nota come
tesi di Church [2], mette in evidenza il notevole potere descrittivo del formalismo
dei diagrammi a blocchi che, come vedremo nel prossimo capitolo, servito come
modello per il primo progetto di elaboratore elettronico che diremo elaboratore
convenzionale o alla Von Neumann [3]. D'altra parte, importante ricordare che
il linguaggio dei diagrammi a blocchi non l'unico modo per descrivere gli algorit-
mi. Diversi altri formalismi sono stati definiti ed utilizzati; tra questi, uno dei
pi noti quello delle funzioni ricorsive le cui caratteristiche sono servite per la
costruzione di particolari elaboratori chiamati LlSP-machines. Esistono inoltre
diversi linguaggi oggi abbastanza diffusi quali il LlSP [4], l'Algol [5), il Pascal [6]
che, pur realizzati su elaboratori convenzionali, si basano sul concetto di ricorsivi-
14
15
Esempio 1.9. La funzione differenza di due interi m ed n con n O definita
dalle due equazioni:
t. Pertanto, anche se il linguaggio FORTRAN oggetto di questo testo non con-
sente l'uso di costrutti ricorsivi, riteniamo opportuno concludere questo capitolo
esponendo i concetti fondamentali del formalismo ricorsivo sia per completezza
di esposizione che per l'attualit di questo argomento.
(I)
(2)
diff (m, O) = m
diff(m. n) = pred (dff Irn. pred (n))).
Esempio 1.8. Supponiamo di saper calcolare le funzioni primitive successore di
un intero n, succ(n) = n + l, e predecessore di un intero n, pred(n) = n - l.
Possiamo allora definire la funzione somma di due interi non negativi m ed n,
som (m, n), con le due seguenti equazioni:
1.3. Il linguaggio delle funzioni ricorsive ([7))
E' possibile definire in modo non formale una funzione ricorsiva tramite la
seguente definizione: una funzione si dice ricorsi va se nella sua definizione si fa
uso delle funzioni stesse. Gli esempi che seguono illustrano questo concetto.
Esempio 1.10. La funzione prodotto di due interi m ed n O definita dalle
due equazioni:
Si osservi che nella (2) si fatto uso della funzione som che supponiamo gi
definita (cfr. esempio 1.8), della primitiva pred e di prod stessa.
Calcoliamo prod (3, 2):
prod (m. O) = O
prod (m, n) = som (m, prod (m, pred (n))).
Risulta evidente l'analogia tra questa definizione e quella data nell'esempio
precedente per la funzione som; le due definizioni differiscono esclusivamente per
il fatto che una usa la funzione primitiva pred e l'altra succo
(I)
(2)
som (m, O) = m
som (m, n) = succ (som (m, pred (n)
(I)
(2)
Tale calcolo viene detto riduzione; abbiamo infatti ridotto l'espressione som (3, 2)
ad una forma equivalente non ulteriormente riducibile, S, servendoci delle due
equazioni definitorie.
L'equazione (I) dice che la somma tra un intero m e O vale m; questa la
parte non ricorsiva della definizione la cui presenza sempre necessaria per assi-
curare la fine del calcolo.
L'equazione (2) dice che la somma di due interi m ed n, con n ovviamente
diverso da O, ottenuta tramite l'applicazione della funzione successore al risul-
tato della somma fra m e pred (n). La presenza di som (m, pred (n nel memhro
destro della (2) viene detta chiamata ricorsiva della funzione che stiamo defi-
nendo.
Cos, ad esempio, il calcolo di som (3, 2) viene eseguito servendosi delle due
equazioni nel modo seguente:
Esempio 1.11. Datala lista x di elementi al' a
2
, ., a
n
essa viene comunemente
indicata come la
l,
a
2
, ..., anI; possibile evidenziare il primo ed i restanti ele-
menti di x usando la notazione [ali z] dove z = [a
2
, a
3
, ... , anI e I l'operatore
costruttore di lista tale che [al I[a
2
, a
3
, ..., anll = [al' a
2
, ..., aJ Se l'insieme
cui appartengono gli elementi della lista x quello dei numeri reali possibile
calcolare il minimo tra gli elementi di x mediante la funzione ricorsiva min defini-
ta dalle seguenti equazioni:
prod (3,2) = som (3, prod (3, pred (2)))
= som (3, prod (3, I)
= som (3, som (3, prod (3, pred (I)))
= som (3, som (3, prod (3, O
= som (3, som (3, O
= som (3, 3)
=6
perla(2)
calcolando pred (2)
perla(2)
calcolando pred ( I)
per la (1)
calcolando som (3,01
calcolando som (3,3)
min ([al]) = al
min ([al' a
2
]) = al se al < a
2
min ([al' a
2
]) = a
2
se al a
2
min ([ali z]) = min ([al' min (zj l)
(1)
(2)
(3)
(4)
perla(2)
calcolando pred (2)
per la (2)
calcolando pred ( I)
per la (1)
calcolando succ (3)
calcolando succ (4)
som (3, 2) = succ (sorn (3, pred (2)
= succ (som (3, I
= succ (succ(som (3, pred (1)))
= succ (succ (sorn (3, O
= succ (succ (3
= succ (4)
=5
16
Cos il minimo della lista [2, 4, 1,8) dato da:
17
min ([2, 4, 1,8 =min ([2, min [4, 1,811)
=min ([2, min ([4, min [1,8))
= min ([2, min ([4, mn
=min ([2, l))
= l
per la (4)
perla (4)
per la (2)
per la (3)
per la (3)
min ([al' a
2
]) = se al < a
2
allora al altrimenti a
2
min ([ali z]) = min ([al' min (z l])
Alternativamente, possibile definire la funzione min usando una sola equa-
zione:
Si osservi che se gli elementi di x sono lettere dell'alfabeto, la funzione min
permette di determinare l'elemento di x che precede tutti gli altri nell'ordina-
mento alfabetico indicato ancora con il simbolo <.
In generale, possibile definire una funzione ricorsiva f mediante un numero
finito n di equazioni del tipo:
=
=
min(x) =se x = [al) allora al altrimenti
se x = [al' a
2
) allora se al <": allora al altrimenti a
2
altrimenti
se x = [ali z) allora min (Ia
l
, mint z j ])
altrimenti errore.
dove con errore si intende la segnalazione del fatto che x non una lista e quin-
di non appartiene al dominio di definizione della funzione min.
In questa definizione glI x) = al ed Hlf(x) costituita da tutto quello che
segue il primo altrimenti.
Esempio J. J4. Ricordando che la funzione fattoriale di un intero n O defini-
ta come:
dove i = l, 2, ..., n sono elementi del dominio di f e hi' l E;;; i E;;; n. sono com-
posizioni di funzioni primitive e/o predefinite ciascuna delle quali pu essere
costruita tramite il seguente schema condizionale:
n! = I
n! = n( n I) (n - 2) . . . 2. 1
se n = O
se n> O
si deduce facilmente la seguente definizione ricorsiva:
Dagli esempi risulta evidente che l'uso di pi equazioni rende pi leggibile
la definizione di una funzione ricorsiva. D'altra parte. ogni funzione ricorsiva
pu essere sempre definita in modo estremamente compatto mediante una sola
equazione nella quale si usano opportune condizioni per individuare la forma del
parametro e quindi la funzione da applicare. Va osservato che per descrivere fun-
zioni in forma ricorsiva non si fa uso del concetto di assegnazione.
E' possibile dimostrare che il linguaggio dei diagrammi a blocchi e quello delle
funzioni ricorsive sono equivalenti nel senso che ogni funzione descrivibile sia
In questo schema c indica una condizione ovvero una espressione costruita
tramite funzioni e relazioni primitive o predefinite il cui risultato un valore lo-
gico: vero oppure falso; gj una funzione primitiva o predefinita ed H/ una
combinazione di funzioni primitive e/o predefinite eventualmente legate dallo
schema condizionale fra le quali pu figurare la funzione f.
Quanto detto viene chiarito dagli esempi seguenti dove ovunque compaia la
funzione identit id definita come id(x) = x per ogni x, conveniamo di scrivere
x in luogo di id(x) ed ancora, ovunque occorra la funzione costante k definita
da k(x) = k per ogni x, conveniamo di scrivere k in luogo dik(x).
Esempio J. J2. Scriviamo in forma generale la funzione ricorsiva som gi vista
nell'esempio 1.8
som (m, n) = se n = Oallora m altrimenti succ (som (m, pred (n)
Esempio J. J3. La funzione ricorsiva min considerata nell'esempio 1.11 pu essere
definita dalle seguenti equazioni:
-
(I)
(2)
ovvero:
tattt O) = I
fatt(n) = prod(n, fatt (predt nj))
fatt(n) = se n = O al/ora l
altrimenti prodt n, fatt(pred(n))
18
con l'uno che con l'altro linguaggio [8]. La prova di questa equivalenza data
in modo costruttivo: si pu costruire una funzione che traduce ogni algoritmo
descritto in un linguaggio in un algoritmo per risolvere lo stesso problema scritto
nell'altro linguaggio. L'equivalenza pu essere dimostrata anche costruendo una
funzione di interpretazione di ogni algoritmo descritto in uno dei due linguaggi.
Siccome i concetti di traduzione ed interpretazione verranno trattati anche nel
cap. 2 a proposito della realizzazione dei linguaggi simbolici di programmazione,
conviene qui precisare i due concetti da un punto di vista puramente funzio-
nale.
Siano M ed N due linguaggi; data una qualunque funzione f, siano f
M
ed f
N
le
descrizioni di f nel linguaggio Med N rispettivamente.
Definizione l. Si dice traduttore da M ad N una funzione T tale che per ogni
funzione f
M
valga la seguente propriet:
Il traduttore deve essere quindi tale da produrre una descrizione di f nel lin-
guaggio N che rappresenti una funzione equivalente ad fM' In particolare il tra-
duttore T pu essere scritto nel linguaggio M oppure N ottenendo TM o TN
rispettivamente.
Definizione 2. Un interpretatore per il linguaggio M una funzione I tale che per
ogni funzione f
M
e per ogni i del dominio di definizione di f si ha
Ossia I una funzione che applicata alla coppia (fM' i) produce il medesimo
risultato che si sarebbe ottenuto applicando direttamente f
M
ad i. L'interpretaiore
I pu essere scritto usando uno dei due linguaggi M oppure N ottenendo rispetti-
vamente 1
M
ed IN'
L'equivalenza fra il linguaggio dei diagrammi a blocchi. B, e quello delle fun-
zioni ricorsive, R, allora dimostrata in modo costruttivo definendo una delle
seguenti funzioni:
il traduttore T
B
che associa ad un algoritmo scritto in R, f
R
, un algoritmo equi-
valente scritto in B, f
B
;
il traduttore TR che associa ad un algoritmo scritto in B, f
B
, un algoritmo equi-
valente scritto in R, f
R
;
l'interpretatore I
B
di algoritmi scritti in K;
l'interpretatore IR di algoritmi scritti in B.
Notiamo che l'equivalenza tra i vari sistemi formali, in particolare tra R e B,
19
costituisce l'argomento principale che suffraga la tesi di Church gi ricordata
nel paragrafo precedente; definendo infatti formalismi abbastanza lontani
tra loro si giunge comunque a poter descrivere la medesima classe di funzioni
che viene per questo detta classe delle funzioni calcolabili.
2
Dal linguaggio macchina alla realizzazione
dei linguaggi simbolici
2.1. Introduzione
La risoluzione di un problema presuppone la definizione di un algoritmo che,
in modo esplicito e non ambiguo, permette di ottenere dai dati iniziali il risultato.
Nella pratica, il compito di eseguire un algoritmo affidato agli elaboratori elet-
tronici (calcolatori) ovvero a macchine costruite proprio per eseguire in modo
automatico le operazioni richieste da un algoritmo.
L'utilizzazione di un elaboratore per l'esecuzione di un algoritmo impone che
tutte le informazioni indispensabili per ottenere il risultato siano fomite alla
macchina in forma ad essa comprensibile ed in particolare devono essere oppor-
tunamente formulate le istruzioni che costituiscono l'algoritmo.
In generale diremo unit di programma la formulazione di un algoritmo in un
linguaggio comprensibile ad un elaboratore elettronico (linguaggio di program-
mazione). Quando la soluzione di un problema determinata utilizzando quella
di opportuni sottoproblerni, l'algoritmo che permette di calcolarla composto da
pi algoritmi: quelli che risolvono i sottoproblemi e quello che, utilizzando
i precedenti, permetta la risoluzione del problema dato (cfr. esempio 1.6). Nel
seguito diremo programma l'insieme delle unit di programma che descrivono,
con un linguaggio di programmazione, gli algoritmi necessari alla risoluzione di
un problema.
Un elaboratore fisicamente costituito da pi componenti (unit hardware)
il cui funzionamento presuppone l'utilizzazione di un insieme di programmi che
vengono forniti dalla casa costruttrice e che costituiscono il software di base
dell' elaboratore.
In questo capitolo. dopo una breve descrizione delle caratteristiche hardware
comuni a tutti gli elaboratori convenzionali. sono messe in evidenza le principali
caratteristiche dei linguaggi di programmazione e sottolineate le fondamentali
differenze tra un linguaggio macchina ed un linguaggio simbolico. Dopo la
descrizione delle modalit di realizzazione di un linguaggio simbolico, il capitolo
si chiude con un breve cenno alle caratteristiche essenziali del sistema operativo.
,...
22
23
Figura 2.1. Schema di funzionamento di un elaboratore.
Esempio 2.1. Supponiamo di lavorare con un elaboratore che riserva 8 bits per la
codifica del codice operativo e 8 bits per quella dell'indirizzo. Supponiamo inol-
tre che l'esecuzione delle operazioni aritmetiche avvenga utilizzando una parti-
colare cella dell'unit aritmetica detta accumulatore in cui si memorizza un ope-
rando prima dell'esecuzione dell'operazione e il risultato una volta che I'operazio-
Unit di
uscita
Unit di controllo
Unit di
ingresso
codice operativo indirizzo
dove codice operativo identifica l'azione che si vuole venga eseguita ed indirizzo
indica la cella su cui operare. Sia il codice operativo che l'indirizzo sono costi-
tuiti da un prefissato numero di bits. Le istruzioni del tipo ora considerato sono
dette ad Wl indirizzo.
2.3. Il linguaggio macchina
Per ogni elaboratore esiste un msierne di istruzioni che devono essere scritte
secondo regole sintattiche fissate e che l'unit di controllo sa interpretare ed
eseguire; tale insieme costituisce il linguaggio macchina. Ogni programma che
debba essere eseguito direttamente dalla macchina deve essere scritto in tale
linguaggio. In pratica ogni elaboratore ha il suo linguaggio macchina che stretta-
mente legato alle caratteristiche dell'hardware.
D'altra parte per. per qualunque elaboratore, gli unici segni disponibili per
formare le istruzioni del linguaggio macchina sono O e I . Tenendo pre-
sente che un qualunque programma in linguaggio macchina costituito da istru-
zioni di tipo diverso (quali ad esempio quelle aritmetiche. di assegnazione. di in-
gresso/uscita e di controllo) ciascuna di esse deve essere opportunamente codi-
ficata per distinguerla da tutte le altre. In generale pgni istruzione codificata
su un ugual numero di bits,
Le istruzioni hanno una struttura sin tattica molto elementare quale ad esem-
pio la seguente:
2.2. Unit hardware di un elaboratore convenzionale
Le componenti hardware fondamentali per un qualsiasi sistema di calcolo
sono le seguenti:
unit di ingresso che un organo che permette di ricevere dall'esterno i dati
iniziali e la sequenza delle istruzioni;
unit di memoria che un organo capace di conservare informazioni e di for-
nirne, su richiesta. una copia;
unit di controllo che un organo che permette di interpretare e far eseguire
la sequenza delle istruzioni;
unit aritmetica che un organo che permette di eseguire operazioni sia arit-
metiche che logiche;
unit di uscita che un organo che permette di comunicare all'esterno i ri-
sultati.
Le componenti hardware pi comunemente usate come supporti per le unit
di ingresso e di uscita sono videoterminali, stampanti, nastri magnetici, dischi,
dischetti (floppy disks); alcune delle quali possono essere usate anche per la me-
morizzazione delle informazioni e quindi possono essere viste come estensioni
delle unit di memoria imemoria di massa o ausiliarie). _
La memoria fisicamente costituita da un insieme di elementi, ciascuno dei
quali pu assumere due soli stati fisici rappresentabili dai simboli O ed I.
Dalle caratteristiche fisiche degli elementi che costituiscono l'unit di memoria,
segue che le informazioni elaborabili da un calcolatore devono essere rappresenta-
te con una sequenza finita di cifre binarie ciascuna delle quali viene chiamata
bit (hinary digir). Per tutte le applicazioni pratiche il bit una unit troppo pic-
cola di informazione e per questo si considera spesso come unit di informazione
il byte che corrisponde ad un raggruppamento di 8 bits. Un byte per esempio
sufficiente a codificare i caratteri dell'alfabeto (cfr. cap. 12).
Per rappresentare quantit numeriche si considerano come unit di informa-
zione raggruppamenti di un numero fissato di bits. Tali raggruppamenti. ciascuno
dei quali contiene un'unica informazione. prendono il nome di unit di memoria
numeriche e la loro lunghezza pu variare da elaboratore ad elaboratore. Nel segui-
to il termine locazione o cella verr usato per indicare un raggruppamento di unit
di informazione (numeriche o meno) a cui associato un numero detto indirizzo.
L'indirizzo permette di individuare la posizione di una cella nella memoria secon-
do modalit strettamente dipendenti dalle caratteristiche dell'elaboratore usato.
In fig. 2.1 schematizzato il funzionamento di un elaboratore; le frecce a tratto
continuo denotano una trasmissione di informazioni e quelle tratteggiate l'azione
di controllo.
24
25
ne sia stata eseguita. Sia 000000 IO il codice operativo per l'operazione di cari-
camento ovvero per l'assegnazione del valore contenuto in una cella all'accumula-
tore; sia 000000 Il il codice operativo per l'operazione di memorizzazione ossia
per l'assegnazione del contenuto dell'accumulatore ad una assegnata cella; sia
inoltre 00000001 il codice operativo per l'operazione di addizione. Consideriamo
le seguenti istruzioni
soprattutto poco leggibili. Essi inoltre non sono porta bili, ovvero non sono tra-
sferibili da un elaboratore ad un altro che abbia caratteristiche costruttive diverse.
Si osservi infine che la scrittura di un programma in linguaggio macchina richiede
la conoscenza degli indirizzi dei dati e delle istruzioni per potervi far riferimento
all'interno delle istruzioni stesse.
0000001000001000
0000000100001001
0000001100001010
Tenendo presente il significato dei codici operativi, l'effetto dell'esecuzione
sequenziale di queste istruzioni il seguente: con la prima istruzione si carica nel-
l'accumulatore il contenuto della cella di indirizzo 00001000, con la seconda
istruzione si somma al contenuto dell'accumulatore quello della cella di indi-
rizzo 00001001, infine con la terza istruzione si memorizza il contenuto dell'ac-
cumulatore nella cella di indirizzo 0000 lOl O. Supponendo che nelle celle di in-
dirizzi 00001000 e 00001001 siano rappresentati i numeri 2 e 3 rispettivamente,
l'esecuzione delle istruzioni precedenti implica le trasformazioni descritte in
fig. 2.2 dove r(i) indica la rappresentazione in memoria del numero i.
2.4. I linguaggi simbolici
Le difficolt legate all'uso del linguaggio macchina sono superate con l'intro-
duzione dei linguaggi simbolici di programmazione. Ci occuperemo in questo pa-
ragrafo della struttura e dei principi fondamentali dei linguaggi simbolici che si
basano sul linguaggio dei diagrammi a blocchi. Non verranno invece trattati altri
esempi di linguaggi simbolici, quali ad esempio quelli basati sullo schema delle
funzioni ricorsive; tali linguaggi si dicono linguaggi funzionali e sono profonda-
mente diversi dai precedenti.
In un linguaggio simbolico i codici operativi sono sigle mnemoniche quali ad
esempio LOAD, ADD, STO, e i riferimenti alle celle di memoria dell'elaboratore
non sono pi i loro indirizzi effettivi ma nomi simbolici chiamati anche etichette.
In generale i prograrnrru 1I1 uuguaggio macchina risultano molto lunghi e
Figura 2.2. Calcolo di 2 + 3 mediante le istruzioni dell'esempio 2.1.
hanno lo stesso effetto delle istruzioni del linguaggio macchina usate nell'esempio
2.1.
A
PESO
XYl
LOAD
ADD
STO
I linguaggi simbolici si dividono in due grandi gruppi: quelli assemblativi (o di
tipo assembly) le cui istruzioni sono in corrispondenza biunivoca con quelle del
linguaggio macchina, e quelli compilativi ed interpretativi per i quali tale corri-
spondenza non prevista e che sono progettati con lo scopo di facilitare la stesura
dei programmi. Ovviamente, per eseguire un programma scritto in un linguaggio
simbolico, occorre che esso sia tradotto nel linguaggio macchina o diretta-
mente interpretato.
Si chiama traduttore di un linguaggio L per un elaboratore M un programma
che, ricevenuo in ingresso un qualsiasi programma sintatticamente corretto scritto
Esempio 2.2. Siano LOAp, ADD eS'I'O i codici operativi che un linguaggio sim-
bolico utilizza per indicare rispettivamente le operazioni di caricamento, a d i ~ t ~
ne- e mernorizzazione. Se supponiamo di associare i nomi simbolici A, PESO,
XYl alle celle che nell'esempio 2.1 sono identificate dagli indirizzi 0000 l 000,
0000 l 00 l, 0000 lOlO, le seguenti istruzioni simboliche
Accumulatore
r(5)
00001010
r(3 )
r(3)
r(3)
r(3)
00001001
r(2)
r(2)
r(2)
r(2)
00001000
Dopo la 3
a
istruzione
Dopo la 2
a
istruzione
Dopo la l a
istruzione
Stato iniziale
26
27
nel linguaggio L (programma sorgente) in grado di produrre in uscita il pro-
gramma equivalente scritto nel linguaggio macchina di M (programma oggetto).
I La traduzione avviene generalmente in due fasi: la prima nota come costruzione
: della tavola dei simboli e l'altra come produzione del programma oggetto.
Nella tavola dei simboli ad ogni nome simbolico incontrato durante la scansione
del programma viene associato l'indirizzo relativo della cella da essa individuata
ovvero la sua posizione riferita alla cella di indirizzo zero dove si pensa sia memo-
rizzata la traduzione della prima istruzione del programma. In generale la tavola dei
simboli contiene anche altre informazioni riguardanti il contenuto della cella.
Nella fase di produzione del programma oggetto vengono sostituiti ai codici
operativi mnemonici i corrispondenti codici binari e, grazie alla tavola dei sim-
boli, ai nomi simbolici vengono sostituiti gli indirizzi relativi loro associati.
In caso di errori sin tattici nel programma sorgente, il traduttore generalmente
non crea il programma oggetto ma fornisce un elenco di tali errori e la loro posi-
zione nel programma; questa eventualit nota come produzione del diagnostico.
I programmi traduttori relativi a linguaggi di tipo assembly si dicono assembla-
!2r:.imentre quelli relativi a linguaggi di tipo compilativo si dicono compilatori.
La traduzione di un programma scritto in un linguaggio compilativo pu avve-
nire. per esempio, secondo lo schema riportato in fig. 2.3 nella quale il compi-
latore realizzato mediante la coppia traduttore-assemblatore. In questo caso il
traduttore permette di passare dal programma sorgente ad un programma equi-
valente scritto nel linguaggio assembly dell'elaboratore usato e l'assemblatore
fornisce successivamente il programma oggetto scritto in linguaggio macchina.
D'altra parte opportuno ricordare che esistono compilatori che non prevedono
l'uso di un assemblatore ed eseguono una traduzione diretta in linguaggio mac-
china.
LOOP LOAD B
ADD A
4
5
6
Indirizzo
relativo
ABA
BIC
C
LOAD ABA
ADD BIC
STO C
STOP
ABA DC 7
BIC DC 8
C DC
*
END
Nome
simbolico
sono costituite da un'etichetta seguita da un codice operativo simbolico e da
un'altra etichetta che indica la cella di memoria interessata dall'operazione o un
valore quale ad esempio una costante numerica. La prima e la seconda etichetta
possono eventualmente mancare.
Cos, ad esempio, nelle istruzioni
LOAD ed ADD sono codici operativi mentre LOOP. A e B sono etichette. Con-
sideriamo il seguente programma:
dove i codici operativi LOAD, ADD, STO sono quelli definiti nell'esempio 2.2,
mentre il codice operativo DC indica l'operazione di definizione di costante, che
consiste nel memorizzare nella cella di memoria individuata dalla etichetta che
compare alla sinistra del codice DC il valore specificato alla sua destra: se tale valo-
re * !'istruzione non modifica il contenuto preesistente nella cella stessa. Suppo-
nendo che la traduzione di ogni istruzione sia contenuta in una cella e che durante
la costruzione della tavola dei sim boli si associ un indirizzo relativo ad ogni eti-
chetta incontrata alla sinistra di ogni codice operativo. la tavola dei sim boli ri-
sulta la seguente:
Programma
assembly
Traduttore
Assemblatore
I \
i;
Figura 2.3. Un possibile schema di compilazione.
AI nne di illustrare brevemente il funzionamento di un asse mblatore conside-
riamo il seguente esempio.
Se i codici operativi LOAD. ADD e STO hanno la codifica binaria considerat a
nell'esempio 2.1 e se il codice della istruzione STOP 00000000. il programma
oggetto il seguente:
Esempio 2.3. Supponiamo di utilizzare un linguaggio assemblativo le cui istruzioni
Si osservi che i numeri binari 100, 101, 110, 111, 1000 sono i corrispondenti
delle costanti decimali 4, 5, 6, 7, 8. L'istruzione END ha lo scopo di indicare
la fine fisica del programma e pertanto non viene tradotta.
2.5. La realizzazione di un linguaggio simbolico
Con il termine realizzazione di un linguaggio simbolico si vuoi tradurre il ter-
mine inglese implementation con il quale si intendono le modalit che vengono
seguite per arrivare all'esecuzione di un programma scritto In quel linguaggio.
Due possibili schemi di realizzazione sono quello basato sulla traduzione e quello
basato sulla interpretazione.
28
Indirizzo
o
l
2
3
4
5
6
contenuto
0000001000000100
0000000100000101
0000001100000110
0000000000000000
0000000000000111
0000000000001000
non definito
29
Compilatore
o assemblatore
Linker
Dati
Realizzazione mediante traduzione
Ricordiamo che un programma sorgente pu essere costituito da una o pi
unit di programma. Nella realizzazione di un linguaggio simbolico mediante
traduzione ogni unit di programma viene separatamente tradotta in una oppor-
tuna successione di istruzioni del linguaggio macchina (modulo oggetto) cui
associata la sua tavola dei sim boli.
Il programma oggetto risulta quindi costituito dall'insieme dei moduli oggetto.
Per rendere eseguibile il programma sar necessario sostituire agli indirizzi relati-
vi presenti in ciascuna tavola dei simboli gli indirizzi assoluti ovvero quelli deter-
minati in base all'indirizzo effettivo della cella a partire dalla quale il programma
verr memorizzato. Tale compito viene assolto da un opportuno programma
(/inker) che, oltre a determinare gli indirizzi assoluti, crea i necessari collegamenti
tra i diversi moduli oggetto e produce la versione eseguibile del programma tpro-
gramma eseguibile). A questo punto pu avere inizio la fase di esecuzione, durante
la quale avviene la lettura degli eventuali dati. In fig. 2.4 si riassume il procedi-
mento ora descritto.
Si osservi che un programma pu essere affetto da errori di varia natura:
errori che vengono segnalati dal diagnostico nella fase di traduzione (errori
sin tattici)
Figura 2.4. Realizzazione di un linguaggio simbolico mediante traduzione.
errori che vengono segnalati dal linker (per esempio quando venga fatto ri-
ferimento ad una unit di programma che non disponibile);
errori che vengono segnalati in fase di esecuzione (per esempio si cerca di ese-
guire una operazione matematicamente non definita quale a/b con b = O). Questo
tipo di errore il pi difficile ad essere corretto, in quanto sia la sua segnalazione
che la sua individuazione nel programma sorgente dipendono dal software del-
l'elaboratore usato;
errori che non possono essere segnalati (errori logici). In questo caso il pro-
gramma sorgente non descrive la soluzione della classe di problemi proposta.
L'assenza di errori di questo tipo pu essere in parte garantita tramite la verifica
dei risultati ottenuti per problemi di cui nota la soluzione.
Realizzazione mediante interpretazione
Un'altra modalit di realizzazione di un linguaggio quella che utilizza un
~ r o r m m detto interpretatore, talvolta gi realizzato in hardware, come per il
linguaggio BASIC nei personal computers. Un interpretatore in grado di leggere,
31 30
, ~ ..-------------------aq;---_....._-----------
Figura 2.5. Procedimento di interpretazione.
2.6. Il sistema operativo
Le interazioni tra l'utente ed il sistema di calcolo avvengono di solito attraver-
so un'interfaccia di tipo software chiamata sistema operativo che consiste nel-
l'insieme di quelle procedure che controllano tutte le risorse di tipo hardware
e/o software di una installazione. In ultima analisi un sistema operativo un in-
sieme di programmi tramite i quali si tende ad ottimizzare il tempo di utilizzo
dell'elaboratore e a rendere tale utilizzazione amichevole per l'utente.
L'evoluzione dei sistemi operativi profondamente legata all'evoluzione della
tecnologia degli elaboratori da una parte e alle esigenze degli utenti dall'altra. So-
no stati cos messi a punto sistemi operativi che seguono filosofie diverse e per-
mettono gestioni diverse delle risorse di un sistema di calcolo. Ad esempio i si-
stemi basati sul principio della monoprogrammazione consentono l'elaborazione
sequenziale di pi programmi costituenti una sequenza di lavori usualmente me-
morizzata su una unit a disco magnetico. Tali sistemi vengono detti di solito
Disk operating systerns (DOS). A differenza dei precedenti i sistemi che usa-
no la tecnica della spartizione del tempo (time-sharingv dedicano ciclicamente
tutte le risorse del sistema ad un lavoro per un periodo di tempo prefissato, con-
sentendo un'elaborazione pseudo-parallela dei lavori proposti da pi utenti.
Un altro tipo di sistema operativo quello basato sul principio della multipro-
grammazione che prevede la presenza di pi programmi nell'unit di memoria ed
elahora un programma finch esso non richiede un'operazione di ingresso/uscita.
Il tempo necessario allo svolgimento di questa operazione. che generalmente
molto maggiore di quello necessario per eseguire altri tipi di operazioni. viene di
solito sfruttato per iniziare o proseguire l'esecuzione di qualche altro programma
presente in memoria.
I sistemi operativi svolgono le loro operazioni su richiesta degli utenti grazie
ad un programma. il supervisore, che fa parte del sistema operativo stesso. Il su-
pervisore in grado di interpretare un dato insieme di comandi che caratteristi-
co di ogni singolo sistema operativo; ad esempio, per attivare le diverse fasi del-
l'elaborazione di un programma quali la compilazione. l'attivazione del linker e
l'esecuzione si devono dare opportuni comandi al supervisore: analogamente
devono essere esplicitamente specificati i comandi che permettono di eseguire
operazioni di correzione, mernorizzazione o cancellazione di programmi e di dati.
I sistemi che prevedono la multiprograrnmazione e/o il tirn e-sharing sono in-
stallati su elaboratori che devono soddisfare contemporaneamente pi utenti.
Oggi la tecnologia elettronica ha consentito la personalizzazione del calcolo,
mettendo a disposizione personal computers a prezzi accessibili anche a singoli
utenti. di fatto rendendo meno sentita l'esigenza di sofisticati sistemi operativi
nel senso sopra accennato. Anche in un personal computer per. la comunicazione
uomo-macchina avviene tramite il sistema operativo (usualmente di tipo DOS).
Pertanto, qualunque sia il sistema di elaborazione usato. l'utente dovr aver ac-
quisito una certa padronanza del linguaggio di comandi del corrispondente siste-
ma operativo.
Risultati
Interpretatore
Programma
sorgente
tradurre ed eseguire, ossia interpretare ciascuna istruzione del programma sor-
gente insieme ai dati. In questo caso lo schema realizzativo diventa quello ripor-
tato in fig. 2.5.
Il grande vantaggio dell'interpretazione rispetto alla traduzione risiede nel fatto
che gli errori sono segnalati nel momento in cui si verificano con la precisa ed
immediata indicazione dell'istruzione del programma sorgente che li ha provo-
cati. Il procedimento dell'interpretazione risulta quindi utilissimo in fase di messa
a punto di un programma in cui fondamentale un diagnostico pi ricco possi-
bile.
Ci sono per alcuni svantaggi nell'uso dell'interpretazione rispetto alla tradu-
zione. tra i quali pi evidente la maggior lentezza complessiva della elahorazione
(si pensi al caso di un procedimento ripetitivo in cui, ad ogni ripetizione, ciascuna
istruzione deve essere letta, tradotta ed eseguita).
In pratica alcuni nnguaggi sono usualmente realizzati tramite compilazione
(esempi sono il FORTRAN, il COBOL, il PLI) mentre altri, quali il BASIC, l'APL,
il LISP sono di solito realizzati mediante interpretazione.
3
Rappresentazione dei numeri
3.1. Numeri interi
II sistema di numerazione a noi pi familiare quello decimale nel quale il
numero IO (dieci) la base ed i numeri interi O, l, 2...., 9 costituiscono le cifre.
Altri sistemi di numerazione che interessano le applicazioni sono quello binario
che opera con la base 2 (due) e le cui cifre sono costituite dai simboli O e l;
quello ottale che utilizza la base 8 (otto) e le cifre O, 1,2,3,4, 5,6,7; quello
esadecimale che, usando come base il numero 16 (sedici), utilizza come cifre i
simboli O, 1,2,3.4,5,6,7,8,9, A, B, C, D, E, F.
Nel seguito il simbolo N indicher un numero in base lO mentre N ~ indicher
che il numero intero N rappresentato nella base {3. Se N <<Xl, si ha che
(3.1 )
rn
(N)il == L ~ { 3 k ,
k=O
01<00
dove a
j
, j == O, l, ... ,01 sono cifre del sistema di numerazione in base Il.
Fissato Il, il massimo numero N
Ol ax
rappresenta bile mediante m < 00 cifre
11
m
- l.
Conversione in base dieci
Supponendo nota la rappresentazione di N in base Il possibile trovare la rap-
N
Ol ax
== 9999 == 10
4
- I
N
Ol ax
== ( III 1)2 == 2
4
- I m==41l==2
Esempio 3.1. 1471 == I x 10
3
+ 4 x 10
2
+ 7 x 10
1
+ I x 10
0
(1471)8 == l x 8
3
+ 4 x 8
2
+ 7 x 8
1
+ I x 8
(1471 )1&== l x 16
3
+ 4 x 16
2
+ 7 x 16
1
+ l x 16
Esempio 3.2. m == 4 Il == lO
Jnz .
34
35
presentazione in base dieci applicando direttamente la (3.1) dove, per comodit
di notazione, le cifre a
k
e la base {3 vengono espresse in base dieci.
Esempio 3.3. (3471)8 = 3)( 8
3
+ 4)( 8
2
+ 7)( 8
1
+ I )( 8
0
= 1849
(3471)16=3)( 16
3+4)(
16
2+7)(
16
1+
1)( 16
0=5845
(AI)16 = 10)( 16' + l )( 16
0
= 161
( 10)2 = I )( 2' + O)( 2
0
= 2
(100)2 = l )( 2
2
+ O)( 2' + O)( 2
0
= 4
(1111)2 = l )( 2
3
+ 1)( 2
2
+ l )( 2
1
+ I )( 2
0
= 15.
dell'algoritmo descritto sopra d luogo ai seguenti passi:
i = O No = 37 dispari a
o
= I
i= I N = 18 pari a, = O
I
i = 2 N
2
= 9 dispari a
2
= I
i = 3 N
3
= 4 pari a
3
= O
i = 4 N
4
= 2 pari => a
4
= O
i = 5 N = I dispari => a
5
= l
5
quindi la rappresentazione binaria del numero 37 datta dalla successione
Una volta determinate a
o
ed a" le restanti cifre binarie a
k,
k = 2, ... , r saran-
no ottenute in modo analogo. Si perviene cos al seguente algoritmo:
Conversione in binario
Assegnato un intero N in base dieci possibile ottenere la sua rappresentazio-
ne in base (3; in particolare, l'equivalente binario del numero N pu essere otte-
nuto dalla (3.1) tenendo presente che la cifra a
o
di un numero binario zero
se e soltanto se il numero pari. Allora, indicato con r un intero positivo tale
che 2
r
.,;;; N < 2
r
+ " si ha:
se m = 32 O N .,;;; 2
31
- I = 2 147483647.
N
m ax
= (OIII ... 1)2 = 2(m - 1) - l;
pertanto possibile rappresentare con m bits tutti e soli i numeri interi positivi
N tali che O.,;;; N N
max
. In particolare per m = 16 ed m = 32 si hanno le limi-
tazioni seguenti:
Supponendo 2
r
.,;;; N < 2
r
+ " sia m> r un numero finito e prefissato di cifre
binarie destinate alla rappresentazione di N; evidentemente, tenendo presente la
(3.1), dovr essere a
k
= O, (r + l) .,;;; k (m - I). Cos per esempio se m = 7 la
rappresentazione binaria di 37 data da (0100101)2 mentre, fissato m = IO,
si ha (0000100101)2'
Va inoltre osservato che nella rappresentazione di un intero in un elaboratore
vengono usati un numero finito m di bits il primo dei quali indica il segno: tutti
i numeri positivi sono caratterizzati da una rappresentazioni binaria con il primo
bit uguale a zero. Cos ad esempio il numero 109 = (110 11O1)2 verr memoriz-
zato, supponendo m = io, come 000 Il OIl OI dove il primo bit (O) indica il
segno (positivo) e le restanti nove cifre contengono la rappresentazione binaria
di 109.
Da quanto detto segue che il massimo numero intero positivo rappresentabile
con m bits di cui il primo riservato al segno rappresentato dalla cifra O seguita
da (m - I) cifre I ovvero
r r
dove No = N = L a
k
2
k
= a
o
+ L a
k
2
k
;
k=O k=1
/ I se No dispari
ao="<,
Ose No pari
/ I se N, dispari
al =""-
Ose N, pari
Algoritmo 31.
I. Leggi: N, r
2. poni No = N
3. ripeti per i = O, l, ... , r - I
3.1. se N
j
dispari allora: poni ai = I ed esegui 3.2
altrimenti: poni ai = Oed esegui 3.2
3.2. poni N
j
+ , = (N
j
- a
j)/2
4. poni a
r
= N
r
5. stop.
Esempio 3.4. Vogliamo trovare la rappresentazione binaria di N = 37. Dalla re-
lazione 2
5
, 37 < 2
6
segue che si devono calcolare 6 cifre binarie. L'applicazione
Il termine overflow indica il tentativo di rappresentare in un elaboratore numeri
N>N .
max

36
Interi negativi
SI detto che ogni numero binario positivo caratterizzato dalla presenza della
cifra O in prima posizione; essendo stato scelto il primo bit a significare il segno,
:, questo uguale ad I il numero binario inteso essere negativo. La presenza del-
la cifra l in prima posizione ottenuta rappresentando i numeri negativi sotto
forma di complemento a due. Si ricordi che si dice complemento a due di un
numero binario rappresentato con m bits la differenza fra quella potenza di 2
che rappresentata dalla cifra l seguita da m cifre Oed il numero stesso.
Esempio 3.5. Se m = 4 la rappresentazione del numero 5 O101. Per ottenere
la rappresentazione di - 5 si deve calcolare la differenza (10000)2 - (OlO1)2
che uguale a (1111)2 - (0101)2 + (0001)2 essendo (10000)2 = (1111)2 +
+ (0001)2' Si osservi che la sottrazione (1111)2 - (0101)2 facilmente realiz-
zata invertendo logicamente le cifre del sottraendo, ossia sostituendo alla cifra
O una cifra I e viceversa. Si ha allora (10000)2 - (0101)2 = (0101)2 - (0001)2 =
= (1011)2' Il numero (1011)2 dunque la rappresentazione di - 5 su m = 4 bits.
In pratica, dato un numero binario positivo, ossia con un bit O in prima posi-
zione, si ottiene la rappresentazione del suo opposto invertendo logicamente
le m cifre e quindi sommando 1 al risultato dell'inversione logica. Tutte queste
operazioni su un elaboratore sono facilmente realizzate in hardware.
La rappresentazione dei numeri negativi nella forma di complemento a due
consente di unificare le operazioni di addizione e sottrazione e quindi di sempli-
ficare l'hardware dell'elaboratore; la rappresentazione della differenza tra due
numeri infatti uguale alla rappresentazione della somma tra il primo ed il com-
plemento a due del secondo.
Esempio 3.6. Sia m = 4; calcoliamo 5 - 2. Questa operazione si pu effettuare in
binario come segue:
(OlO1)2 + (10000)2 - (0010)2 - (10000)2 = (Ol O1)2 + (1110)2 - (10000)2 =
= (10011)2 - (1000U)2 = (0011)2 = + 3.
37
(0010)2 + (10000)2 - (0101)2 - (10000)2 = (0010)2 + (1011)2 - (10000)2 =
= (1101)2 - (10000)2 = (- 0011)2'
Anche in questo caso la sottrazione finale (110 1)2 - (10000)2 non viene ese-
guita: (1101)2 gi il risultato finale in quanto rappresenta il complemento a
due di 3 ossia - 3.
I numeri interi negativi N rappresentabili con m < 00 bits nella forma di com-
plemento a due sono tutti e soli quelli per cui - 2(m- 1) N < O. Per m = 16
si ha N - 2
15
= - 32768 mentre per m = 32 vale la limitazione N - 2
31
=
=- 2147483648.
3.2. Numeri reali
Fissata una base di numerazione (3 possibile rappresentare un qualsiasi numero
reale x finito e diverso da zero nella forma:
(3.2)
dove ai' i m sono cifre del sistema di numerazione usato e b un intero
espresso nella base (3. La rappresentazione (3.2) del numero x detta in virgola
mobile normalizzata (floating point); le cifre al' a
2,
..., a
m
costituiscono la
mantissa mentre l'intero b detto caratteristica.
Esempio 3.8. I numeri decimali
-0.1471 +37.1 -0.0125 +0.003 +300
sono rispettivamente rappresentati in virgola mobile normalizzata come:
-0.147110 +0.37110
2
-0.12510-
1
+0.310-
2
+0.310
3
.
Da quanto detto segue che, indicata con (X)(3 la rappresentazione di un qual-
siasi numero reale x diverso da zero in base (3, si ha:
Conversione in binario
Per determinare la rappresentazione binaria di un numero reale x espresso in
base dieci si consideri dapprima il problema di determinare le cifre binarie della
mantissa di un numero decimale x, O < x < l. Dalla relazione:
Si osservi che l'ultima sottrazione di fatto non viene eseguita nella macchina.
Infatti, siccome il numero di bits (m = 4) fissati per la rappresentazione degli
interi insufficiente a rappresentare il risultato dell' operazione (O101)2 + (1110)2
= (100 Il )2' baster eliminare il primo bit di tale risultato per tener conto anche
della successiva sottrazione ed ottenere il risultato finale (0011)2'
Esempio 3.7. Sia ancora m = 4; vogliamo calcolare 2 - 5. Si ha:
(3.3)
m
(X)(3=0.a
1a2
... a
m
(3 b = [a
j
(3 i.(3b.
j= l
38
39
3.3. Rappresentazione finita ed errori di arrotondamento
Nella pratica le caratteristiche hardware di un elaboratore impongono precise
limitazioni sul numero di cifre utilizzate per la rappresentazione di un numero
e. pertanto, solo un sottoinsieme dei numeri reali pu essere rappresentato su un
determinato sistema di calcolo. Pi precisamente. indicata con (1 la base di nume-
razione usata dall'elaboratore, sia m < 00 il numero di cifre utilizzato per la rnan-
tssa. n < 00 quello per la caratteristica e siano L ed U rispettivamente il massimo
ed il minimo intero rappresentabile con le n cifre della caratteristica. Se F l'in-
sieme dei numeri reali rappresentabili suU'elaboratore, F costituito da tutti e
soli i numeri reali x la cui rappresentazione in virgola mobile normalizzata ha una
caratteristica b tale che L b U ed una mantissa costituita al pi da m cifre
diverse da zero. Sono pertanto elementi di F sia il numero zero, la cui rappre-
sentazione caratterizzata da ai = O, l i m, che tutti i numeri reali rappre-
sentabili nella forma
(3.4) O. al a
2
.. a
m
O... O... (1b, al "* O. L b U.
I valori delle costanti (1, m, L ed U sono dati forniti dalle case costruttrici in
quanto strettamente legati alle caratteristiche hardware dell'elaboratore. La base
di numerazione (1 generalmente due ma spesso usato anche il sistema di
numerazione ottale o esadecimale. Le costanti L ed U delimitano l'ordine di
grandezza dei dati rappresentabili su un elaboratore: il tentativo di rappresentare
numeri la cui caratteristica maggiore di U detto overflow mentre quello di
rappresentare numeri con caratteristica minore di L detto underflow. Il signi-
ficato del numero m di cifre destinate alla mantissa strettamente legato alla
precisione con cui l'elaboratore lavora. Sia infatti x un numero reale la cui
rappresentazione nel sistema di numerazione usato dall'elaboratore data da:
(3.5) O. al a
2
.. a
m
a
m
+ l' .. a
m
+ i e, ai "* O, L b U
dove a
m
+ i "* Oper qualche i > O.
Siccome la rappresentazione (3.5) ha una mantissa con cifre diverse da zero
nelle posizioni che seguono la m-esima, il numero x non appartiene ad F e non
pu essere rappresentato sull'elaboratore; esso allora sostituito da una sua ap-
prossimazione che indicheremo con fl(x) appartenente ad F. Il valore fl(x) ot-
tenuto da (3.5) per troncamento oppure per arrotondamento; nel primo caso
fl(x) dato da:
(3.6) fl(x) = O.a
l
a
2
... a
m
(1b
nel secondo:
Il
1\
segue:
m
2x =al + [ ai 2- (i-l}
i= 2
da cui, posto CI = 2x, si ha: al = l se Cl l, al = Ose Cl < l. Analogamente,
posto c
2
= 2( CI - al', si ha a
2
= l se c
2
l, a
2
=Ose c
2
< l. In generale, posto
Ci = 2(c
i
_ 1- a
i_
l)' la i-esima cifra ai della mantissa data da:
a. =/' l se Ci l
I """O se Ci < 1.
Esempio 3.9. Si vuoI determinare la rappresentazione binaria del numero deci-
male x == +0.1. Applicando il procedimento sopra indicato si ottiene:
(+ 0.00011001100110011 .... ')2
ovvero il numero decimale 0.1 non ha una rappresentazione binaria finita in quan-
to esso , in base due, un numero periodico di periodo 00 Il. Si osservi inoltre
che la rappresentazione binaria in virgola mobile normalizzata del numero deci-
male x == 0.1 data da
+ 0.1100110011001100 ... (1101, (1 = (10)2 = 2
essendo 101 la rappresentazione binaria di - 3.
Sia ora x un qualunque numero reale espresso in base dieci. La sua rappre-
sentazione binaria ottenuta convertendo sia la parte intera che quella decimale;
la conversione della parte intera avviene seguendo le regole viste nel paragrafo
precedente mentre quella della parte decimale avviene applicando il procedi-
mento di conversione ora descritto.
Esempio 3.10. Tenendo presenti i risultati degli esempi 3.4 e 3.9 si ha che la rap-
presentazione binaria del numero decimale + 37.1 data da
(+ 100\01.000\100110011001\ .. ')2
La rappresentazione binaria in virgola mobile normalizzata di 37.1 allora:
+ 0.\00\01000\\00\\00\\ ... fflilo. (1 == (10)2 == 2
essendo 0\\ Ola rappresentazione binaria di + 6.
(3.7)
se a
m
+ 1<(1/2
se a
m
+ I (1/2
40 41
mentre, se tl(x) ottenuto da (3.7), valgono le seguenti relazioni:
caratterizzati da valori diversi della costante m: il sistema in precisione semplice
e quello in doppia precisione. La denominazione scelta per i due sistemi legata
al fatto che il numero di bits destinati a rappresentare il numero nel secondo si-
stema il doppio di quello usato nel primo e il passaggio deIIa precisione semplice
a quella doppia implica un aumento della precisione nel senso che, daIIa preci-
sione di macchina f
m
caratteristica della precisione semplice, si passa ad una pre-
cisione di macchina minore o uguale di f ~ Si osservi che, contrariamente a quan-
to avviene per la mantissa, il numero di cifre usate come caratteristica general-
mente lo stesso sia nella semplice che nella doppia precisione.
Quanto detto in questo paragrafo mette in evidenza che in un elaboratore la
rappresentazione di quantit reali non intere non in generale esatta: essa coin-
cide con il valore esatto a meno di una quantit finita, diversa da zero che di-
pende dalla precisione di macchina.
Sull'insieme F dei numeri rappresentabili su un elaboratore sono definite le
operazioni elementari di addizione, sottrazione, moltiplicazione e divisione.
Indicata con . una qualunque operazione elementare, sia 8 la corrispondente
operazione definita in F. Il modo con cui 8 viene effettivamente eseguita dipende
dall'elaboratore usato e, in generale, si ha:
x 8 y = tl(x . y) = (x . y) (1 + f), Ie I~ f
m
per ogni coppia di valori x ed y appartenenti ad F. La differenza tra x . y e
x 8 y rappresenta l'errore di arrotondamento commesso nell'esecuzione dell'o-
perazione e dipende daIIa precisione con cui si opera. Le operazioni di somma e
moltiplicazione definita su F sono generalmente commutative ma non associative
e anche la propriet distributiva non pi valida quando si usa una aritmetica
finita ovvero quando le operazioni vengono eseguite usando una precisione
finita.
e
R
= (x - tl( x/x.
tl(x) = x(l +f),
Si osservi che le limitazioni ottenute per gli errori di arrotondamento dipendo-
no dal metodo usato per calcolare flf x): il troncamento pu portare ad errori
che possono essere il doppio di quelli che sarebbero stati ottenuti con l'arroton-
damento. Va inoltre sottolineato che gli errori relativi, al contrario di quelli
assoluti, non dipendono dalla caratteristica ovvero non dipendono dall'ordine
di grandezza del numero x.
Da quanto detto segue che il valore tl(x) ottenuto da (3.5) per troncamento
o per arrotondamento, tale che
facilmente verificabile che, quando tl(x) ottenuto per troncamento da (3.6),
si ha:
e
A
=x - tl(x)
ed errore relativo di arrotondamento la quantit
In ogni caso, se x ha una rappresentazione di tipo (3.5) la sostituzione di x con
tl(x) d luogo ad un errore, detto errore di arrotondamento, il cui valore dipende
dalla tecnica usata per determinare tl(x). In particolare, detta errore assoluto di
arrotondamento la quantit
Vogliamo eseguire queste stesse operazioni utilizzando, nel sistema decimale,
una rappresentazione in virgola mobile normalizzata con m = 4 cifre di mantissa
supponendo che tl(x) sia ottenuto per troncamento dal valore di x. In questa
ipotesi si ha:
(x l Ef) x
2
) mx
3
= (0.2000 10 IJ 0.2500 10- 3) Ef) 0.7800 10- 3 =
= (0.2000 10 Ef) 0.0002 100)Ef) 0.7800 1 ~ 3 =
= 0.2002 10 IJ 0.0007 10 = 0.2009 10
dove f
m
data da
se tl(x) calcolato per troncamento
se tl(x) calcolato per arrotondamento
La quantit f
m
detta precisione di macchina e rappresenta una limitazione
superiore per l'errore relativo di arrotondamento quando al valore x, non esat-
tamente rappresentabile sull'elaboratore, si sostituisce la sua approssimazione
tl(x). La precisione di macchina una quantit caratteristica di ogni elaboratore
e dipende dalla base di numerazione, dal numero di cifre m destinate alla mantissa
e dal metodo scelto per determinare fl(x). La maggior parte dei sistemi di calcolo
permette di utilizzare due diversi sistemi di rappresentazione dei dati numerici
Esempio 3.11. Dati i valori Xl = 0.2, x
2
= 0.00025 e x
3
(Xl + x
2
) + x
3
= Xl + (x
2
+ x
3
) = 0.20103.
0.00078 si ha che

42
XI(J (X
2
rl X
3)
= 0.2000 10 m(0.2500 10- 3 rl 0.7800 10- 3) =
= 0.2000 10 ll 0.1030 ~ 2 =
= 0.2000 10 ll 0.0010 10 = 0.2010 10
Il risultato di (Xl mX
2)
ll X
3
non coincide quindi con quello di xl rl (X
2
rl X
3):
nel primo caso si ottenuto un valore che coincide con il risultato esatto a meno
di una quantit dell'ordine di 10- 4, nel secondo l'errore commesso , al pi,
dell' ordine di 10- s.
Supponiamo ora di voler sommare i seguenti valori:
Xl =0.94 10-
4
, X
2
=0.26 10-
4
e X
3
= 0.1 10.
Si ha:
(Xl mX
2)
rl X
3
= (0.9400 10- 4(J 0.2600 10- 4) rl 0.1000 10 =
= 0.120010-
3
I!l 0.100010 =
= 0.000 l 10 rl 0.1000 10 =0.100 l 10
x1(J (x
2
ll x
3)
= 0.9400 10- 4 rl (0.0000 10 rl 0.1000 10) =
= 0.9400 10- 4 rl 0.1000 10 =
= 0.0000 10 rl 0.1000 10 = 0.1000 10.
Il contributo degli addendi xl ed x
2
completamente ignorato quando la somma
calcolata aggiungendo il valore di Xl ad x
2
I!l x
3
.
L'esempio precedente mette in evidenza che, quando si opera in aritmetica
finita, la precisione con cui si determina il risultato, dipende, oltre che dalla pre-
cisione di macchina, anche dall'ordine in cui vengono eseguite le operazioni. Inoltre,
formule matematicamente equivalenti possono dare risultati diversi se utilizzate
in precisione finita.
Esempio 3.12. Si vuoi determinare il punto medio x
m
di un intervallo di cui sono
noti gli estremi a =0.651 e b =0.653. Sappiamo che:
X
m
= (a + b)/2.
Supponendo di utilizzare in base dieci una rappresentazione finita con tre cifre
di mantissa si ha:
Il valore calcolato del punto medio non appartiene all'intervallo ed quindi
,.
43
completamente sbagliato. Avremmo trovato un risultato pi corretto se avessimo
usato la relazione:
X
m
= b + (a - b)/2:
In questo caso il valore calcolato x
m
= 0.652. Infatti:
x
m
=0.653 10 Hl (0.65 I 10 El 0.653 10) O 2 =
= 0.653 10 ll (- 0.200 10- 2) 02 =
= 0.653 10 rl (- 0.100 10- 2) =
= 0.653 10 rl (- 0.001 10) = 0.652 10.
Lo studio degli errori di arrotondamento e della loro propagazione di fonda-
mentale importanza per una corretta interpretazione dei risultati di un qualunque
algoritmo eseguito in precisione finita. Tale studio esula dagli scopi di questo
testo in quanto pi pertinente a testi di calcolo numerico (cfr. [9], [lO), [Il)).
II
Il FORTRAN 77
Il

4
Il linguaggio FORTRAN
4.1. Introduzione
La storia del linguaggio FORTRAN inizia nel 1953, quando la IBM dette inizio
al progetto di definizione di un sistema di programmazione per l'allora nuovo
elaboratore 704. Tale sistema doveva permettere di superare gli svantaggi insiti
nell'uso del linguaggio assembly, fra cui essenzialmente il costo notevole di analisi
dei problemi scientifici e l'impossibilit di utilizzo da parte dei non specialisti.
Nel novembre 1954 fu cos pubblicato il primo rapporto preliminare sul nuovo si-
stema, chiamato IBM Mathematical FORmula TRANslation system: FORTRAN.
Il progetto iniziale era rivolto all'utilizzo sul 704, a cui si riferiva il primo compi-
latore elaborato nel 1957 e la successiva versione FORTRAN Il; ma il successo
dell'iniziativa fu tale che intorno al 1960 proliferarono versioni del FORTRAN
legate ai diversi elaboratori allora disponibili. Si cominci allora a sentire l'esi-
genza di definire uno standard del linguaggio da poter assumere come base nella
costruzione dei diversi compilatori: un programma scritto secondo le regole di tale
standard sarebbe stato accettato come sintatticamente corretto da tutti i compi-
latori conformi allo standard. Un primo passo in tal senso fu compiuto ancora
dalla IBM che nel 1962 pubblic il cosiddetto FORTRAN IV; ma in quello stesso
anno l'American National Standard Institute (ANSI) affid ad una commissione
la definizione di uno standard che fu definitivamente pronto nel 1966 e che
noto come FORTRAN 66 (cfr. [13]).
Dal 1966 in poi, in seguito al rapido evolversi degli elaboratori dal punto di vi-
sta dell'hardware e del software, il FORTRAN ha subito grosse trasformazioni.
Nel 1969 l'ANSI decise di formulare un nuovo standard che recepisse le princi-
pali e pi importanti estensioni del FORTRAN 66 introdotte dai compilatori di
nuova costruzione: la situazione era in cos rapida evoluzione che soltanto nel
1978 fu approvato il nuovo standard, noto come FORTRAN 77. Il documento
che definisce il FORTRAN 77 [12] descrive due livelli del linguaggio: il Full
Language. detto FORTRAN o FORTRAN 77, ed il Subsct Language che un
sottoinsieme del Full Language e costituisce lo standard attuale per elahoratori
48
con capacit di memorie limitate. Le differenze principali tra il Full ed il Subset
Language sono riassunte in appendice Al mentre quelle tra il FORTRAN 77 ed
il FORTRAN 66 verranno messe in evidenza nel corso del testo e riassunte in ap-
pendice A2.
Nel seguito le sigle F77 ed F66 saranno usate per indicare rispettivamente il
FORTRAN 77 ed il FORTRAN 66.
4.2. Alfabeto
L'insieme dei caratteri FORTRAN ossia l'alfabeto del linguaggio costituito
da:
caratteri alfanumerici: le cifre del sistema decimale (O, l, 2, 3, 4, S, 6, 7, 8, 9)
e le lettere dell'alfabeto inglese (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q,
R, S, T, U, V, W, X, Y, Z);
caratteri speciali: = uguale
+ pi
- meno
* asterisco
sbarra
parentesi tonda aperta
parentesi tonda chiusa
punto
apice
spaziatura (blank)
$ dollaro
due punti (non previsto in F66).
Si osservi che il carattere blank pu essere usato per migliorare la leggibilit
di un programma; infatti esso non ha alcun significato per il compilatore che lo
ignora sempre ad eccezione di casi particolari che verranno evidenziati in seguito.
Per evidenziare la presenza di un carattere blank useremo talvolta il simbolo v.
4.3. Costanti, nomi simbolici, parole chiave
Un programma FORTRAN costituito da frasi (o istruzioni) scritte con i
caratteri dell'alfabeto FORTRAN e suddivise in una o pi unit di programma.
Tra gli elementi primari che costituiscono una istruzione figurano le costanti,
i nomi simbolici e le parole chiave.
Costanti
Una costante FORTRAN una successione di caratteri che rappresenta per il
49
compilatore un valore che non deve cambiare durante l'esecuzione del program-
ma. La forma di una costante verr definita nel capitolo seguente.
Nomi simbolici
Un nome una successione dicaratteri alfanumerici !!!iziare
con deve essere costituita al pi da 6 (sei) caratteri. I nomi simbo-
'lici sono usati dal programmatore per identificare entit da lui stesso definite
(variabili, matrici, unit di programma, aree di memoria riservate, etc.).
Parole chiave
Nel linguaggio FORTRAN parola chiave sinonimo di codice operativo.
Una parola chiave infatti una successione di caratteri alfanumerici a cui il com-
pilatore attribuisce un particolare significato (ad esempio WRITE significa
scrivi, READ significa leggi e cos via) .
Si noti che non esistono in F77 nomi riservati nel senso che la stessa successio-
ne di caratteri pu essere usata, ovviamente con significato diverso, sia come nome
simbolico che come parola chiave: il compilatore in grado di determinare il signi-
,
ficato corretto in base al contesto in cui la successione di caratteri compare.e
4.4. Frasi eseguibili e non eseguibili
Le frasi FORTRAN si classificano come e frasi non eseguibili
(cfr. appendice A3): le prime specificano delle azioni che dovranno essere compiute
in fase di esecuzione e vengono tradotte in una o pi istruzioni del linguaggio mac-
china; le seconde non descrivono azioni ma forniscono informazioni al compila-
tore specificando, ad esempio, particolari caratteristiche o propriet dei nomi
simbolici usati (frasi dichiarative o di specificazione) oppure classificando le unit
di programma. J-e vengono tradotte in istruzioni del lin-
. guaggio macchina.
frasi che compongono ciascuna unit di programma devono
preciso ordine che impone, ad esempio, che le dichiarative le
bili (cfr. appendice f\3).
4.5. Etichette
Ad una frase FORTRAN pu essere assegnata una etichetta (/abel) in modo che
altre frasi della stessa unit di programma possano farvi riferimento.
Un'etichetta costituita da una successione di n cifre decimali, l n S, di
cui almeno una diversa da zero. Se n < 5 vengono ignorati i caratteri blank even-
tualmente presenti tra una cifra e l'altra, Inoltre le cifre zero eventualmente pre-
so
senti nelle prime posizioni dell'etichetta non sono significative ai fini della sua di-
stinzione da altre etichette. Cos, ad esempio, O1234, l v 234, '171234, 1234'17in-
dicano la stessa etichetta. E' ovvio che in una stessa unit di programma non pos-
sono esserci due o pi frasi con la stessa etichetta. Non invece considerata un
errore la presenza di etichette superflue ossia etichette alle quali non viene mai
fatto riferimento nel corso della stessa unit di programma; alcuni compilatori
segnalano per come situazione anomala la presenza di etichette superflue.
Osserviamo che tutte le frasi FORTRAN possono essere accompagnate da una eti-
chetta ma possibile far riferimento diretto a11e sole frasi eseguibili ed alla frase
FORMAT (cfr. cap. 13).
4.6. Il formato delle linee
SI
non possibile finire una frase FORTRAN ed iniziame un'altra sulla stessa
linea;
il testo della frase va scritto nelle colonne che vanno dalla 7-ma alla 72-ma Iv
\1 comprese;
una frase pu essere formata da pi linee (fino ad un massimo di venti). La
prima linea detta linea iniziale e le altre sono dette linee di continuazione;
una linea di caratterizzata dalla presenza di un carattere diverso (j'!
vi' da blank o zero a colonna 6; -
l'eventuale etichetta di una frase deve essere scritta nelle colonne da I a 5 della
linea iniziale.
:'
t
,I
:.1

Un programma FORTRAN si presenta fisicamente come una successione di


linee che vengono scritte in modo sequenziale su opportuni supporti.
Ciascuna linea costituita da una successione di 72 caratteri dell'alfabeto
--- - ----- .-
FORTRAN e la posizione di ciascun carattere in una linea detta
I pi comuni supporti su cUI vengono scritte le linee di un programma permet-
tono di comporre linee con un numero di caratteri superiore a 72. Gli eventuali
caratteri presenti in una linea a partire da11a colonna 73 in poi sono per ignorati
dal compilatore FORTRAN ai fini della creazione del programma oggetto; essi
possono per essere riprodotti in una lista ovvero in una copia del programma
sorgente. La presenza di caratteri successivi al 72-mo non quindi sentita
in alcun modo dal compilatore FORTRAN il quale, ignorandola completamente,
non la segnala in alcun modo al programmatore; questo pu essere fonte di errori
in compilazione e/o in esecuzione non sempre facilmente rintracciabili.
Una linea di un programma considerata linea di commento e viene del tutto
ignorata dal compilatore quando interamente costituita da caratteri blank,
oppure quando ha uno dei due caratteri C o * a colonna 1.
Una linea di commento pu contenere nelle colonne successive alla prima
qualunque carattere, anche non appartenente all'alfabeto FORTRAN, che sia
stampabile, ovvero riproducibile su un supporto esterno quale ad esempio un
video o un foglio di carta.
Una linea di commento pu stare in qualunque punto dell'unit di programma.
Le linee di commento vengono riprodotte nella lista del programma e servono
quindi per facilitare la lettura e la comprensione del programma stesso.
(
In F66 una linea considerata di commento soltanto se ha il carattere C a
colonna l. ,
Una linea che non sia linea di commento deve essere composta tenendo pre-
senti le seguenti regole:
c o 1t (o tr /', O

4' l 4 r ,.,.
'ClOU/'c/',
(7unl
12
__________ -.1.+--- . _
5
Costanti e variabili:
elementi fondamentali di ogni istruzione
Ogni istruzione FORTRAN che elabora un'informazione deve far riferimento
alla locazione di memoria nella quale contenuta l'informazione stessa. Tale in-
formazione pu o meno variare durante l'esecuzione del programma: nel primo
caso la locazione di memoria deve essere identificata da un nome simbolico
mentre nel !,u essere identificata da una costante.
5.1. Le costanti ed il loro tipo
In F77 sono previste costanti di tipo diverso: intero, reale. doppia precisione.
complesso. logico e carattere. Ogni tipo corrisponde a modalit diverse di rappre-
sentazione in memoria del valore identificato dalla costante. La forma di una co-
stante ne specifica il tipo ed il valore.
Costanti intere
Si definisce costante intera una stringa di cifre decimali eventualmente prece-
duta dal segno + o -. Formalmente una costante intera pu essere rappresentata
da

dove s indica il segno ed n indica una stringa di cifre decimali. Se il segno s manca,
la costante si intende essere positiva.
Esempio 5.1. Sono costanti intere le seguenti:
-2 + 37 - 578 1957 - 15878 -I o 3
in quanto nella stringa n compaiono simboli non consentiti (il punto decimale e
la virgola).
l
b
mentre non lo sono:
- 2.0 1.957 + 0.1 - 15,73
F
54
55
Il valore rappresentato da una costante intera memorizzato in una unit di
memoria numerica secondo le modalit viste per la rappresentazione dei numeri
interi.
ciascuna delle quali rappresenta il valore 1O 3;
- 4.857E + 03 -.4857E + 04 - 485. 7E I
ciascuna delle Quali rappresenta il valore -4857.
- 4857.EO
Costanti reali
Esempio 5.2. Sono costanti reali nella forma senza esponente le seguenti:
Le costanti reali rappresentano valori che vengono memorizzati in virgola
mobile normalizzata all'interno di una unit di memoria numerica secondo le
modalit viste per la rappresentazione dei numeri reali. Una costante reale pu
essere scritta in due modi: senza esponente e con esponente.
Nella forma senza esponente, caratterizzata dalla presenza del punto decimale,
la costante scritta come
/s n. 011
dove s indica il segno mentre n ed m sono stringhe di cifre decimali. Il segno pu
mancare ed in questo caso la costante intesa come positiva. Anche una delle
due stringe n ed m pu esser vuota ed in questo caso la stringa mancante consi-
derata uguale a zero.
+ 0.7 + 23.5 - 0.001 + 0.0 .05 - 1. O.
In F77 prevista una forma esponenziale senza il punto decimale non consen-
tita in F66. Cos sono valide le costanti 1E - 2 per rappresentare 0.0 I oppure
_ 503E - 2 per rappresentare - 5.03.
Le costanti reali sono spesso dette anche costanti reali in precisione semplice
per distinguerle esplicitamente dalle costanti reali in doppia precisione.
Costanti in doppia precisione
Una costante reale in doppia precisione rappresenta un valore che viene memo-
rizzato in virgola mobile normalizzata in una cella costituita da due unit di me-
moria numeriche consecutive.
Le costanti di questo tipo vengono scritte soltanto nella forma esponenziale
con la lettera TI che sostituisce la Eusata per le costanti reali in precisione sempli-
ce. Pertanto una costante in doppia precisione della forma:
I
dove s, n, m ed e hanno lo stesso significato visto per le costanti reali.
Nella forma con esponente, caratterizzata dalla presenza della lettera E, la co-
stante scritta come:
Esempio 5.4. Alcuni esempi di costanti in doppia precisione sono i seguenti:
+ 3.875D + 00 387.5D - 02 3875.D - 3 .3875Dl
ciascuna delle quali rappresenta il valore 3.875; le costanti
Isn.mEse\
dove s indica un segno, mentre n, m ed e sono stringhe di cifre decimali. Il signifi-
cato della forma esponenziale il seguente:
+ 1000.D + 00 + I.D + 03 I.D3 1 D3
s n . m x l O'"
rappresentano invece il valore 1000.
Esempio 5.3. Sono costanti reali nella forma con esponente le seguenti:
ovvero la costante intera e che segue con il suo segno la lettera E ha il signifi-
cato di esponente rispetto alla base dieci e il suo valore legato alle limitazioni
di overtlow e di undertlow per i numeri reali. Il segno s pu mancare ed in questo
caso si suppone che esso sia +; una delle due stringhe n ed m pu mancare ed
considerata uguale a zero.
ciascuna delle quali rappresenta Il valore - 5.03;
Anche per questo tipo di costante va osservato che la versione senza il punto
decimale valida soltanto in F77.
indica il numero complesso 1.5 + 7.3i
indica il numero complesso 1 - 7i.
(1.5, 7.3)
(1.,-.7EI)
Costanti di tipo complesso
Le costanti di tipo complesso sono usate per rappresentare numeri complessi
e vengono scritte come coppie di costanti reali separate da una virgola e chiuse tra
rappresenta la parte reale del numero complesso
mentre la seconda rappresenta la parte immaginaria. Cos, per esempio:
- 503.E - 2
+ O.OOIE + 00
- 50.3E - 1
.IE - 2 + LE - 3
- 0.503E + 01 - 5.03E + 00
+ I.E - 03
56
Le costanti di tipo complesso sono memorizzate in celle costituite da due uni-
t di memoria numeriche consecutive.
Costanti di tipo logico
Siccome i valori logici possibili sono soltanto due si hanno due sole costanti
logiche:
.TRUE. e .FALSE.
ossia vero e falso. I punti che accompagnano le stringhe TR UE (FALSE)
fanno parte integrante della costante e non possono essere omessi.
Una costante di tipo logico memorizzata in una unit di memoria numerica.
Costanti di tipo carattere
Questo tipo di costanti previsto soltanto in F77; per la loro definizione e uti-
lizzazione si veda il cap. 12.
5.2. Le variabili ed il loro tipo
Una variabile una cella il cui contenuto (valore) pu variare durante l'esecu-
zione del programma ed il nome simbolico che la identifica, detto nume di varia-
bile. la distingue da ogni altra cella della stessa unit di programma. Il nome
simbolico di una variabile deve soddisfare le regole viste nel 4.3. Sono quindi
corretti i nomi:
A Al NOME X3Y COST SOMMA DIFFE N23
mentre non lo sono:
lA Al. NOME! X3 + Y COjST DIFFERENZA.
Le variabili FORTRAN possono essere di tipo intero, reale, doppia precisio-
ne, complesso, logico e carattere. Ad ognuno di questi tipi corrisponde una diversa
rappresentazione in memoria del valore della variabile ed una diversa lunghezza
delle celle destinata a contenerlo. Ogni variabile intera, reale o logica occupa infat-
ti una unit di memoria numerica mentre ogni variabile di tipo doppia precisione
o complesso occupa due unit di memoria numeriche. Le variabili di tipo carat-
tere sono memorizzate secondo modalit diverse che verranno esposte nel cap.
12.
La lettera iniziale di un nome di variabile pu essere usata per distinguere
le variabili di tipo intero da quelle di tipo reale. Le variabili reali sono infatti
caratterizzate da nomi che iniziano con una qualunque delle lettere dalla A alla
H o dalla O alla Z; le variabili intere sono invece contraddistinte da nomi che ini-
ziano con una dellelettere I, J, K, L, M, N.
57
Esempio 5.5. Sono nomi di variabili intere i seguenti:
NOME LPI 13 KSTAR IND JSOMMA
mentre sono nomi di variabili reali:
OME AMAX SOMMA AI DIFFE STAR.
Se il tipo di una variabile non intero o reale. esso deve essere esplicitamente
Per specificare esplicitamentejltipo di una variabile si usano frasi che
di specificazion!.. (dichiarative) di tipu che hanno la
tipo lista
dove:
tipo sta ad indicare uno dei seguen ti dichiaratori:
INTEGER, REAL, DOUBLE PRECISION. COMPLEX, LOGICAL,
CHARACTER;
lista indica una successione di nomi di variabile separati da virgole.
L'effetto di una frase dichiarativa di tipo la cui lista sia costituita da nomi di
variabile quello di comunicare al compilatore che tali variabili sono da consi-
derarsi, nella in cui compare la frase dichiarativa, del tipo
specificato dal dichiaratore. . ..
Esempio 5.6. La frase
DOUBLE PRECISION RADIX. MAX
serve a specificare che le variabili RADIX e MAX devono essere trattate come va-
riabili doppia precisione e quindi il loro valore verr memorizzato in celle di lun-
ghezza doppia rispetto a quelle riservate alla memorizzazione di variabili reali.
Ulteriori utilizzazioni delle frasi dichiarative di tipo saranno analizzate nel corso
d.el .testo. Jn ogni caso si deve tener presente che le liste che compaiono in due.Ira,
SI dichiarative non possono avere elementi comuni.
Ogni unit di programma pu contenere pi istruzioni di specificazione di tipo
va sempre ricordato che le [rasi dichiarative devono essere poste prima
di qualunque frase eseguibile (cfr. appendicie A3).
Anche se la lettera iniziale del nome pu essere usata per distinguere le varia-
bili reali da quelle intere, pu essere comodo usare una dichiarazione esplicita di
tipo anche per queste variabili.
58
Esempio 5. 7. Le dichiarazioni
REAL MEDIA, MINIMO
INTEGER PESO
permettono di utilizzare le variabili MEDIA e MINIMO come reali e la variabile
PESO come intera evitando l'uso di nomi meno comodi quali ad esempio
AMEDlA, XMINIM, KPESO.
Si osservi che abbastanza diffusa l'abitudine di dichiarare il tipo di tutte le
variabili di una unit di programma comprese quelle intere e reali e che alcuni
compilatori possono essere utilizzati in modo da inviare un messaggio di avverti-
mento, se non addirittura di errore, nel caso in cui venga utilizzata una variabile
il cui tipo non sia stato esplicitamente dichiarato. Questa scelta permette di con-
trollare eventuali errori di battitura dei nomi di variabile e semplifica le opera-
zioni che devono essere fatte quando si vuoI avere, per esempio, la versione in
doppia precisione di un programma gi scritto in semplice.
5.3. L'istruzione IMPLICIT
Le variabili il cui nome non compare in nessuna frase di specificazione di tipo
si dicono di tipo implicito: la lettera iniziale del loro nome determina il loro
tipo.
Per fissare il legame tra il tipo di una variabile e la lettera iniziale del suo nome
si usa l'istruzione IMPLICIT che non prevista in F66. La forma di questa istru-
zione la seguente:
IMPLICIT tipo I (elenco l), tipo 2 (elenco 2), ...
dove:
tipo l, tipo 2, etc. sono dichiaratori di tipo (esempio REAL, LOGICAL);
elenco I, elenco 2, etc. sono liste costituite da una o pi lettere dell'alfabeto
inglese ciascuna delle quali separata dalla successiva mediante una virgola. Un
elenco di lettere consecutive alfabeticamente ordinate pu essere indicato median-
te la sua prima ed ultima lettera separata da un segno meno.
L'effetto dell'istruzione IMPLICIT quello di specificare, mediante i dichiara-
tori, il tipo delle variabili i cui nomi simbolici iniziano con una lettera che compa-
re nella specificazione.
L'istruzione IMPLICIT ha effetto soltanto nell'unit di programma che la con-
tiene.
Esempio 5.8. L'istruzione
IMPLICIT REAL (I, L-N), INTEGER (A-C)
r
59
fa s che tutte le variabili di tipo implicito i cui nomi iniziano con I, L, M, N
sono di tipo reale mentre quelle i cui nomi iniziano per A, B, C sono di tipo
intero.
L'utilit della istruzione IMPLICIT evidente quando. per esempio. si vuoI
modificare da reale semplice a reale doppia precisione il tipo di tutte le variabili
di una unit di programma; per far questo baster utilizzare il comando
IMPLICIT DOUBLE PRECISION (A-H, O-Z).
Per utilizzare correttamente l'istruzione IMPLICIT si deve anche ricordare che
essa deve precedere qualsiasi altra istruzione dichiarativa di tipo e che una dichia-
rativa esplicita di tipo prevale sull'istruzione IMPLICIT.
Esempio 5. 9. La successione di istruzioni:
IMPLICIT DOUBLE PRECISION (A-C)
REAL BETA, ALFA
INTEGER CPI
ha l'effetto seguente: tutte le variabili i cui nomi iniziano con le lettere A, B, C
sono di tipo doppia precisione ad eccezione delle variabili BETA ed ALFA che
sono di tipo reale e della variabile CPI che di tipo intero.
Nel testo, quando non sia esplicitamente indicato, si suppone che il tipo delle
variabili sia implictamente definito dal loro nome.
Inoltre verr usata la notazione
nome simbolico: valore
per indicare che la variabile, il cui nome simbolico compare alla sinistra dei due
punti, ha il valore specificato alla destra dei due punti; cos, ad esempio, I : 5 si-
gnifica che la variabile di nome I contiene il valore 5.
6
Le espressioni
Una espressione FORTRAN una qualunque combinazione di operandi otte-
nuta tramite operatori e parentesi tonde; l'esecuzione delle operazioni indicate
dagli operatori d luogo ad un risultato che viene detto l'a/ore de/l 'espressione.
Si osservi che anche un SlOgOIO operando costituisce una espressione FORTRAN.
Le espressioni FORTRAN si suddividono in aritmetiche, rei azionali, logiche e
carattre.Queste ultime, non previste in F66, saranno trattate nel cap. 12.
6.1. Espressioni aritmetiche
Le espressioni aritmetiche sono utilizzate per ottenere come risultato un valore
numerico. Esse sono costituite da operandi di tipo numerico, quali ad esempio
variabili e costanti di tipo intero, reale, doppia precisione o complesso, e da ope-
ratori aritmetici. Gli operatori aritmetici sono i seguenti:
Operatore
+
*
**
Operazione aritmetica
addizione
sottrazione
moltiplicazione
divisione
elevamento a potenza
Osserviamo che in un'espressione aritmetica non sono permessi due operatori
consecutivi, e che l'operazione di moltiplicazione va sempre indicata con il simbo-
lo *. Cos, per esempio, sono valide le seguenti espressioni:
1+3 .. 2
mentre sono esempi di espressioni non valide i seguenti:
x * - Y A + - B 5.5 * - l x ** - Y
(
62
63
e, nell'ambito dello stesso livello di priorit, il calcolo viene eseguito da sinistra
verso destra.
Esempio 6.1. L'espressione 1.0 + 3.0 * 2.0 viene valutata eseguendo prima la
moltiplicazione, che d come risultato 6.0, e dopo l'addizione fra 1.0 e 6.0; il
risultato finale quindi 7.0 (cfr. fig. 6.1).
3.0
ti
10.0 2.
Y
5 ~ 2
Calcolando da sinistra verso destra le addizioni e sottrazioni, il risultato finale
18.0(cfr. fig. 6.2).
priorit alta
priorit media
priorit bassa
**
* e I
+e-
3.0 2.0
V
1 ~ ~ 1
Valutazione delle espressioni aritmetiche
La valutazione di un'espressione aritmetica avviene usando i contenuti delle
celle di memoria indicate dagli operandi nel modo indicato dagli operatori; per
esempio l'espressione X + Y viene valutata sommando il contenuto della cella
di nome X con quello della cella di nome Y. Se in un'espressione compaiono di-
versi operatori la sua valutazione avviene tenendo presenti le seguenti priorit:
Figura 6.1. Valutazione dell'espressione 1.0 + 3.0 * 2.0.
Figura 6.2. Valutazione dell'espressione 5.0 + 10.0/2.0 + 3.0 .. 2 - 1.0.
Esempio 6.2. L'espressione
5.0 + 10.012.0 + 3.0 ** 2 - 1.0
viene valutata eseguendo innanzitutto l'elevamento a potenza che d come ri-
sultato .lII = 9.0. L'espressione pertanto diventa:
5.0 + 10.0/2.0 + 9.0 - 1.0.
Esempio 6.3. L'espressione A + B/C ** D viene valutata eseguendo prima l'ele-
vamento a potenza C ** D; indicato con .0l
I
il risultato di questa operazione,
l'espressione diventa A + B/9f l' viene quindi eseguita la divisione B/9f I otte-
nendo un risultato 9f
2
; il risultato finale ~ 3 ottenuto eseguendo l'operazione
A + .!jI2 (cfr. fig. 6.3).
Viene quindi eseguita la divisione e si ottiene:
5.0 + 5.0 + 9.0 - 1.0.
i ~
,-Jf4 ~ A + ;7i 3
Figura 6.4. Valutazione dell'espressione A + H/C ** D * E-F.
Jf
5
6S
fJt
l
+-C" D
A + 91
3
- F
91
4
- F
C D
V
y ~
V ~ l
fJt 3 fJt 3 +- A + ,rJt
2
Figura 6.3. Valutazione dell'espressione A + H/C D.
fJl
3
+- fJl
2
* E ~
91
4
+-A + fJl
3
~
fJl +- 9t -F
5 4
Esempio 6.4. La valutazione dell'espressione
A + B/C ** D E - F
pu essere cos schematizzata (cfr. fig. 6.4):
64
91
1
+- C ** D ~ A +B/ ,0l
l
E - F
91
2
+- B/91
l
~ A + fJt
2
E - F
Uso delle parentesi
L'utilizzazione delle parentesi tonde permette di modificare la priorit di ese-
cuzione delle operazioni aritmetiche in quanto, al momento della valutazione di
una espressione, vengono eseguite per prime le operazioni racchiuse tra parentesi,
Quando una coppia di parentesi racchiusa in un'altra, l'espressione contenuta
nella coppia pi interna viene calcolata per prima.
Esempio 6.5. L'espressione (X + Y) * W viene valutata calcolando prima
,7f l +- X + Y, e poi ,'79 2 +- ,?fl * W; essa corrisponde all'espressione algebrica
(x + y) w. L'espressione X + Y * W, corrispondente invece a x + y w, viene cal-
colata valutando prima ,?fl +- Y * W e dopo .?f2 +- X + ,7f l'
a + b
Esempio 6.6. L'espressione algebrica --- deve essere scritta in FORTRAN
c
come (A + B)/C, in quanto l'espressione A + B/C equivale all'espressione algebri-
b
ca a + e non a quella data (cfr. fig. 6.5).
c
a
Esempio 6.7 L'espressione algebrica - correttamente trascritta in FORTRAN
bc
a
come A/(B * C), mentre A/B * C corrisponde alla espressione - c (cfr. fig. 6.6).
b
66
67
a+b b
Figura 6.7. Calcolo di -- e a + - +d.
c+d c
Elevamento a potenza
In F77 due successivi. elevamenti potenza sono valutati iniziando da quello
---- ... -.---. . c
di de;tra: A ** B ** C equivale a a(b). In F66 non invece consentito l'uso di
elevamenti a senon utilizzando le parentesi; perci, in F66,
l'operazione a(b
c
) deve essere trascritta come A ** (B **
brica tradottasiainF chejn,F77 come (A ** B) ** C. Cos,
per esempio, se i valori contenuti nelle celle di nome A, B, C sono:
b
e a+ -.
c c
a+b
Figura 6.5. Calcolo di
91,---
B C
V

I
I,
\
!
I:
a a
Figura 6.6. Calcolo di - e b c.
bc allora
A: 2. B : 2. C: 3.
fig. 6.7).
b
come (A + B)/(C + D), mentre A + B/C + D corrisponde ad a + -+ d (cfr.
c
Esempio 6.8. L'espressione algebrica
a + b
c+d
deve essere scritta in FORTRAN
(A ** B) ** C
A ** (B ** C)
A ** B ** C
viene eseguita valutando 2.
2
. = 4. e poi 4.3. = 64.;
viene eseguita valutando 2.
3
. = 8. e poi 2.
8
= 256.;
non viene eseguita in F66 in quanto considerata
ambigua, mentre in F77 essa equivale alla prece-
dente.
Le parentesi possono anche essere usate per separare due simboli di operatori
aritmetici; cos per esempio. dovendo trascrivere l'esnressione algebrica a- b. si
deve scnvere A ** (- B) e J espressione algebrica - ba pu essere corretta-
mente scritta come - B * A oppure come A * (- B).
Osserviamo che in F66 una grandezza numerica di qualunque tipo pu essere
elevata ad esponente intero, ma soltanto le grandezze reali possono essere elevate
ad esponente reale. In F77, invece, sono permessetuttelecombinazioni di tipo
tra la base e l'esponente.Tatta eccezioneper quelle checoinvolgono i tipi doppia
precisione e complesso. Le combinazioni consentite in F66 e F77 sono riassunte
68 69
in fig.6.1) e 6.9 rispettivamente, dove I, R, Dp, C indicano i tipi intero, reale,
doppia precisione, complesso.
Dalle figure risulta evidente che, mentre un'espressione come I ** J oppure
AK ** 5 permessa in qualunque versione del FORTRAN, le espressioni 3 ** 0.5
oppure I ** R non sono valide in F66.
Va osservato che in FORTRAN la divisione fra interi d come risultato la parte IlA
1intera si otterrebbe eseguendo l'operazione in aritmetica reale: tr
Cos il valore della espressione FORTRAN 1/2 Omentre 1./2. d come risul-
tato 0.5. Analogamente:
Nella valutazione delle espressioni intere contenenti una o pi operazioni di
divisione quindi molto importante l'ordine in cui le operazioni vengono effet-
4
tuate. Si consideri, ad esempio, l'espressione algebrica - . 3: essa trascritta cor-
3
rettamente nell'espressione FORTRAN intera 4 * 3/3 il cui valore 4, ma non
nell'espressione intera 4/3 * 3 il cui valore 3.
k - n
(K - N)/M * J.
vale zero qualunque siano i valori di l e J;
vale - l;
vale N se e soltanto se N pari;
vale N qualunque sia N;
vale zero se M minore di N in valore assoluto.
1/2 * (l +J)
4/(5-8)
N/2 * 2
N * 2/2
N/M * M
J * (K - N)/M e
Esempio 6.9. Le seguenti espressioni intere

l R Dp C
base
l s s s s
R s s s s
Dp s s s no
C s s no s
Figura 6.9. Elevamento a potenza in F77. Figura 6.8. Elevamento a potenza in F66.

l R Dp C
base
l s no no no
R s s no no
Dp s no s no
C s no no no
Il r
Ossen'azione 1. Mentre l'operazione di elevamento a potenza con esponente in-
tero viene di solito eseguita tramite moltiplicazioni ripetute, quella con esponente
reale richiede il passaggio al logaritmo, e quindi un tempo di calcolo maggiore.
Dovendo allora calcolare a
3
, conviene usare l'espressione A ** 3 anzich A ** 3.0.
Osservazione 2. La definizione matematica di elevamento a potenza nel campo
reale impone alcune restrizioni: non pu essere elevata ad esponente negativo o
nullo un'espressione il cui valore sia zero, e non pu essere elevata ad esponente I
reale un' espressione il cui valore sia negativo. .Il \
_____ j'J
Uso dell'aritmetica intera e reale
Se un operatore aritmetico opera su grandezze dello stesso tipo il risultato di
un'operazione un valore il cui tipo coincide con quello degli operandi; esso vie-
ne determinato eseguendo l'operazione in aritmetica intera, reale, doppia pre-
cisione o complessa a seconda del tipo degli operandi. Cos, ad esempio, 3 + 5
d come risultato il numero intero g, mentre 3. + 5. d come risultato il valore
reale 8. che viene memorizzato in virgola mobile normalizzata. Ancora, mentre
l'espressione 30875 + 7874, facendo uso dell'aritmetica intera, pu dar luogo
su alcuni elaboratori a fenomeni di overf1ow, l'espressione 30875. + 7874. uti-
lizza l'aritmetica dei reali e il risultato, ovvero il numero 38749., rappresentato
in memoria come reale.
pur trascrivendo in modo corretto le espressioni algebriche equivalenti j
k-n m
e -- j, possono dare risultati numericamente diversi. Per esempio, se i con-
m
tenuti delle vanabili sono
K:5 N:3 M:4 J:8
la prima espressione vale 4 (cfr. fig. 6.10) e la seconda vale zero (cfr. hg.6.11).
3 9f] +-.0f 2/4
Figura 6.10. Valutazione di * (S - 3)/4.
j"
70
f
71
Operazioni fra numeri complessi
Le operazioni aritmetiche tra operandi di tipo complesso danno come risultato
un numero complesso. In fig. 6.12 si ricordano le definizioni matematiche delle
operazioni elementari fra complessi intendendo zi = u
1
+ i v
1
e z2 = u
2
+ i v
2
Osserviamo che anche nel caso di espressioni non intere pu essere fondamenta-
le l'ordine in cui le operazioni vengono effettuate. Infatti il risultato di un'opera-
zione fra due numeri reali rappresentabili in macchina pu non essere un numero
rappresentabile in macchina, e deve quindi essere approssimato con la sua rappre-
sentazione floating point (cfr. cap. 3). In questa gerarchia il tipo doppia precisione e complesso sono allo stesso li-
vello in quanto essi non possono coesistere in una stessa espressione.
La regola generale che comanda l'esecuzione delle operazioni aritmetiche resta
ancora valida; pertanto se il tipo di due operandi non lo stesso, quello pi debole
~ i n automaticamente modificato in quello pi forte mediante un'operazione,
detta di conversione, che permette il passaggio da una rappresentazione intem-a .
i ad un'altra. Anche se la possibilit di combinare in un'espressione operandi di
tipo diverso molto comoda, va osservato che essa d luogo in generale ad un'ela- l,
borazione pi lenta, in quanto l'operazione di conversione costa un certo tem-
po macchina.
Operazione Risultato
Parte reale Parte immaginaria
I) Doppia precisione, complesso
2) Reale
3) Intero
pi forte
1
pi debole
U
1
+u
2
v
1
+ v
2
u
1
-U
2
vI - ":
u
1u2
- v
1
v
2
U
1V2+V1U2
U
1U2+V1V2
U
2
v
1
- v
2
U
1
Iz21 IZ21
Vu
2
+ v
2
zero
2 2
Esempio 6.11. Si consideri l'espressione 1.1 + 2; in essa sono presenti due gran-
dezze di tipo diverso: 1.1 che reale e 2 che intera. Siccome l'operazione pu
essere eseguita soltanto fra operandi dello stesso tipo, il risultato viene calcolato
in due fasi:
la costante 2 viene convertita dal tipo intero a quello reale (pi forte);
viene eseguita l'operazione di addizione facendo uso dell'aritmetica reale e si
ottiene il valore 2.1.
Figura 6.12. Operazioni elementari fra numeri complessi.
Esempio 6.10. Supponiamo che la variabile complessa li contenga il valore
5 + 3i e l2 contenga 2.5 - 1.1 i.
L'espressione l l + l2 d come risultato un valore complesso la cui parte
reale data da 5. + 2.5 = 7.5 e quella immaginaria da 3. - LI = 1.9.
L'espressione l I + l2 - (8.7, LE - I) d ancora un valore complesso la
cui parte reale uguale a 7.5 - 8.7 = - 1.2 e quella immaginaria uguale a
1.9 - LE - I = 1.8.
Espressioni aritmetiche miste
Le operazioni aritmetiche di addizione, sottrazione, moltiplicazione e divisio-
ne possono essere eseguite soltanto tra operandi dello stesso tipo. E' per possi-
bile utilizzare in una stessa espressione operandi di tipo diverso dando luogo a
quelle che vengono dette espressioni miste. In queste espressioni le operazioni
vengono eseguite tenendo presente la seguente gerarchia fra i tipi degli operandi:
6
Esempio 6.12. Consideriamo l'espressione algebrica "5 a. , ~ fClll 't' ,
Essa pu essere trascritta nell'espressione mista 615 * A che, pur essendo
sintatticamente corretta, d luogo ad un risultato sbagliato: la sua valutazione
infatti prevede innazitutto l'esecuzione della divisione fra interi 6/5 che d come
risultato il numero intero I; l'operazione successiva I * A di tipo misto e l'ope-
rando intero l viene convertito nel suo equivalente reale prima di essere molti-
plicato per il contenuto della variabile A. Il risultato dell'espressione FORTRAN
6
6/5 * A quindi A. L'espressione - a pu invece essere correttamente tradotta
5
come 6 * A/5 oppure 6./5 * A (cfr. fig. 6.13).
Uso delle funzioni intrinseche
Oltre alle operazioni aritmetiche di addizione, sottrazione, moltiplicazione,
divisione ed elevamento a potenza, sono spesso necessarie operazioni pi com-
pIesse quali, ad esempio, il calcolo dei logaritmi, di funzioni trigonometriche,
ecc.. Tali operazioni vengono eseguite in FORTRAN usando opportune procedu-
re, dette funzioni intrinseche, ciascuna delle quali indicata da un nome. Cos,
per esempio, la funzione esponenziale indicata da EXP, la radice quadrata da
72 73
Figura 6.13. Valutazioni di espressioni miste relative all'esempio 6.12.
si converte 6 da intero a reale: 6.0
si calcola 6.0 * A - Risultato reale: ;jfl +- 6.0 * A
si converte 5 da intero a reale: 5.0
si calcola 3f
1
/ 5.0 - Risultato reale: ;'f,f +- :'Jf
1
/ 5.
Operazione
Nome della Numero di Tipo degli Tipodc:l
funzione argomenti argoment i risultato
{'m
l l, R, Dp.C Intero
REAL l I, R, Dp,C Reale
Conversione
DBLE l I, R, Dp,C Doppia precisione
CMPLX 102 I, R, Dp,C Complesso
Modulo ABS C Reale
Valore assoluto ABS I, R, Dp Il tipo del
Radice quadrata SQRT R, Dp, C risultato coincide
Esponenziale EXP R, Dp,C con quello degli
Logaritmo naturale LOG R, Dp, C argomenti che,
Seno SIN R,Dp,C nel caso siano pi
Coseno COS R,Dp,C di uno,<k"l1l10
Tangente TAN R,Dp essere tu Ili
Massimo fra pi valori MAX 2 o pi I, R,Dp dclIostesso
Minimo fra pi valori MIN 2 o pi I, R,Dp
tipo
SQRT (678.36)
EXP(Y)
MlN (J,. 3 + N, 8)
A + SIN (0.5 * TETA)
0.5 * (H + A/SQRT(X
B/(ABS (X Y) * EPS)
EXP (ABS (H/2
SQRT (13 * C + SQRT(A))
Figura 6.14. Alcune funzioni intrinseche in F77.
SQRT, il valore assoluto da ABS. In fig. 6.14 sono riportate alcune delle principali
funzioni intrinseche disponibili in F77 (per un elenco completo cfr. cap. 14).
Ciascuna funzione opera su uno o pi dati, detti argomenti, e fornisce un
unico risultato che pu essere utilizzato scrivendo il nome della funzione seguito
da una lista di argomenti racchiusa fra parentesi. Nella maggior parte dei casi
previsto un solo argomento; quando per gli argomenti sono pi di uno, essi de-
vono essere separati da virgole.
Per utilizzare correttamente una qualunque funzione intrinseca fondamentale
che il numero e il tipo degli argomenti coincida con quello specificato in fig.
6.14; cos, ad esempio, SQRT (2) un'espressione sbagliata in quanto la funzione
SQRT non pu essere usata con argomenti di tipo intero. che un ar-
somentc di tipo sp'!gliatQ non autcmaticamente ad un tipo
retto, e che inoltre errori di questo tipo non vengono di solito segnalati e generano
quindi risultati imprevedibili.
Sono esempi di espressioni che utilizzano funzioni intrinseche i seguenti:
'1- 6 / 5=1
6
!
6. A
"cf
gf
l
6 5
"cf
31'1 AJI\ - 6./5. =
"cf
6./5 * A
si converte 5 da intero a reale: 5.0
si calcola 6.0/5.0 - Risultato reale:
9f
t
+-6./5. = 1.2
si calcola .3f1 * A - Risultato reale:
91 +- 3f
1
* A = 1.2 * A.
6/5 * A
6 * A/5
si calcola 6/5 - Risultato intero: l
si converte l da intero a reale: 1.0
si calcola 1.0 * A - Risultato reale gf +- l. * A
74
7S
.<al
6
- 99
4
+
C. EXP (X .'lfl-I.O)
C * EXP (.<al
2
- \.0)
C * EXP ( fJf 3)
C * Y9
4
1- LOG(X)
,<al 2 -X
gp
l
91
3
- .rjl2 - \.0
(jf 4 - EXP(.rjl 3)
{jfs-C. fJf
4
Esempio 6.15. Valutazione di C. EXP (X LOG(X) - 1.0)
- 2. A
:19
7
-
Esempio 6.16. Valutazione di SQRT(X + SQRT ( 1.0 + X + X * Y
8l
1
- 1.0 + X SQRT(X+SQRT({jfI+X*Y
9P
2
- SQRT SQRT (X + fJf
2)
+ X * Y
(jf 3- X + 91
2
SQRT(.<al3) + X * Y
Come si vede da questi esempi, una qualunque espressione pu essere usata
come argomento di una funzione intrinseca; il tipo dell'espressione deve coinci-
dere con uno di quelli specificati dal FORTRAN per l'argomento corrispondente.
L'espressione usata come argomento di una funzione intrinseca pu ridursi ad
una costante o ad una variabile come nei primi due esempi, oppure pu coin-
volgere operazioni aritmetiche e/o riferimenti ad altre funzioni intrinseche. E'
inoltre premesso utilizzare in un argomento di una funzione intrinseca la fun-
zione stessa (cfr. l'ultimo esempio).
Molte funzioni intrinseche in F77 possono avere argomenti di tipo diverso:
in generale il risultato dello stesso tipo degli argomenti che, se sono pi di uno,
devono essere tutti dello stesso tipo. Per esempio, se X una variabile in doppia
precisione e K una variabile intera, i loro valori assoluti possono essere determinati
rispettivamente da ABS(X) e ABS(K) e. mentre il risultato di ABS(X) un valore
in doppia precisione, quello di ABS(K) intero; se C una variabile complessa
il risultato di ABS(C) un valore reale, il modulo di C.
Osserviamo che lo standard F66 prevede nomi diversi per funzioni che operano
su argomenti di tipo diverso. Cos, ad esempio, il valore assoluto di un intero deve
essere calcolato mediante la funzione IABS, di un reale mediante ABS, di una
quantit in doppia precisione mediante DABS, e il modulo di un numero com-
plesso mediante CABS (cfr. cap. 14 e appendice A2).
Se in un'espressione aritmetica compare un riferimento ad una funzione in-
trinseca, questa viene valutata prima di effettuare qualunque altra operazione
aritmetica. Da ci segue che le espressioni che compaiono come argomenti d uria
funzione saranno le prime ad essere valutate e, se esse utilizzano a loro volta una
funzione, questa avr la precedenza.
Esempio 6.13. Valutazione di A + SIN (0.5 * TETA)
9P
1
- 0.5 * TETA A + SIN
.<al
2-SIN(.<al I)


Esempio 6.14. Valutazione di SQRT (B ** 2 - 4. * A * C)/(2. * A)

SQRT - 4. * A * C)/(2. * A)
992- 4. * A

SQRT (fAI - fA
2
* C)/(2. * A)
fA
3
- fjf 2 * C
SQRT ( fjf I - fjf 3)/(2. * A)
9P
4
- fjf\ - fjf3

SQRT (fA4)/(2. * A)
Si osservi che alcune funzioni intrinseche permettono di eseguire operazioni
di conversione di tipo e possono essere usate per modificare il tipo del risultato
dell'espressione che costituisce il loro argomento. Cos, ad esempio, la funzione
REAL permette di convertire in reale quantit di altro tipo e la sua utilizza-
zione pu essere esemplificata dalle seguenti espressioni:
REAL (2 + 1)/2 REAL ( I /2) * A
L'esecuzione della prima espressione prevede la valutazione della espressione
intera 2 + I; il suo valore, 3, viene convertito in reale e successivamente diviso
per il numero intero 2. Il risultato della pnma espressione e pertanto 1.5. L'ese-
cuzione della seconda espressione prevede la valutazione dell'espressione in-
tera 1/2; il suo valore, zero, viene convertito in reale e successivamente molti-
plicato per A. Il risultato del1a seconda espressione pertanto zero qualunque
sia il valore della variabile A.
76
6.2. Espressioni relazionali
Un'espressione relazionale costituita da due espressioni aritmetiche legate
da un operatore di relazione (cfr. fig. 6.15):
77
Esempio 6.20. Le espressioni:
B ** 2 .GE. 4. * A * C
B ** 2 - 4. * A * C .GE. O.
Figura 6.15. Operatori di relazione.
Esempio 6.17. X.GT. Y permette di confrontare i valori delle variabili X e Y.
L'espressione vera se il contenuto della variabile X maggiore di quello della
variabile Y, altrimenti falsa.
Si pu notare che, non essendo definita una relazione di ordine tra i numeri
complessi, gli unici operatori di relazione permessi con espressioni complesse
sono .EQ. e .NE.
4. * A * C - B ** 2 .LE. O.
sono tutte equivalenti e rappresentano la relazione b
2
4ac.
6.3. Espressioni logiche
Le espressioni logiche sono formate dalla combinazione di valori logici median-
te gli operatori logici .AND., .OR., .NOT., definiti in fig. 6.16; il valore di una
espressione logica un valore logico.
ABS (E l - E2) .LE. TOLL
El .EQ. E2
4. * A * C .LE. B ** 2
In dell'uso dell'aritmetica finita, ragionevole aspettarsi che due
espressioni teoricamente equivalenti diano in realt risultati quasi uguali, ma non
esattamente uguali. Quindi, indicando con EI e E2 i risultati di due espressioni
non intere, l'espressione relazionale
sar di solito falsa, anche quando matematicamente la relazione deve essere vera.
Per prevenire ciel-tipo o;a desc-ilito
ossia una costante positiva sufficientemente piccola per verificare una relazione
di uguaglianza approssimata: i due valori E I e E2 saranno considerati uguali se
la loro differenza , in valore assoluto, minore o uguale della tolleranza fissata
ovvero se:
dove TOLL indica la tolleranza.
I
Vale la pena di osservare che il valore della tolleranza deve essere scelto con
estrema cura; esso dipende sia dalla precisione con cui si lavora, che dall'ordine i
di grandezza di E I ed E2 e, in ogni caso, deve essere tale da evitare una defini-
zione troppo approssimata di uguaglianza.
b
espressione
operatore di relazione
aritmetica B
Notazione Notazione
Significato
matematica FORTRAN
.EQ. uguale
*-
.NE. diverso
< .LT. minore
.LE. minore o uguale
> .GT. maggiore
;;;. .GE. maggiore o uguale
espressione
aritmetica A
Esempio 6.18. ABStX - Y).LE.l.E - 6 permette 1I1 confrontare il risultato
dell'espressione ABS(X - Y) con la quantit 10- 6; l'espressione relazionale
vera se la differenza fra i contenuti di X e Y , in valore assoluto, minore o uguale
di l O" 6, altrimenti falsa.
Esempio 6.}1). l + J .EQ.K + 3 permette di confrontare il risultato dell'espres-
sione I + J con quello di K + 3. L'espressione relazionale vera se i due risultati
sono uguali, altrimenti falsa.
La valutazione di un'espressione relazionale avviene valutando separatamente
le due espressioni aritmetiche e mettendo poi a confronto i loro risultati.
Il risultato di un'espressione relazionale un valore logico: vero se la relazio-
ne specificata dall'operatore verificata, falso altrimenti.
Le aritmetiche che cornpaonoIri -una" espressione relazionale
tipo il risultato dell'espressione di tipo pi debole
convertito, prima del confronto, nel tipo pi forte. --------.
In F66 le due espressioni aritmetiche devono essere dello stesso tipo.
l
78
Dalla definizione segue che
I
I
LI .ANO. L2
LI .OR. L2
.NOT. LI
vero se e soltanto se entrambi i valori logici LI ed L2 sono veri;
falso se e soltanto se entrambi i valori logici LI ed L2 sono falsi;
vero se LI falso, ed falso se LI vero.
LI L2 LI .AND. L2 LI .OR. L2 .NOT. LI
vero vero vero vero falso
vero falso falso vero falso
falso vero falso vero vero
falso falso falso falso vero
r
79
Esempio 6.21. LEQ.O .OR. J.GT.I + 3
valutata come (LEQ.O). OR. (J.GT.(I + 3.
Se I : 3 e J : 5 il risultato dell'espressione il valore logico falso. mentre se
I : O e J : 5 l'espressione vera. Notiamo che nel secondo caso sufficiente valu-
tare l'espressione relazionale LEQ.O per stabilire il risultato; in alcune realizzazio-
ni del FORTRAN verr valutata anche l'espressione J.GT.(I + 3), in altre sar
evitato tale calcolo.
Esempio 6.22. 1** 2 .NE. N + M .ANO. 5. + B .GT. SQRT(X)
valutata come ((I ** 2) .NE. (N + M .ANO. 5. + B) .GT. SQRT(X;
supponendo I : 2, N : 3, M : 5, B : 5.5, X : 4, il risultato della espressione : vero.
Figura 6.16. Gli operatori logici .AND..OR..NOT.
In F77 sono previsti altri due operatori logici .EQV. e .NEQV. (cfr. fig. 6.17)
tali che:
Esempio 6.23. A.LT.B .ANO..NOT. L
valutata come (A.LT.B) .ANO. (.NOT. L); se A : 5.1. B 7.3 e L : .TRUE.,
il risultato : falso.
I valori su CUI gli operatori logici agiscono possono essere costanti o variabili
logiche ed espressioni relazionali; un'espressione logica pu quindi contenere
operatori logici, di relazione e aritmetici e nella sua valutazione vengono eseguite
prima le operazioni aritmetiche, poi quelle relazionali e infine quelle logiche,
secondo la seguente scala di priorit:
Figura 6.17. Gli operatori logici .EQV. e .NEQV.
1. + SQRT(2.)
A * 0.5 - 8.0 ** 3
3. ** (1./3) - 5. ** (1./3)
(A.GT.O) .OR.. FALSE.
2+3*5
1.5 + 3.141592/2.
TRUE..OR .. FALSE.
Esempio 6.24. L .ANO.'A. LE. X .OR. B .GT. 6.15
valutata come (L. ANO. (A.LE.X .OR. (B.GT. 6.15); supponendo L: TRUE.,
A : 15.1, X : 17.3, B : 1.0, il risultato dell'espressione : vero.
6.4. Espressioni costanti
Un'espressione aritmetica, logica o relazionale si dice espressione costante se
non contiene nomi di variabile n riferimenti a funzioni. Inoltre, in un'espressione
aritmetica costante l'operazione di elevamento a potenza consentita solo con
esponente intero. Sono esempi di espressioni costanti i seguenti:
mentre non lo sono i seguenti:
falso
vero
vero
falso
pi bassa.
priorit
Pi['"
vero se gli operandi hanno lo stesso valore logico;
vero se gli operandi hanno valore opposto.
( \ c!K
-----------------I-f'F'----
LI .NEQV. L2
Operatore
.NOT.
.ANO.
.OR.
I .EQV. e .NEQV.
LI .EQV. L2
LI .NEQV. L2
LI L2 LI .EQV. L2
vero vero vero
vero falso falso
I
falso vero falso
Il falso falso vero
I
i
Le regole suddette possono essere modificate con l'uso delle parentesi in ana-
logia a quanto accade per le espressioni aritmetiche.
80
Esercizi
6.2 Calcolare il valore delle seguenti espressioni logiche:
6.1 Calcolare il valore delle seguenti espressioni aritmetiche:
81
a(b + c); a(y - b(y - c)); ab + c - a( - 3 + k):
a + bx a+b (a + b) (c + d)
d2;
b - cy d a
2
_ c
2
c+
x+y
(_X.:
(a: bt
5
I ( a r
y-3 x
2
3 + b
a
b
+
3_c;
ab +k c.
(36 - 2.)/5 - (4 + 2)
19/4.+3-6
- 2 ** 2/3.
2 ** 2 - 4/5
2 ** 3 - 1./2.
20/2 ** 2
(20/2) ** 2
19/(5 + 3 - 6)
19/(5 + 3 - 6.)
22./(3 + 1)
20 - 3 * 4 (
(20 - 3) * 4
15/3*21)
15/(3 * 2)
15./(3 * 2) >,::
- l'
6.4 Calcolare il valore delle espressioni logiche
6.S Trascrivere le espressioni logiche
X + yi+ 2 + h
A+B**3
X + 3.5/Y + 4
AB/C + 2
H * S/Z + (3.1 - H * S)
(37.2 * C * Z) / (A + B - C * D/3.1)
Al + X * (A2 + X * (A3 + A4 * X
L/A ** 2 * (X/Y) ** 3
(A + B * Xl/CC+ D * Y) - H ** 2 + 3 - A
X * (X ** 2 - Y ** 2)/(X ** 2 + Y ** 2)
- 1/(2 * X) + A ** 3/(4. * X ** 3).
X + Y ** I + 2 + H
6.8 Scrivere le espressioni matematiche corrispondenti alle seguenti espressioni:
6.9 Le seguenti espressioni FORTRAN sono sintatticamente corrette, ma non
corrispondono alle espressioni algebriche indicate. Riserivere le espressioni
FORTRAN corrette.
(C .OR. D) .AND. F r
t:
e LI .NEQV. L2 LI .EQV. L2
C .OR. D .AND. F T e
I
1. GE. 2 ( -
(7 + I - 3) .LT. lO I
(3. GT. 4) .OR. (lO - 8/2) .LT. 5
(2 ** 3 - 4./5) .LT. 10.1 .AND. 3 .GT. 1 .OR.4 .EQ. (3 + l).
per C : .TRUE., D: .FALSE., F: .TRUE.

I Il '\ I
perA :4.,B :5.eperA :5.,B :4.
6.3 Calcolare il valore della seguente espressione logica:
l
in altre ad esse equivalenti che facciano uso soltanto degli operatori .AND.,
.OR. e .NOT. (A + B) * CIX + Y
(a + b) e
x+y
6.6 Trascrivere le espressioni logiche
.NOT. (A.GT.B .AND. A.LE.C)
.NOT. (A.LE.B .OR. A.GT.C)
in altre equivalenti in cui non si faccia uso dell'operatore .NOT.
6.7 Scrivere le espressioni FORTRAN corrispondenti alle seguenti espressioni
matematiche:
(S + Z) ** 2 + {A * B)/(C * S)
(S + Z) ** 2 + A * B/(C * S)
x * {A * X/B - C * Xl
abs
(s + z)2 + -
c
ab
es
ax
x
b - ex
82
a
X A/(B - C) X x - - cx
b
3 a + bx
3./4. R - (A + BX)/CY -r----
4 cy
hax
A B - H + A X/0.5 T ab---
0.5t
(ab - h) ax
(A B - H) A X/0.5 T
0.5 t
a(b - h)2
A (B - H) .. 2/A + B .. 2
a + b
2
A B - H 2/(A + B) .. 2
~ f
a+b
6.10 Usando le opportune funzioni intrinseche, scrivere le espressioni FORTRAN
corrispondenti alle seguenti espressioni matematiche
-1f 3
a e.Jbii ;
-1f
- e-
x+
- sen x; In (a
2
+ x
2);
2 2 2
- l 2a
( 2 ) 1/2
Il + sen x I;
Vx2 + y2 3 ~
-;; sen x; In
2 l - sen x
sen
3
x cos
2
x 7
p;
xy l
- sen (nx);
6 x
2+)
- - - In Ix - y I ;
3 3 2 2
e v'3+k max (a, b, c)
Vr2 + (2 1ff-
l f
.J3(x
2
+ y2) l + min (a
2,
b
2,
c
2
_ l)
- fg
21f
7
La frase di assegnazione
7. t. Introduzione
L'istruzione di assegnazione tra le pi importanti in FORTRAN in quanto
permette di memorizzare un valore in una particolare locazione di memoria.
La forma generale di questa frase :
v = espressione
dove:
v un nome simbolico di variabile;
espressione una espressione FORTRAN.
L'esecuzione di frasi di questo tipo avviene calcolando prima il valore del-
l'espressione e memorizzando poi tale valore nella cella identificata dal nome
v. Il simbolo = ha quindi in FORTRAN un significato completamente diverso
da quello matematico: esso permette di definire il contenuto della cella di memo-
ria individuata dall'identificatore v che compare alla sua sinistra attribuendogli
il valore dell'espressione scritta alla sua destra; esso quindi equivalente al simbo-
lo <- visto nel linguaggio dei diagrammi a blocchi. Mediante una frase di asse-
gnazione allora possibile indicare quali operazioni si vogliono eseguire e su
quali operandi ed in quale locazione di memoria si vuoI trasmettere e conservare
il risultato ottenuto. Tenendo presente il tipo del contenuto di una cella di me-
moria possibile distinguere tra assegnazione aritmetica, assegnazione logica ed
assegnazione tra stringhe di caratteri. Esaminiamo qui i primi due tipi riman-
dando al cap. 12 l'analisi del terzo tipo.
7.2. Assegnazione aritmetica
Si tratta di una istruzione del tipo:
v = espressione aritmetica
dove v l'identificatore di una variabile intera, reale, doppia precisione o com-
plessa.
84
8S
Esempio 7.2. Supponendo che le variabili I, N, A, B contengano i valori:
Negli esempi che seguono supporremo di valutare una espressione reale con una
precisione Ero ::;: 10- 6 e una espressione doppia precisione con Ero ::;: 10- 16.
Esempio 7.1.
A = 1.85
1=4
XI = Z
effetto: il valore 1.85 memorizzato in A
effetto: il valore 4 memorizzato in I
effetto: il contenuto di Z copiato in Xl.
Esempio 7.5. L'effetto della frase di assegnazione
v = 1./3. + 1./3. + 1./3.
quello di memorizzare in V il valore 0.999999 dell'espressione reale a destra
del segno =. Se D il nome di una variabile in doppia precisione il suo contenuto,
dopo l'esecuzione della frase
0= 1.00/3.00 + 1.00/3.00 + 1.00/3.00
0.9999999999999999.
I : lO N: 3 A: 1.5 B: 0.5
indichiamo, accanto ad ogni frase di assegnazione, il suo effetto
A=B
H = A + 10.5
Esempio 7.3. Supponendo che A e B contengono i valori usati nell'esempio
precedente, l'effetto della esecuzione sequenziale delle frasi:
Esempio 7.7. I = X + Y + Z
L'espressione reale mentre una variabile intera. Supponendo che sia
X : 4.5, Y: 0.0, Z : 1.0, il valore dell'espressione 5.5 e ad I viene assegnato
il valore 5 = INT (5.5).
Esempio 7.6. A = 7/3 * K.
L'espressione intera mentre A il nome di una variabile reale. Supponendo
che K : 3 il valore dell'espressione 6 e il valore 6.0 = REAL (6) viene memoriz-
zato in A.
__ v l'identificatore pu essere diverso da quello
dell'espressione aritmetica. In questo caso la frase di assegnazione detta di
assegnazione mista e la sua esecuzione avviene secondo lo schema seguente:
l'espressione viene valutata in base al tipo degli operandi che la compongono;
\
' il .tipo v non influenza in alcun modo il calcolo dell'espressione
aritmetica;
il risultato dell'espressione viene automaticamente convertito nel tipo di v
mediante l'opportuna funzione intrinseca di conversione (lNT, REAL, OBLE,
CMPLX) e viene quindi memorizzato nella locazione di nome v (ulteriori det-
tagli sulle funzioni di conversione sono dati nel cap. 14).
H: 11.5 B : 0.5
il valore 13 di lO + 3 memorizzato in IPN;
il valore 1.0 di (1.5 + 0.5)/2 memorizzato in H;
il valore 4.0 di 1.5 +(2. * 0.5 + 1.5) memorizzato
in A:
il valore 160 di lO + 150 memorizzato in I
A: 0.5
il seguente: con la prima frase viene cancellato il contenuto 1.5 di A e sostituito
da quello di B ovvero da 0.5; con la seconda viene valutata A + 10.5 ovvero
0.5 + 10.5 e il suo risultato Il.O memorizzato in H. Quindi, dopo l'esecuzione
di queste due frasi si ha:
I = I + 150
IPN = I + N
H = (A + B)/2
A = A +(2. * B + A)

Esempio 7.4. Supponiamo che vengano eseguite sequenzialmente le frasi:


N = 2
l = N + l
l = N + l - 5 * l ** 2
Con la prima istruzione il valore 2 memorizzato in N: con la seconda viene va-
lutata l'espressione intera N + I e il suo valore, 3, memorizzato in I; con la ter-
za viene valutata l'espressione N + I - 5 * I ** 2 ovvero 2 + 3 - 5 * 3 ** 2 il cui
risultato, - 40, assegnato come nuovo contenuto di I.
b
Esempio 7.8. V = 1.0 - 12 + A.
Supponendo che A e V siano variabili reali e che A : 1.0, l'espressione viene
valutata in doppia precisione in quanto vi compare come operando la costante
I.D - 12. Il risultato dell'espressione doppia precisione .100000000000 10000 + I
viene troncato e memorizzato nella cella V il cui contenuto diviene quindi
.IOOOOOE + OI = REAL (.100000000000 I OOOD + I).
In fig. 7.1 si riassumono le possibili frasi di assegnazione aritmetica mista
previste in F77; si pu notare che sono proibite situazioni che prevedono la con-
r
86
87
versione doppia precrsione - complesso o viceversa. In F66 sono proibite anche
le frasi di assegnazione mista in cui la variabile v oppure l'espressione aritmetica
sono di tipo complesso.
/espressione reale
variabile intera = - espressione doppia precisione
"'--espressione complessa
espressione intera
variabile reale doppia precisione
"<, espressione complessa
dopo l'esecuzione delle prime due frasi di assegnazione la variabile T I contiene
il valore vero mentre T2 contiene il valore falso. Il contenuto di T I viene
modificato dalla frase successiva. Essa viene eseguita valutando prima il valore
dell'espressione logica TI .AND.T2 che, essendo T2 falso, d come risultato lo-
gico .FALSE.; tale valore viene quindi assegnato come contenuto di T I.
Osserl'azione. Nella pratica si presenta spesso la necessit di scambiare il conte-
nuto di due celle di memoria dello stesso tipo. Indicate con A e B le due celle,
la successione di istruzioni
""espressione intera
variabile doppia precisione =/
""'-espressione reale
non ha l'effetto voluto, che invece ottenuto dalla successione
/espressione intera
variabile complessa =
""'-espressione reale
Figura 7.1. Assegnazioni uitmetiche miste previste in F77.
7.3. Assegnazione logica
E' possibile assegnare il risultato di una espressione relazionale o logica ad una
variabile di tipo logico v mediante la frase:
dove S il nome di una cella di memoria ausiliaria dello stesso tipo di A e B.
in cui si salva il contenuto di A per poterlo poi assegnare a B.
In generale, nel seguito, con la frase scambia A con B si indicher una suc-
cessione di operazioni del tipo sopra indicato.
v = espressione logica
la cui esecuzione implica la valutazione della espressione indicata e la assegnazione
del suo valore (cvero oppure falso) alla variabile logica v.
Esercizi
7.1. Dire quali delle seguenti frasi di assegnazione non sono corrette e perch:
I = 1+ K; 49 = K L = A + B/C; A + C ** 2 = D ;
R = SQRT(X + Y); A + B = 0.5 + H
7.2. Scrivere le opportune frasi di assegnazione per memorizzare la parte intera
del valore di ciascuna delle seguenti espressioni aritmetiche:
7.3. Scrivere le opportune frasi di assegnazione per memorizzare in floating point
i valori delle espressioni dell'esercizio 7.2.
3
3a -
2j - 5
(sin (x) + cos (x2
sin
2(x)
+ cos
2(x)

LOGICAL TI, T2
TI =.TRUE.
T2 = .FALSE.
TI = TI .AND. T2
LOGICAL VAL, FLAG
VAL= .TRUE.
FLAG = .FALSE.
dopo l'esecuzione di queste frasi la cella di memoria chiamata VAL contiene il
valore logico vero e quella indicata con FLAG il valore falso.
Esempio 7. 9.
Esempio 7.10.
88
7.4. Dire quale valore assegnato per effetto delle seguenti frasi:
A = 1/2 + 3.5
M = A/2 + 5/2
M = (A + 5)/2
B = REAL(l)/2 + 3.5
con I : 3
conA:5.
con A :4.
con I : 3.
8
Alcuni semplici programmi
7.5. Supponiamo di usare un elaboratore nel quale, dato x, fl(x) ottenuto
mediante troncamento; dopo l'esecuzione sequenziale delle frasi:
R = 3.
X = l./R
L = 3. * X
M = R * X
N=X+X+X
le variabili L, M ed N contengono il valore zero. Perch?
7.6. Dire quali delle seguenti frasi di assegnazione non sono corrette e perch
(solo i nomi di variabile che iniziano con la lettera L sono di tipo logico):
L = A.AND.LI; A.LT.B + 5. = LA; A = Ll.OR.L2
L = A ** 2.GT.5 ..OR.. NOT.L.; LI = .NOT.(A.RQ.B);
LI = .NOT.(A.EQ.B); A.NE.B = LI; L4 = Ll.AND.(L2.0R.L4).
7.7. Scrivere le opportune frasi di assegnazione di tipo logico per memorizzare
il risultato della valutazione delle seguenti espressioni logiche informali:
A maggiore di B e C non minore di D
non LOoppure Ll
<<1 uguale a l Ooppure A minore o uguale a l.E-5.
7.8. Descrivere tramite frasi di assegnazione le seguenti situazioni:
L vera se LI vera e L2 falsa, altrimenti falsa
L falsa se LI vera oppure A maggiore di B, altrimenti vera.
8.1. Introduzione
Abbiamo visto nei capitoli precedenti quali siano gli elementi fondamentali
costituenti le frasi del linguaggio FORTRAN: le costanti e le variabili. Tramite
questi elementi, insieme agli operatori aritmetici, logici e di relazione, si possono
costruire le espressioni. Finalmente, tramite le espressioni, si pu realizzare
l'operazione di assegnazione.
Prima di passare ad esaminare altre fondamentali frasi FORTRAN quali quelle
di controllo, vogliamo dare in questo capitolo alcuni esempi di programmi comple-
ti per la cui costruzione possediamo gi alcuni strumenti. Osserviamo che, avendo
come unica frase eseguibile quella di assegnazione, siamo in grado di scrivere sol-
tanto programmi che realizzano una sequenza di calcoli e che portano a definire
il valore di alcune variabili. Tali programmi hanno un senso molto particolare:
essi infatti calcolano sempre gli stessi valori in quanto non possono acquisire dati
di volta in volta diversi e, d'altra parte, non riescono a fornire i risultati calcolati;
in una parola, manca loro l'interfaccia con il mondo esterno costituita dalle opera-
zioni di ingresso/uscita. Con le operazioni di ingresso si possono acquisire dati
di volta in volta diversi e con le operazioni di uscita possiamo visualizzare i risul-
tati.
Per poter scrivere un programma reale, infine indispensabile usare delle op-
portune frasi che ne indichino la fine. L'inizio di un programma FORTRAN
invece automaticamente indicato dalla sua prima frase.
8.2. Frasi di ingresso/uscita guidate dalla lista
Nei capitoli 13 e 18 verranno trattate estensivamente le diverse frasi di ingres-
so/uscita previste in F77. Per il momento. allo scopo di poter scrivere qualche
semplice programma, mtrocuciarno le frasi di ingresso/uscita guidate dalla lista
(non previste in F(6): csse permettono di leggere dati o visualizzare risultati ser-
vendosi delle unit di ingresso () di uscita standard, definite dal sistema di calcolo
Con cui si lavora, senza specificare nel programma il modo in cui i dati o i risultati
r
90
91
devono essere forniti.
La frase di ingresso guidata dalla lista ha la forma seguente
0.5. Alcune forme in cui i dati possono essere forniti al momento dell'esecuzione
della frase sono le seguenti:
PRINT ., lista-di-uscita
Esempio 8.3. Sono esempi di frasi di uscita guidate dalla lista i seguenti:
(a) 7 15/0.05 0.5
(b) 7, 15 /
(c) 7
15
/
7 15 0.05 0.5
7, 15,0.05,0.5
7, 15
.5 E-l, 0.5
7
15
5.E-2
5.E-l
(a)
(b)
(c)
(d)
La precedente frase di lettura pu essere usata per assegnare un valore alle
sole variabili Kl e K2; per questo sufficiente fornire i dati, ad esempio, in una
delle forme seguenti:
Se si vogliono leggere n valori uguali a una costante c, possibile scrivere su
una linea un simbolo della forma n. c invece di scrivere n costanti uguali a c
separate da virgole o da caratteri blank.
In analogia con la frase READ ., esiste in F77 la frase di uscita guidata dalla
lista che ha la forma:
dove:
PRINT la parola chiave;
Iista-di-uscita una lista di espressioni FORTRAN separate da virgole. For-
me pi generali di lista-di-uscita sono definite nel cap. 13.
PRINT *, A, B
PRINT *, A, B, A + B, A.. 2 - B.. 2
PRINT -. N, X, SQRT (DELTA)
PRINT -. ABS(X).GT.EPS
L'effetto della frase PRINT. il seguente: vengono calcolati i valori delle
espressioni che compaiono nella lista; questi valori vengono poi riprodotti sul
per assegnare alle variabili Kl, K2, X ed Y rispettivamente i valori 7, 15, 0.05,
READ ., lista-di-ingresso
READ., Kl, K2, X, Y
Esempio 8.2. Supponiamo di usare la frase
I dati in lettura possono essere disposti su una o pi linee (righe su una tele-
scrivente, schede perforate, etc.) e sono separati da caratteri blank o da virgole:
il primo dato inizia con il primo carattere non blank e termina quando compare
un altro carattere blank o una virgola; il secondo dato, se esiste, inizia dal successi-
vo carattere non blank e cos via. L'esecuzione di una frase di lettura guidata dalla
lista fa s che vengano lette tante linee quante ne sono necessarie per assegnare un
valore a tutte le variabili della lista. L'operazione di lettura viene per interrotta
se si incontra su una linea un carattere / (sbarra): in questo caso le eventuali
variabili della lista a cui ancora non stato assegnato un valore, mantengono
quello che avevano prima dell'inizio dell'operazione.
Notiamo infine che ogni operazione di lettura inizia con una nuova linea.
A =0.01
B = -0.001
1=5.
Esempio 8.1. Con l'istruzione
READ .,A, B, I
si leggono dal mezzo di ingresso standard tre valori numerici, due reali e uno inte-
ro, che vengono memorizzati nelle celle di nomi A, B, I. Supponiamo ad esempio
che i dati forniti siano, nell'ordine, 0.0 l, - 0.00 l, 5; allora la frase di lettura ha
lo stesso effetto, ai fini della definizione dei valori di A, B, I, delle tre istruzioni
di assegnazione
dove:
READ la parola chiave:
Iista-di-ingresso una lista di nomi simbolici separati da virgole (forme pi
generali di una Iista-di-ingresso verranno viste nel cap. 13).
L'effetto dell'esecuzione della frase READ. il seguente: vengono letti tanti
valori quanti sono i nomi simbolici presenti nella lista; il primo valore viene asse-
gnato alla prima variabile, il secondo alla seconda e cos via. I valori in ingresso
devono essere sotto forma di costanti FORTRAN e devono accordarsi in ordine e
tipo con le variabili della lista.
92
mezzo di uscita standard (video, telescrivente, stampante, etc.) in un formato
che dipende dal tipo di ciascuno di essi e dalla particolare realizzazione del
FORTRAN. Cos, per esempio, il risultato di un'espressione aritmetica reale pu
venir stampato nella forma con o senza esponente in base al suo ordine di gran-
dezza: di solito vengono visualizzate un numero di cifre coerente con la precisio-
ne di macchina. In ogni caso, in uscita i dati di tipo numerico sono preceduti e
seguiti da caratteri blank che ne facilitano la lettura. Ogni operazione di uscita
inizia su una nuova linea e crea tante linee quante ne sono necessarie per stam-
pare tutti i valori previsti dalla lista di uscita.
Esempio 8.4. La frase
PRINT*, X, Y, X - Y
fa s che vengano riprodotti sul mezzo standard i valori di X e Y e la loro dif-
ferenza, risultato dell'espressione X - Y.
Negli esempi che seguono faremo spesso uso di liste di uscita contenenti costan-
ti di tipo carattere che sono costituite in generale da una stringa di caratteri
alfanumerici e/o speciali delimitata da apici (cfr. cap. 12). Osserviamo che una
coppia di apici consecutivi all'interno di una costante di tipo carattere viene ri-
prodotta in stampa come un unico apice, mentre gli apici che delimitano la
stringa non vengono riprodotti in stampa.
Esempio 8.5. Supponendo che sia A : 2, B : 3 ed R: - 1.5 e che la precisione di
macchina sia dell'ordine di 10-
6
la frase
PRINT., 'LAVSOLUZIONEvDELL"EQUAZIONE', A, '.X+',B, '= O.E"', R
produce la linea di stampa:
LA SOLUZIONE DELL'EQUAZIONE 2.000ooo.X + 3.000000 = O.E' - 1.500000
Se invece A : 2 x 10
9
, B : 3 x 10
9
ed R : - 1.5 la stessa frase di uscita d
luogo alla seguente linea di stampa:
LA SOLUZIONE DELL'EQUAZIONE 2000000 E +09.X +3.000000 E +0.9 =O.E' -1.500000
8.3. Le istruzioni PROGRAM, STOP e END
Vogliamo ora scrivere un programma che legga due numeri reali a, b con
b
a '* O, calcoli la soluzione r = - - dell'equazione ax + b = O, e la stampi.
a
93
PROGRAM RADICI
C PROGRAMMA CHE CALCOLA LA SOLUZIONE DELL'EQUAZIONE
C AX + B = O CON A.NE.O
READ., A, B
R = - B/A
PRINT., :LAVRADICEVDELL"EQUAZIONE', A, '.X +', B: = OV['"
PRINT., ', R, ' *
STOP
END
Nel programma ora scritto compaiono alcune nuove istruzioni: la prima e le
ultime due.
Istruzione PROGRAM
PROGRAM RADICI la frase che d il nome (RADlC l) al programma. La
forma generale dell'istruzione PROGRAM la seguente:
PROGRAM nome
dove:
PROGRAM la parola chiave che identifica la frase;
nome un nome simbolico che non deve essere usato in nessun'altra istru-
zione del programma.
frase PROGRAM non esiste-in F66 e il suo uso in F77 facoltativo in quan-
to Il nome che con essa si assegna serve esclusivamente per distinguere un pro-
gramma da un altro.
Quando presente, la frase PROGRAM deve precedere ogni altra istruzione.
Istruzioni STOP e END
Le ultime due frasi del programma RADIC l ne indicano la fine. La frase costi-
tuita sola parola chiave k[ine logica del programma; la sua
esecuzione fa s che l'esecuzione del programma termini.
. La frase costituita dalla sola parola chiave END deve essere l'ultima istruzione
di ogni '1' d' .'
. 111 UI1l a .1 programma; essa e non eseguibile ed ha lo scopo di in-
dicare al compilatore la fine fisica dell'unit di programma.
Osserviamo che in F77, ma non in F66. la successione di istruzioni
STOP
END
equivalente alla sola Istruzione END.
Osservi. . I h" rviarno 1110 tre c e 111 un programma possono essere presenti pi frasi
STOP, se richiesta l'interruzione dell'esecuzione in pi punti distinti,
La frase STOP pu essere usata anche nella forma
STOP n
b _
94
dove n una costante intera costituita al pi da 5 cifre (o, in F77, una costante
di tipo carattere). Quando l'istruzione STOP n viene eseguita, la costante n
disponibile per qualche scopo dipendente dalla particolare realizzazione del
FORTRAN; di solito essa viene visualizzata sul mezzo standard di uscita e pu
servire per individuare in Quale punto il programma terminato quando vi siano
pi punti di uscita.
,
'I Riassumendo, in un programma scritto in F77 possono esserci nessuna, una,
/
. o pi frasi STOP, mentre deve essercene almeno una se il programma scritto in .
F66. In ogni caso ogni unit di programma deve terminare con la frase END.
In fig. 8.1 sono riportate le modificazioni dello stato della memoria dovute
all'esecuzione del programma RADICI, nell'ipotesi che i valori letti siano a = 0.01
e b = 83.24 e che la precisione di macchina sia dell' ordine di 10-
6
.
r
95
Esempio 8.6. Un risultato analogo a quello del programma RADICI per quanto
riguarda la gestione delle operazioni di ingresso/uscita, ma non per quanto riguar-
da la memoria, si ottiene con il seguente programma.
PROGRAM RADIC2
READ -. A, B
PRINT *, 'LAvRADICEvDELL"EQUAZIONE', A, '*X +', B: = OvE'"
PRINT *, '****., - B/A, '****.
STOP
END
In questo programma manca l'assegnazione alla variabile R del valore - B/A,
che invece viene direttamente stampato per effetto dell'ultima frase PRINT.
8.4. L'istruzione PARAMETER
Memoria
A B R ...
- - - -
rno.ou n(83.24) - -
nro.on n(83.24) 11(- 8324.) -
nro.on 11(83.24) n(- 8324.) -
n(OOI) n(83.24) 11(- 8324.) -
Stato iniziale
Dopo l'esecuzione della frase READ
Dopo l'esecuzione della frase R = - BI A
Dopo l'esecuzione delle frasi PRINT
Stato finale, al momento dell'esecuzione
della frase STOP
Supponiamo di voler scrivere un programma in cui. dato un valore x > I, si
calcola e si stampa il valore y = f(x), con
I+n'
f( x) = x
2
- 2 n'x + -- - 2 n'
Inx
dove n' un parametro reale che per il momento fissiamo uguale a 0.1. Il risul-
tato desiderato pu essere ottenuto con uno dei due programmi seguenti:
PROGRAM ALFAI
READ -. X
y = X * X - 2. * 0.1 * X + (1. + O.1)/LOG(X) - 2. * 0.1
PRINT -. 'X = t x.v =', Y
STOP
END
Dati in ingresso
0.01 83.24
Linee di stampa
LA RADICE DELL'EQUAZIONE O.OiOOOO *X + 83.24000 = OE'
- 8324.000 *****
figura 8.1. Esecuzione del programma RADIC 1.
PROGRAM ALF A2
ALFA = 0.1
READ -. X
Y = X * X - 2. * ALFA * X + (l. + ALFA)/LOG(X) - 2. * ALFA
PRINT *,'X =', x.v = " Y
STOP
END
La differenza principale fra i due programmi la seguente: in ALFA I si in-
serito il valore 0.1 direttamente nell'espressione FORTRAN il cui risultato viene
memorizzato in Y; in ALFA2 si introdotta una variabile, ALFA, a cui si assegna
96
il valore 0.1, e che viene usata nell'espressione. E' ovvio che ALFA2 un pro-
gramma pi flessibile di ALF Al; infatti possibile usarlo per valori diversi del
parametro Q' semplicemente intervenenuo sulla frase di assegnazione ALFA = 0.1,
anzich sulla frase, ben pi complessa, che definisce Y. In F77 possibile defi-
nire ALFA come nome simbolico della costante 0.1 mediante la frase dichiara-
tiva PARAMETER, la cui forma la seguente:
c
C
PROGRAM CERCHIO
STAMPALA LUNGHEZZADELLACIRCONFERENZA
E L'AREA DEL CERCHIO
PARAMETER(PI =3.141592, DUEPI = 2. * Pl)
READ -. RAGGIO
PRINT -. 'RAGGIO =', RAGGIO
PRINT *, 'LUNGH.vCIRCONFERENZA = ,DUEPI * RAGGIO
PRINT -. 'AREA =', PI * RAGGIO ** 2
STOP
END
97
dove:
PARAMETER la parola chiave che identifica la frase;
Pl"'" Pn sono nomi simbolici;
e
l
, ..., e
n
sono espressioni costanti (cfr. 6.4). Se P
j
di tipo carattere, logi-
co, o numerico, e
i
deve essere di tipo carattere, logico o numerico rispettivamente.
Per effetto dell'istruzione PARAMETER, il nome Pi un nome simbolico di
costante il cui valore il risultato dell'espressione e
i
che gli viene associato se-
condo le regole dell'assegnazione. Se in un'istruzione PARAMETER compare
un'espressione contenente un nome simbolico di costante, questo deve essere
stato definito precedentemente nella medesima o in un'altra frase PARAMETER.
Un nome simbolico di costante un nome di costante a tutti gli ~ f e t ~
avendo la forma di un nome di variabile; esso pu quindi essere usato in una
frase FORTRAN allo stesso modo di una costante, salvo il fatto che non pu
essere parte di una costante (ad esempio, parte reale o parte immaginaria di una
costante complessa), e neppure di una specificazione di formato (cfr. cap. 13).
Si osservi inoltre che, in quanto nome di costante, il valore di un nome simbo-I
{\'i lico di costante non pu essere modificato mediante, ad esempio, frasi di asse-I \\
gnazione o di lettura o mediante altre frasi PARAMETER. I.
In quanto dichiarativa, l'istruzione PARAMETER deve precedere tutte le frasi
eseguibili dell'unit di programma in cui compare. Per quanto riguarda la posizio-
ne della PARAMETER rispetto alle altre frasi dichiarative, si veda l'appendice
A3.
Esempio 8. 7. Sono esempi corretti di utilizzo della istruzione PARAMETER i
seguenti:
LOGICAL VERO, FALSO
PARAMETER(VERO = .TRUE., FALSO = .FALSE)
PARAMETER(EPSM= lE ~ 06, EPS = IO *EPSM)
PARAMETER(ALFA = 0.1, BETA= ALFA * EPS)
Esempio 8.8. Nel programma seguente SI definiscono i due nomi simbolici di
costante l'I e DUEPI; eSSI vengono usati nelle espressioni aritmetiche che figurano
nelle istruzioni di stampa.
L
8.5. Altri esempi
Vediamo qualche altro semplice programma in cui si utilizzano le frasi
FORTRAN fin qui incontrate.
Esempio 8.9. Dati due numeri II' 1
2
> O si vuoi calcolare e stampare l'area ed il
perimetro del rettangolo di lati II e 1
2
e del quadrato di lato uguale al minimo fra
Il e 1
2
,
PROGRAM GEOM
REAL LATOI, LATm, LATO
C LETTURA DEI DATI
READ *, LATOI, LATm
C CALCOLODEL PERIMETRO E DELL'AREA DEL RETTANGOLO
PRETT = 2. * (LATOI + LAT02)
ARETT = LATOI * LAT02
C CALCOLODEL PERIMETRO E DELL'AREA DEL QUADRATO
LATO = MIN(LATOI, LAT02)
PQUAD=4. * LATO
AQUAD= LATO * LATO
C STAMPADEI RISULTATI
PRINT *, 'ILvPERIMETROvDELvRETTANGOLOvDIvLATI'
LATOI, LAT02, 'E":', PRETT '
PRINT *, 'LAvSUAVAREAvE":', ARETT
PRINT *, 'ILvPERIMETROvDELvQUADRATOvDI LATO', LATO,
'E":' PQUAD
PRINT *, 'LAVSUAVAREAVE":', AQUAD
STOP
END
Esempiu 8. JO Il seguente programma calcola un valore approssimato per sen x,
dove x espresso in radianti, come somma dei primi cinque termini dello sviluppo
111 serie di potenze
L
x2k ~ I
x
3
x
5
x
7
x'l
se n x =
(- l )k X - -
+
-
+
--
k=O
(2k + l)' 3' 5' 7' 9'
(
98
c
c
c
PROGRAM SENO
APPROSSIMAZIONE DEL SENO DI UN ANGOLO DI
X RADIANTI TRAMITE LA SOMMA DEI PRIMI CINQUE
TERMINI DELLO SVILUPPO IN SERIE DI POTENZE
PRINT ., 'SCRIVlvILvVALOREvDlvX vINvRADIANTI'
READ., X
TI =X
T2 = TI X/2. X/3.
T3 =T2 X/4. X/S.
T4 = T3 X/6. X/7.
T5 = T4 X/8. X/9.
PRINT., 'ILvSENOvDl', X, 'E" CIRCA'
PRINT., 'u., TI - T2 + T3 .- T4 +T5, '
STOP
END
r
99
dove ft x) definita da:
2- n
8.4. Individuare gli eventuali errori nelle seguenti frasi:
PARAMETER (RAD 2 = SQRT (2.
PARAMETER (EINV = l./E, E = 2.7182)
PARAMETER (SO M = 0.5, UNO = r., ZERO = O)
PARAMETER (N = in N2 = N. N)
8.5. Indicare i valori delle variabili A, B, N, NP e J dopo l'esecuzione della frase
Si noti che l'esecuzione di questo programma prevista in modo interattivo,
in quanto la prima istruzione prevede la stampa sul mezzo standard del messaggio
SCRIVI IL VALORE DI X IN RADIANTI
Tale messaggio informa l'utente che deve fornire il dato (ossia, il valore attuale di
x) necessario per l'esecuzione della successiva operazione di lettura. Ovviamente,
l'esecuzione non procede finch tale dato non stato fornito.
Esercizi
8.1. Dette A e B la base e l'altezza di un tnangolo, scrivere un programma che
legga i valori di A e B e stampi l'area del triangolo.
8.2. Se a, b e c indicano le lunghezze dei lati di un triangolo, la sua area pu
essere calcolata con la formula
s = Vp(p - a) (p - b) (p - c)
nove p il semiperimetro del triangolo.
Scnvere un programma che, letti I valori di a, b e c calcoli e stampi il pen-
metro e l'area del triangolo.
8.3. Scrivere un programma che, dati i valori a, b ed n, calcoli e stampi il valore
b-a[ (b-a) J
-6- f(a) + 2 f -2- + f(b)
READ ., A, N, B, NP, J
supponendo che i dati siano forniti in uno dei modi seguenti:
(a) 7.3, l O, - 3.5, 87, 1010
(b) 7.3, 10/
(c) 73., l, O., O, O
(d) - lO E - 3
737
S. E-S, 102, -3
(e) + 7.03 E + 2, - 38, 5.5, lO
- 78
(O 1.1.1,2.2,2,3,8,15
8.6. Se zI = 1.1 + 3i, z2 = 5 + 8i e z3 = i sono tre numeri complessi, scrive-
re un programma che calcoli e stampi la loro somma ed i loro moduli.
8.7. Scrivere un programma che calcoli e stampi la somma ed il prodotto di due
numeri complessi assegnati.
8.8. Supponiamo che le istruzioni
REAL A, N
COMPLEX OMEGA
DOUBLE PRECISION B
READ.,A,N,OMEGA,B
facciano parte della stessa unit di programma. Indicare come devono essere
fomiti i dati perch dopo l'esecuzione della frase di lettura le variabili A.
N. OMEGA e B abbiano tutte valore zero.
9
Scelte e decisioni
9.1. Controllo esplicito dell'esecuzione: l'istruzione GOTO-incondizionato
La sequenzialit del flusso di un algoritmo pu essere interrotta in situazioni
che impongono la scelta tra blocchi di istruzioni alternativi in base al verificarsi
o meno di una determinata condizione. Queste situazioni di scelta vengono de-
scritte in FORTRAN mediante opportune istruzioni che sono l'argomento dei
prossimi paragrafi e che, insieme alle strutture di ripetizione che verranno presen-
tate nel prossimo capitolo, permettono di controllare quasi completamente l'e-
secuzione di un programma. Esistono per situazioni che richiedono un controllo
esplicito dell'esecuzione del programma. Tale controllo viene realizzato mediante
l'istruzione GO TO-incondizionato.
Questa istruzione ha la forma seguente:
GOTOn
dove:
GO TO la parola chiave;
n l'etichetta di una frase eseguibile che deve essere presente nella stessa unit
di programma cui appartiene l'istruzione GO TO-incondizionato.
L'esecuzione della frase GO TO n provoca il trasferimento del controllo della
esecuzione all'istruzione la cui etichetta coincide con n. Cos, per esempio, l'ese-
cuzione delle istruzioni:
N=l
GO TO io
9 N=N+lOO
lO J = N +30
avviene nel modo seguente: si pone uguale ad uno il contenuto della cella N e
l'esecuzione prosegue poi, sequenzialmente, a partire dall'istruzione individuata
dall'etichetta numero lO. L'istruzione intermedia N = N + 100 viene completa-
mente ignorata.
I"
IO.
102 103
Esempio 9.1. Sia f(x) una funzione reale di variabile reale definita da:
Supponendo noto il valore di x si vuoI calcolare la Quantit v = f(x) + x
2
.
La situazione di scelta relativa a questo problema la seguente:
dove c un'espressione logica il cui valore. valutato al momento dell'esecuzione
dell'istruzione IF (c) THEN. determina la scelta tra i due blocchi di istruzioni.
L'effetto deIl'esecuzlOne di questa struttura esattamente quello indicato in
fig. 9.1: se la condizione indicata dalla espressione c vera vengono eseguite
le istruzioni del blocco l e sono ignorate quelle del blocco 2 mentre, se la condi-
zione c falsa vengono eseguite soltanto le istruzioni del blocco 2. In entrambi
i casi l'esecuzione continua con l'istruzione che segue immediatamente END IF.
La struttura decisionale IF-THEN-ELSE quindi caratterizzata da una frase
iniziale IF (c) THEN e da una frase finale END IF. La frase intermedia ELSE
serve ad evidenziare sia la fine del primo blocco di istruzioni che l'inizio del se-
condo. Il primo blocco, detto anche costituito da tutte le istru-
zioni che seguono IF(c) THEN e precedono ELSE mentre il secondo, detto
anche blocco ELSE:_' costituito da tutte le istruzioni che seguono ELSE e pre-
'cedono END IF. Siosservi che, in quanto eseguibile, la frase ELSE pu avere unall j
,',\ etichetta ma proibito farvi riferimento mediante altre frasi di controllo. ;' i
per x 1.5
per x < 1.5
l x-l
f(x) = O
IF (c) THEN
[blocco di istruzioni 1] +- (blocco THEN)
ELSE
[blocco di istruzioni 2] +- (blocco ELSE)
END IF
E' importante osservare che l'istruzione GO TO-incondizionato deve essere
usata in modo opportuno: infatti un suo uso eccessivo e indiscriminato d luogo
a programmi di difficile lettura e comprensione.
L'analisi fatta sugli algoritmi e la loro descrizione ha messo in evidenza la ne-
cessit di strutture che, in presenza di pi blocchi di istruzioni alternativi. per-
mettano di sceglierne uno in base alla veridicit o meno di una particolare condi-
zione. In F77 possibile tradurre una situazione di scelta tra due blocchi alterna-
tivi mediante il costrutto IF-THEN-ELSE. Un'analisi dettagliata di questo costrut-
to, non previsto nelle precedenti versioni del FORTRAN, facilita la comprensione
di un'altra istruzione che pu essere usata in un processo decisionale e che pre-
vista anche in F66: l'istruzione IF-logico.
La generica situazione di scelta tra due blocchi di istruzioni alternativi pu
essere schematizzata nel modo illustrato in fig. 9.1. Ad essa corrisponde la strut-
tura di controllo
9.2. Costrutto IF-THEN-ELSE
Bloccodi
istruzioni
2
IF (X.GE.I.5) THEN
Y=X-1.
ELSE
Y=O.
ENDIF
Y=Y+X .. 2
Figura 9.1. Scelta tra due blocchi di istruzioni.
104
Esempio 9.2. Siano x ed y due numeri dati e diversi da zero. Se x y si cal-
colano le quantit s = x + y e p = xy, altrimenti si calcolano d = x - y e
q = d/(2 y).
Questa situazione pu essere cos descritta:
IF (X.GE.Y) THEN
S=X+Y
P=X.Y
ELSE
D=X-Y
Q=D/(2. Y)
ENDIF
Si noti che proibito trasferire il controllo dell'esecuzione di un programma
,rdentro unblocco TH}:N oppure dentro ad esempio,
sbagliato scrivere una successione di istruzioni come la seguente:
GO TO IO
IF (X. GE. Y) THEN
S=X+Y
lO Y=S.X
ELSE
A=X-Y
ENDIF
Figura 9.2. Strutture decisionali mancanti
del blocco TREN.
La struttura
IF (c) THEN
ELSE
[blocco di istruzioni]
ENDIF
corrisponde al diagramma di fig. 9.2 mentre
IF (c) THEN
[blocco di istruzioni]
ELSE
ENDIF
IOS
Figura 9.3. Strutture decisionali mancanti
del blocco ELSE.
In queste istruzioni infatti la frase GO TO IO trasferisce il controllo dell'ese-
cuzione dentro un blocco THEN.
In altre parole si pu dire che in F77 non permesso entrare, mediante una
frase di controllo, dentro una struttura di una.-
struttura di questo tipo mediante opportune istruzioni di controllo
presenti in un blocco THEN o in un blocco ELSE. In una situazione di questo
genere viene allora a mancare l'ipotesi, che generalmente accompagna una struttu-
ra decisionale, e che consiste nel presupporre che, scelta la strada da seguire, l'e-
secuzione prosegua con l'istruzione successiva a quella finale della struttura stessa.
La presenza di una istruzione di controllo dentro una struttura decisionale pu
quindi compromettere la leggibilit di un programma e la possibilit di seguirne
facilmente il flusso.
Una struttura decisionale deve prevedere anche situazioni in cui li/W dei due
blocchi THEN oppure ELSE vuoto ovvero le situazioni rappresentate nelle
figu re segue nti:
corrisponde a quello di fig. 9.3. Quando il blocco ELSE vuoto l'istruzione
ELSE pu essere omessa. Si osservi che le situazioni rappresentate dalla fig. 9.3
sono equivalenti a quelle di fig. 9.2: basta esprimere in modo opportuno la con-
dizione che determina la scelta.
9.3. Strutture decisionali annidate
I blocchi di istruzioni che compaiono nella struttura lF-THEN-ELSE possono
a loro volta contenere altre strutture di scelta; quindi possibile avere pi costrut-
ti IF-THEN-ELSE uno dentro l'altro ciascuno dei quali deve essere chiuso da una
istruzione END IF. Situazioni di questo tipo vengono dette strutture annidate
mtendendo per nido ael costrutto decisionale IF-THEN-ELSE tutte le istruzioni
comprese tra la frase iniziale lF (c) THEN e quella finale LNU IF.
Negli esempi seguenti. i nidi delle strutture di controllo sono stati evidenziati
graficamente mediante parentesi quadre

106
107
Esempio 9.3. La trascrizione in F77 delle istruzioni indicate in fig. 9.4 la se-
guente:
Esempio 9.4. Dati i coefficienti reali a. b. c di una equazione di secondo grado
ax2 + bx + c == Osi selezionano. mediante l'indicatore ind. diversi casi:
ind == - 2
ind == - I
ind == O
ind == I
significa che l'equazione del tipo c == O:
significa che l'equazione del tipo bx + c == O:
significa che l'equazione del tipo ax
2
+ bx + c == Oed ha radici reali;
significa che l'equazione del tipo ax
2
+ bx + c == Oed ha radici com-
pIesse coniugate.
In fig. 9.5 si riportano il diagramma di flusso e le relative istruzioni F77.
IF (A.EQ.O.) THEN
IF (B.EQ.O.) THEN

=-2
ELSE
IND== -- l
ENDIF
ELSE
DELTA==Bu2 -4.*A*C
IF (DELTA.GE.O.O) THEN
[
IND= O
ELSE
IND= l
ENDIF
ENDIF
Figura 9.5. Diagramma di flusso e istruzioni corrispondenti all'esempio 9.4.
Le parentesi quadre che accompagnano la lista delle istruzioni FORTRAN
negli esempi 9.3 e 9.4 servono soltanto a mettere in evidenza gli annidamenti di
pi strutture IF-THEN-ELSE: esse non fanno certo parte del programma ma ne
facilitano la comprensione. E' possibile ottenere un risultato analogo incolonnan-
do le istruzioni relative ai nidi delle strutture di controllo pi interne su posizioni
via via pi spostate a destra; questo modo di incolonnare le istruzioni viene di
solito indicato con il termine inglese indentation (intaccatura, dentellatura) e
verr utilizzato negli esempi che
Figura 9.4. Diagramma di flusso corrispondente all'esempio 9.3.
IF (J.LE.N) THEN
J =N +J
IF (X.GE.O.S) THEN
l
S = X + T
T =J. S
ELSE
S=X-T
T = 3. * S ..2
ENDIF
T==T+X
ELSE
S==J*X
IF (X.GT.O.O) THEN
[
T == SQRT(S)
ELSE
T==-S
ENDIF
X=T+S
END IF
, I
I
, i
Figura 9.6. Diagramma a blocchi e programma corrisponuente all'algoritmo deU'esempio 9.5.
Esempio 9.5. L'area di un triangolo i cui lati hanno lunghezze a, b, c data dalla
formula di Erone s =vqdove q = p(p - a) (p - b) (p - c) con p =(a + b + c)/2.
Evidentemente tre valori a, b, c non rappresentano la lunghezza dei lati di un
triangolo reale se non sono positivi oppure se la quantit q non positiva (esem-
pio a = l, b = 3, c = 5). Supponendo di avere pi teme di valori di cui almeno
la prima costituita da valori positivi tali che q > 0, scrivere un programma che
permetta di calcolare e stampare il numero tot delle teme lette. il numero
n di triangoli reali e la loro area media. Il programma termina quando si legge
una tema i cui elementi non sono tutti positivi.
108
PROGRAM ARMEDI
INTEGERTOT
TOT =0
N =0
SOM =O.
IO READ. A. B. C
TOT = TOT + I
IF (A.GT.O..AND.B.GT.O..AND.C.GT.O.) THEN
P = (A + B+ Cl/2.
Q = p .(P - A) (P - Dj. (P - C)
IF (Q.GTO.O) THEN
N =N + I
S = SQRT(Q)
ELSE
S =0.
ENDIF
SOM=SOM+S
GOTO IO
ELSE
AM= SOM/N
PRINT . SU'. TOT. 'TERNE DI VALORI'
PRINT . N. 'SONOLATI DI TRIANGOLI REALI'
PRINT . 'l"AREAMEDIAE" DATADA!. AM
END IF
STOP
END
101 O
n O
SOI11 0
/
109
E' possibile risolvere questo problema con l'algoritmo seguente dove sorn in-
dica la somma delle aree dei triangoli e la doppia numerazione evidenzia le istru-
zioni interne alla struttura decisionale.
l. Poni tot = 0, n =O, som = O
2. leggi: a, b, c
3. incrementa di l il valore di tot
4. se i tre valori letti sono positivi
allora: 4.1. calcola p = (a + b + c)/2 e q = p(p - a)(p - b)(p - c)
4.2. se q> Oallora: calcola s =vq, incrementa di l il valore di n
ed esegui 4.3.
altrimenti: poni s = Oed esegui 4.3.
4.3. aggiungi s a som
4.4. vai a 2.
altrimenti: esegui 5.
5. calcola l'area media a
m
=sorn/n
6. scrivi: tot, n, a
m
7. Stop
La lista del programma e il diagramma a blocchi sono dati in fig. Y.6.
Esempio 9.6. Scrivere un programma che risolva lo stesso problema dell'esem-
pio precedente prevedendo la possibilit. che, tra tutte le teme lette, nessuna rap-
presenti i lati di un triangolo reale: questo caso viene segnalato in fase di stampa
dei risultati.
Il problema pu essere risolto mediante il seguente algoritmo:
l. Poni tot = O, n = O, som = O
2. leggi: a, b, c
3. incrementa di l il valore di tot
4. se i tre valori letti sono positivi
allora: 4.1. calcola p = (a + b + c)/2 e q = p(p - a)(p - b)(p - c)
4.2. se q> Oallora: calcola s = incrementa di l il valore di n
ed esegui 4.:;
altrimenti: poni s = Oed esegui 4.3
4.3. aggiungi sa som
4.4. esegui 2.
altrimenti: se n> Oallora: calcola a
m
= som/n;
scrivi: tot, n, a
m
;
esegui 5.
altrimenti: scrivi: tot ed esegui 5.
5. Stop.

p---------------
llO
La lista del programma la seguente:
III
La lista del programma e il diagramma a blocchi sono i seguenti:
!
1
PROGRAM ARMED2
INTFGER TOT
N=O
SOM=0.0
TOT=O
lO READ *, A, B, C
TOT =TOT + I
IF (A.GT.O..AND.B.GT.O..AND.C.GT.O.) THEN
P = (A + B +C)/2.
Q= p * (P - A) * (P - B) * (P - C)
IF (Q.GT.O.O) THEN
N=N + I
S = SQRT (Q)
ELSE
S =0.0
END IF
SOM=SOM +S
GOTO IO
ELSE
--IF (N.GT.O) THEN
AM = SOM/N
PRINT *, 'SI SONOLETTE', TOT, 'TERNE DI VALORI'
PRINT *, N, 'SONO RISULTATE LATI DI TRIANGOLI REALI'
PRINT e , 'L"AREA MEDIAE" DATADA:', AM
ELSE
PRINT *, 'SI SONOLETTE', TOT, 'TERNE DI VALORI'
PRINT *, 'NESSUNAINDIVIDUAUNTRIANGOLOREALE'
ENDIF
ENDIF
STOP
END
Esempio 9.7. Si vogliono ordinare tre valori dati a, b, c in modo che sia a b c.
Un algoritmo per risolvere questo problema il seguente:
l. Leggi: a, b, c
2. se a b allora: esegui 3.
altnmenti: scambia a con b ed esegui 3.
3. se b c allora: esegui 4.
altrimenti: scambia b con c
se a b allora: esegui 4.
altrimenti: scambia a con b ed esegui 4.
4. scrivi: a. b, c
5. stop.
PROGRAM ORDABC
READ *. A, B, C
IF (ALE.B) THEN
ELSE
S=A
A=B
8=S
END IF
IF (B.LE.C) THEN
ELSE
S=B
B=C
C=S
IF (A.LE.B) THEN
ELSE
S=A
A=B
B=S
END IF
END IF
PRINT-. A, B, C
STOP
END
9.4. Strutture decisionali concatenate
Nella pratica si presentano spesso situazioni di scelta in cui intervengono pi
condizioni che si escludono a vicenda ovvero situazioni che sono descritte da una
costruzione del tipo:
se: condizione 1 allora:
esegui l'azione l
altrimenti se: condizione 2 allora:
esegui l'azione 2
altrimenti se: condizione n allora:
esegui l'azione n
altrimenti: esegui l'azione n + 1.
112
113
Figura 9.7. Strutture decisionali concatenate.
se x < O
s e ~ x ~
se x> l
x
2
x(x - l)
x+2
y = f(x) e f(x) =
IF (X.LT.O.O) THEN
Y=X**2
ELSE IF (X.LE.l.O) THEN
Y = X (X - 1.0)
ELSE
Y=X +2
END IF
S=Y+H
Le istruzioni seguenti:
Esempio 9.8. Dati i valori x ed h si vuoi determinare la quantit s = y + h dove
F
Blocco di
istruzioni
n + l
Blocco di
istruzioni
n
Blocco di
istruzioni
2
Blocco di
istruzioni
Tali processi decisionali, visualizzati in fig. 9.7, vengono descritti in F77 me-
diante la struttura:
IF (cl) THEN
[blocco di istruzioni l]
ELSE IF (c
2
) THEN
[blocco di istruzioni 2]
ELSE IF (c
n
) THEN
[blocco di istruzioni n]
ELSE
[blocco di istruzioni n + l]
END IF
dove cl' c
2
' ..., c
n
sono espressioni logiche che vengono valutate in sequenza
nell'ordine in cui esse compaiono; non appena una di esse risulta vera viene ese-
guito il blocco di istruzioni che la segue mentre se nessuna espressione risulta
vera eseguito il blocco di istruzioni che segue la frase ELSE.
Si osservi che ogni blocco di istruzioni che segue una delle frasi l F (c l) THEN
oppure ELSE IF (Ci) THEN implicitamente seguito da un trasferimento alla
frase finale END IF della struttura. Risulta quindi importante l'ordine in cui com-
paiono nella struttura decisionale le singole espressioni logiche in quanto. tra pi
espressioni vere, la prima quella che comanda l'esecuzione della struttura.
hanno l'effetto indicato in fig. 9.8: si valuta la prima espressione X.LT.O.O;
se essa risulta vera si pone Y uguale ad X ** 2 e l'esecuzione riprende dalla istru-
zione che segue END IF ovvero S = Y + H (in questo caso avremo s = x
2
+ h).
Se invece la prima espressione risulta falsa si valuta la seconda ovvero si stabilisce
se x minore o uguale ad l. Nel caso in cui questo risulti vero si pone Y uguale ad
X * (X - l.) e l'esecuzione riprende con l'istruzione S = Y + H che in questo caso
equivale a s = x(x - l) + h. Se nessuna delle due espressioni logiche precedenti
vera si pone Y uguale ad X + 2. e l'esecuzione continua ancora con S =Y + H
che in questo caso equivale a s = x + 2 + h.
y..-x+2
Figura 9.8. Diagramma di flusso relativo all'esempio 9.8.
114
115
9.5. Riepilogo
Da quanto detto fino ad ora segue che una qualunque struttura decisionale
aperta dalla istruzione
IF (c) THEN
e chiusa da
END IF
Tra queste due frasi possono comparire una o pi istruzioni
IF (l.LE.O) THEN
N=O
ELSE IF (J.GT.IO) THEN
N=3
ELSE IF (J.LE.S) THEN
N = l
ELSE
N=2
ENDIF
ELSE IF (c) THEN
ELSE
ENDIF.
pu essere sostituita dalla sola
PROGRAM ORDABC
READ -. A, B, C
IF (A.GT.B) THEN
S=A
A=B
B = S
END IF
IF (B.GT.C) THEN
S=B
B=C
C=S
IF (A.GT.B) THEN
S=A
A=B
B =S
END IF
END IF
PRINT A, B, C
STOP
END
permettono di calcolare correttamente il valore di N in quanto verr eseguita
una sola frase di assegnazione, quella corrispondente alla prima espressione logica
che risulta vera; se tutte le espressioni sono false si esegue l'istruzione che segue la
frase ELSE.
Esempio 9.10. Il programma relativo all'esempio 9.7 pu essere cos modifi-
cato:
se J < O
se 1 < J < 5
se6<J<IO
se J > lO
N vale O
N vale 1
N vale 2
N vale 3
ELSE
ENDIF
che deve sempre seguire le eventuali ELSE IF presenti. Le frasi IF (c) THEN,
ELSE IF (c) THEN, ELSE sono seguite da blocchi di istruzioni la cui esecuzione
subordinata alla veridicit delle espressioni logiche presenti nella struttura e che
possono a loro volta contenere altre strutture decisionali. Ogni blocco di istruzio-
ni che segue una delle frasi IF (c) THEN, ELSE IF (c) THEN, ELSE pu essere
vuoto ovvero privo di istruzioni. Ricordiamo che se vuoto il blocco che segue
la frase ELSE possibile omettere l'istruzione ELSE stessa ovvero la successione
di istruzioni
ed al pi una istruzione
Esempio 9.9. Sia N una variabile intera il cui valore deve essere determinato in
base a quello di un'altra variabile intera J secondo le regole seguenti:
I
!
Il;
!
Le istruzioni seguenti:
!.empio 9.11. Dati tre valori reali a, b, c calcolare e stampare M = max (a b c)
ed m =rnin (a, b, c) , ,
116
PROGRAM MAXMIl
REAL MAX,MIN
READ-. A, B, C
IF (A.GT.B) THEN
MAX=A
ELSE
MAX=B
END IF
IF (C.GT.MAX) THEN
MAX=C
END IF
IF (A.GT.B) THEN
MIN= B
ELSE
MIN=A
END IF
IF (C.LT.MIN) THEN
MIN=C
END IF
PRINT *, 'MASSIMO .: MAX, 'MINIMO =', MIN
END
Si osservi che, quando il blocco ELSE vuoto, non si ottiene nessun migliora-
mento del programma dalla omissione della frase ELSE, anzi tale omissione pu
rendere meno chiaro e leggibile il programma.
9.6. lf-logico: una struttura particolarmente semplice
Supponiamo di voler descrivere in FORTRAN una situazione nella quale una
sola istruzione, che chiameremo istruzione dipendente, deve essere eseguita op-
pure ignorata in base alla veridicit o meno di una condizione (cfr. fig. 9.9).
Il costruHo
IF (c) THEN
istruzione dipendente
ELSE
END IF
produce l'effetto desiderato in quanto l'istruzione viene eseguita se (e soltanto
se) la condizione c risulta vera altrimenti essa viene ignorata.
Questa situazione pu essere scritta in modo pi sintetico nella forma
IF (c) istruzione dipendente
117
F
Figura 9.9. Diagramma corrispondente alla istruzione If'-logco.
alla quale si d il nome di IF-Iogico. L'esecuzione di questa istruzione, presente
sia in F77 che in F66, ha quindi l'effetto seguente: si valuta l'espressione logica c;
se essa risulta vera viene eseguita l'istruzione dipendente altrimenti tale comando
viene ignorato. In ogni caso l'esecuzione continua con l'istruzione che segue l'IF-
logico.
Sono esempi di istruzioni IF-Iogico i seguenti:
IF(J.NE.IO) SUM=O.
IF (ABS(X- Y).LE.EPS) X = XI +SQRT (A + B)
IF (X.GT.Y.OR.H.LE.l.E - 3) JMAX= 20
L'istruzione dipendente che accompagna un IF-Iogico non deve essere n un al- ,
tra IF-Iogico n una delle seguenti istruzioni: I
DO, IF (c) THEN, ELSE IF (c) THEN, ELSE, END IF, END. !
Esempio 9.12. Siano dati N valori della variabile A ciascuno dei quali numerato
mediante un numero progressivo I, l E;;; I E;;; N. Si vuoi calcolare quanti valori di
A sono maggiori di UfO.
Se indichiamo con NP il numero totale dei valori positivi di A il problema pu
essere risolto dal programma seguente:
PROGRAM NPOSI
~ E *, N
NP=O
100 READ *, l, A
IF (A.GT.O.O) NP = NP + 1
IF (I.EQ.N) STOP
GO TO 100
END
1-
I
I

Il:i
I

118
Si osservi che il valore di NP ovvero il numero dei valori positivi viene incre-
mentato di una unit se A> O; il controllo IF(I.EQ.N) viene invece eseguito sem-
pre qualunque sia il valore di A. 1\ programma termina, mediante l'esecuzione
della frase STOP, quando sono stati esaminati tutti i valori di A ovvero quando I
uguale ad N; se I < N l'esecuzione prosegue con la lettura del successivo valore
di I e di A. Da notare che il programma non prevede la scrittura del valore finale
di NP; qualora essa venisse richiesta due azioni dovrebbero essere eseguite alla fine
della lettura dei dati: la scrittura del contenuto di NP e l'interruzione dell'esecu-
zione del programma. Tali comandi non possono essere realizzati mediante una
sola istruzione e quindi il programma scritto deve essere modificato, per esempio,
nel modo seguente:
PROGRAM NPOS2
READ *, N
NP=O
100 READ *, I, A
IF (A.GT.O.) NP = NP + 1
IF (I.NE.N) GO TO 100
PRINT *, NP
STOP
END
Questo esempio mette in evidenza che l'efficacia della frase di controllo IF..-
logico dal fatto che, quando risulta vera la condizione-in-
dicata nell'istruzione stessa, si pu eseguire un solo comando: \'istruzione dipen-
dente. Per questo motivo, per realizzare senza il costrutto IF-THEN-ELSE una
situazione di scelta tra due blocchi alternativi di istruzioni, si deve utilizzare insie-
me all'IF-logico l'istruzione GOTO incondizionato. A questo proposito vediamo
come devono essere modificati alcuni degli esempi di questo capitolo senza far
uso del costrutto IF-THEN-ELSE.
Esempio 9.13. Le istruzioni dell'esempio 9.8 equivalgono a:
IF (X.LT.O.O) GO TO 100
IF (X.LE.I.O) GO TO 200
Y = X + 2.
GOTO 300
100 Y =X .. 2
GO TO 300
200 Y = X * (X - 1.0)
300 S =Y + H
r
119
Esempio 9. J4. Un programma che serva a calcolare il massimo ed il minimo tra
'tre valori dati il seguente (cfr. esempio 9.11):
PROGRAM MAXMI2
REAL MAX, MIN
READ *, A, B, C
IF (A.GT.B) GO TO \O
MAX=B
GOTO 20
\O MAX = A
20 IF (C.GT.MAX) MAX = C
IF (A.GT.B) GO TO 30
MIN=A
GOT040
30 MIN = B
40 IF (C.LT.MIN) MIN = C
PRINT *, 'MASSIMO =', MAX, 'MINIMO =', MIN
STOP
END
Dagli esempi visti risulta chiaro che, non facendo uso della struttura decisio-
nale IF-THEN-ELSE, si scrivono programmi meno facili nel senso che la loro
comprensione resa pi difficoltosa dagli inevitabili salti di esecuzione.
Si osservi che il FORTRAN consente di evidenziare un punto di un programma
mediante l'istruzione costituita dalla sola parola chiave
CONTINUE
L'esecuzione di tale frase, di solito accompagnata da una etichetta, non ha altro
effetto se non quello di far proseguire sequenzialmente l'esecuzione del program-
ma.
In mancanza del costrutto IF-THEN-ELSE possibile realizzare la situazione di
scelta descritta in fig. 9.1 mediante le istruzioni IF-Iogico e CONTINUE nel modo
seguente:
IF (c) GOTO Il)
[blocco di istruzioni 2]
GOTO n
2
n) CONTINUE
[blocco di istruzioni I]
11
2
CONTINUE
Analogamente la situazione di fig. 9'.2 pu essere realizzata nel modo seguente:
120
IF (c) GOTO n
l
[blocco di istruzioni]
n
l
CONTINUE
9.7. GOTO-calcolato
Nei paragrafi precedenti si visto come si pu scegliere una tra pi alternative
possibili in base al verificarsi di una condizione. Quando questa scelta determi-
nata sulla base del valore di una espressione intera si pu usare l'istruzione GOTO-
calcolato che in F77 ha la forma seguente:
GOTO (n l' n
2
, ..., n
m
) , espressione intera
dove:
GO TO la parola chiave:
n n n
sono etichette non necessariamente distinte di frasi eseguibili
l' 2"'" m
della stessa unit di programma cui appartiene il GOTO-calcolato;
la virgola che precede l'espressione intera pu essere omessa.
Questa frase opera nel modo seguente: si calcola il valore k dell'espressione in-
tera; se l k m l'esecuzione prosegue con l'istruzione identificata dalla eti-
chetta n
k
, altrimenti l'esecuzione prosegue con l'istruzione che segue il GOTO-
calcolato.
In F66 l'espressione intera che compare in questa frase deve essere costituita
solo da un nome di variabile intera e non prevista la virgola che la precede.
Inoltre in F66 non specificato l'effetto della frase nel caso in cui il valore k
sia minore di l o maggiore di m.
Esempio 9.15. L'istruzione
GOTO (30, 40, SO), N + l - L
d luogo ad un salto alla frase 30 se N + l - L vale l, alla frase 40 se N + l - L
vale 2, alla frase SOse N + l - L vale 3. Se il valore di N + l - L minore di l
o maggiore di j l'esecuzione prosegue in modo sequenziale.
Esempio 9.16. L'istruzione
GOTO (7, lO, 15,7), M
provoca l'esecuzione dell'istruzione 7 se M vale 1 oppure 4, dell'istruzione lO
se M vale 2 e dell'istruzione 15 se M vale 3. Se M < l oppure M> 4 l'istruzione
GOTU-calcolato non provoca nessun salto di esecuzione.
L
121
9.8.IF-aritmetico
Questa frase ha la forma seguente:
IF (espressione aritmetica) n.. n
2
, n
3
dove:
IF la parola chiave:
n
l
, n
2
, n
3
sono etichette non necessariamente distinte di frasi eseguibili della
stessa unit di programma cui appartiene l'IF-aritmetico.
L'espressione aritmetica che compare in questa istruzione pu essere di tipo
intero, reale o doppia precisione.
Sono quindi esempi di istruzioni IF-aritmetico i seguenti:
IF (A) 10,20,30
IF (1- J) 5, 5, 3
IF (8 2 - 4. A C) 20, 60, 60
IF(I+2.L)Bl,1l,Bl
L'istruzione IF-aritmetico permette di controllare l'esecuzione del programma
in base al valore dell'espressione aritmetica che vi indicata: se il valore del-
l'espressione negativo l'effetto dell'IF-aritmetico lo stesso di un GOTO n
l
;
se il valore dell'espressione zero l'effetto quello di GOTO n
2
mentre se il va-
lore dell'espressione positivo l'effetto coincide con quello di GOTO n
3
. L'istru-
zione IF-aritmetico pu essere quindi rappresentata nel modo descritto dalla fig.
9.10.
Figura 9.10. Diagramma a blocchi corri-
spondente alla istruzione IF-aritmetico.
Esercizi
9.1 Scrivere un programma che legga il valore di x e stampi il valore s(x) dove
stx) uguale a - l se x < O, uguale a zero se x =Oed uguale a + l se x> O.
9.9 Scrivere un programma che, dati n valori della variabile A, determini quanti
di essi sono negativi, quanti positivi e quanti nulli.
9.10 Scrivere un programma che risolva lo stesso problema dell'esercizio prece-
dente usando come unico strumento decisionale l'istruzione IF-Iogico.
Individuare gli eventuali errori nelle seguenti istruzioni FORTRAN:
\ ,.1 (
123
GOTO IO
lF (A.GT.B) THEN
X=X+A.B
y = X +.5. A
ELSE
END IF
lF (A.GT.3.1) GO TO IO
IF (A.GT.B) THEN
X=X+A.B
ELSE
X=A+B
y = X + 0.5. A
ENDIF
lO
IO
d)
b)
SI
116
-5, \
r-l C
a) IF (N.LT.IO) 10,20,30
30 IF (A.GT.B) THEN
IO X=X+A.B
y = X + 0.5. A
ELSE
ENDIF
20 CONTINUE
c) IF (A.GT.B) THEN
X=X+A.B
IF (X.GT.I. 7) GO TO lO
ELSE
X=A+B
lO Y = X + 0.5 A
ENDIF
IF (N.EQ.O) IF (M.EQ.3) GOTO 515
IF (N.EQ.O.AND.M.EQ.3) GOTO 515
IF (A.LT.B.AND.GT.C) STOP
IF (A.LT.B. OR.A.GT.C) STOP
IF (A.GT.3..AND.A.LE.2.) A = A + B
GO TO (20, 30, 40, 50), X + 1.5
Tema data
Risultato
lO, 15,27
0,0
93,93,93
3,3
87, 16,87
1,3
9.8
9.4 Leggere tre interi e confrontarli. Il programma deve stampare una coppia
di interi cos definita: (O, O) se i tre numeri sono distinti; (3, 3) se i tre nu-
meri sono uguali; (i, j) se l'i-ma e j-rno numero sono uguali. Per esempio:
9.3 Scrivere un programma per leggere tre interi e scriverli in ordine decrescente.
Dati: a) I 2 3
b) l 3 2
c) 2 l 3
d) 2 3 I
e) 3 1 2
t) 3 2 1
9.2 Scrivere un programma che permetta di calcolare e stampare i tre valori
s(x l), s(x2) ed s(x
3
) con s(x) definita nell'esercizio precedente e xl = - 2,
x
2
= - I, x
3
= 3.
122
9.5 Scrivere un programma che legga le coordinate di tre punti nel piano: P
I
=:
=: (xl' YI ) , P2 =: (X
2'
Y
2
) , P
3
=: (X
3'
Y
3
) e calcoli la distanza tra P
I
e P
2
e la
distanza tra P
I
e P3' Il programma deve stampare la maggiore tra le due di-
stanze calcolate.
9.6 Scrivere un programma che, letti tre valori x, Ye z; permetta di verificare
se essi costituiscono le lunghezze dei tre lati di un triangolo ossia se sono
positivi e se:
X + Y>z, X + z > Y, Y+ z > x.
11 risultato del programma e un numero intero uguale a:
O se x, y, z non sono lati di un triangolo;
se x, y, z sono lati di un triangolo isoscele;
2 se x, y, z sono lati di un triangolo rettangolo;
3 altrimenti.
9.7 Indicare gli eventuali errori nelle seguenti successioni di istruzioni:
lO
Cicli
10.1. Strutture di ripetizione
Nella stesura di un qualunque programma si presenta spesso la necessit di ese-
guire pi volte un gruppo di istruzioni; d'altra parte evidente l'utilit di costrut-
ti che, realizzando un procedimento ripetitivo, permettono di eseguire un certo
numero di volte, automaticamente, le stesse operazioni con dati diversi.
Esempio 10.1. Dato un cerchio di raggio r la lunghezza della circonferenza
data da 211"r mentre l'area data da 1 1 ~ Per calcolare e stampare l'area e la lun-
ghezza della circonferenza di 15 cerchi si procede nel modo seguente:
1. Ripeti 15 volte
1.1. leggi: r
1.2. calcola e stampa l'area
1.3. calcola e stampa la lunghezza della circonferenza
2. Stop
Esempio 10.2. Per determinare il voto medio riportato da uno studente che ha
sostenuto m esami si pu seguire il seguente algoritmo nel quale s indica la
somma dei voti riportati dallo studente
1. Leggi: m
2. poni s = O
3. ripeti m volte
3.1. leggi un voto
3.2. aggiungi ad s il voto letto
4. se m = Oallora: scrivi che lo studente non ha sostenuto esami;
vai a 5.
altrimenti: calcola il voto medio v = s/m;
stampa: m e v;
vai a 5.
5. stop.
126
Il diagramma a blocchi corrispondente a questo algoritmo quello rappresen-
tato in fig. 10.1.
Figura 10.1. Calcolo del voto medio riportato dI uno studente che hl sostenuto m esami (cfr.
esempio 10.2).
Se vogliamo calcolare i voti medi riportati da N studenti, baster ripetere N
volte questo algoritmo leggendo ogni volta il numero degli esami sostenuti ed i
voti riportati da ciascuno studente (cfr. fig. 10.2).
Negli esempi precedenti come in alcuni degli algoritmi del cap. l, presente
una struttura ripetitiva che pu essere cos schematizzata:
Ripeti, un numero fissato di volte.
L__blocco di istruzioni
127
Tale struttura (ciclo finito) sottintende l'utilizzazione di un contatore ovvero di
una variabile il cui valore, indicando il numero di ripetizioni fatte, controlla l'e-
secuzione della struttura e ne determina l'inizio e la fine. Essa viene realizzata in
ripeti N volte
Figura 10.2. Calcolo deUemedie dei voti riportati da N studenti ciascuno dei Qualiha sostenuto
m esami (cfr. esempio 10.2).
128
FORTRAN mediante una frase opportuna (istruzione DO) la cui esecuzione atti-
va appunto un ciclo che si esaurisce dopo un numero finito di ripetizioni.
Prima di descrivere dettagliatamente la frase DO opportuno ricordare che esi-
stono situazioni cicliche nelle quali si ripete l'esecuzione di determinate istruzioni
subordinatamente al verificarsi o meno di una specificata condizione. Tali strut-
ture, gi evidenziate nel cap. l come cicli iterativi, non sono quindi controllate da
un contatore ma da una condizione in base alla quale viene stabilito se interrom-
pere o meno il ciclo. I cicli iterativi sono quindi caratterizzati dal fatto che un de-
terminato blocco di istruzioni (corpo) viene eseguito ripetutamente un numero
imprecisato di volte e possono essere genericamente schematizzati in questo
modo:
Ripeti, sotto il controllo di una condizione,
L_blocco di istruzioni
dove l'esecuzione del blocco di istruzioni modifica almeno una delle variabili
che intervengono nella condizione (cfr. esempio 1.5).
La fig. 10.3 mostra alcuni tipi di strutture cicliche iterative. Il primo ciclo,
indicato con la lettera (A), detto ciclo WHILE ed caratterizzato dal fatto che,
se la condizione non risulta vera, esso non viene mai attivato nel senso che non
vengono eseguite le istruzioni che ne costituiscono il corpo. Il ciclo contras-
segnato dalla lettera (B) detto ciclo UNTIL e presenta invece la particolarit
che il suo corpo viene sicuramente eseguito almeno una volta. Questa differenza
tra le due strutture determinata dalla posizione dell'operazione di controllo che
si trova nel ciclo WHILE prima del blocco di istruzioni mentre nel ciclo UNTIL
posta dopo. Il terzo tipo di struttura, contrassegnato con la lettera (C), carat-
129
te rizzato dal fatto di avere il corpo suddiviso in due blocchi di istruzioni posti
uno prima ed uno dopo l'operazione di controllo. Evidentemente in questo caso
le istruzioni del blocco posto prima del controllo verranno eseguite sicuramente
almeno una volta mentre quelle del blocco che si trova dopo saranno eseguite
soltanto se la condizione risulta falsa.
Mentre alcuni linguaggi di programmazione, come ad esempio il PASCAL,
ed alcune estensioni del FORTRAN utilizzano istruzioni particolari per realiz-
zare i cicli WHILE e/o UNTIL, in F77 non prevista alcuna istruzione di questo
tipo. E' per possibile definire un qualunque ciclo iterativo usando in modo op-
portuno le istruzioni IF-logico e GOTO-incondizionato. Cos il ciclo WHILE
pu essere descritto mediante il costrutto:
n
1
IF (.NOT. condizione) GOTO n
2
[blocco di istruzioni]
GOTO n
1
n
2
CONTINUE
il ciclo UNTIL equivalente alla sequenza di istruzioni:
n
1
CONTINUE
[blocco di istruzioni)
IF (.NOT.condizione) GOTO n
1
mentre il ciclo (C) di fig. 10.3 pu essere definito nel modo seguente:
n
1
CONTINUE
[blocco di istruzioni l]
IF (condizione) GOTO n
2
[blocco di istruzioni 2]
GOTO n
1
n
2
CONTINUE
E' opportuno sottolineare che occorre molta attenzione nell'uso dei cicli itera-
tivi come si pu dedurre dall'esempio seguente.
Esempio 10.3. Si vuoi scrivere un programma che permetta di calcolare la radice
quadrata di un numero positivo x basandosi sul seguente procedimento:
lA)
(8)
Figura 10.3. Alcune strutture cicliche iterative.
L
130
l. Dati due numeri positivi s e d tali che s2<x e d
2
> x
2. poni m = (s + d)/2
3. se m
2
=x allora: m il risultato;
scrivi m e vai a 4.
altrimenti: se m
2
> x allora: poni d = m e torna a 2.
altrimenti: poni s = m e torna a 2.
4. stop.
La fig. 10.4 rappresenta il diagramma a blocchi di questo procedimento nel
quale presente un ciclo iterativo che sicuramente, per particolari valori di x
quali ad esempio x = 2. impone un numero infinito di ripetizioni. Questa situa-
zione pu presentarsi anche quando m = ...;; rappresentabile con un numero
finito di cifre in quanto essa dipende dal criterio usato per controllare il ciclo.
A causa della precisione finita con cui si lavora sar infatti difficilmente verificata
la condizione se m
2
= x che determina la fine del procedimento. Per lo stesso
motivo sar lecito accettare, come risultato, un valore il cui quadrato sia quasi
uguale ad x. tenendo presente che le richieste sulla bont dell'approssimazione
non possono prescindere dalla precisione di macchina e dipendono dalle esigenze
di chi utilizza il programma. In base a queste considerazioni nel programma ripor-
tato in fig. 10.5 viene utilizzata, quale criterio di arresto, la condizione se
Figura 10.4. Diagrammi I blecch che descrive il procedimento per il calcolo di V; x> O
(esempi. 10.3). '
131
PROGRAM RADQ X
READ *. X. S. D. SIGMA
100 CONTINUE
EMME = (S + D)/2.
EMME2 = EMME" 2
IF (ABS(EMME2 - X). LESIGMA) GOTO 200
IF (EMME2.GT.x) THEN
D= EMME
ELSE
S = EMME
ENDIF
GOTO 100
200 CONTINUE
PRINT *. 'RISULTATovOTTENUTO', EMME
PRINT *, 'ERROREvCOMMESSO', ABS(EMME - SQRT(X))
STOP
END
Figura 10.5. Diagramma a blocchi e programma F77 per il calcolo di .J;, x >O.
1 m2 - x I o dove o una quantit positiva maggiore della precisione di mac-
china. Il valore di o viene acquisito in fase di lettura insieme a quello degli altri
dati del problema. Si osservi che un errore nella scelta della tolleranza o pu
generare ancora una ripetizione infinita delle istruzioni che costituiscono il corpo
del ciclo. I criteri che vanno seguiti nella scelta di o esulano da un testo di questo
tipo e dipendono da considerazioni numeriche per le quali si rimanda, per esem-
pio, a [lO].
Le osservazioni fatte sull'esempio precedente mettono m evidenza una carat-
teristica delle strutture cicliche iterative: esse sono semplici e di immediata com-
prensione ma nascondono il pericolo che, a causa di un errore logico nel pro-
gramma o di un errore sui dati, la condizione che determina la fine del ciclo
non venga mai verificata. Per evitare questo inconveniente opportuno fissare
un numero massimo di ripetizioni in modo che la situazione ripetitiva sia con-
trollata non solo dalla condizione presente nel ciclo ma anche da un contatore
che ne determina l'interruzione non appena sono state eseguite tutte le ripe-
tizioni. Il ciclo iterativo viene allora inserito in un ciclo finito dando luogo ad una
struttura che pu essere cos schematizzata:
Ripeti, un numero fissato di volte,
: Ripeti, sotto il controllo di una condizione,
: blocco di istruzioni.
&. __1__
137
Esempio 10.8. Dati n > Oe v scrivere un programma che permetta di calcolare
e stampare la quantit
Esempio 10.7. Scrivere un programma che, dati i numeri interi n, a ed r permette
di calcolare e stampare ogni elemento della progressione aritmetica di ragione
r definito da:
I
I
ijJ
.1
I
I
I
I
I
I
I
I
k =O, l, ... , n u
k
= a + kr
PROGRAM UOUK
INTEGER A,K,R,N,UK
READ., A, R, N
DO 100 K =O. N
UK = A +K. R
PRINT ., K, '- MOvELEMENTO', UK
100 CONTINUE
STOP
END
Si osservi che il ciclo presente in questo programma costituito da N + l ripe-
tizione del rango e che la variabile del DO usata pi volte nelle istruzioni del
rango.
n
q = U
o
+ u
1
+ ... + un = L U
k
k=O
dove U
o
=v e u
k
= k(k + l) u
k
_ l per l ..;;k ..;; n.
Un algoritmo per risolvere questo problema il seguente:
l. Leggi: n e v
2. poni U
o
=v
3. poni q = v
4. ripeti n volte per k = l, 2...., n
4.1 calcola u
k
= k(k + i) U
o
4.2 poni q = q + u
k
4.3 poni U
o
= u
k
5. scrivi: q
6. stop
)/
Infine va tenuto presente che proibito trasferire il controllo dell'eSeCuzione. ti
! dentro al rango di un DO da un punto al di fuori del rango stesso ovvero non Ttj}-
consentito entrare nel rango di un DO se non attraverso l'istruzione iniziale /T
DO che definisce e controlla il ciclo stesso.
r
PROGRAM VOTMED
INTEGER VOTO
READ.,M
S=O.O
00 27 I = l,M,
READ .,VOTO
S =S +VOTO
27 CONTINUE
IF (M.NE.O) THEN
VM=S/M
PRINT., 'VOTOvMEDIOvSUvM =', M, 'vESAMI', VM
ELSE
PRINT -. 'LOVSTUDENTEvNONvHAvSOSTENUTOvESAMI'
ENDIF
STOP
END
Esempio 10.6. Il programma seguente permette di calcolare e stampare il voto
medio riportato da uno studente che ha sostenuto M esami (cfr. esempio 10.2 e
fig. 10.1).
Si osservi che l'istruzione DO che compare in questo programma equivale a
DO 27, I = l, M, l. L'esecuzione del ciclo inizia ponendo uguale ad l il valore
della variabile I; si calcola quindi il numero di ripetizioni imposte dal DO: se lo
studente non ha sostenuto alcun esame (M = O) si ha C = O, il rango del DO viene
ignorato e l'esecuzione prosegue con l'istruzione che segue 27 CONTINUE; se
invece lo studente ha sostenuto uno o pi esami vengono eseguite M volte le i-
struzioni del rango ed alla fine del ciclo S contiene la somma ,!ei votLtiPortati
I .
136
Alcune regole da seguire
Affinch una struttura ripetitiva controllata dall'istruzione DO possa essere
correttamente eseguita necessario che non si creino situazioni che impediscono
l'esecuzione sequenziale dei passi mediante i quali si realizza il
(9 ticolare, la variabile del DO non mai essere il rango
pu essere usata in una qualunque istruzione del rango purch non
venga modificato il suo valore ", l'istruzione finale di un ciclo-DO non
deve essere un'altra istruzione DO n un'istruzione
GOTO-assegnato, IF-aritmetico, IF(c) THEN, ELSE, ELSE IF(c) THEN, END IF,
RETURN, STOP, END. L'istruzione che viene comunemente usata come frase
terminale di un DO l'istruzione CONTINUE che, avendo come unico effetto
quello di far proseguire l'esecuzione uet programma, permette di evidenziare il
rango del DO senza intervenire operativamente nel ciclo.
138
139
ovvero:
Esempio 10.10. Scrivere un programma che, dato n 5, permetta di calcolare
e stampare le seguenti quantit:
DOlO I=I,N
IF (I.LT.S) GOTO IO
K = K +(I - 1)/2.
L=L+2.1
IO M=M+I
DO IO 1= l, N
IF (I.LT.5) GOTO 20
K =K +(I - 1)/2.
L=L+2.1
20 M =M + I
IO CONTINUE
n
k = L(i - 1)/2
i = 5
n
L 2i,
i= 5
ti,
i= I
m=
PROGRAM MLK
INTEGER M, L, N, 1
REAL K
READ., N
M=O
L=O
K=O.O
DO IO 1= l,N
M=M+I
IF (I.LT.S) GO TO IO
K =K + (I - 1)/2.
L=L+2.1
IO CONTINUE
PRINT., M, L, K
STOP
END
L'istruzione DO 10 I = l, N implica N ripetizioni del rango nel quale viene pi
volte utilizzata la variabile del DO. La prima istruzione del rango, M = M + I,
viene eseguita ad ogni ripetizione del rango mentre le frasi di assegnazione che
seguono l'IF-logico vengono eseguite soltanto se I 5: durante le prime quattro
ripetizioni del rango risulta infatti vera la relazione I.LT.5 e l'esecuzione dell'istru-
zione dipendente GOTO lO provoca un salto all'istruzione finale IO CONTINUE.
Lo stesso risultato del programma precedente sarebbe stato ottenuto utilizzando
uno qualunque dei seguenti cicli:
READ., N
M=2.N+1
S = 1.0
DO IO I = l, M, 2
S = S.I
IO CONTINUE
PRINT., 'PRODOTTOvDElvPRIMI', N + l, 'vNUMERlvNATURALlvDlSPARI', S
S =0.0
DO IS 1=2,M,2
S = S + 1
IS CONTINUE
PRINT., 'SOMMAvDElvPRIMI', N, 'vNUMERlvNATURALlvPARI', S
STOP
END
In questo programma compaiono due cicli-DO i cui ranghi sono separati nel
senso che il secondo ciclo diventa attivo soltanto quando terminato il primo;
questo ha permesso di usare lo stesso nome di variabile I nelle due istruzioni DO
senza che si creino errori o ambiguit nell'esecuzione dei due cicli. Infatti, durante
l'esecuzione del ciclo controllato dall'istruzione DO lO I = l, N, 21a variabile I
assume tutti i valori dispari compresi tra l ed N secondo le regole che comandano
l'esecuzione di un ciclo-DO; al momento della disattivazione del ciclo l contiene
il valore N + 2 e, con l'esecuzione della frase DO 15 I = 2, N, 2 la variabile I
viene ridefinita ed il suo valore posto uguale a 2. Durante questo ciclo la variabile
l assume tutti i valori pari compresi tra 2 ed N - 1 e vale N + 1 quando il ciclo
termina.
Esempio 10.9. Dato un intero positivo dispari M = 2N + I il programma se-
guente calcola il prodotto dei primi N + l numeri interi positivi dispari e la som-
ma dei primi N numeri interi positivi pari.
Basandosi su questo algoritmo si ha:
PROGRAM SOMUK
READ.,N,V
Uo=v
Q=V
DO 20, K= l,N
UK = UO. K. (K + I)
Q=Q+UK
UO=UK
20 CONTINUE
PRINT., Q
STOP
END
Si osservi che gli elementi u
k
vengono calcolati usando l'aritmetica reale per evi-
tare fenomeni di overflow nel calcolo di k(k + I) con aritmetica intera.
i
!]
il
140 141
Figura 10.8. Diagramma a blocchi relativo al problema dell'esempio 10.11.
Sarebbe stato per notevolmente diverso scrivere:
DOlO 1=I,N
M=M +1
IF (LLT.5) GOTO lO
K = K + (I - 1)/2.
lO L=L+2*1
In questo caso infatti, quando I minore di S, l'istruzione dipendente
GOTO lO impone un salto all'istruzione finale del DO che, essendo la frase di
assegnazione L = L + 2 * I, provoca la modificazione del contenuto della variabile
n
L la quale, alla fine del ciclo, contiene il valore 2i e non quello richiesto dal
io; l
problema.
10.4. Cicli e strutture decisionali
In molti problemi l'attivazione di un ciclo-DO pu essere subordinata al veri-
ficarsi o meno di una certa condizione.
Esempio 10.11. Dato un intero n> Oscrivere un programma che permetta di cal-
colare la quantit m definita da:
n
m=
[
(i+1)n se n pari
i= l
n
m= [
2in se n dispari
i= l
Il programma richiesto deve realizzare il seguente procedimento:
l. Leggi: n
n
2. se n pari allora: calcola m = (i + 1) n e vai a 3.
i= l
n
altrimenti: calcola m = 2 i n e vai a 3.
io; l
3. scrivi: m
4. stop.
READ -. N
EMME=0.0
IF (N/2 * 2.EQ.N) THEN
DO 150 I = l, N
EMME= EMME+ (I + 1.0) * N
150 CONTINUE
ELSE
DO 200 I = l, N
EMME = EMME+ 2. * I * N
200 CONTINUE
ENDIF
PRINT *,'N =', N, 'vM =', EMME
STOP
END
F v
J
Una descrizione pi dettagliata di questo algoritmo (cfr. fig. 10.8) mette in
evidenza la necessit di usare due strutture cicliche alternative la cui attivazione
determinata dalla condizione se n pari.
Facendo uso della struttura decisionale IF-THEN-ELSE possiamo quindi scn-
vere il programma seguente:
E' importante osservare che quando un ciclo-DO fa parte del blocco di istru-
zioni che seguono una delle frasi IF (c) THEN, ELSE IF (c) THEN, ELSE, il
rango del DO deve essere interamente contenuto nel blocco che contiene la frase
iniziale del ciclo ossia l'lstruzione DO.
-_...:---'
/;
(
142
D'altra parte, se /'istruzione IF (c) THEN compare dentro il rango di un ci-
c/o-DO anche la corrispondente istruzione END IF deve far parte del rango.
Esempio 10.12. Supponendo di aver intervistato N p r s ~ di se.sso diverso s ~
vuoI calcolare l'et media dei maschi e quella delle femmine. I dati sono raccolti
in N schede ciascuna delle quali contiene l'et ed un codice che indica il sesso del-
l'intervistato (O per le femmine ed I per i maschi). .
Indichiamo con Nm (NO il numero totale dei maschi (delle femmine) e con
Em (ED la somma delle loro et; il problema pu essere allora risolto come segue:
I. Leggi: N
2. poni Nm = Oed Nf = O
3. poni Em = Oed Ef = O
4. ripeti N volte:
4.1. leggi una coppia di dati
4.2. se codice = 1 allora: aggiungi una unit ad Nm e
aggiungi l'et ad Em. Vai a 4.3.
altrimenti: aggiungi una unit ad Nf e
aggiungi l'et ad Ef. Vai a 4.3.
4.3. continua il procedimento ripetitivo
5. calcola e stampa l'et media dei maschi e quella delle femmine
6. stop.
11 programma richiesto pu essere allora il seguente:
PROGRAM ETAMED
INTEGER CODICE, ANNI
READ-. N
NM=O
NF=O
EM=0.0
EF =0.0
DO 151 NUM= l,N
READ*, ANNI, CODICE
IF (CODlCE.EQ.1) THEN
NM=NM+I
EM=EM + ANNI
ELSE
NF = NF + 1
EF =EF + ANNI
END IF
151 CONTINUE
ETAM = EM/NM
ETAF = EF/NF ,
PRINT * 'NUMERO'lDEI'lMASCHI', NM, ''lETA'' MEDIA, ETAM
PRINT *: 'NUMERO'lDELLE'lFEMMINE', NF, 'v ETA" MEDIA', ETAF
STOP
END
143
10.5. Trasferimento ad istruzioni fuori del rango
La ripetizione delle operazioni indicate dalle istruzioni del rango di un DO pu
essere interrotta trasferendo il controllo dell'esecuzione dall'interno del rango ad
una istruzione che, pUT facendo parte della stessa unit di programma. non appar-
tiene al rango. In questo caso la variabile del DO mantiene, al momento dell'uscita
dal ciclo, il valore definito durante l'ultima ripetizione.
Esempio 10.13. Dato N, si vogliono leggere al pi N valori della variahile PESO;
la lettura dei dati deve terminare con il primo valore negativo o nullo della va-
riabile. Scrivere un programma che segnali se tutti gli N valori di PESO sono po-
sitivi e, in ogni caso, fornisca il numero di valori letti.
Seguendo lo schema indicato in fig. 10.9 si ha:
READ *, N
DOIO,K=I,N
READ*, PESO
IF (PESO.LE.O.O) GOTO 25
IO CONTINUE
PRINT *, 'TUTTI vI vVALORIvSONOvPOSITIVI'
K=N
25 PRINT *, 'NUMEROvDlvVALORIvLETTI', K
STOP
END
Figura 10.9.
144
Dopo aver acquisito il valore di N inizia il ciclo controllato dall'istruzione
DO l O, K = l, N; essa impone N ripetizioni del rango che costituito da due
operazioni: una di lettura ed una di controllo. Se tutti i valori della variabile
PESO risultano positivi l'istruzione dipendente GOTO 2S non viene mai ese-
guita ed il ciclo si esaurisce dopo N ripetizioni del rango. L'esecuzione prosegue
allora in modo sequenziale con l'istruzione che segue la frase terminale del DO.
Siccome il ciclo stato completamente eseguito, al momento della sua disattiva-
zione la variabile K contiene il valore N + l: da qui la necessit di inserire l'istru-
zione K = N prima della stampa del numero di dati letti. Nel caso in cui i valori
della variabile PESO non siano tutti positivi il ciclo viene interrotto non appena
si trova un valore negativo o nullo: in questo caso infatti l'esecuzione dell'istru-
zione dipendente GOTO 2S impone un salto nell'esecuzione al di fuori del rango
del DO che provoca l'immediata disattivazione del ciclo e l'esecuzione dell'istru-
zione individuata dalla etichetta 2S. Siccome il ciclo non stato completato il
valore di K quello definito durante l'ultima ripetizione e fornisce quindi il nu-
mero di valori letti: i primi K - l sono tutti positivi mentre il K-mo, essendo nega-
tivo o nullo, ha provocato l'interruzione delle operazioni di lettura.
Esempio 10.14. Il seguente programma permette di calcolare la radice quadrata
di un numero positivo x mediante l'algoritmo UI fig. 10.6: \
PROGRAM RADICE
READ -. X, SIGMA, N, S, D
DO 100 1= 1, N
EMME= (S + D)/2.
EMME2= EMME 2
IF (ABS(EMME2 - X).LE.SIGMA) GOTO 200
IF (EMME2.GT.x) THEN
D=EMME
ELSE
S= EMME
END IF
100 CONTINUE
PRINT., 'E" STATOvESEGUITOvILvNUMEROVMASSlMOvDl',
'vRlPETIZI0NI'
STOP
200 PRINT., 'SONOVSTATEvESEGUITE,I, 'vRIPETIZI0N(
PRlNT .,'E" STATOvTROVATOvlLvRISULTATO', EMME
PRINT., 'CONvUNvERRORE: ABS (EMME - SQRT(X
STOP
END
145
10.6. Cicli-DO annidati
Come mostra il diagramma di fig. 10.2, possono presentarsi situazioni che preve-
dono due o pi cicli finiti uno dentro l'altro (annidati). Il linguaggio F77 prevede
la possibilit di a. ttivare, all'interno del.ran...g..o di u. n.. DO.. '. altri Cicli-D.O. con. l'. unica */:-
limitazione che il Jl111KiLdeldJQ l!i'1 interno deve essere interamente contenuto
dentro al rango'del ciclo pi esterno. osservare
essere ridefinita dalle istruzioni del rango, le
annidati devono usare variabili di nome -
,<!ive!S.-2' Non sono previste limitazioni sul numero di cicli-DO che possono essere
annidati.
Esempio 10.15. Il seguente programma permette di calcolare e stampare il voto
medio di N studenti (cfr. fig. 10.2):
PROGRAM MEDIE1
INTEGER VOTO
READ., N
D030 NS= l,N
PRINT -. 'STUDENTEvNUMERO', NS
READ .,M
S=O.O
DO 15 1= 1, M
READ., VOTO
S=S+VOTO
15 CONTINUE
IF (M.NE.O) THEN
VM = S/M
PRINT., 'VOTOvMEDlOvSUvM =', M, 'v ESAMI', VM
ELSE
PRINT -. 'LOvSTUDENTEvNONvHAvSOSTENUTOvESAMI'
END IF
30 CONTINUE
STOP
END
Pi strutture cicliche annidate possono utilizzare la stessa frase terminaI=. che,
in questo'caso, deve essere considerata come appartenente soltanto al rango
DO pi interno.
Esempio 10.16. La successione di istruzioni:
N=O
DO 50 M = 1,5
K=M
DO 50 J = O, 3
L= J
50 N = N + l
146
equivale alla seguente:
N=O
DO 100 M=I,5
K=M
DO SO J = O, 3
L=J
SO N =N + l
100 CONTINUE
Dopo l'esecuzione la variabile M vale 6, K vale 5, J vale 4, L vale 3 ed N vale
20. Il rango del DO pi interno, controllato dalla variabile J, viene ripetuto
20 volte mentre quello del DO pi esterno che utilizza la variabile M, viene ese-
guito 5 volte.
Anche se previsto che due o pi cicli-DO annidati si chiudano sulla stessa
frase pu essere utile evidenziare il rango di ciascun ciclo mediante istruzioni
CONTINUE distinte.
Esempio 10.17. La successione di istruzioni:
N=O
L=O
DO lO 1=1,2
N=N+ l
DO lO J=I,3
K=J +N
DO lO M = 1,3
lO L=L+K
equivale alla seguente:
N=O
L=O
DO lO I = 1,2
N=N+ l
DO 20 J = 1,3
K=J +N
DO 30 M= 1,3
L=L+K
30 CONTINUE
20 CONTINUE
lO CONTINUE
Il rango del DO pi esterno, controllato dalla variabile I viene eseguito 2 volte;
quello del DO intermedio, controllato da J, viene eseguito 6 volte mentre quello
del DO pi interno, controllato dalla variabile M, viene eseguito 18 volte. Dopo
l'esecuzione delle istruzioni indicate le variabili I, J ed M contengono rispettiva-
mente i valori 3, 4 e 4 mentre N contiene il valore 2, K il valore 5 ed L il valore 63.
.. _-----------
147
L'abitudine di separare i ranghi di cicli-DO annidati mediante istruzioni finali
distinte non utile soltanto per aumentare la leggibilit di un programma ma ' i
anche per evitare errori quando nel rango di uno dei cicli annidati vengono esegui- "
te operazioni di controllo. Tali operazioni non devono infatti prevedere un tra- '
sferimento ad una istruzione che appartenga al rango di altri cicli interni; in parti-
colare sbagliato trasferire il controllo dell'esecuzione del rango di un DO alla
frase finale di un'altro ciclo in esso annidato.
Esempio 10.18. Il seguente gruppo di istruzioni
L=O
DO lO M = 1,5
L=L+M
IF (M.LE.3) GOTO lO
DO 20 K = 1,3
20 L = L + (M - K)
IO CONTINUE
corrisponde al diagramma a blocchi di fig. 10.10; il rango del DO pi esterno,
controllato dalla variabile M, viene eseguito cinque volte mentre il ciclo pi in-
terno viene attivato soltanto se M maggiore di 3. Alla fine dell'esecuzione dei
due cicli i contenuti delle variabili M, L e K sono rispettivamente 6, 4 e 30. La
distinzione mediante etichette diverse delle frasi terminali dei due cicli neces-
ripeti per m = 1,2,3,4,5
v
Figura 10.1O. I cicli finiti annidati esaminati nell'esempio 10.18.
148 149
10.3 Indicare gli eventuali errori nei seguenti gruppi di istruzioni:
c) DO lO K = l, lO
L=K
IF (K.GT.5) GOTO lO
L =K + 3 l''{ U
lO IF (L.LE.LM) K = L - 2
d) GO TO 5
DO lO I = l, 100
5 H = 0.5. I
A=IH+A
lO CONTINUE
saria per effettuare in modo corretto il trasferimento previsto nel rango del DO
pi esterno. Sarebbe stato infatti sbagliato scrivere, per esempio, la successione di
istruzioni:
L=O
DO lO M=1,5
L=L+M
IF (M.LE.3) GOTO lO
DO lO K=I,3
lO L=L+(M-K)
in quanto l'istruzione dipendente GOTO lO trasferisce il controllo dell'esecu-
zione alla frase finale del ciclo pi interno.
a) DO lO 1M1 = 1, 5
IMI = IMI + 3
lO CONTINUE
b) DO 5 K =N + 1, J, L
5 IF(K.LE.MAN) IS = N K
l'I V
\ .
Esercizi
10.1 Alcune delle istruzioni seguenti sono sbagliate. Perch?
10.2 Determinare il numero di ripetizioni del rango per ognuna delle seguenti
istruzioni:
DO 22 l = 22, 77, - 1
DO 37 \JM-l= 1, 10,2 SCk (16
DO N, 1= 1, 10,2 rlO
DO lO, K = L - 3, J + 2, 3 - LI
DO 1 JS = 0.0, 8.0, 0.5 l'IO
DO 3 S = 0.0, 8.0, 0.5
DO 83 K = L + M, K
DO 5 M= L, lO, L
DO 21, ITER = LO, A + B,:,1.l
\
! l
f) DO lO l = 20, l, - l
Al = 1./2.
DO 20 K = l, l i I (
lO L=K+3
20 CONTINUE
(a) DO lO l = 1,4 (b) S = O.
S = O. DO lO l = 1,4
S=S+I S=S+I
lO CONTINUE lO CONTINUE
I
(c) S = O. (d) S = l.
DO lO l = 4, l, - 1 DO lO l = 1,4
S = S + 1./1 S = S l
lO CONTINUE lO CONTINUE
e) IF (A - B.LE.E) THEN
DO lO I = l, N
X=X+H
PRINT., X 2
ELSE
X=X-H
PRINT.,2. X
lO CONTINUE
END IF
10.4 Indicare il contenuto della variabile S dopo l'esecuzione delle sequenze di
istruzioni (a), (b), (c), e (d) seguenti:
10.5 Scrivere un programma che, assegnate n l teme di numeri interi, esegua
per ciascuna di esse quanto previsto nell'esercizio 9.4.
10.6 Scrivere un programma che, assegnate n l teme di numeri reali, permetta
di stabilire per ciascuna di esse se i valori letti costituiscono i lati di un
triangolo (cfr. esercizio 9.6).

c:
DO 3, 1= 8, 8
DO 7 M= 1, 55, 1O
DO lO J = lO, O, - 1 (f
DO 2, L =O, 30 I
DO 6 K =0.1, 3.5, 2.1
150
10.7 Scrivere un programma che, assegnato un numero intero N,
. l h 2r N < 2
r
+ l e le cifre della rappresentazione binaria
Il valore r ta e c e ...."
di N. (cfr. 3.l).
10.8 Scrivere un programma che permetta di stampare il valore che un polinomio
n .
. ., d -- l () - 1: a Xl assume per x = z asse-
.a coefficienti reah di gra o n? 'Pn X - j= O i
gnato (l dati del problema sono: n, z ed i coefficienti a
o
' al' ..., an)
[
Il
Le variabili dimensionate
11.1. Introduzione
Nel corso dei precedenti capitoli si sempre associato un nome simbolico ad
una singola locazione di memoria. In FORTRAN possibile anche individuare
con un nome simbolico un insieme ordinato di locazioni consecutive atte a con-
tenere dati tutti del medesimo tipo. Un tale insieme viene detto variabile dimen-
siona!a (array) e le locazioni che lo costituiscono sono dette elementi della varia-
bile dimensionata; ogni elemento pu essere individuato specificandone in modo
opportuno la posizione tramite degli indici. In pratica, possibile tradurre in
FORTRAN la notazione vettoriale comunemente usata, ad esempio, nella descri-
zione di molti problemi e algoritmi di natura scientifica; tale possibilit si rivela
talvolta indispensabile per il trattamento di insiemi di valori omogenei.
Esempio Il. ( Consideriamo l'algoritmo descritto nell'esempio 10.8. In tale algo-
ritmo si fa uso della notazione vettoriale che permette una descrizione sintetica e
compatta delle operazioni da svolgere. In particolare al passo 4.1 si descrive il cal-
colo di u
k
' ossia di u
1
se k = l, u
2
se k = 2, e cos via; i nomi u
O
' u
1
' ... un si
riferiscono a entit fra loro distinte. Nel programma SOMUK non si fa corrispon-
dere una cella di memoria ad ognuno dei valori ul' ..., un' in quanto il nome
simbolico UK identifica sempre la stessa cella dove, al variare di K durante l'ese-
cuzione del ciclo-DO, viene memorizzato ogni volta un valore diverso.
Supponiamo ora di voler scrivere un programma che, calcolati u
O
' u
1
' ..., un'
stampi la somma degli elementi di posto dispari u
l
. u
3
... e quella degli elementi
di posto pari u
O
' u
2
' .. Se il valore di n fissato, ad esempio n = 7, si pu otte-
nere lo scopo desiderato con il seguente programma:
152
READ., V
UO=V
Ul = 2. UO
U2 =2. 3. Ul
U3 = 3. 4. U2
U4 =4. S. U3
US =5. 6. U4
U6 = 6. 7. US
U7 =7. 8. U6
SP= UO+ U2 + U4 + U6
SD= Ul +U3 + US + U7
PRINT. 'SOMMA DEGU ELEMENTI DI POSTO PARI =', SP
PRINT.: 'SOMMA DEGU ELEMENTI DI POSTO DISPARI =', SD
STOP
END
E' evidente che per valori grandi di n molto scomodo scrivere un programma
analogo al precedente. Utilizzando invece una variabile dimensionata i cui ele-
menti contengano i valori u
O
' u1' ... , un possibile scrivere un programma che
risolve il problema qualunque sia n (cfr. esempio 11.10).
Esempio 11.2. Sono noti i voti conseguiti da 200 studenti di un corso di laurea
che prevede 30 esami. Per poter facilmente trattare questo insieme di dati si pu
costruire una tabella rettangolare A di 200 colonne e 30 righe: in ogni colonna
si riportano i voti conseguiti da uno studente. La tabella A risulta cos costituita
da 6000 dati: il voto conseguito dal j-esimo studente all'i-esimo esame si trova
all'incrocio fra la j-esima colonna e l'i-esima riga; esso quindi individuato dalla
coppia di indici (i, j) e pu essere indicato con il simbolo aj,j'
Nel seguito useremo il termine vettore per indicare un insieme di dati ognuno
dei quali individuato da un solo indice (cfr. esempio 11.1) e il termine
per indicare un insieme di dati ognuno dei quali individuato da una coppia, di
indici (cfr. esempio 11.2). Un vettore una tabella unidimensionale e una matnce
una tabella bidimensionale; si possono costruire anche tabelle a tre o pi dimen-
sioni, per poter trattare insiemi di dati particolari quali, ad esempio, il numero di
persone che abitano ad ogni piano ad ogni numero civico di ogni strada in una
ta, oppure i valori che una funzione di tre o pi variabili assume su un reticolo di
punti. Ad una tabella, intesa come insieme di dati individuabili tramite indici,
si pu far corrispondere in FORTRAN una variabile dimensionata.
153
Il.2. Nomi di variabili dimensionate e istruzione DIMENSION
Perch un nome simbolico possa essere considerato in una unit di programma
come nome di una variabile dimensionata, occorre che di ci sia informato il com-
quale devono essere fomite, in
il tipo della variabile, ossia il tipo comune a tutti i suoi elementi; -
il numero di dimensioni;
l'ampiezza di ogni dimensione.
Ad esempio, se si vuoi definire una variabile dimensionata corrispondente ad
una matrice di 30 righe e 200 colonne con elementi reali, si deve specificare
al compilatore che la variabile di tipo reale e che ha due dimensioni, la prima di
ampiezza 30 e la seconda di ampiezza 200.
Le indicazioni suddette, insieme ad altre che verranno esaminate in seguito,
devono essere specificate tramite un dichiaratore di variabiledimensionata che ha
la forma:
dove:
v un nome simbolico che costituisce il nome della variabile dimensionata; il
tipo della variabile il tipo (esplicito o implicito) di v;
n il numero di dimensioni, e deve essere minore o uguale di 7 (in F66 deve
essere n 3);
dI" .. , d
n
sono i dichiaratori di dimensione. Per ogni valore di i, d ha la forma
I
infj : SUPj
dove inf
j
e SUPj sono la limitazione inferiore e la limitazione superiore per l'i-
esima dimensione. v ha dimensioni costanti quando, per ogni i, inf
. '" _. . . l
e SUPj espresslOnl aritmetiche ottenute combinando costanti e nomi di'oca-
stanti forme per infj e sUPi' consentite soltanto all'interno di sotto-
programmi, verranno esaminate nel cap. 15. In ogni caso il valore di sup. deve
essere maggiore o uguale di quello di inf
j;
se inf
j
uguale a l, il dichiaratore d.
pu assumere la forma (unica consentita in F66) I
suP;
L'ampiezza dell'i-esima dimensione data da
Sj =sUP
i
- inf
j
+ l
e l'ampiezza di v, ossia il numero totale dei suoi elementi, il prodotto delle
. n
ampiezze s., ovvero data da n s..
I i=l I
154
Esempio JJ.3. Nel dichiaratore di variabile dimensionata
T
155
Esempio 11.6. Le frasi
A (IO, 20)
si ha: n = 2, inf
l
= inf
2
= l, sUPI = lO, sUP2 = 20; l'ampiezza della prima dimen-
sione quindi s = lO, quella della seconda s2 = 20, da cui segue che l'ampiezza
della variabile 1 SI x s2 = 200. Osserviamo che il dichiaratore usato equiva-
lente ad uno qualunque dei seguenti:
A(I : 10,20)
A(I : lO, l : 20) A(lO, l : 20)
PARAMETER (N = IO)
REAL A(N, N + I), V(N), U(N)
definiscono la matrice reale A di lO righe e Il colonne e i vettori reali V ed U di
ampiezza lO. Notiamo che nei dichiaratori di dimensione compare il nome sim-
bolico N che non un nome di variabile, bens un nome di costante definito nella
precedente frase PARAMETER. Le due istruzioni sono pertanto equivalenti
alla frase
Nel seguito useremo abitualmente, per le variabili a una e due dimensioni,
la terminologia seguente: vettore di lunghezza SI in luogo di variabile a una
dimensione di ampiezza SI; matrice di SI righe e s2 colonne, o matrice
s x s , in luogo di variabile a due dimensioni di ampiezze rispettive SI e s2 ;
l 2 . .. b
matrice quadrata di ordine n in luogo di variabile a due dimensioni entram e
di ampiezza n. Il significato di altre locuzioni usate in luogo delle precedenti
sar facilmente deducibile da queste.
Un dichiaratore di variabile dimensionata pu comparire in una frase dichia-
rativa di tipo, come negli esempi che seguono:
Esempio JJ.4. La frase
INTEGER N, M(60), VOTI (15,20)
indica al compilatore che N, M, VOTI sono variabili di tipo intero, e le ultime due
sono variabili dimensionate. In particolare M un vettore di 60 elementi e VOTI
una matrice di 15 righe e 20 colonne.
Esempio JJ.5. La frase
REAL L(lO), A(- 5 : 4), U(O : 20), Z(l : 5, 6), W(l, 3,4)
specifica che L, A, U, Z, W sono variabili dimensionate di tipo reale; in particolare
L un vettore di lO - l + l = IO elementi;
A un vettore di 4 - (- 5) + l = lO elementi;
U un vettore di 20 - O+ l = 11 elementi;
Z una matrice di 5 - l + l = 4 righe e 6 - l + l = 6 colonne;
W una variabile a tre dimensioni di ampiezze rispettive:
2 - l + l = l, 3 - l + l = 3 e 4 - l + l = 4.
Osserviamo che L ed A hanno la stessa ampiezza, pur essendo diversi i loro dichia-
ratori di dimensione.
REAL A(lO, Il), V(lO), U(lO)
L'istruzione DIMENSION
Se si vuoI dichiarare che uno o pi nomi sim bolici sono nomi di variabile di-
mensionata si pu usare l'istruzione dichiarativa DIMENSION, la cui forma ge-
nerale :
DIMENSION lista
dove:
DIMENSION la parola chiave che identifica la frase;
lista una lista di dichiaratori di variabile dimensionata.
La presenza di un dichiaratore di variabile dimensionata in una frase DIMENSION
non ha alcun effetto riguardo al tipo della variabile stessa. A tal proposito occorre
osservare che una frase DIMENSION pu precedere o seguire eventuali frasi di
specificazione di tipo in cui compaiano nomi di variabili dimensionate da essa
dichiarate. In ogni caso un dichiaratore di variabile dimensionata non pu compa-
rire in pi frasi dichiarative nella stessa unit di programma.
Esempio 11. 7. L'istruzione
REAL MAT (5, io. O : l)
equivalente a una qualunque delle coppie di istruzioni seguenti:
REAL MAT
DIMENSION MAT(5, IO, O: 2)
DIMENSION MAT(5, IO, O: 2)
REAL MAT
E' invece sbagliata la presenza nella stessa unit di programma delle due istru-
zioni seguenti:
l:
156
REAL MAT(5, lO, O: 2)
DIMENSION MAT (5,10, O: 2)
Va notato che spesso si preferisce evitare l'uso dell'istruzione DIMENSION
e inserire i dichiaratori delle variabili dimensionate in frasi di specificazione di \ I
tipo; si veda a tale proposito quanto stato detto nel cap. 5 circa l'opportunit !
di dichiarare esplicitamente il tipo di tutte le variabili in ogni unit di program-
ma.
11.3. Nomi di elementi di variabile dimensionata
Un elemento di variabile dimensionata identificato da un nome della forma
dove:
v il nome della variabile dimensionata;
n uguale al numero delle dimensioni di v;
e
l
, . . , e
n
sono espressioni intere, dette espressioni indice, che possono conte-
nere a loro volta riferimenti a elementi di variabile dimensionata (anche di v stes-
sa). In F66 le espressioni indice potevano avere soltanto una delle forme seguenti
j * s + k, j * s, s k, s, k
dove j e k sono costanti intere, e s una variabile intera.
Il simbolo (el' ... ,e
n)
detto indice dell'elemento; nel seguito useremo tal-
volta il termine inuice in luogo di espressione indice quando non vi sia ambi-
guit.
Esempio 11.8. Date le variabili dimensionate IPIV, A, Z, W dichiarate con la frase
DIMENSION IPIV (IO), A(5, 6), Z(lO, IO, lO), W(O : lO)
sono sintatticamente corretti i seguenti nomi di elementi:
IPIV (IO)
IPIV (3. J)
IPIV (IPIV(I)
A(I, J)
A(I 2,1)
A(I, IPIV(K
Z(I +2, I + 1,5)
W(K)
W(I+(J-I).N)
157
Sono invece sbagliati i nomi A(I) e IPIV(X): il primo perch contiene una sola
espressione indice mentre A una variabile a due dimensioni, il secondo perch
X un'espressione che non pu essere usata come espressione indice. ( r ',. I "/,. 7 Il
Il nome di un elemento di variabile dimensionata pu essere usato come un
nome di variabile ordinaria in una espressione. nella lista di una frase di ingres-
so/uscita, e in una frase di assegnazione alla sinistra del segno =. Occorre co-
munque tener presente che, al momento dell'esecuzione dell'istruzione in cui
esso compare, il valore di ogni espressione indice deve essere compreso fra la
limitazione inferiore e la limitazione superiore della dimensione corrispondente.
Cos nell'esempio 11.8, i riferimenti a W(K) ed A(I, J) sono corretti soltanto
se O K lO, l I 5 e I J 6.
Esempio 11.9. Date le variabili IND e A dichiarate con la frase
INTEGER IND (5), A(O : 5,6)
supponiamo di eseguire le seguenti istruzioni
DO 15 1=1,5
IND (I) = I +1
PRINT., A(lND(I), I - l)
15 CONTINUE
Mentre la prima istruzione del rango del DO viene sempre eseguita correttamente,
la seconda provoca una situazione di errore per I = l e 1= 5. Infatti per I = l la
seconda espressione indice I - l, assume il valore zero che non compreso fra le
limitazioni inferiore e superiore della seconda dimensione di A. Analogamente,
per I = 5 la prima espressione indice IND(I) ha il valore non consentito 6.
Esempio 11.10. Si vuole scrivere un programma che, dati n >O e v, permetta di
calcolare u
k
= k(k + l) u
k
_ l' per k = l, ..., n con U
o
= v. Si vuole inoltre cal-
colare e stampare la somma dei valori u
k
con k dispari e quella dei valori u
k
con
k pari (cfr. esempio 11.1).
Per poter specificare l'ampiezza della variabile dimensionata U i cui elementi
contengono i valori u
o
' ul' ... , un occorre fissare una limitazione superiore per n.
Il seguente programma, SOMUKV, risolve il problema per n 50.
158
159
TBAMB contiene il numero di bambini, maschi e femmine. nati negli anni dal
1980 al 1985.
Nel programma ora scritto evidente l'utilit di poter usare per la matrice
TOT indici di riga e di colonna variabili rispettivamente fra O e I e fra 1980 e
1985. Se infatti avessimo usato il dichiaratore, consentito anche in F66,
TOT (2, 6)
PARAMETER (LINF = 1980, LSUP = 1985)
INTEGER TOT (0:1, LINF : LSUP), SEX, ANNO, NOK, TBAMB
READ -. N
C AZZERAMENTO DEI TOTALI
NOK=O
TBAMB =0
DO 100 ANNO = LINF, LSUP
DO 100 SEX = 0,1
TOT (SEX, ANNO) = O
100 CONTINUE
C CICLO: SI LEGGE UNA COPPIA DI DATI PER VOLTA.
C SE NON E' VALIDA SI PROCEDE ALLA
C LETTURA SUCCESSIVA,
C ALTRIMENTI SI AGGIORNA NOK, E EVENTUALMENTE,
C TBAMB E TOT (SEX, ANNO)
DO 200 I = l, N
READ -. SEX, ANNO
IF (SEX.NE.O.AND.SEX.NE.l) GOTO 200
NOK= NOK + l
IF (ANNO.LT.LINF.OR.ANNO.GT.LSUP) GOTO 200
TBAMB = TBAMB + l
TOT (SEX, ANNO) = TOT (SEX, ANNO) + l
200 CONTINUE
C STAMPA DEI TOTALI
PRINT ., 'NUMERO DI COPPIE VALIDE:'. NOK
IF (NQ!<..NE.O) THEN
PRINT., 'TOTALE BAMBINI NATI FRA IL', LSUP,':', TBAMB
PRINT ., ..... MASCHI .....
DO 300 ANNO = L1NF, LSUP
PRINT -. ANNO', ANNO, ':', TOT (O, ANNO)
300 CONTINUE
PRINT ., ' .... FEMMINE .....
DO 400 ANNO = L1NF, LSUP
PRINT ., ANNO', ANNO, ': TOT (l, ANNO)
400 CONTINUE
ELSE
ENDIF
STOP
END
Osserviamo che per evitare riferimenti a elementi U(K) con K > 50 si inserito
nel programma un controllo sul dato in ingresso N; se N > 50 il programma ter-
mina subito con un messaggio di avvertimento.
PROGRAM SOMUKV
PARAMETER (NMAX = 50)
DlMENSION U(O : NMAX)
READ., N, V
IF (N.GT.NMAX) GOTO 50
C CALCOLO DI U(K), K = O, l, ... , N
U(O) = V
DO 25 K = l, N
U(K) = U(K - l) K (K + l)
CONTINUE
CALCOLO DELLA SOMMA DEGLI U(K), CON K DISPARI
SD=O.
0035K= I,N,2
SD = SD + U(K)
CONTINUE
CALCOLO DELLA SOMMA DEGLI U(K), CON K PARI
SP= O.
00 45 K = O, N, 2
SP = SP + U(K)
45 CONTINUE
C STAMPA DEI RISULTATI
PRINT ., 'SD =', SD, 'SP =', SP
STOP
50 CONTINUE
PRINT., 'N DATO TROPPO GRANDE: NMAX =', NMAX
STOP
END
Esempio 11.11. Si vuoI sapere quanti bambini sono nati negli anni dal 1980 al
1985 in una comunit costituita da N persone; si vuole inoltre costruire una ta-
bella da cui risulti quanti fra i bambini suddetti sono maschi e quanti femmine.
Il programma seguente risolve il problema. A tale scopo si legge, per ogni per-
sona appartenente alla comunit, una coppia di dati costituita da: sesso (codi-
ficato come O se maschio e l se femmina) ed anno di nascita. I totali desiderati
vengono memorizzati nella matrice TOT di due righe, una per ogni sesso, e sei co-
lonne, una per ogni anno dal 1980 al 1985: gli indici di riga possono assumere i va-
lori O e l, e gli indici di colonna variano fra 1980 e 1985. Osserviamo che, per ga-
rantire la corretta esecuzione del programma, si controlla ogni coppia di dati che
viene letta: una coppia non considerata valida se il suo primo elemento non
zero oppure uno. Al termine dell'esecuzione del ciclo controllato dall'istruzione
DO 200 I = l, N la variabile NOK contiene il numero di coppie di dati valide e
25
C
1
35
i ~ i
C
160 161
in cui si mettono in evidenza soltanto il numero di righe e il numero di colonne,
avremmo dovuto far variare gli indici di riga fra 1 e 2 e quelli di colonna fra 1 e 6;
cos, in corrispondenza alla coppia di dati SEX e ANNO avremmo dovuto far
riferimento all'elemento
TOT (SEX + 1, ANNO - LINF + 1)
anzich, come si fatto, all'elemento
Esempio 11.12. Siano dati i vettori di ampiezza s = IO
INTEGER LISTA uo), COPIA (- 5 : 4)
11 primo elemento di LISTA LISTA (1), il secondo LISTA (2), e cos via
fino al decimo che LISTA (l O); invece, nel vettore COPIA la prima posizione
spetta all'elemento COPIA (- 5), la seconda a COPIA (- 4), e la decima e ultima
a COPIA (4).
TOT (SEX, ANNO).
\J [> I I \/1 I vi 1'/" ( / i '
IlA. Disposizione in memoria degli elementi di una variabile dimensionata
Ad ogni elemento di una variabile dimensionata di ampiezza s corrisponde un
numero fra l ed s che rappresenta la sua posizione in memoria all'interno del-
l'insieme di locazioni consecutive identificato dal nome della variabile. La posi-
zione di un elemento dipende dal numero di dimensioni della variabile, dai valori
delle espressioni indice e dai dichiaratori di dimensione, secondo lo schema ri-
portato in fig. Il.1, dove il simbolo i" indica il valore della k-esima espressione
indice e".
Dalla fig. Il.1 si deduce anche che sono memorizzate per colonne,
in quanto in memoria tutti gli elementi ordinati per valorr
crescenti dell'indice di riga, precedono gli elementi della seconda colonna, ordinati
allo stesso modo, e cos fino all'ultima colonna.
In generale, gli elementi di una variabile di n dimensioni sono ordinati nel modo
seguente: l'n-esimo indice In varia da inf
n
a sUPn; per ogni varore di in l'indice
i
n_ 1
varia da inf
n_ 1
a sUPn_l; per ogni coppia di valori di in e i
n_ 1
l'indice
i
n- 2
varia da inf
n_ 2
a sUPn_2; cos via fino a il che varia da inf
l
a sUPI per ogni
insieme di valori di in' in_I' ..., i
2
.
Esempio 11.13. Le matrici A e 8 dichiarate con la frase
Figura Il.1. Ordinamento degli elementi di variabile dimensionata.
DlMENSION H(2, 2, 2)
DIMENSION A(2, 3), 8(3,2)
hanno ambedue ampiezza 6. A ha due righe e tre colonne e i suoi elementi sono
ordinati nel modo descritto in fig. I l. 2; 8 ha tre righe e due colonne ed memo-
rizzata per colonne come si vede in fig. Il.2.
L'ordinamento degli elementi della variabile dichiarata da
infine descritto in fig. 11.3, da CUI si vede che tutti gli elementi il cui terzo
indice i
3
vale 1 precedono tutti quelli per i quali i
3
vale 2, ossia che H rnemo-
rizzata per piani.
In fig. IlA si visualizza tramite le frecce l'ordine in cui sono memorizza ti gli
elementi di A, 8 e H; in questa figura si evidenzia la memorizzazione per colonne
di A e 8 e per piani di H.
Lo schema riportato in fig. Il.1 valido per n 3 anche in F66. A questo pro-
posito osserviamo che secondo tale versione del FORTRAN consentito che il
valore di una espressione indice nel nome di un elemento di variabile dimensionata
superi la limitazione superiore della corrispondente dimensione, purch la posizio-
ne dell'elemento, calcolata secondo lo schema di fig. Il.1 ,non superi l'ampiezza
totale della variabile; cos, per esempio, se le dimensioni della matrice MAT sono
specificate dalla frase
posizione
l +(il - inf
l)
l + (il - inf
l)
+ (i
2
- inf
2)
* SI
l + (il - inf
l)
+ (i
2
- inf
2)
* SI +
+ (i
3
- inf
3
) * SI * s2
l + (il - inf
l)
+ (i
2
- inf
2)
* SI +
+(i
3
- inf
3
) * SI * s2 +...
... + (in - infn) * SI * s2 * ... * sn- I
-,
I
I
I
I
I
I
I
:
elemento
v (il)
v (il' i
2)
v (il' i
2
, i
3
)
dichiaratore di
variabiledimensionata
v (di)
v (di' d
2)
v (di' d
2,
d
3)
Dalla figura si deduce, in particolare, che gli elementi di un vettore sono dispo-
sti in memoria nell'ordine crescente degli indici. . - - ------ - '
I
",
162
Figura Il.3. Memorizzazione conseguente alla frase DIMENSION H(2 ,2,2).
PROGRAM POLX
CALCOLO DEL VALORE DI UNPOLINOMIO DI GRADO N.LE.lO
PARAMETER (NMAX = lO)
DIMENSION A(O: NMAX)
LETTURA DI N
READ *, N
IF (N.LE.NMAX) THEN
LETTURA DEI COEFFICIENTI E DI X
DO IO 1= O,N
READ -. A(I)
CONTINUE
READ -. X
CALCOLO ESTAMPA DEL VALORE DEL POLINOMIO
POL = A(N)
D020 I=N-I,O,-I
POL = POL * X + A(I)
CONTINUE
PRINT -. 'X =', X, 'POL(X) =', POL
ELSE
IL VALORE DI N E' TROPPO GRANDE
L'ESECUZIONE TERMINA CON LA STAMPA DI UNMESSAGGIO
PRINT *, 'N TROPPO GRANDE. NMAX=', NMAX
ENDIF
STOP
END
lO
20
n
p (x) = \"' a. xi
n L 1
i=O
per un assegnato valore ai x.
Il seguente programma si basa sull'identit
Pn(x) = (anx + an_l) x + an_z)x + ... + al) x + a
o
'
coefficienti del polinomio a
o'
... , a
n
sono memorizzati nel vettore A, mentre
il valore richiesto memorizzato nella variabile POL.
163
dei programmi. In assenza di controlli, una tale situazione non viene segnalata nel
momento in CUI si verifica e pu condurre ad un risultato sbagliato o alla conclu-
sione forzata dell'esecuzione del programma. Cos, data la matrice MAT sopra
specificata, per effetto del riferimento a MAT (6,5) si andrebbe ad operare sulla
ventiseiesima locazione di memoria a partire da quella in cui memorizzato
MAT (I, I), ossia su una locazione che non fa parte della memoria riservata a
MAT.
Nell'esempio seguente, come gi si fatto nell'esempio 10.10, si effettua un
controllo sui dati in ingresso per evitare il riferimento a elementi di un vettore
la cui posizione superi l'ampiezza del vettore stesso.
c
C
Esempio 11.14. Calcolo del valore di un polinomio di grado n IO a coefficienti
reali
C
C
C
C
6 5 4 3 2
I
A(l,I) A(2,1) A(l,2) A(2,2) A(l,3) A(2,3)
B(l,l ) B(2,1) B(3,1) B(l,2) B(2,2) B(3,2)
Elemento
Posizione
Elemento
B(l,I) B(I,2)
A(l ,2/ A(l ,3)
BJ0J2l
t t t
A(2,1) A(2,2) A(2,3) B(3,1) B(3,2)
D1MENSIONA(2, 3) D1MENSIONB(3,2)

H(l,2,2)
t
H(2,1,2) H(2,2,2)
H(l,I,I) H(l,2,1)
-:
H(2,1,I) H(2,2,IV
D1MENSIONH(2,2,2)
Elemento
Posizione
Figura 11.2. Memorizzazione conseguente alla frase DIMENSION A(2,3), B(3,2).
INTEGER MAT (5, 5)
Figura Il.4. Memorizzazione delle variabili dimensionate A, B, H.
un riferimento all'elemento MAT (6, I) sbagliato in F77, ma non in F66
in quanto la sua posizione 6 < 25; il nome di elemento MAT (6,5) invece
sbagliato anche in F66, in quanto ad esso corrisponderebbe la posizione 26 > 25.
Si noti che, nella pratica, un controllo diretto ad evitare che in fase di esecu-
zione si verifichino situazioni non consentite del tipo ora esemplificato, comporta
u.n costo molto elevato in termini di tempo-macchina; per questo motivo la mag-
gior parte dei compilatori lo attiva soltanto dietro esplicita richiesta del program-
matore. Di solito buona regola far attivare il controllo in fase di messa a punto
I
'I
\
.\
\
I
\ !
l
Li
".I!
;1
l
1M 165
Esempio 11.17. Il seguente programma Hl O calcola e stampa gli elementi di una
matrice reale H quadrata di ordine lO; gli elementi hi,j con i, j = l, ..., n sono
definiti da:
Dagli esempi ora svolti evidente che l'utilizzo del nome di una variabile di-
n2ensiolta senza indici in una frase di lettura obbliga a fornire i dati nell'ordine
in cui gli elementi sono disposti in memoria; analogamente, se lo si usa in una
frase di uscita, l'ordine in cui i contenuti degli elementi verranno stampati quello
In molte situazioni utile poter stabilire un ordine
diverso di ingresso o di uscita dei dati; nel cap. 13 si descriveranno tutte le possi-
bilit previste in F77 per il trattamento delle variabili dimensionate nelle opera-
zioni di ingresso/uscita.
Consideriamo ora alcuni esempi di programmi che utilizzano variabili dimensionate.
11.5. Esempi di utilizzazione delle variabili dimensionate
Volendo scrivere dei programmi in cui si usano variabili dimensionate si pone il
problema di come poterle leggere e/o stampare. Nei paragrafi precedenti si visto
che una lista di ingresso/uscita pu contenere nomi di elementi di variabili di-
! mensionate; d'altra parte in FORTRAN consentito usare in una lista di ingres- I
1, J so/uscita il nome di una variabile dimensionata al posto della lista esplicita dei IN
l nomi di tutti i suoi elementi nell'ordine in cui figurano in memoria. j
Esempio 11.15. Dato il vettore
INTEGER V(7)
l'istruzione
PRINT ., V
significa che si devono stampare i contenuti Gei 7 elementi di V nell'ordine in
cui compaiono in memoria; in altri termini essa equivale a
PRINT., V(l), V(2), V(3), V(4), V(5), V(6), V(7)
h . -
l,j
i + j
i,j = l, ..., n.
Analogamente, si equivalgono le due trasi seguenti:
READ., V
READ -, V(l), V(2), V(3), V(4), V(5), V(6), V(7)
Esempio 11.16. Data la matrice
INTEGER A(2, 3)
l'istruzione
READ., A
indica che si devono leggere 6 dati interi e che il primo verr memonzzato in
A(l, l), il secondo in A(2, 1), e cos via (cfr. fig. 11.2); la frase quindi equiva-
lente a
READ., A(l,l), A(2,1), A(l,2), A(2,2), A(l,3), A(2,3)
L'istruzione
READ., A(l,1), A(l,2), A(l,3), A(2,1), A(2,2), A(2,3)
indica invece che si devono leggere tutti gli elementi di A, ma per righe anzich
per colonne. e non quindi equivalente alle due precedenti.
Supponendo ad esempio di voler leggere e memorizzare in A la matrice
2
5
le prime due istruzioni di lettura impongono di fornire i dati nell'ordine
l 4 2 5 3 6,
mentre la terza impone l'ordine seguente
l 2 3 4 5 6.
PROGRAM HlO
DlMENSION H(lO, lO)
DO lO J = l, lO
DOlO 1=1,10
H(I, J) = 1./ (I + J)
PRINT*, H(I, J)
lO CONTINUE
STOP
END
Consideriamo ora il seguente programma HN:
PROGRAM HN
PARAMETER(NM = lO)
DIMENSION H(NM, NM)
READ -. N
DOlO J=I,N
DO lO I = l, N
H(I, J) = 1./ (I + J)
PRINT *, H(I, J)
lO CONTINUE
STOP
END
Se in ingresso N = IO, il programma HN calcola gli stessi valori di HlU, men-
tre se in ingresso N < lO, tale programma assegna un valore soltanto ad
alcuni degli elementi della variabile H la cui ampiezza uguale a 100.
Cos, se N = 5, viene definito il contenuto degli elementi corrispondenti alle
posizioni da l a 5, da 11 a 15, da 21 a 25, da 31 a 35, da 41 a 45, mentre non
viene assegnato alcun valore a tutti gli altri elementi.

167
10
Zj = L ai,j yj i = l, ... , lO
j=l
Si osservi che le operazioni di ingresso/uscita in ORDVET riguardano un sot-
toinsieme dei 20 elementi di X, e non si quindi potuto usare la frase READ -. X
oppure PRINT *. X.
e DO lO 1 = 1,8 0010 1=1,8
Esempio Il.19. Data una matrice quadrata A di ordine lO ed un vettore y di IO
elementi, il seguente programma PRaD l O calcola e stampa il vettore prodotto
z = Ay; gli elementi di z sono definiti da
PROGRAM PRODIO
REAL A(IO, IO), Y(IO), Z(IO)
C LETTURA DELLA MATRICE (PER COLONNE) E DEL VETTORE Y
READ *, A
READ -. Y
C CALCOLO DEL VETTORE PRODOTTO Z
DOlO 1=1,10
Z(I) = O.
DOlO J=I,10
Z(I) = Z(I) +A(I, J) * Y(J)
lO CONTINUE
C STAMPA DEI DATI E DEI RISULTATI
PRINT *, 'MATRICE DATA, PER COLONNE'
PRINT *, A
PRINT *, 'vETTORE DATO v'
PRINT -. Y
PRINT *, 'VETTORE PRODOTTO'
PRINT *, Z
STOP
END
dove ai,j sono gli elementi di A e Y
j
quelli di y.
Osserviamo che in questo caso la dimensione del problema, ossia la dimensione
dei vettori e delle matrici interessate, fissata a priori e non costituisce un dato.
Ci consente di usare i nomi delle variabili dimensionate, senza indici, nelle frasi
di ingresso/uscita.
E' interessante notare che PRaDl O pu essere usato soltanto per problemi di
dimensione n = IO; se si vuole utilizzarlo, ad esempio, per n = 8, si deve sosti-
tuire la costante 8 alla costante lO nella frase REAL e sostituire le frasi
00101=1,10 e 0010 1=1.10
rispettivamente con le frasi
Esempio Il.18. L'algoritmo seguente permette di ordinare in senso crescente n
numeri reali dati Xl'' X
n
'
1. Leggi: n, xl' X
2'
, x
n
2. Scrivi: xl' X
2'
, x
n
3. Per i = I. ..., n - I
3.1. Poni min = i
3.2.Perj=i+ l, ...,n
3.2.1. Se x
j
< x
min
: poni min = j e vai a 3.2.2;
altrimenti: vai a 3.2.2;
3.2.2. Continua il ciclo controllato da j
3.3. Se min > i: scambia x
min
con xi e vai a 3.4
altrimenti: vai a 3.4
3.4. Continua il ciclo controllato da i
4. Scrivi: xl' X
2'
... , x
n
5. Stop
Supponendo n 20, l'algoritmo viene realizzato dal seguente programma:
PROGRAM ORDVET
D1MENSION X(20)
C LETTURA DEI DATI. SI SUPPONE N.LE.20
READ *, N
DOlO 1=I,N
READ *, X(I)
IO CONTINUE
PRINT -. 'VETTORE DATO'
DOl5 I=I,N
PRINT *, X(I)
15 CONTINUE
C RIORDINAMENTO DEGLI ELEMENTI DI X
DO 50 I = l, N - I
MIN=I
DO 45 J = I + I, N
IF (X(J).LT.X(MIN)) MIN = J
4S CONTINUE
IF (MIN.GT.I) THEN
TEMP = X(MIN)
X(MIN) = X(I)
X(I) = TEMP
ELSE
ENDIF
50 CONTINUE
C STAMPA DEL VETTORE RIORDINATO
PRINT -. 'vETTORE RIORDINATU
D055 I=I,N
PRINT *, X(I)
55 CONTINUE
STOP
END
166
168
Esempio Il.20. Si vogliono calcolare le seguenti medie relative ai voti riportati
in 8 materie dai 60 alunni afferenti a tre classi di 20 alunni ciascuna:
1) la media dei voti riportati da ciascun alunno in ognuna delle tre classi;
2) la media dei voti per ciascuna materia in ognuna delle tre classi.
Tutti i dati possono essere contenuti in una variabile a tre dimensioni, di nome
V, in cui l'elemento vi,i,kindica il voto riportato nella j-esima materia dall'i-esimo
alunno della k-esirna classe; cos gli indici di riga possono variare da l a 20,
quelli di colonna da 1 a 8, quelli di piano da l a 3.
I risultati dei calcoli sono contenuti in due matrici, MEDAL e MEDMAT: la
prima, di 20 righe e 3 colonne, contiene le medie relative al punto 1); la seconda,
di 8 righe e 3 colonne, contiene quelle relative al punto 2).
PROGRAM MEDIE
C CALCOLO DELLEMEDIE PER ALUNNI E PER MATERIE
PARAMETER (NALUN= 20, NMAT = 8, NCLAS = 3)
INTEGER V (NALUN, NMAT, NCLAS)
REAL MEDAL (NALUN, NCLAS)
REAL MEDMAT (NMAT, NCLAS)
C LETTURADEI DATI, PER CLASSE, PER MATERIA, PER ALUNNO
READ-. V
C CALCOLO DELLEMEDIE RICHIESTE PER OGNI CLASSE
DO 35, K = l, NCLAS 3
C CALCOLO DELLEMEDIEDEGLI ALUNNI DELLAK-ESIMA CLASSE
DO lO, I = l, NALUN
MEDAL (I, K) = O.
DO S, J=I,NMAT
MEDAL (I, K) = MEDAL (I, K) + V(I, J, K)
CONTINUE
MEDAL (I, K) = MEDAL (I, K)/ NMAT
lO CONTINUE
C CALCOLO DELLEMEDIERELATIVEADOGNI MATERIA
C NELLAK-ESIMA CLASSE
DO 20, J = l, NMAT
MEDMAT (J, K) = O.
DO 15, I=I,NALUN
MEDMAT (J, K) = MEDMAT (J, K) + V(I, J, K)
15 CONTINUE
MEDMAT (J, K) = MEDMAT (J, K)/ NALUN
CONTINUE
30 CONTINUE
C STAMPA DELLEMEDIE PERCLASSE, PER ALUNNO
PRINT *, MEDAL
C STAMPA DELLEMEDIE PERCLASSE,PER MATERIA
PRINT *. MEDMAT
STOP
END
Si osservi che la frase READ *, V prevede la lettura dei 480 dati nel seguente
ordine: per ogni classe si devono fornire i voti riportati da tutti gli studenti nella
169
prima materia, poi i voti riportati da tutti nella seconda materia, e cos via. Se i
dati non fossero disponibili in questo ordine si sarebbe costretti a riordinarli nel
modo imposto dal programma.
Esempio Il.21. Dati due vettori x, y di elementi xl' ... ,x
n
e Yl' ... 'Y
n
rispet-
tivamente, si vuole calcolare il prodotto scalare p, definito da
In [14] dimostrato che l'accumulo degli errori di arrotondamento nel cal-
colo del prodotto scalare in precisione finita pu essere notevole per alcune
scelte di x e Y e che pu essere ridotto se si ha modo di eseguire le operazioni
con una precisione maggiore di quella in cui sono memorizzati i dati. Nel pro-
gramma seguente si calcola il prodotto scalare P in doppia precisione, mentre i
dati X e Y sono in precisione semplice. Si utilizza inoltre una variabile ausiliaria
D per poter eseguire tutte le operazioni in doppia precisione.
PARAMETER (N = lO)
REAL X(N), Y(N)
DOUBLE PRECISION D, P
READ*,X,Y
P = O.DO
DO 25 I = I, N
D = X(I)
p =P +D * Y(I)
25 CONTINUE
PRINT -. 'VETTORE Xv:', X
PRINT *, 'VETTORE Yv .; Y
PRINT *, 'PRODOTTOSCALAREv:', P
STOP
END
Esempio Il.22. Data una matrice quadrata A, di ordine n, si vogliono calcolare
prodotti scalari p(j, k) fra la colonna j-esima e la colonna k-esima, definiti da
n
p( j, k) = '\' a . a k
L l,) l,
i= 1
per j = l, ... , n - l e k = j + 1, ... ,n. Si vuole inoltre interrompere il
calcolo appena si trova una coppia di valori (j ,k) per cui Ip(j, k) I> E, dove
E>O una costante assegnata. In questo caso l'esecuzione termina con la stampa
dei valori di j, k e p(j, k). Se invece tutti i valori calcolati p(j, k ) sono in valore
assoluto minori o uguali di E. l'esecuzione termina con la stampa di un messaggio
che segnala tale situazione.
T
171
scrivi: tutti i prodotti p sono "piccoli
l ' ',' , I
DlMENSION VETT (O : 8)
DlMENSION APICE (8 : O)
REAL REC, REM (20,20)
DlMENSION REC, REM (20, 20)
INTEGER MAT (5., 3,2) r (
DlMENSION ALFA (- 5, 2) /0C
DlMENSION ALFA (- 5 : 2)
Il.5 Con riferimento alle variabili dimensionate dell'esercizio precedente, indi-
care quali fra i seguenti nomi di elementi sono sbagliati:
BETA (2,3,4) GAMMA (2) DELTA (2) ALFA (2,3,4) ALFA (1,1)
EPSIL(3,4) ZETA (23,1) DELTA (O) ETA (2,3,4) ETA (2,33)
11.2 Scrivere opportune dichiarazioni per le variabili dimensionate qui di seguito
descritte:
a) la matrice intera DAMA, di 12 righe e 12 colonne, con indici maggiori o
uguali di l;
b) la matrice intera DAMB, di 12 righe e 12 colonne, con indici maggiori o
uguali di - 6;
c) la matrice complessa COMP, con indici di riga variabili fra - 5 e 5 e indici
di colonna fra - 3 e 3;
d) la variabile TRIANG, di tipo doppia precisione, di 3 righe, 5 colonne
e 4 piani, e indici non negativi;
e) il vettore intero STATUS, con indici variabili fra - n e n, con n = 20.
11.3 Scrivere i dichiaratori di opportune variabili dimensionate atte alla memo-
rizzazione dei seguenti insiemi di dati:
a) le temperature minima e massima rilevate in 20 stazioni metereologiche il
19 ottobre 1986;
b) le temperature minima e massima rilevate in 20 stazioni metereologiche
nei giorni dal 20 al 26 ottobre 1986;
c) i valori che la funzione f(x) = cosx assume nei punti x
j
= j ;- , per j = l,
.. , ,n;
d) i valori che la funzione f(x, y) = x
2
+ cos (xy) assume nei punti
(xi' Yk) =(j ; , k ;) con j, k = O, I, ... , n.
11.4 Indicare l'ampiezza delle seguenti variabili dimensionate:
REAL ALFA (2:3,4), BETA (2,3,4), GAMMA (2,3:4), DELTA (234)
DOUBLE PRECISION EPSIL(2:3,4), ZETA(23,4), ETA (2,34).
Esercizi
Il.1 Individuare quali fra le seguenti frasi dichiarative sono sbagliate e spiegarne
il motivo:
per j = \, ... , n - I
Figura 11.5. Diagramma di flusso relativo all'esempio 11.22.
Il programma PROD che segue risolve il problema per n. l O, realizzando il
diagramma di fig. 11.5. Si osservi che in PROD si utilizzano due variahili ausi-
liarie, D e DP, in doppia precisione per poter effettuare i calcoli con una pre-
cisione maggiore di quella in cui sono memorizzati i dati e i risultati. Si osservi
inoltre che nel programma non si memorizzano tutti i valori p(j, k), bensi si usa
una variahile non dimensionata P per memorizzarli temporaneamente via via che
vengono calcolati.
PROGRAM PROD
REAL A(IO, IO). P, EPS
DOUBLE PRECISION D, DP
READ -. N. EPS
DOl5 1=I,N
D015 J=I,N
READ -, A(I, J)
15 CONTINUE
DO I 50 J = I, N - I
D0140 K=J+I,N
DP = O.DO
00120 1=I,N
D = A(I,J)
DP = DP + D * A(I, K)
120 CONTINUE
P= DP
IF (ABS(P).LE.EPS) GOTO 140
PRINT -. J, K, P
STOP
140 CONTINUE
150 CONTINUE
PRINT -, 'P(1, K).LE.', EPS, 'PER OGNI (1, K)'
STOP
END
170
j!
i
!
l
'I
, "
12
Elaborazione delle informazioni
di tipo carattere
DELTA (1)
ZETA (3 ** I, I)
DELTA (J + 1** 2)
GAMMA (I, (I + 1)/3)
fra i seguenti nomi sono sbagliati e
BETA (2,3, 1/1) GAMMA (2, 1 - 7)
ZETA (I, 3 ** I)
ALFA (ABS(I- 5), 1/3)
ETA (I, 1 -I)
Se 1= 2, 1 = IO, X = 3.14159, quali
perch?
ALFA (1,1)
EPSIL (I, l/X)
ETA (lNT(X), 34)
ETA (J - I, I)
172
Il.6 Sono dati il vettore intero M e la matrice reale A dichiarati da
DIMENSION M(10), A( 10, lO)
Supponendo che il contenuto di M sia definito dalla sequenza di istruzioni
DOI3I=I,1O
M(I) = 2 * I - I
13 CONTINUE
indicare la posizione corrispondente ai seguenti elementi:
M(5), M(M(l)), M(M(2)), M(l + M(5), M(lO), I
A(l, lO), A(lO, l), A(M(5), M(4), A(M(7)/3, lO), A(M(2) ** 2, I).
Nei capitoli precedenti si pi volte accennato al fatto che un calcolatore pu
elaborare insieme alle informazioni di tipo logico o numerico anche informazioni
di tipo carattere ovvero informazioni quali le lettere dell'alfabeto, le parole di
un testo, i segni di interpunzione, etc. Negli ultimi anni, la manipolazione ed
elaborazione di informazioni di tipo carattere (word processing) ha notevol-
mente allargato le possibilit di applicazione degli elaboratori assumendo una
importanza sempre crescente che si manifesta anche nelle nuove possibilit di
gestione dei caratteri offerte dall'ultima versione standard del FORTRAN.
11.7 Scrivere un programma che permetta di definire gli elementi di una matrice
reale A di 5 righe e 7 colonne e di calcolare e stampare il massimo fra i valori
assoluti degli elementi di ciascuna riga. Provare la correttezza del programma
avendo come dato la matrice A i cui elementi a. . sono definiti da
l,l
i;;;:. j
i + j
ai,j =
i + j
i <i
2i + 3j
11.8 Scrivere un programma che permetta di memorizzare in un vettore V le som-
me degli elementi di ciascuna colonna di una matrice reale B di ordine
15. Il programma deve inoltre riordinare in senso decrescente gli ele-
menti di V e stampare il vettore cos ottenuto.
11.9 Scrivere un programma che permetta di leggere per colonne gli elementi di
una matrice A quadrata di ordine n lO e calcolare e stampare le norme
Il A e Il A 111' dove
12.1. Memorizzazione dei caratteri
Le informazioni di tipo carattere vengono memorizzate in unit di memoria
dette unit di memoria carattere ciascuna delle quali in grado di contenere la
codifica binaria di un solo carattere. Le modalit con cui vengono codificati i
caratteri dipendono dal sistema usato che stabilisce anche la lunghezza di ogni
singola unit di memoria carattere. di codifica molto diffuso quello
utilizzando 7 bits per la codifica di un carattere, permette di codifi-
care 127 caratteri distinti. Un altro codice quello EBCDIC che utilizza 8 bits
per la memorizzazione di un singolo carattere. Con il possibile
definire ed utilizzare 256 caratteri diversi. Sia il codice ASCII che quello EBCDIC
sono riportati in appendice A4.
Le unit di memoria carattere sono quindi completamente diverse e netta-
mente distinte da quelle numeriche che, ricordiamo, sono destinate a contenere
informazioni di tipo numerico o logico. Tale distinzione chiaramente sottolinea-
ta dallo standard F77 che definisce dato di tipo carattere una qualunque succes-
sione (stringa) di caratteri codificabili su un elaboratore ed associa ad ogni dato di
tipo carattere la sua lunghezza definita come il numero di caratteri che lo costi-
tuiscono. Un dato di tipo carattere quindi memorizzato in tante unit di memo-
ria carattere contigue quante sono quelle specificate dalla sua lunghezza.
I
174
175
Esempio 12.2. La frase:
CHARACTER * 12 XI, X2, X3 * IO.
CHARACTER * 7 A, B, H * 3, C, D
CHARACfER *I A, B, C
CHARACTER A * I, B * 5, C * I
CHARACTER XY * 4
CHARACTER X * 33. Y * 33
che equivale a
che equivale a
che equivale a
che equivale a
CHARACTER A, B, C
CHARACTER A, B * S, C
CHARACTER * 4 XY
CHARACTER * 33 X. Y
lunghezza di nomi simbolici di costanti (ulteriori utilizzazioni di questo specifi-
catore sono indicate nel cap. 15).
Lo specificatore di lunghezza che segue la parola chiave CHARACTER fissa
la lunghezza per tutte le entit carattere individuate dai nomi simbolici nl' ..., n
r
mentre ogni specificatore di lunghezza che segue un nome sim bolico si riferisce
soltanto alla entit individuata da quel nome. Gli specificatori che fissano lun-
ghezze uguali ad uno possono essere omessi insieme all'asterisco che li precede.
In una frase CHARACTER sempre possibile specificare la lunghezza di una
entit di tipo carattere facendo seguire il corrispondente nome simbolico da
un asterisco e da uno specificatore di lunghezza. In_particolare possibile indicare
una lunghezza diversa da quella fissata dallo specificatore Q che segue la parola
chiave; in questo caso lo specificatore di lunghezza Qfissa la lunghezza per tutte
le entit i cui nomi sim bolici non sono seguiti da un loro specificatore di lunghez-
za che, in generale, diverso da Q.
CHARACfER A * 7, B * 2, C * (3 + 8)
specifica che A, B e C sono entit carattere la cui lunghezza rispettivamente
uguale a 7, 2, II.
Altri esempi di dichiarazione esplicita di tipo carattere sono i seguenti:
Esempio 12.1. La frase dichiarativa di tipo:
CHARACTER * 7 A, B, C
specifica che A, B e C sono entit carattere ciascuna delle quali contiene esatta-
mente 7 caratteri. La frase.
specifica che A, B, C, D sono nomi simbolici di entit carattere la cui lunghezza
uguale a 7 mentre H indica il nome di una stringa di caratteri la cui lunghezza
uguale a 3; analogamente, per dichiarare che le varia bili X I, X2 e X3 sono di ti.
po carattere ed hanno lunghezza rispettivamente uguale a 12, 12, IO si pu usare
la frase:
dove:
CHARACfER la parola chiave che identifica la frase;
n
l
, n
2
, ..., n
r
sono nomi simbolici; . .. .
Q Q ,Q2" .. , Q sono specificatori di lunghezza ciascuno del quali pu essere.
, I r
- una costante intera positiva non preceduta dal segno +;
- una espressione costante intera che deve avere valore positivo e deve essere rac-
chiusa tra parentesi; ..
- un asterisco racchiuso tra parentesi (*) che pu essere usato per specificare la
Variabili carattere
Le variabili di tipo carattere (variabili carattere) vengono indicate mediante un
nome simbolico; il loro tipo deve essere specificato mediante una opportuna frase
dichiarativa nella quale sono indicati sia il nome della variabile che la sua lun-
ghezza.
Dichiarazione esplicita del tipo carattere
Per specificare il tipo e la lunghezza di una entit di tipo carattere possibile
usare una delle seguenti forme della frase dichiarativa CHARACfER:
CHARACTER .. Q "l' "2' ..., n
r
CHARACTER "r " QI' "2 .. Q2' ..., "r .. Qr
12.2. Le costanti e le variabili di tipo carattere
Costanti carattere
Una costante di tipo carattere (costante carattere) scritta in FORTRAN
come una successione di caratteri racchiusa tra apici. Gli apici che racchiudono la
costante non fanno parte di essa e quindi tra i due apici che delimitano una co-
stante carattere deve esserci almeno un carattere che pu essere anche il carat-
tere di spaziatura (blank). Una costante carattere pu essere costituita sia da ca-
ratteri facenti parte dell'alfabeto FORTRAN che da caratteri diversi qual:, ad
. <:;;;. [ l?' . %purch codificati sul sistema di calcolo usato. L apo- esempiO, ,"'-, ".,.,,,
strofo rappresentato da una coppia di apici consecutivi. . .
Indicato con v il carattere di spaziatura sono esempi di costanti carattere I se-
guenti:
'BUONGIORNO' '1987' 'COMEvSTAI?' 'c"ERA' 'vUNv' 'v'.
Si osservi che la costante '1987' rappresenta la successione di quattro caratteri:
I, 9, 8, 7 e non il numero 1987. . .
La l',lghezza di una costante carattere il numero dei tra gli
apici, compresi eventuali caratteri di spaziatura; il doppio apice
'--\-- presentare l'apostrofo conta come un_unico carattere. Cos le sei costanti pnma
rispettivamente lunghezza 10,4, IO, 5, 4, l.
Il
,l
176
Esempio 12.3. Consideriamo la seguente successione di frasi dichiarative:
PARAMETER (LUN = 6, L = 8)
CHARACTER (LUN) VOCE, TIPO, ART. (L)
PARAMETER (ART = 'ARTICOLO').
La prima frase PARAMETER stabilisce il valore degli specificatori di lunghezza
usati nella dichiarativa CHARACfER; la seconda frase PARAMETER assegna in-
vece alla costante carattere' ARTICOLO' il nome simbolico ART. Questa succes-
sione di istruzioni serve allora a specificare che VOCE e TIPO sono due variabili
carattere di lunghezza uguale a 6 mentre ART il nome simbolico della costante
carattere' ARTICOLO' di lunghezza 8.
Come si vede anche da questo esempio quando la frase CHARACfER usata
per dichiarare il tipo di un nome simbolico di costante, il valore di questa costante
deve essere specificato in una frase PARAMETER che segue la dichiarativa
CHARACfER. In questo caso la lunghezza della costante carattere pu essere in-
. dicata mediante lo specificatore (.) che chiameremo specificatore di lunghezza in-
defi.'!!ta; la sua utilizzazione ha l'effetto di specificare,
viduate da nomi simbolici di costante, una lunghezza uguale a quella delle corri-
spondenti costanti che compaiono nella frase PARAMETER. In ogni caso, una
volta fissata, la lunghezza di un nome simbolico di costante carattere non deve
essere pi modificata.
Esempio 12.4. Le frasi:
CHARACTER ( ) SP, CAR
PARAMETER (SP ='SPECIFICAZIONE', CAR = 'CARATTERE')
servono a specificare che SP e CAR sono nomi simbolici di due costanti carattere la
cui lunghezza uguale, rispettivamente, a quella delle costanti 'SPECIFICAZIONE'
e 'CARATIERE' indicate nella dichiarativa PARAMETER. Pertanto SP ha
lunghezza 14 e CAR ha lunghezza 9.
Esempio 12.5. La successione di istruzioni:
PARAMETER (LUN = 6)
CHARACTER (LUN) VOCE, TIPO, ART. (.)
PARAMETER (ART = 'ARTICOLO')
ha lo stesso effetto di quella indicata nell'esempio 12.3. In questo caso la lunghez-
za della costante il cui nome simboli co ART determinata da quella della co-
stante 'ARTICOLO' ed quindi uguale a 8. Se la seconda frase PARAMETER
venisse sostituita da
l
177
PARAMETER (ART = 'ARTICOLOV'DAV' REGALO')
il nome simbolico ART indicherebbe una costante carattere di lunghezza uguale
a 18.
Dichiarazione implicita del tipo carattere
Analogamente a quanto detto per le entit di tipo numerico o logico possi-
bile indicare in un programma FORTRAN che una o pi lettere dell'alfabeto,
se usate come iniziale di un nome simbolico, ne determinano il tipo carattere.
La frase che permette la dichiarazione implicita del tipo carattere ha la forma:
IMPLICIT CHARACfER * {I (al' a
2
, , a
m
)
dove:
IMPLICIT CHARACfER la parola chiave che identifica la frase;
Q uno specificatore di lunghezza diverso da (*);
al' a
2
, ..., a
m
sono singole lettere oppure gruppi di lettere ordinate alfabetica-
mente di cui viene indicata la prima e l'ultima lettera separate da un segno meno.
Nella dichiarazione .tip().!\on quindi dello speci-
ficatore di lunghezza indefinita;)noltre, i nomi il cui tipo implicitamente speci-
ficato dalla frase IMPLICIT CHARACfER indicano stringhe di caratteri che
hanno tutte la stessa lunghezza: quella fissata dallo specificatore Q. Cos, ad esem-
pio, la frase:
IMPLICIT CHARACfER * 16 (A - C)
specifica che i nomi simbolici che iniziano con le lettere A, B, C indicano entit
di tipo carattere di lunghezza 16. Una dichiarazione esplicita di tipo pu modifi-
care il tipo o la lunghezza delle entit i cui nomi hanno una lettera iniziale pre-
vista in una istruzione IMPLICIT CHARACTER.
Esempio 12.6. La successione di istruzioni:
IMPLICIT CHARACTER. 16 (A - C)
REAL ANNA, CARLO
CHARACTER 8 BABBO
ha l'effetto seguente: tutte le variabili i cui nomi hanno come lettera iniziale
A, B oppure C sono considerati di tipo carattere e la loro lunghezza uguale a 16
unit di memoria carattere. Fanno eccezione ANNA e CARLO che indicano
variabili reali e BABBO che indica una variabile carattere di lunghezza 8. Si noti
che la dichiarazione implicita di tipo precede quella esplicita secondo le regole
gi viste nel 5.3.
178 179
Esempio 12. 7.
caratteri. Una sottostringa identificata da un nome la cui forma la seguente:
Esempio 12.11. Sia AI una variabile carattere di lunghezza 5 il cui contenuto
la stringa GAMMA. Indichiamo, accanto ad ogni nome. i caratteri che costitui-
scono alcune sottostringe estratte da A I e le relative lunghezze.
Esempio 12.10. Supponendo che ALFA sia una variabile carattere di lunghezza 8
e BETA sia un vettore carattere di tre componenti di lunghezza 5, il nome simbo-
lico ALFA(2 : 5) indica la sottostringa formata dal secondo, terzo, quarto e quin-
to carattere della stringa di nome ALFA mentre BETA(2)( 1: 3) identifica la
sottostringa costituita dai primi tre caratteri di BETA (2).
dove:
v il nome della variabile carattere o dell'elemento di variabile carattere
dimensionata da cui si estrae la sottostringa;
et, e
2
sono due espressioni intere dette espressioni di sottostringa. II valore di
et specuica la posizione nella variabile v del carattere pi a snustra della sotto-
stringa mentre il valore di e
2
specifica quelIa del carattere pi a destra. I valori di
et ed e
2
devono essere tali che 1 et e
2
Qdove Q la lunghezza di v.
3
I
Lunghezza
5
Contenuto
GAMMA
AM
MA
GAM
A
Sottostringa
Al (:)
A I (2 : 3)
Al (4 :)
A l( : 3)
Al(2:2)
In un nome sim bolico di sottostringa possono essere omesse una o entrambe
le espressioni di sottostringa: l'omissione di et equivale ad e, = l, quella di e
2
equi-
vale ad e
2
=Q; se entrambe le espressioni sono omesse il nome della sottostringa
ha la forma v(:) e la sottostringa coincide con l'intera stringa v.
La lunghezza di una sottostringa data da e
2
- e, + l. Pertanto, se il valore di
e, uguale a quello di e
2
la sottostringa costituita da un unico carattere, quello
che nella stringa v occupa la posizione indicata da et e da e
2
.
Variabili carattere dimensionate
Nel capitolo precedente stata sottolineata l'opportunit di utilizzare variabili
dimensionate che, ricordiamo, possono essere anche di tipo carattere. La frase
dichiarativa CHARACTER pu essere utilizzata per specificare i nomi delle even-
tuali variabili dimensionate, il numero e la lunghezza dei loro elementi.
caso, tutti gli elementi di una variabile carattere dimensionata devono
stessa lunghezza ed pertanto proibito usare variabili carattere dimensionate che
siano costituite da elementi di lunghezza diversa l'uno dalI' altro.
CHARACTER * lO VOCE (5)
Esempio 12.8. La frase:
Esempio 12.9. La successione di istruzioni:
IMPLICIT CHARACTER. 25 (A)
DIMENSION ART(IO)
serve a specificare che le variabili i cui nomi sim bolici iniziano con la lettera A
sono di tipo carattere ed hanno lunghezza 25; inoltre ART un vettore carattere
di lO elementi ciascuno dei quali costituito da 25 caratteri.
specifica che VOCE una variabile dimensionata costituita da cinque elementi
di tipo carattere ciascuno dei quali ha lunghezza uguale alO.
PARAMETER (LUN =3)
IMPLICIT CHARACTER. (LUN + 2) (A - C F, M)
CHARACTER FI (LUN + I), MAM 15
PARAMETER (FI ='CANE', F2 ='GATTO')
La prima frase PARAMETER fissa il nome LUN per la costante 3; la seconda
frase stabilisce che tutti i nomi che iniziano con le lettere A, B, C. F, M si riferi-
scono a quantit carattere di lunghezza uguale a 5; la terza frase specifica che F 1
e MAM, pur essendo sempre di tipo carattere, hanno per una lunghezza diversa
rispetto a quelIa specificata implicitamente: F 1 ha lunghezza 4 e MAM ha lun-
ghezza 15; la quarta frase infine assegna alla costante 'CANE' il nome simbolico
Fl ed alIa costante 'GATTO' il nome simbolico F2. Si osservi che 'CANE' e
'GATTO' sono costituite rispettivamente da 4 e da 5 caratteri.
l
i
I
I
I
I
I
\i
\
I
!
i I
Il
!\
li
I
12.3. Sottostringhe ed espressioni carattere
Sottostringhe
Con il termine sottostringa si indica in F77 una entit di tipo carattere costi-
tuita da un qualunque sottoinsieme di caratteri contigui estratti da una stringa di
Espressioni carattere
Una espressione carattere costituita, nella sua forma pi semplice, da una
delIe seguenti entit carattere: costante, variabile, elemento di variabile dimen-
sionata, sottostringa. Espressioni carattere pi complesse possono essere formare
usando l'operatore concatenazione che viene indicato con il simbolo Il e che
180
181
opera tra due operandi di tipo carattere. Se xl ed x
2
indicano due entit carat-
tere il risultato dell'operazione
una stringa carattere il cui valore quello di xl seguito dal valore di x
2.
Esempio 12.12. Il valore dell' espressione carattere:
'LIN' Il 'GUAGGIO'
la stringa LINGUAGGIO ottenuta congiungendo in un'unica stringa i valori
delle costanti 'LIN' e 'GUAGGIO'. Analogamente l'espressione:
'LINGUAGGIO' Il 'v' Il 'FORTRAN' Il '77'
Esempio 12.14. La successione' di istruzioni:
CHARACTER * 4 VETT(5), A(2, 2)
VETT(l) = 'CANE'
VETT(2) = 'LUPO'
VETT(3) = 'GUFO'
VETT(4) = 'IENA'
VETT(5) = 'TOPO'
DO IO I = 1,2
DO IO J = 1,2
A(I, J) = VETT (2 * J - 2 + I)
lO CONTINUE
specifica la lunghezza ed il contenuto sia delle cinque componenti del vettore
carattere VETT che dei quattro elementi della matrice carattere A.
ha il seguente valore:
LINGUAGGIOvFORTRAN 77.
Esempio 12.15. Sia A I una variabile carattere il cui valore la stringa NUOVO.
L'esecuzione della frase:
A\(4 : 4) = 'T'
Esempio 12.16. Consideriamo la successione di istruzioni:
Dopo l'esecuzione di queste istruzioni V(I), V(l) e V(3) contengono rispettiva-
mente i valori:
sostituisce. il quarte carattere di A I con la lettera T. II contenuto di A l diventa
quindi la stringa NUOTO.
CHARACTER * 6 V(3), Al * LU, AL *
Al = 'ILvGATTOvEvLAvVOLPEv'
A2 = 'ILvGRILLOvPARLANTE'
V(l) = Al(4 : 9)
V(2) = AI(l5 :)
V(3) = A2(4 : 9)
GRILLO VOLPE v GATTO v
v = espressione carattere
12.4. Assegnazione fra stringhe di caratteri
Come stato sottolineato nel cap. 7, la frase di assegnazione pu essere definita
anche tra variabili ed espressioni di tipo carattere. La forma generale della frase
in questo caso:
dove:
v il nome di una variabile carattere, di un elemento di variabile carattere di-
mensionata, di una sottostringa.
L'esecuzione di questa frase implica la valutazione dell'espressione carattere
e la successiva definizione di v il cui valore viene posto uguale a quello dell'espres-
sione se la lunghezza di v uguale a quella del valore dell'espressione carattere.
Esempio 12.13. La successione di istruzioni:
CHARACTER * 7 AN, S
AN = 'CAVALLO'
S=AN
permette di memorizzare l'informazione carattere 'CAVALLO' nelle variabili
AN ed S.
In una frase di assegn...a. zione la variabile v pu avere lunghezza diversa dal
<.
in questo caso la stringa che costituisce il valore "
. dell'espressione viene opportunamente allungata o troncata prima di effet-
tuare l'assegnazione. A questo proposito il FORTRAN specifica che se la lunghez-
di quella del valore dell'espressione, quest'ultimo viene allun-
gato con l'aggiunta, alla sua destra, di tanti caratteri blank quanti ne servono
per uguagliare la lunghezza di v; se la lunghezza di v invece inferiore a quella
del valore dell'espressione carattere, quest'ultimo viene accorciato togliendo, alla
________________-----J..-------- _
182
sua destra, tanti caratteri quanti ne occorrono per uguagliare la lunghezza di v.
r
183
razioni di concatenazione e le frasi di assegnazione tra stringhe di lunghezza
diversa.
Esempio 12.17. Sia A una variabile carattere di lunghezza 6. Indichiamo, accanto
ad alcune frasi di assegnazione, il contenuto di A:
Esempio 12.18. Sia DATO una variabile carattere di lunghezza uguale a 5. Esami-
niamo l'effetto dell'esecuzione sequenziale di alcune frasi di assegnazione.
Frase di assegnazione
A= 'UN'
A = 'VELOCEMENTE'
A = 'PINO'II'LORO'
Frase di assegnazione
DATO = 'FERRO'
DATO (I :4) = 'CORT'
DATO (4:4) = 'V'
DATO (2:2) = 'ERBA'
DATO (4 :) = 'A'
Contenuto di A
UNVvvv
VELOCE
PINOLO
Contenuto di DATU
FERRO
CORTO
CORVO
CERVO
CERAV
Esempio 12.19.
CHARACTER VAR * 8, TAR * IO
VAR = 'AUTO'
TAR = VAR l l 'MOBILE'
La prima frase di assegnazione colloca la stringa AUTO nelle prime quattro
posizioni di VAR il cui contenuto completato da caratteri di spaziatura fino a
raggiungere la lunghezza di 8 caratteri fissata per VAR. Per eseguire la seconda
frase di assegnazione si valuta l'espressione carattere VAR /1 'MOBILE' il cui
valore, AUTOvvvvMOBILE, costituito da 14 caratteri ed quindi troncato
in AUTOvvvvMO prima di essere assegnato come contenuto della variahile
TAR. Un risultato diverso sarebbe stato ottenuto concatenando una sottostringa
di VAR con la costante carattere 'MOBILE' ovvero usando la frase di assegnazione
TAR = VAR (: 4) Il 'MOBILE'.
Le ultime due frasi dell'esempio precedente mettono in evidenza che, al mo-
mento della assegnazione, si applica sempre la regola di aggiustare opportuna-
mente la lunghezza del valore dell'espressione in modo che essa coincida con
quella di v anche quando v una sottostringa.
Si osservi che in una frase di assegnazione tra stringhe di caratteri proibita
qualunque sovrapposizione tra le unit di memoria carattere che costituiscono
v e quelle utilizzate dall'espressione. Pertanto sono sbagliate le frasi seguenti:
DATO (I :4)='LE' Il DATO (2 :8)
DATO = DATO (l : 3) Il VAR
DATO = DATO (: 2) Il DATO (9:)
DATO (3: 5) = DATO (4: 4) Il DATO (l : 3)
in quanto in ognuna di esse la valutazione dell'espressione carattere coinvolge
l'elaborazione di sottostringhe che si sovrappongono con quelle indicate a sinistra
del simholo di assegnazione. Sono invece esempi di frasi corrette i seguenti:
DATO (I :4) = 'LE' Il DATO (5 :8)
DATO (4:) = DATO (: 3)
DATO (3 :5)=DATO(:2)IIDATO(6 :6)
DATO (2 : 2) = DATO (3: 3)
L'esempio seguente serve ad evidenziare quali effetti possano produrre le ope-
L'espressione carattere che compare in questa frase ha infatti come valore la
stringa AUTOMOBILE.
12.5. Lettura e scrittura dei dati di tipo carattere
Le frasi di ingresso/uscita guidate dalla lista introdotte nel cap. 8 possono essere
usate per leggere e scrivere quantit di tipo carattere; altre possibilit per effet-
tuare queste operazioni verranno presentate nel prossimo capitolo. Si ricordi che
le costanti carattere possono far parte di una lista di una frase PRINT* ma non
di una READ* mentre sia la lista di ingresso che quella di uscita possono conte-
nere nomi simbolici di entit carattere.
Esempio 12.20.
CHARACTER * 8 AN I, AN2
READ *, N, M, ANI
AN2 = 'V PECORE v'
PRINT -. 'ClvSONOv', N, AN2, 'vEV', M, ANI
STOP
END
Il significato e l'effetto di queste istruzioni di immediata comprensione e
non necessita di ulteriori spiegazioni, Si deve per osservare che i dati devono
. \
184
essere fomiti in modo opportuno: i primi due dati devono essere costanti intere
e saranno quindi costituiti da una stringa di cifre decimali mentre il dato di
tipo carattere sar costituito da una costante di lunghezza 8 (per esempio
'v MUCCHEv').
Per quanto riguarda l'operazione di lettura guidata dalla lista si deve tenere
presente che essa equivale ad una frase di assegnazione nel senso che permette
di definire il contenuto di una variabile o di una sottostringa di
tanto, se la lunghezza del dato fornito in ingresso non uguale a quella stabilita
per la corrispondente variabile o sottostringa, essa viene automaticamenteaggiu-
stata togliendo caratteri a destra del dato o aggiungendo caratteri di splgia!,:!ra
sempre a destra del dato secondo le modalit viste per le frasi di
Esempio 12.21. Sia VAR una variabile carattere di lunghezza 5 il cui valore viene
definito dalla frase di ingresso
READ *, VAR
Se viene fornito il dato' AUTOMOBILE', il valore di VAR costituito dai primi
cinque caratteri di questa stringa ovvero VAR vale AUTOM; se in ingresso viene
fornita la stringa 'AUTO' il valore di VAR AUTOv.
Nelle operazioni di scrittura guidate dalla lista il numero di caratteri che devono
essere riprodotti in uscita determinato dalla lunghezza della espressione carat-
tere che compare nella lista di uscita: il valore dell'espressione viene interamente
riprodotto sul mezzo di uscita standard.
Esempio 12.22.
CHARACTER TESTO * 3
TESTO ='F77'
DO lO 1= 1,3
PRINT ... , TESTO (I : I)
lO CONTINUE
STOP
END
L'esecuzione di questo programma produce la scrittura dei singoli caratteri
della stringa F77 su righe successive, ovvero:
F
7
7
185
12.6. Confronto tra espressioni carattere
E' possibile utilizzare gli operatori di relazione .GT., .LT., .GE., .LE., .EQ.,
.NE. definiti nel 6.2 per eseguire confronti tra due stringhe di caratteri ovvero
possibile definire ed utilizzare una espressione relazionale carattere il cui valore
vero oppure falso. Cos, ad esempio, supponendo che VOCE e TESTO
siano i nomi simbolici di due variabili carattere entrambe di lunghezza lO, sono
corrette le seguenti istruzioni di controllo che coinvolgono espressioni relaziona-
li carattere:
IF (TESTO.GT.VOCE) TESTO (l: 3) = 'ALB'
IF (TESTO (3: 5).LT.VOCE (3: 5 GOTO lO
IF (TESTO.EQ.' AUTOMOBILE') VOCE = 'DAvCORSA'
IF (VOCE.NE.TESTO (l: 5) Il 'CARTA') VOCE = 'PENNA'
Per capire le modalit secondo le quali viene valutata un'espressione reiazionale
carattere, occorre tener presente che:
l'ordinamento alfabetico delle lettere equivale ad un ordinamento in senso
crescente ovvero:
A<B<C< ... < X<Y<Z
le cifre decimali sono ordinate in senso crescente:
0<1<2< ... <8<9
l'insieme costituito dalle lettere dell'alfabeto e dalle cifre decimali deve essere
ordinato in uno dei modi seguenti:
0< I <2< ... <8<9<A<B< ... <Y<Z
A<B< ... <Y<Z<O< l < ... <8<9
la scelta tra questi due ordinamenti lasciata al singolo sistema di calcolo;
il carattere blank precede sia la lettera A che la cifra zero cio blank < A e
blank < O.
Altri caratteri diversi dalle lettere dell'alfabeto, dalle cifre decimali e dalla
spaziatura costituiscono un insieme il cui ordinamento non viene fissato dal
FORTRAN ma dal sistema di calcolo su cui si lavora. Nel prossimo paragrafo
vedremo come possibile utilizzare mediante opportune funzioni intrinseche,
l'ordinamento dei caratteri del sistema di codifica ASCII e rendere pertanto indi-
pendente dall'elaboratore usato il risultato del confronto tra espressioni carattere.
Il confronto tra due operandi di tipo carattere avviene nel modo seguente:
se i due operandi hanno lunghezza diversa, quello pi corto viene allungato
aggiungendo caratteri blank alla sua destra;
: i
186
187
i due operandi vengono confrontati a partire dal loro carattere iniziale:
maggiore l'operando che ha il carattere iniziale maggiore. Se i caratteri ini-
ziali sono uguali il confronto tra i due operandi procede carattere per carattere
fino a che non si trovano due caratteri diversi: la relazione tra questi due carat-
i teri determina quella tra i due operandi;
\. due operandi sono uguali se sono costituiti da stringhe di caratteri uguali.
Esempio J2.23. Le relazioni tra stringhe di caratteri:
'GIANNI'.GT.' AGUZZI'
'MARIA'.GT.'MACCONI'
'GRAZIA'.GT.'GASPARO'
sono tutte vere. La veridicit della prima espressione determinata dal1a rela-
zione che lega le lettere iniziali dei due operandi, quella del1a seconda dalla
relazione che lega il terzo carattere dei due operandi e quella della terza dal1a
relazione che lega il secondo carattere dei due operandi.
E' ancora vero il risultato del1'espressione:
Esempio J2.25. Si vuoI scrivere un programma che, letta una stringa di 7 carat-
teri alfabetici, permetta di stabilire se la lettera iniziale e quella finale della stringa
precedono M e quante volte compare nella stringa la lettera B.
CHARACTER * 7 VAR
READ*, VAR
IF (VAR(I: 1).LT.'M'.AND.VAR(7: 7).LT.'M') THEN
PRINT -. 'LAVLETTERAvINIZIALEVPRECEDEvM'
PRINT *, 'LAvLEITERAvFINALEvPRECEDEvM:
ELSE
PRINT -. 'LAVLETTERAvINIZIALEVNONvPRECEDEVMvOPPURE'
PRINT *, 'LAvLETTERAvFINALEvNONvPRECEDEvM'
ENDIF
NB=0
DO IO 1=1,7
IF (VAR(I: I).EQ.'B') NB= NB + I
IO CONTINUE
PRINT *, 'LAvLETTERAvBVCOMPARE', NB, 'vVOLTE'
STOP
END
'GENNAIO vI986'.LT.'GENNAlO v1987'
LLT CIvMAGGlOv 1986', 'l vMAGGIO vI987')
12.7. Funzioni intrinseche per la manipolazione dei caratteri
Le funzioni LGE, LGT, LLE, LLT
Nel paragrafo precedente stato osservato che possibile confrontare tra loro
due stringhe di caratteri indipendentemente dal sistema di codifica usato dal sin-
golo elaboratore. II FORTRAN prevede infatti quattro funzioni intrinseche LGE,
LGT, LLE, LLT ciascuna delle quali permette di confrontare due espressioni
carattere secondo l'ordinamento definito nel sistema di codifica ASCII. Queste
quattro funzioni operano su due argomenti ciascuno dei quali costituito da una
espressione carattere di lunghezza arbitraria; il risultato di ciascuna funzione
un valore logico che rappresenta il risultato del confronto tra i due argomenti
eseguito secondo il codice ASCII. Pi precisamente:
Esempio J2.26. II valore dell'espressione:
Cl c
2
cl> c
2
Cl . c
2
Cl < c
2

d risultato vero se
d risultato vero se
d risultato vero se
d risultato vero se
LGE (Cl' c
2
)
LGT (cl' c
2
)
LLE (Cl' c
2
)
LLT (Cl' c
2
)
'I vMAGGlOvI986'.LT.'1 vMAGGIO v1987'
CHARACTER * IO DATO
READ-. DATO
IF(DATO(I :I).EQ.' A'.AND.DATO (IO:IO).EQ.'1') THEN
PRINT *, 'LAvSTRINGAvINIZIAvCONvAvE vTERMINAvCONvl'
ELSE
PRINT -. 'CARATTEREvINIZIALEv', DATO(I:I)
PRINT *, 'CARATTEREvFINALEv', DATO(10:10)
END IF
STOP
END
mentre dipende dal sistema usato il valore dell'espressione:
Esempio J2.24. Si vuoI scrivere un programma che, letta una stringa di IO carat-
teri, permetta di stabilire se essa inizia con la lettera A e termina con la lettera I.
Nel caso in cui questo non sia verificato, il programma deve stampare il carattere
iniziale e quello finale del1a stringa data in ingresso.
Vediamo ora alcuni esempi di programmi che prevedono confronti tra stringhe
di caratteri.
in quanto il FORTRAN non specifica quale sia l'ordinamento tra lettereecifre.
188
falso in quanto nel codice ASCII l'insieme delle cifre decimali precede quello
delle lettere dell'alfabeto e quindi, in particolare, I> l.
La funzione INDEX
La funzione intrinseca INDEX permette di localizzare in una stringa di carat-
teri il punto in cui compare un'altra stringa di caratteri. La funzione lNDEX ha
due argomenti di tipo carattere: il primo, sI' identifica la stringa che deve essere
analizzata, il secondo, s2 ' indica la stringa che deve essere localizzata dentro sI'
II risultato della funzione INDEX (SI' s2) un valore intero che indica la posizio-
ne del carattere iniziale di s2 nella stringa SI' Se s2 compare pi di una volta in
SI il risultato di INDEX (SI' s2) la posizione del carattere iniziale della prima
occorrenza di s2 in SI . Il risultato di INDEX (sI' s2) zero se s2 non compare in
SI oppure se la lunghezza di s2 maggiore di quella di SI'
Pertanto il risultato di:
INDEX ('IL'I7NOME'I7DELLA 'I7ROSA', 'NOME')
4 perch la stringa NOME si trova nella stringa IL '17 NOME '17 DELLA '17 ROSA a
partire dal quarto carattere. Analogamente, 12 il risultato di:
INDEX ('IL'17 NOME '17 DELLA '17 ROSA', 'LA')
189"
PARAMETER (LLIN = 70, LUN= 4)
CHARACTER LINEA* (LLIN), ART * (LUN)
INTEGER POS
NUM=O
READ-. LINEA
ART = ''I7UN'I7'
LOC= l
DO lO I = l, LLIN/LUN
POS= INDEX(LINEA(LOC :), ART)
IF (POS.EQ.O) GOTO 20
LOC= POS+ LUN+ LOC- 1
NUM = NUM + l
PRINT *, ART, 'COMPARE'I7NELLA'I7POSIZIONE'I7', (POS + LOC- l)
lO CONTINUE
20 PRINT *, 'NUMER0'l7D1'170CCORRENZE'I7D1'17', ART, NUM
STOP
END
11 multato dell'espressione lNDEX (LINEA (LOC:), ART) indica la DosizioJ1e
di ART nella sottostringa LINEA (LOC:). Cos quando LOC vale I, POS indica
J;pc;sizione in LINEA-della prima occorrenza di ART. Successivamente il conte-
nuto di LOC viene modificato in modo da analizzare la stringa LINEA a partire
dalla posizione LOC che segue immediatamente quella dell'ultimo carattere di
ART. Supponendo che la stringa memorizzata in LINEA sia:
UNA DONNA VIDE UN GATIO CHE SALTAVA SUL PRATO DA UN RAMO DI UN ALBERO
la successione di valori delle variabili LOC e POS la seguente:
,
I
La funzione ICHAR ha come argomento un'espressione carattere di lunghezza
uno (ovvero un singolo carattere) e d come risultato un valore intero che rappre-
senta la posizione del carattere nel sistema di codifica usato dall'elaboratore. 11
FORTRAN specifica che se un sistema prevede la codifica di n caratteri il risultato
di ICHAR dovr essere un intero compreso tra zero ed (n - I). Evidentemente,
l'argomento di lCHAR deve essere un carattere rappresentabile sul sistema usato.
La funzione CHAR ha come argomento una espressione intera, i, il cui valore
deve essere compreso tra zero ed (n - l) essendo n il numero di caratteri codifi-
cati sull' elaboratore u
Le funzioni ICHAR, CHAR e LEN
mentre zero il risultato di:
INDEX ('IL'17 NOME 'I7DELLA '17 ROSA', 'ROSSA')
INDEX ('NOME', 'IL'17 NOME 'I7DELLA 'I7ROSA')
La funzione INDEX pu essere utilizzala ad esempio per risolvere il problema
di determinare il numero totale di occorrenze di una data stringa in una pi lunga
e, in generale, per determinare il numero di volte che una certa espressione lessi-
cale usata in un testo.
Esempio 12.27. Si vuoi scrivere un programma che permetta di calcolare il nume-
ro di volte che l'articolo indeterminativo UN compare sulla riga di una pagina di
un libro. Si vogliono inoltre individuare le posizioni delle singole occorrenze del-
l'articolo UN nella riga che supporremo composta da 70 caratteri.
Indicata con LINEA la variabile carattere che contiene la riga da esaminare e
con NUM il numero totale di occorrenze della stringa' '17 UN '17' in LINEA, un
programma che permetta di risolvere il problema il seguente:
Valore di
LOC
l
19
53
64
Caratteri analizzati
in LINEA
dal primo al 70-mo
dal 19-mo al 70-mo
dal 53-mo al 70-mo
dal 63-mo al 70-mo
Valore di
POS
15
49
60
O
T
190
191
Il risultato di CHAR (i) il carattere corrispondente alla i-ma posizione nel si-
stema di codifica usato. Evidentemente se I un intero tale che O, I , n - l ed
X un carattere codificato si ha che:
Il FORTRAN prevede per la elaborazione delle informazioni carattere un'altra
funzione intrinseca, LEN(c), il cui risultato la lunghezza dell'espressione carat-
tere che costituisce il suo argomento. L'utilizzazione di questa funzione verr
esemplificata nel cap. 15.
Esempio 12.28. Si vuoi scrivere un programma che permetta di sostituire ad
ogni lettera di una stringa di caratteri quella che la segue nell'alfabeto e lasci inal-
terati i caratteri non alfabetici. La lettera Z deve essere sostituita dalla A.
Per risolvere questo problema si pu usare il seguente algoritmo:
I. Leggi: la stringa
2. ripeti per ogni carattere della stringa:
2.1. se il carattere compreso tra A ed Y
allora: sostituiscilo con la lettera successiva;
altrimenti: se il carattere la lettera Z:
allora: sostituiscilo con la lettera A;
altrimenti: lascia il carattere inalterato
in corrispondenza a ciascuna delle seguenti frasi di assegnazione:
AUGURI = 'BUONvNATALEvEvFELICEvANNOvNUOVO'
AUGURI = 'BUONvI987'
AUGURI = 'TANTIvAUGURlvDIvBUONvCOMPLEANNO'
Indicare il contenuto delle sottostringhe
AUGURI (: 4)
AUGURI (5 : 12)
AUGURI (7 : 12)
AUGURI (16 : 17)
AUGURI (21 : 26)
AUGURI (27 :)
scrivere le frasi di assegnazione che permettono di:
a) assegnare a PRIMO la stringa di caratteri che si ottiene concatenando
i valori dei tre elementi del vettore LISTA:
b) sostituire all'ultimo carattere di PRIMO la lettera W;
c) sostituire il contenuto del primo elemento di LISTA con i primi cinque
caratteri di PRIMO;
d) sostituire il secondo carattere del secondo elemento di LISTA con il nu-
mero 8.
n""" L
Esercizi
12.1 Indicare la lunghezza delle seguen ti costanti carattere:
a) 'LAvVOLPEvARGENTATA'
b) 'COSAv c"E"?' r
c) 'vQUESTA vAUTOMOBILE vE" vVELOCEv ,
d) 'vROSSO, BIANCO. VERDEv I C,
e) 'vvv'
12.2 Supponiamo che un programma contenga la seguente frase di specificazione:
CHARACTER * 31 AUGURI
12.3 Supponendo che un programma contenga la frase
CHARACfER * 5 LISTA (3), PRIMO * 15
12.4 Scrivere un programma che permetta dI copiare in ordine inverso in una va-
riabile carattere B i caratteri di un'altra variabile A, ovvero di sostituire l'ul-
timo carattere di B con il primo di A. il penultimo con il secondo e cos via.
ha lo stesso valore di X
ha lo stesso valore di I
CHAR (lCHAR (X))
ICHAR (CHAR (I)
3. stop.
Nel programma seguente indichiamo con STR la stringa data e con L la sua
lunghezza che supporremo al pi uguale ad 80.
PROGRAM ROTAZ
CHARACTER STR * 80, CAR, S
READ*, L
READ-. STR
DO IO I=I,L
CAR = STR(I : I)
IF (A'.LE.CAR.AND.CAR.LE.'Y') THEN
S = CHAR(lCHAR (CAR) + I)
ELSE IF (CAR.EQ.'Z') THEN
S= 'A'
ELSE
S=CAR
ENDIF
STR (I: I) = S
IO CONTINUE
PRINT *, STR
STOP
END
r
i
I
!
.\
!
!
I
192
12.5 Scrivere un programma che stampi in ordine alfabetico i cognomi di 25
alunni di una classe.
12.6 Scrivere un programma che, data una stringa di 80 caratteri, ne costruisca
un'altra ottenuta dalla prima sopprimendo le spaziature.
12.7 Scrivere un programma che legga N righe di un testo ciascuna delle quali
composta da 80 caratteri e contiene soltanto parole complete. Il program-
ma deve contare il numero di parole contenuto nelle N righe, il numero di
occorrenze della lettera A e di una stringa assegnata STRING.
Supponendo N = 7 e STRING = 'MODELLO', eseguire il programma aven-
do come dato il testo seguente:
Come ben noto la ricerca della soluzione di molti problemi pu essere
spesso cos schematizzata:
- si sostituisce al problema reale un modello matematico che conserva le
caratteristiche essenziali del problema di partenza;
- si sceglie il metodo per risolvere il modello in esame;
- si interpreta la soluzione trovata in termini del problema di partenza per
verificarne la validit.
l
13
Operazioni di ingresso / uscita con formato
13.1. Alcune considerazioni sulle frasi di ingresso/uscita guidate dalla lista
In generale, un'istruzione di ingresso/uscita deve contenere le seguenti indi-
cazioni: la direzione in cui avviene la trasmissione di informazioni, dall'esterno
verso la memoria (ingresso) o dalla memoria verso l'esterno (uscita); il mezzo di
ingresso/uscita da ~ e la lista delle locazioni di memoria interessate alla
trasmissione delle informazioni e le modalit secondo le quali tali informazioni
devono essere rappresentate all'esterno. Cos, ad esempio, nelle frasi di ingres-
so/uscita guidate dalla lista
READ *, A, N
PRINT *, A, N
le parole chiave READ e PRINT indicano il tipo di operazione, 11 mezzo usato non
esplicitamente indicato ed quello standard, la lista A, N indica le locazioni di
memoria di cui si deve trasmettere il contenuto ed infine l'asterisco indica che le
modalit di rappresentazione esterna dei valori trasmessi dipendono dal sistema e
dalla lista (in questo senso va infatti interpretata la denominazione guidate dalla
lista).
Come si accennato nel cap. 8, le frasi READ * e PRINT * sono molto sem-
plici da usare ma poco flessibili perch non consentono di scegliere il modo in
cui i dati devono essere disposti sul mezzo di ingresso/uscita; ci pu implicare,
in un'operazione di lettura, l'impossibilit di usare insiemi di dati gi predisposti
perch questi non possono essere interpretati nel modo desiderato.
Esempio 13.1. Consideriamo il seguente problema. supponendo che l'unit di
ingresso standard sia il lettore di schede. Per ogni dipendente di un'azienda si
ha una scheda gi predisposta su cui sono perforati anno di nascita, nome e co-
gnome, senza alcuna spaziatura fra il primo dato e il nome ma con uno spazio
fra questo e il cognome. Si vogliono leggere le schede una per volta memorizzando
l'anno di nascita in una variabile intera, NASC, ed il nome e cognome in una va-
riabile carattere, NOME, di lunghezza 30. La frase di lettura
194
READ., NASC, NOME
non pu essere usata allo scopo desiderato. Infatti, supponendo ad esempio che
una scheda contenga i dati:
1928FRANCA GENSINI
essa viene cos interpretata al momento dell'esecuzione della frase di lettura:
il primo dato 1928FRANCA in quanto inizia con il primo carattere non blank
e termina con il carattere che precede il blank successivo; il secondo dato GEN-
SINI. Siccome il primo dato non una costante intera e il secondo dato non
una costante carattere, si crea una situazione di errore che impedisce la prosecu-
zione del programma.
Come si vedr nel corso del presente capitolo, in FORTRAN si possono usare
istruzioni di ingresso/uscita pi generali di quelle guidate dalla lista, nelle quali
possibile indicare esplicitamente una specificazione di formato, ossia una descrizio-
ne del modo in cui devono essere forniti e interpretati i dati (se si tratta di una
istruzione di ingresso) o in cui devono essere visualizzati i risultati (se si tratta di
un'istruzione di uscita). Le istruzioni di ingresso/uscita in F77 sono molto pi
flessibili di quanto non lo fossero in F66. Le innovazioni portate rispetto allo
standard precedente sono sostanziali e numerose e pertanto, per rendere pi sem-
plice l'esposizione di questo capitolo, si tralascer di sottolinearle rimandando al-
l'appendice A2 per un riepilogo finale.
Nel seguito la sigla I/O (lnput/Output) potr sostituire l'espressione ingresso/
uscita ed il termine record indicher un insieme di caratteri rappresentato su un
qualsiasi supporto fisico quale, ad esempio, una riga di stampa, una scheda
rata, una linea su video etc.
13.2. Specificazioni di formato
Le informazioni trasmesse durante un'operazione di I/O sono rappresentate
all'esterno della memoria su records. La struttura di tali records pu essere descrit-
ta mediante una specificazrone di formato che, in particolare, individua una sud-
divisione di ciascun record in uno o pi campi, ossia gruppi di caratteri ognuno
dei quali contiene un singolo dato; l'ampiezzadi un campo il numero di carat-
teri che lo compongono. La specificazione di formato descrive completamente
il modo in cui ogni dato deve essere scritto nel campo che gli destinato e pu
inoltre contenere altre informazioni utili per l'interpretazione dei records.
Una specificazione d formato ha la forma seguente:
r
195
in cui ciascun e
j
pu essere del tipo:
r d
r
d
or
r sf
dove:
- r uru;ontatoredi ripetizione che, se presente, deve essere una costante in-
tera positiva senza segno; r pu essere omesso se uguale ad I;
- d un descrittore npettbile ossia una stringa di caratteri che specifica l'arn-
pie;za del campo su deve essere rappresentata un'informazione, il tipo di
informazione ed il modo in cui essa deve essere scritta sul record;
- d un descrittorenon.ripetibile ossia una stringa di caratteri che fornisce al
or ..u u_ .
compilatore particolari informazioni sulla composizione e l'interpretazione d un
record;
- sf a sua volta una dif!!!J11ato.
Ciascun e. della forma rd
r
equivale ad r descrittori dr separati da virgole;
l
cos per esempio,
(et' 2 dr' e
3
) equivale a (et, dr' dr' e
3
)
Ciascun e. della forma rS
f
equivale ad una specificazione di formato costituita
I .
da r ripetizioni separate da virgole della specificazione di formato sf privata delle
parentesi; cos, ad esempio, se sf indica la specificazione (e" e
z),
(e" 2 sf' e
3
) equivale a (e,. (e
l
, e
z'
e" e
z),
e
3
)
In fig. 13.1 riportato l'elenco dei descrittori ripetibili previsti in F77 che pos-
sono essere suddivisi in descrittori di tipo numerico, carattere e logico in base
al tipo di informazione rappresenta bile nel campo da essi descritto. In ogni
Descrittori ripetibili Descrittori ripetibili Descrittori ripetibili
di tipo numerico di tipo logico di tipo carattere
Iw Lw A
IW.m Aw
FW.d
EW.d
Ew.dEc
DW.d
GW.d
Gw.dEc
Figura 13.1. Descrittori ripetibili in F77.
196
197
descrittore, il simbolo W rappresenta una costante intera positiva senza segno che
indica l'ampiezza del campo individuato dal descrittore mentre la lettera I, F, E,
D, G, A, L indica il tipo di informazione contenuta nel campo (numerico per
I, F, E, D, G, carattere per A, logico per L). II significato dei simboli d, ed m
(costanti intere non negative e senza segno) e di c (costante intera positiva e
senza segno) sar chiarito nei paragrafi successivi.
In fig. 13.2 riportato l'elenco dei descrittori non ripetibili previsti in F77;
nella stessa figura accanto ad ogni descrittore viene brevemente riassunto il suo
significato.
Come verr ulteriormente specificato nel 13.9, ogni elemento della lista in
una frase di I/O nella quale indicata una specificazione di formato associato ad
un descrittore ripetibile; il descrittore stabilisce in che modo deve avvenire la
conversione del dato dalla sua rappresentazione interna in memoria come valore
dell'elemento della lista di l/O alla sua rappresentazione esterna sul record, o
viceversa. I descrittori non ripeti bili presenti nella specificazione di formato non
sono invece associati ad alcun elemento del1a lista di I/O.
Esempio 13.2. Sono esempi di specificazioni di formato i seguenti:
13.3. Rappresentazione dei dati numerici sui records di I/O
I numeri sono rappresentati sui records di I/O in base dieci mentre sono rappre-
sentati in memoria nel sistema di numerazione usato dall'elaboratore. Pertanto
l'ingresso/uscita di un dato numerico implica l'esecuzione di un algoritmo di
conversione da un sistema di numerazione ad un altro e l'eventuale troncamento
o arrotondamento del1a mantissa per i numeri reali (cfr. cap. 3).
Esponiamo in questo paragrafo alcune regole generali riguardanti la rappresen-
tazione esterna dei dati numerici sui records di l/O.
In ingresso i caratteri blank nelle prime posizioni di un campo destinato al1a
rappresentazione di un dato numerico non sono significativi, mentre un campo
costituito da soli caratteri blank viene interpretato come zero. Gli eventuali ca-
nel campo dopo il primo carattere non blank possono essere
interpretati come zero oppure ignorati e l'interpretazione dipende, per i mezzi di
I/O standard, dal sistema di calcolo. Negli esempi che seguono, quando non sia
diversamente specificato, adotteremo la convenzione che tali caratteri blank
vengano interpretati come zero, coerentemente con la regola esistente al riguardo
in F66. Va osservato che in F77 possibile stabilire nel1a specificazione di forma-
to l'interpretazione di tali caratteri sia per mezzi di I/O standard che per mezzi
non standard utilizzando i descrittori non ripetibili BN e BZ (cfr. 13.15).
In uscita i numeri vengono sempre scritti nelle posizioni pi a destra del campo
loro riservato e sono eventualmente preceduti da caratteri blank : il segno precede
immediatamente il primo carattere non blank. II segno + considerato in F77
opzionale e la sua presenza nei campi numerici in uscita dipende dal sistema; si
pu comunque imporre una convenzione specifica al riguardo usando i descrit-
tori non ripetibili S, SP, SS (cfr. 13.15). Negli esempi che seguono adotteremo
la convenzione di omettere tale segno.
In uscita un campo destinato al1a rappresentazione di un numero viene riem-
pito di asterischi se, tolti i caratteri opzionali, il dato non pu essere rappre-
sentato secondo le modalit dettate dal descrittore. Cos. ad esempio, un campo
di ampiezza 2 destinato a contenere un numero intero viene riempito di asteri-
schi se il dato da rappresentare - 12 che richiede tre caratteri; se per il dato da
(12,12, F5.3)
(EI3.6, F5.1, F5.1, F5.1)
5X, EI3.6, 5X, EI3.6
(IX, 13, (15, F8.1, 15, F8.1, 15, F8.1
fine di un record
inserimento della stringa
hl ... h
n
su un record di uscita
salto di n caratteri
descrittori di tabulazione
termine dell'operazione se la lista di I/O esaurita
interpretazione dei caratteri blank nei campi
numerici su records di ingresso
gestione del segno +nei campi numerici
nei records di uscita
fattore di scala per valori numerici
Figura 13.2. Descrittori non ripetibili in F77.
nX
Tn
TLn
TRn
BN
Bl
sP
s
SP
SS
(15, F8.1)
(A4)
(v SPECIFICAZIONEvDlvFORMATO')
(3X,'H =', D22.15,'N =', 14)
(212, F5.3) equivalente a
(EI3.6,3 F5.l) equivalente a
(2(5X, EI3.6 equivalente a
(IX, 13,3(15, F8.1 equivalente a
r
198
J99
rappresentare + 12, allora il campo sul record di uscita riempito con la stringa
12 ed il segno + non viene riportato, qualunque sia la convenzione in atto al ri-
guardo.
13.4. 1\ descrittore Iw per dati di tipo intero
Il descrittore Iw individua un campo destinato alla rappresentazione di un dato
intero. Sia in ingresso che in uscita il dato rappresentato sul record come costan-
te FORTRAN intera.
viene interpretato secondo la specificazione di formato precedente. i dati letti
sono i numeri 121, 1235, 25000, O. 12549.
Se lo stesso record viene interpretato secondo la specificazione di formato
(1112)
i dati letti sono i numeri 12. II. 23, 52, 50, O, O, O, 1,25.49.
Osserviamo che sul record non c' nessun carattere di separazione fra un dato
e l'altro: la suddivisione in campi dedotta dalla specificazione di formato suffi-
ciente per individuare la fine di un dato e l'inizio del successivo.
vv123 oppure v+ 123 oppure +v123
Esempio 13.3. Su un record di ingresso un campo individuato dal descrittore
15. Se il contenuto del campo
esso viene interpretato come il numero intero 123. Se invece il contenuto del
campo
Esempio 13.4. Indichiamo qui di seguito come II numero 333 puo essere rappre-
sentato su records di ingresso o di uscita in campi individuati da alcuni descrit-
tori lw.
13.5. I descrittori Fw.d, Ew.d, DW.d per dati di tipo reale e doppia precisione
Un descrittore Fw.d, Ew.D o Dw.d individua un campo di ampiezza w desti-
nato alla rappresentazione esterna di un numero reale. I descrittori Fw.d, Ew.d,
Dw.d, insieme a Ew.dEc, GW.d e Gw.dEc (cfr. 13.15) saranno indicati con il
termine descrittori reali.
I descrittori reali in ingresso
In ingresso i descrittori reali sono tutti equivalenti : il dato pu essere rappre-
sentato, nel campo di ampiezza w, nella forma di costante FORTRAN intera,
reale o doppia precisione. Se il dato nella forma di costante reale con espo-
nente, l'esponente pu essere scritto come una costante intera con segno non
preceduta dalla lettera E oppure D. Se nel campo presente il punto decimale.
allora il l'alare di d specificato nel descrittore non ha alcun significato; in caso
contrario, il dato viene interpretato come se fosse presente un punto decimale
immediatamente precedente le d cifre pi a destra nella stringa di caratteri che
rappresenta il numero, escluso l'esponente.
Esempio 13.6. Riportiamo qui di seguito \'interpretazione che viene data del
.contenuto di un campo di ampiezza 5 in corrispondenza a diversi descrittori
, reali.
Campo Descrittore Interpretazione
uscita
**
333
v333
ingresso
333
v333
impossibile
(13,14,315)
descri ttore
13
14
12
Esempio 13.5. La specificazione di formato
vl23v oppure + 123v
esso viene interpretato come il numero intero 123 o 1230 a seconda della con-
venzione in atto sull'interpretazione dei caratteri blank.
, I
I
i,
l'
Il
I
I
I
equivalente a
(13,14,15,15,15)
e descrive cinque campi consecutivi destinati alla rappresentazione di dati interi.
Il primo campo ha ampiezza 3, il secondo 4 e gli ultimi tre hanno tutti ampiezza
5. Se il record di ingresso
121123525000 vvvv v 12549
vv2.5
2 .5vv
- 2 .5 v
. 2EO I
.7E-3
3 . 1+4
\vv3 vv
F5.0
F5.2
F5.4
F5.2
E5.l
05.1
F5.2
2.5
2.5
- 2.5
2.
0.0007
31000.
3. se ogni spazio equivale ad uno zero oppure
0.03 se gli spazi sono ignorati.
200
201
dove lo zero prima del punto decimale pu non essere presente, e dove:
al'" ad sono le prime d cifre della mantissa del numero espresso in base
dieci, e la cifra ad ottenuta per arrotondamento;
exp una stringa di 4 caratteri che contiene la caratteristica b del numero
espresso in base dieci. In fig. 13.3 dove bI' b
2
, b
3
rappresentano le cifre di b, si
riportano le forme di exp che si possono avere con il descrittore EW.d quando b
compreso in valore assoluto fra O e 999; la scelta tra la forma in cui compare la
lettera E e l'altra forma dipende dal sistema. Se si usa il descrittore DW.d sono
possibili, a scelta del sistema, tutte le forme previste in fig. 13.3 e una terza forma
in cui la lettera D sostituisce la lettera E.
del punto decimale, resta disponibile un solo carattere per la parte intera del nu-
mero che invece costituita dalle due cifre I e 2. Si osservi inoltre che mediante
il descrittore F5.3 il numero 0.0004 viene rappresentato come zero mentre il
valore 0.0005 rappresentato come .00 l. Nel primo caso quindi il descrittore
non permette una corretta rappresentazione esterna del dato il cui valore sembra
essere zero, mentre nel secondo caso si ottiene una rappresentazione dello stesso
ordine di grandezza del valore in memoria.
I descrittori Ew.J e DW.d in uscita
In un campo individuato dal descrittore FW.d su un record di uscita sono rap-
presentati come zero tutti i numeri reali che sono, in valore assoluto, minori di
0.5 x 10- d. Pertanto non conviene usare tale descrittore se si desidera che la
rappresentazione esterna di qualunque numero reale contenga informazioni sul
suo ordine di grandezza. In tal caso si possono usare i descrittori EW.d e Dw.d,
con w d + 7, ai quali corrisponde una rappresentazione esterna della forma
Nell'ultimo caso si vede come, in corrispondenza dello stesso descrittore reale,
una stessa stringa di caratteri senza il punto decimale pu essere interpretata in
modi diversi. Per evitare interpretazioni diverse da quella desiderata, consiglia-
bile inserire sempre il punto decimale nei dati reali.
AI momento della sua acquisizione, il dato scritto nel campo in ingresso viene
letto e convertito nel sistema di numerazione usato dall'elaboratore' la sua rap-
I . '
( . presentazione interna sar in precisione semplice o doppia coerentemente con iii
l I \ tipo della locazione di memoria in cui esso deve essere memorizzato, e
dentemente dal numero di cifre decimali con cui esso rappresentato sul record.
l descrittori reali in uscita
!II uscita i descrittori reali non sono fra loro equivqlenti in quanto definisco-
no modalit diverse di rappresentazione esterna di un numero reale nel campo
di ampiezza w. In ogni caso, indipendentemente dal tipo di rappresentazione
interna del dato (semplice o doppia precisione), la sua rappresentazione esterna
contiene d cifre dopo il punto decimale di cui l'ultima ottenuta per arrotonda-
mento.
II descrittore Fw.d in uscita
Il descrittore Fw.d produce in uscita la rappresentazione del dato nella for-
ma di costante reale FORTRAN senza esponente con d cifre dopo il punto deci-
male. Se il valore assoluto del dato minore di l, la presenza o meno di uno zero
prima del punto decimale dipende dalla convenzione usata dal sistema di calcolo.
Nel seguito adotteremo la convenzione di omettere questo zero.
Esempio 11.7. Riportiamo la rappresentazione esterna di arcuru numeri reali in
corrispondenza a diversi descrittori Fw.d
(13.1 ) O.a
l
... ad exp
Rappresentazione Descrittore Rappresentazione
interna esterna
fI (- 12.388) F6.3
******
fI (T2.388) F6.3 12.388
fI (- 786.3346) FIO.3 V'V'-786.335
fI (- 786.3346) F5.0 -786.
fI (0.0004) F5.3 V'.OOO
fl (0.0005) F5.3 V'.001
Si osservi che nel primo caso il campo, di ampiezza 6, viene riempito di aste-
rischi; infatti, essendo d = 3 ed essendo obbligatoria la presenza del segno - e
b exp
b=O E +00 oppure +000
l E Ob, oppure OOb
l
9 <Ibl E bi b2 oppure os,b2
99 <I bi b2 b3
Figura 13.3. Forme di exp nella rappresentazione esterna O.a
l
... ad exp
corrispondente a Ew.d.
Osserviamo che i numeri reali la cui caratteristica b e, in valore assoluto, mag-
giore di 999 non possono essere rappresentati mediante i descrittori EW.d e DW.d
ma solo mediante opportuni descrittori EW.dEc e Dw.dEc (cfr. 13.15).
202
r
203
Esempio 13.8. Riportiamo la rappresentazione esterna prodotta da alcuni descrit-
tori EW.d e DW.d in corrispondenza di determinati valori interni. Nei primi due
casi indichiamo tutte le possibilit, negli altri soltanto una.
I descrittori EW.d e Dw.d consentono di rappresentare in uscita i numeri reali
con un qualunque numero di cifre di mantissa. Evidentemente sufficiente fissare
d , t quando noto che un dato non pu avere pi di t cifre di mantissa esatte;
una diversa scelta di d provocherebbe la rappresentazione di cifre non attendibili
in quanto sicuramente affette da errore.
'ii Si osservi che i descrittori Ew.d e Dw.d possono essere usati in
Il rentemente qualunque sia la rappresentazione interna del dato. Se, nel
cui si lavora, il descrittore Dw.dproduce una rappresentazione esterna in cui com-
pare la lettera D, allora esso pu essere usato quando si vuole mettere in evidenza,
che il dato riprodotto sal record era rappresentato internamente in doppia pre-
cisione.
i
l'
; I
Rappresentazione
interna
Il r- 786.5936)
Il (- 786.5(36)
Il (0.0001)
Il (0.0009)
Il (- 10-
8
)
Il (2 )( 10
15
)
Descrittore
E13.6
010.3
EIO.3
EIO.3
011.4
011.4
Rappresentazione
esterna
- 0.786594E + 03 opp. - 0.786594 + 003
- 0.7870 +03 opp. - 0.787E +03 opp. 0.787 +003
v O.lOOE - 03
vO.900E - 03
- 0.10000 - 07
VO.2000D + 16
Essa individua due campi di ampiezza 13 destinati alla rappresentazione di due
numeri reali. Secondo tale specificazione Il numero complesso 3.35 - li pu
essere rappresentato nel modo seguente
",,0.335000E + al - 0.200000E + al
mentre il numero complesso + 7i, con parte reale uguale a zero, rappresentato.
ad esempio, da
""O.OOOOOOE + 00 ""0.700000E + al
Osserviamo che la specificazione di formato e i records precedenti potrebbero
anche riguardare l'ingresso/uscita di due numeri reali; infatti l'interpretazione
data ai due valori trasmessi diversa a seconda se i due descrittori reali sono asso-
ciati. tramite la lista di 110. a due locazioni reali o ad una complessa.
13.7. I descrittori ripetibili per dati di tipo carattere
Per n/o di stringhe di caratteri si pu usare il descrittore ripetibile Aw, dove
w rappresenta, come al solito, l'ampiezza del campo. Le modalit di rappresenta-
zione esterna del dato dipendono dalla relazione che sussiste fra we la lunghezza
Q dell'elemento della lista di 110 associato al descrittore.
Il descrittore Aw in uscita
In uscita, se w ;;;. Q, la stringa di Qcaratteri viene posta nelle Qposizioni pi a de-
stra del campo preceduta da w-Q caratteri blank, mentre se w < Qnel campo ven-
gono riprodotti i primi w caratteri della stringa.
Esempio 13.10. Sia CANE ""LUPO la stringa di caratteri che si vuole riprodurre
su un record di uscita: essa viene rappresentata tutta o in parte, a seconda del de-
scrittore usato:
Il descrittore Aw in ingresso
In ingresso, se w ;;;. Q vengono convertiti e memorizzati gli Q caratteri pi a
destra del campo; se invece w < Qla stringa di caratteri presente nel campo, se-
guita da Q - w caratteri blank, viene memorizzata nella locazione corrispondente.
13.6. I descrittori ripetibili per dati di tipo complesso
Per la rappresentazione di un numero complesso su un record di 110 occorrono
due campi individuati da due descrittori reali non necessariamente uguali fra loro;
il primo campo riservato alla rappresentazione esterna della parte reale del nu-
mero, il secondo a quella della parte immaginaria. Nella specificazione di formato
i due descrittori possono eventualmente essere separati da uno o pi descrittori
non ripetibili. Da quanto detto segue che un numero complesso viene rappre-
sentato su un record di IlO come una coppia di numeri reali; ricordiamo a tale
proposito che quando si usa la frase di ingresso guidata dalla lista, i numeri com-
pIessi devono essere fomiti sotto forma di costante FORTRAN complessa, ossia
come coppia di costanti reali, separate da una virgola e racchiuse fra parentesi.
Esempio 13.9. Sia data la seguente specificazione di formato (2EI3.6J.
Descrittore
A4
A5
A9
Al2
Rappresentazione
CANE
CANE""
CANE ""LUPO
""""""CANE""LUPO
204
Esempio 13.11. Sia MESE una variabile carattere di lunghezza g, in cui si deve
memorizzare la stringa di caratteri presente in un campo individuato da un descrit-
tore Aw. Gli esempi seguenti mostrano l'effetto che si ottiene in corrispondenza
ad alcuni descrittori e campi in ingresso.
205
destinati alla rappresentazione di dati di tipo carattere e non hanno
presrabnua, mentre gli altri sono dedicati alla rappresentazione di numeri interi
ed hanno ampiezza 3. 11 record
PER 'V N = 125 'V Kv VALE : V'V5 'V E'VM 'VVA LE: - 12
Descrittore Campo in ingresso
A8 GENNAIOv
A7 GENNAIO
A9 GENNAIOvv
Stringa memorizzata in MESE
GENNAIOv
GENNAIOv
ENNAIOvv
corrisponde alla specificazione data: il primo, il terzo ed il quinto campo hanno
in questo caso ampiezze rispettive 6, 8, IO. Anche il record
RIGA 'V'V l 'V COLONNA 'V'V IPIANO 'V'V l
E' evidente che quando w >Q, il dato in ingresso deve essere allineato a de-
stra nel campo per evitare che vadano persi nella lettura caratteri significativi.
Inoltre si pu osservare che il valore assegnato a MESE nell'ultimo caso diverso
da quello che le verrebbe attribuito con la frase di assegnazione
MESE = 'GENNAIO v"/
Tale frase infatti provocherebbe il troncamento a destra della stringa
'GENNAIOv'V' e la memorizzazione in MESE del valore 'GENNAIO 'V'.
fii
corrisponde alla specificazione data, e in questo caso il primo, il terzo ed il quinto
campo hanno ampiezze 4,8,5.
!
Da quanto detto segue che quando un record viene letto o scritto sotto il con-
,di .. e di formato un dato di tipo carattere viene rappresenta-
to su di esso senza gli apici delimitatori che caratterizzano le costanti carattere;
che tali apici sono obbligatori se il record viene letto con una frase
READ*.
---
Come si messo in evidenza in questo esempio, la lettura di dati di tipo carat-
tere sotto il controllo del descrittore A w pu non essere equivalente all'assegna-
zione mentre tale equivalenza sussiste sempre quando la lettura guidata dalla
lista (cfr. cap. 12). D'altra parte, la regola seguita nella lettura di dati di tipo
carattere coerente con il fatto che in uscita essi vengono riprodotti nelle posi-
zioni pi a destra del campo loro riservato.
II descrittore A
Per l'I/O di dati di tipo carattere si pu usare anche il descrittore A in cui.non
compare l'ampiezza del campo; in questo caso il campo risulta di ampiezza Q,
dove Q la lunghezza dell'elemento della lista di I/O di cui si vlore.
11 descnttore A pu essere molto utile per l'uscita di dati di tipo carattere, il
cui valore viene riprodotto per intero sul record di uscita; d'altra parte questo
descrittore va usato con molta precauzione in specificazioni di formato relative
a frasi di ingresso.
Esempio 13.1:l. La specificazione di formato
(3 (A, 13
equivale a
(A. 13, A, 13, A, 13)
e descrive un record costituito da sei campi: il primo, il terzo ed il quinto sono
13.8. Istruzioni di ingresso/uscita con formato relative ai mezzi standard
Le pi semplici frasi di I/O con formato relative ai mezzi standard hanno la
forma seguente:
READ f, lista-di-ingresso
PRINT f, lista-di-uscita
dove:
READ, PRINT, lista-di-ingresso e lista-di-uscita hanno lo stesso significato
visto nei capitoli precedenti;
f un identificatore di formato che pu essere:
- un * (in questo caso la frase guidata dalla lista);
- l'etichetta di una frase FORMAT presente nella stessa unit di programma in
cui compare la frase di I/O;
- un'espressione carattere;
- un nome di variabile dimensionata carattere.
Istruzione FORMAT
L'istruzione FORMAT una frase non eseguibile che ha la forma
n FORMAT SI
dove:
'd,
I
,
206
FORMAT la parola chiave che identifica la frase;
n l'etichetta, obbligatoria, della frase;
sf una specificazione di formato che risulta associata a tutte le istruzioni
di ingresso/uscita della stessa unit di programma in cui figura n come identifi-
catore di formato.
Esempio 13.13. Con la coppia di istruzioni
READ 150, N, M. A, B
150 FORMAT (215, 2FI0.0)
si associa alla frase di lettura READ la specificazione di formato (215, 2F l 0.0),
secondo la quale i valori da assegnare a N, M, A, B devono essere forniti su un
record secondo le modalit imposte dai descrittori 15 per i primi due e F 10.0 per
gli ultimi due.
Se la stessa frase FORMAT associata alla frase
PRINT 150, N, M, A, B
la specificazione di formato in essa contenuta descrive la struttura del record, sul
mezzo di uscita standard, su cui verranno rappresentati i valori di N, M, A, B.
E' importante osservare che nella stessa unit di programma pi frasi di 110
, possono fare riferimento ad una stessa istruzione FORMAT e che frase.
" pu s.tare in qualunque punto dell'unit di programma (cfr. appendce] \
Il A3); di solito SI usa raggruppare tutte le istruzioni FORMAT prima della END ii
in modo da migliorare la leggibilit dell'unit di programma.'i
Esempio 13.14. Nel seguente programma la frase READ e la frase PRINT fanno
riferimento alla stessa frase FORMAT, di etichetta 100, che contiene la specifi-
cazione di formato (2EI3.6).
READ 100, A, B
A=A+1.
B=B- 5.
PRINT 100, A, B
STOP
100 FORMAT (2 EI3.6)
END
Se il record letto con la frase READ "-
U t1''''' I (I (J r(;
;/ v
vv- 2.vvvvvvv-\87.vvvvvvvv
quello prodotto dalla PRINT il seguente:
- 0.1 OOOOOE + al - 0.920000E + 02
207
Espressioni carattere come identificatori di formato
Se l'identificatore di formato in una frase di I/O una espressione carattere,
il valore dell'espressione o una sua sottostringa deve costituire una specificazione
di formato al momento dell'esecuzione della frase. Se la specificazione di formato
definita da una sottostringa essa pu essere preceduta soltanto da caratteri blank
ma pu essere seguita da qualsiasi altro carattere.
Esempio 13.15. Nella frase
READ '(215, 2FIO.0)', N, M, A. B
l'identificatore di formato costituito dall' espressione carattere' (215, 2F 10.0)';
questa istruzione allora equivalente alla coppia di istruzioni READ e FORMAT
dell'esempio 13.13.
Esempio 13.16. Siano A e B variabili carattere rispettivamente di lunghezza 2 e
5. Le tre istruzioni:
A ='(2'
B = 'FS.3)'
PRINT A Il B, XI, X2
hanno, sul record di uscita, lo stesso effetto della frase
PRINT '(2F5.3)', Xl, X2
in quanto il valore dell'espressione A // B la specificazione di formato (2 F5.3).
Esempio 13.17. Se A e B sono variabili carattere di lunghezza 8, le istruzioni
A = 'vv(313, F'
B = '5.3) GGMM'
PRINT A II B, LA, LB. Le. XI
hanno, sul record di uscita, lo stesso effetto della frase
PRINT '(313, FS.3)', LA, LB. LC, Xl
Il valore dell'espressione A//B contiene infatti la sottostringa (313, FS.3) che,
essendo preceduta da caratteri blank, riconosciuta ed utilizzata come specifica-
zione di formato.
Esempio 13.18. Sia N una variabile carattere di lunghezza l. Nella frase:
PRINT '('j/N/I'13)',LA. LB, LC
l'identificatore di formato costituito da un'espressione carattere il cui valore
208
ottenuto concatenando la costante '(' con il valore di N e con la costante '13)'.
Pertanto, se al momento dell'esecuzione della frase PRINT il valore di N '2',
la frase equivale a
PRINT '(213)', LA, LB, LC
mentre, se N vale 'S', essa equivale a:
PRINT '(513)', LA, LB, LC
Da questo esempio si vede che, tramite un identificatore costituito da una espres-
sione carattere, si pu associare ad una frase di I/O una specificazione di formato
variabile.
Variabili dimensionate carattere come identificatori di formato
Se l'identificatore di formato in una frase di I/O il nome di una variabile
dimensionata carattere, allora di formato il risultato della con-
catenazione dei valori dei singoli elementi nell'ordine in cui essi
oppure una sua sottostringa; in questo ultimo caso la
pu essere preceduta da caratteri blank e seguita da qualunque altro carattere.
Esempio 13.19. Consideriamo le seguenti istruzioni:
CHARACTER * 4 FORM(4)
FORM(J) ='(313'
FORM(2) = ')'
READ FORM, Ix, Iy, Iz
La specificazione di formato associata alla frase READ (313). Intatti conca-
tenando i valori dei quattro elementi di FORM si ottiene una stringa di 16 carat-
teri, in cui viene individuata la sottostringa (313) che costituisce appunto una
specificazione di formato valida.
E' evidente che anche con identificatori di formato costituiti da variabili di-
mensionate carattere si possono definire specificazioni di formato variabile nel
senso suggerito dall'esempio 13.18.
13.9. Interazione fra lista di ingresso/uscita e specificazione di formato
L'esecuzione di una frase di I/O con formato avviene scandendo insieme,
da sinistra verso destra, la lista di I/O e la specificazione di formato. L'acquisi-
zione dei dati o la creazione dei records di uscita contemporanea alla scansione
della lista e della specificazione di formato.
lj In quanto segue occorre tener presente che al momento dell'esecuzione di una
209
r:frase di I/0c:>gni nome di variabile dimensionata presente nella lista viene trattato
se fossero specificati tutti gli elementi della variabile nell'ordine in
compaiono in memoria.
lnterazione lista-formato nelle operazioni di ingresso
Un'operazione di ingresso inizia con la trasmissione all'interno della memoria
del record che deve essere letto (record corrente). Successivamente inizia la scan-
sione della specificazione di formato.
Se, durante la scansione della specificazione di formato, si incontra un descrit-
Itore ripetibile che definisce un campo di ampiezza w SI controlla se gi stato
I
ed assegnato un valore a tutti gli elementi della lista. In caso affermativo, I )
( 'I i:l'operazione di ingresso ha termine; altrimenti essa prosegue con l'acquisizione , I J \ .
I: ,! !di un dato dal record corrente ossia viene letta una stringa di w caratteri che, in- ( !l/t
I " terpretata in base al tipo del descrittore, costituisce il valore da assegnare al primo '.. ' t\:
\ elemento della lista di ingresso il cui contenuto non stato ancora definito. In: i; IJ ,;
corrispondenza ad un elemento della lista di tipo complesso la scansione della spe- !Ii J
cificazione di formato procede fino ad incontrare un altro descrittore ripetibile I
e, dal record corrente, si leggono due campi.
Il procedimento ora descritto pu essere realizzato correttamente soltanto se il
dato sul record di ingresso nella forma prevista dal descrittore e se quest'ultimo
del tipo opportuno in relazione al tipo dell'elemento della lista di ingresso (cfr.
fig. 13.4). Tutte le situazioni che impediscono il corretto svolgimento della ope-
razione provocano l'interruzione dell'intero programma a meno che esse non ven-
Tipo dell'elemento Tipo del descrittore
nella lista di I/O ripetibile
intero intero: lw'llw.m /
'7
/' (
reale reale: Fw.d, Dw.d,
Ew.d, EW.dEc
doppia precisione
Gw.d, GW.dEc
complesso una coppia di descrittori reali
carattere carattere: A, Aw
logico logico: Lw
Figura 13.4. Corrispondenza tra il tipo degli elementi deUa lista di I/O e queUo dei descrittori
ripetbili.
210 211
sia disponibile sull'unit di ingresso il seguente record:
v- 0.2,vO.2v,2l5
READ '(2F5.l, 13)', A, B, N
impone la lettura di due numeri reali da memorizzare in X e Y; i dati devono es-
sere scritti su un unico record secondo la specificazione di formato (SFI0.3),
ossia (FIO.3, FIO.3, FlO.3, FIO.3, FI0.3). Ai primi due descrittori ripetibili
F I0.3 vengono associati gli elementi X, Y della lista di ingresso ai quali vengono
quindi assegnati i valori risultanti dall'interpretazione e conversione delle stringhe
presenti nel primo e nel secondo campo rispettivamente. Quando viene incontrato
il terzo descrittore F I0.3 l'operazione termina perch terminata la scansione
deBi"Usta di ingresso.
--------._--- -
A; pertanto la stringa v -0.2 presente nel primo campo di ampiezza S viene inter-
pretata come numero reale -0.2, viene convertita nella rappresentazione interna
fl( - 0.2) e memorizzata in A;
il secondo descrittore incontrato ancora un descrittore ripetibile FS.I ; al se-
condo elemento della lista di ingresso B, viene assegnato il valore fl(0.2) risultan-
te dall'interpretazione e conversione della stringa vO.2 v presente nel secondo
campo del record;
il terzo descrittore incontrato il descrittore ripetibile 13 e il terzo elemento
della lista la variabile intera N; la stringa 21S presente nel terzo campo viene al-
lora interpretata come un numero intero che viene assegnato ad N;
viene incontrata la parentesi finale della specificazione di formato ed essendo
ormai stato assegnato un valore ad ogni elemento della lista di ingresso, l'opera-
zione ha termine.
Esempio 13.23. L'esecuzione della frase
READ '(F8.\, 2(13, FIO.O))', A. N, B, NM. BM, K, BK
Esempio 13.22. La frase
READ '(5FI0.3)', X, Y
avviene nel modo seguente. Dal primo record vengono letti, secondo la specifi-
cazione di formato (F8.I, (13, F 10.0, 13, F 10.0)), cinque valori che vengono
assegnati nell'ordine ad A, N, B, NM, BM. A questo punto si incontra la parentesi
chiusa finale; si inizia allora la lettura di un nuovo record per acquisire i valori da
assegnare a K e BK. Su questo secondo record i dati vengono interpretati secondo
la specificazione di formato che inizia dal punto di riscansione, ovvero essi devono
accordarsi con la specificazione (13, FIO.O, 13, FIO.O).
(13, (A3, 12, A3, 12), F5.3)
(13, A3, 15, A3, 15), F5.3, (A3, 15, A3, 15),F5.3))
A3, 12, A3, 12), (F5.3, 12, F5.3, 12))
(13, A3, A3, 12, 12)
13, A3, 13, A3), 12)
(13, (A3, 12, A3, 12))
(13, 2A3, 212)
,
(13, 2(A3, 12))
t
(2(13, A3), 12)
t
(13, 1(A3, 12), F5.3)
(2(A3, 12), rF5.3, 12))
(13, 2(2(A3, 15), F5.3))
t
Esempio 13.21. Supponiamo che al momento dell'esecuzione della frase
Esempio 13.20. Nelle seguenti specificazioni di formato la freccia indica il punto
di riscansione; per maggior chiarezza, accanto a ciascuna specificazione viene indi-
cata la forma ad essa equivalente.
gano opportunamente trattate come indicato nel cap. 18.
Se, durante la scansione della specificazione di formato, viene incontrato un de-
scrittore non ripetibile viene eseguita l'azione da esso descritta e la scansione della
specificazione di formato procede con l'esame del successivo descrittore.
Quando, durante la scansione della specificazione di formato. si incontra la
parentesi chiusa finale, l'operazione di ingresso termina se la sua esecuzione ha
permesso di definire il contenuto di tutti gli elementi della lista. In caso contrario,'
,I 1\ l'acquisizione dei dati prosegue dal record che, sull'unit di ingresso, segue imrne-
I diatamente il record corrente; questo nuovo record viene trasferito in memoria
i \ e sostituisce il record corrente. La scansione della specificazione di formato ri-
t
Il ).. I,. '
\ ~ ~ ~ a partire dal punto di riscansione che coincide con l'inizio .della specifi, \
~ (' . caione di formato se questa n o ~ contiene specificazioni di formato interne; at-
(li I trimenti esso coincide con l'inizio della specificazione di formato che si chiude
con l'ultima parentesi interna destra.
i l' ..
l'
Esempio 13.24. Sia IND un vettore di IO elementi; \'istruzione
Considerando che la specificazione di formato (2F5.l, 13) equivalente a
(F5.1, FS.I, 13), l'operazione di lettura avviene nel modo seguente:
inizia la scansione della specificazione di formato. Il primo descrittore il de-
scrittore ripetibile FS.I e il primo elemento nella lista di ingresso la variabile
'I
l,
READ '(14)', IND il
prevede di leggere un valore per ognuno degli elementi di IND secondo la speci-
I
I
I
212
ficazione di formato (14); siccome questa specificazione prevede un unico campo
di 4 caratteri, i valori delle lO componenti di IND devono essere scritti ognuno
nelle prime 4 posizioni di un record, per un totale di lO records successivi. I dati
devono invece essere fomiti su un unico record, in lO campi consecutivi di am-
piezza 4, se si usa la frase
READ '(1014)', IND
Supponendo infine che i dati vengano acquisiti con l'istruzione
READ '(414)', IND
devono essere predisposti 3 records distinti: il primo deve contenere i valori di
IND(I), IND(2), IND(3), IND(4), il secondo quelli di IND(5), IND(b), IND(7),
IND(8) e infine il terzo quelli di IND(9) e IND(lO). Ogni dato dovr occupare
un campo di 4 caratteri.
Dagli esempi precedenti risulta evidente che il numero di records letti durante
una operazione di ingresso dipende dal numero di elementi della lista e dalla spe-
cificazione di formato; se il numero di records richiesti dall'operazione e maggiore
del numero di records disponibili sull'unit di ingresso, si crea una situazione di
errore che provoca la fine dell'esecuzione dell'intero programma a meno che essa
non sia prevista nei modi descritti nel cap. 18. In ogni caso occorre molta atten-
zione nel disporre i dati sui records di ingresso o nello scegliere la specificazione di
formato da associare ad una istruzione di lettura. A questo proposito si osservi
che una specificazione di formato deve essere tale da non imporre la lettura
di records pi lunghi di quanto consentito dal supporto fisico su cui essi sono
rappresentati (sui mezzi di ingresso standard la lunghezza massima consentita
di solito 80 caratteri).
Interazione lista-formato nelle operazioni di uscita
L'esecuzione di una frase di uscita con formato consiste nella creazione in me-
moria di uno o pi records che successivamente vengono emessi sull'unit di usci-
ta. II numero e la struttura dei records creati dipendono dalla lista di uscita, dalla
specificazione di formato e dalla loro interazione. La scansione della lista e del
formato procede nello stesso modo visto per un'operazione di ingresso; in parti-
colare ogni volta che nella specificazione di formato si incontra un descrittore ri-
petibile, il valore dell'elemento della lista ad esso corrispondente viene convertito
e rappresentato sul record corrente secondo le modalit imposte dal descrittore.
Anche per le istruzioni di uscita deve essere rispettata la corrispondenza di tipo
fra elemento della lista di uscita e descrittore ripe tibile ad esso associato (cfr.
fig. 13.4). Inoltre, e buona regola evitare specificazioni di formato che diano luo-
l
213
go alla creazione di records troppo lunghi, ovvero costituiti da pi caratteri di
quanti ne possono essere contenuti su una riga dell'unit di uscita prescelta (le
righe sulle usuali unit di uscita, come stampante, video, terminale, sono di so-
lito lunghe 80, 120 o 117 caratteri).
Esempio J3.25. Data la matrice intera MAT dichiarata con la frase
INTEGER MAT (3,2)
e data la variabile carattere N di lunghezza l, a cui si suppone assegnato il valore
'3', l'esecuzione della frase
PRINT '('f/N//'I4)', MAT
determina la creazione di due records su ognuno dei quali vengono riprodotti i
contenuti degli elementi di una colonna di MAT secondo la specificazione di for-
mato (314). Ricordiamo infatti che la lista di uscita costituita dal nome di matrice
MAT equivalente alla lista:
MAT(I, I), MAT(2, I), MAT(3, I). MAT(I, 2), MAT(2, 2), MAT (3,2)
Cos, se MAT contiene la matrice
(
-2)
5 15
-7 -3
vengono creati i records seguenti:
vvv l vvv5 vv- 7
vv- 2 vv 15 vv- 3
Esempio J3.26. Supponendo che GG, MM, AA siano variabili intere contenenti
rispettivamente i valori 29, 6,49 l'esecuzione della frase
PRINT 1200, 'GIORNO:', GG, 'MESE:', MM, 'ANNO:', AA
1200 FORMAT (3(A7, 13
d luogo alla creazione del record seguente:
GIORNO: V'29V' V' MESE: V'v6V' V' ANNO:V'49
Se la frase FORMAT fosse stata:
1200 FORMAT(A7,13)
allora si sarebbero ottenuti tre records di uscita:
GIORNO:v29
vV'MESE: vv6
vvANNO: v49
I
I
I
I,
l'
li
li
Il
,I,
l
I
Figura 13.5. Controllo della spaziatura verticale su stampante.
Esempio 13.27. Il record creato dalla frase PRINT dell'esempio 13.26 verrebbe
riprodotto su una riga della stampante privato del primo carattere. ossia I
214
Osserviamo che per ottenere tre records distinti con la frase PRINT*, ossia senza
specificazione di formato esplicita, si dovrebbero eseguire tre operazioni di uscita
distinte:
PRINT *, 'GIORNO:', GG
PRINT -. 'MESE:' , MM
PRINT *, 'ANNO:', AA
Specificazioni di formato vuote
In F77 sono permesse istruzioni di I/O con specificazioni di formato vuote.
Se la specificazione di formato vuota anche la lista deve esserlo. Sono quindi
ammesse le istruzioni seguenti:
READ '()'
PRINT '( )'
L'effetto della prima frase quello di ignorare il record corrente qualunque sia
il suo contenuto; quello della seconda di creare un record vuoto.
Primo carattere
blank
o
+
Effetto
spaziatura singolo: il record viene
riprodotto sulla riga successiva
all'ultima gi stampata
spaziatura doppia: il record viene
riprodotto a distanza di una riga
dall'ultima gi stampata
solto di pagina: il record
riprodotto sulla prima riga
della pagina successiva
sovrastampa: il record
riprodotto sulla stessa riga
del precedente
215
I
I
I
,.
I
I
13.10. Controllo della spaziatura verticale su stampante
I records creati durante l'esecuzione di una frase di uscita possono essere
emessi sull'unit di uscita uno alla volta oppure tutti insieme, al termine dell'ope-
razione. Le modalit che regolano la gestione dei records di uscita dipendono dal
sistema e dalle unit usate e pu essere anche prevista un'emissione globale
dei records di uscita nel senso che soltanto alla fine dell'esecuzione di un program-
ma vengono riprodotti sull'unit di uscita tutti i records creati da tutte le frasi
di uscita presenti nel programma stesso. In ogni caso ogni record viene riprodotto
a partire dal margine sinistro di una nuova linea sull'unit di uscita prescelta.
In generale, ogni sistema di calcolo prevede almeno una unit di uscita, che
chiameremo stampante, sulla quale possibile controllare la spaziatura verticale
tra due linee di. uscita successive mediante opportune indicazioni nella specifi-
cazione di formato. Infatti, quando il record viene emesso su stampante.. il suo
primo carattere non viene stampato ma viene usato per determinare la
della riga su cui il record verr stampato rispetto all'ultima riga gi stampata ql: Il
rispetto all'inizio del foglio di stampa. Nella fig. 13.5 viene indicato che' ,
si ottiene quando il primo carattere blank, O(zero), I, +; qualunque altro carat-
tere che si trovi nella posizione iniziale del record di uscita viene di solito conside-
rato come un carattere blank anche se in F77 non stabilita alcuna norma al
riguardo.
IORNO:v29 vvMESE:vv6 vv ANNO:v49
Per evitare la perdita del primo carattere potremmo usare. ad esempio. la speci-
ficazione di formato:
(A8, 13, 2(A7, 13
Avendo aumentato di un carattere l'ampiezza del primo campo, la stringa
GIORNO: viene riprodotta nelle 7 posizioni pi a destra del campo ed il primo
carattere del campo. che anche il primo del record. un hlank.
Il primo carattere del record di uscita su stampante pu essere specificato
anche usando opportuni descrittori non ripetibili. come verr specificato nel
paragrafo successivo.
13.11. I principali descrittori non ripetibili
Il descrittore nX
Questo descrittore. in cui n una costante intera positiva senza segno che non
pu essere omessa neppure se uguale ad I, consente di spostarsi di n caratteri sul
record corrente. L'utilizzazione del descrittore nX permette quindi di ignorare
n caratteri su un record in ingresso o di creare un campo di n caratteri blank su
fii
I111
216
un record di uscita. Di solito questo descrittore viene usato nelle specificazioni
di formato associate a Istruzioni di uscita per spaziare opportunamente I risultati
oppure per creare un blank come primo carattere del record. Ad esempio la speci-
ficazione di formato
(IX, 3(A7,13
consente di non perdere il primo carattere nella stampa del record dell'esempio!
13.26, ed ha quindi lo stesso effetto della specificazione indicata nell'esempio r
13.27.
Esempio 13.28. L'esecuzione della frase
PRINT '(5X, 14, 5X, EI3.6)', N, X, M, Y
avviene nel modo seguente:
il primo descrittore incontrato nella scansione di formato 5X; allora sul re-
cord di uscita vengono riempite con caratteri blank le prime 5 posizioni;
il secondo descrittore il descrittore ripeti bile 14; ad esso viene associato il
primo elemento della lista di uscita, N, il cui valore viene riprodotto sul record
allineato a destra nel campo che va dalla sesta alla nona posizione;
il terzo descrittore ancora 5X; esso provoca l'inserimento di caratteri blank
nelle posizioni dalla decima alla quattordicesima;
il quarto descrittore, E13.6, ripetibile e viene associato al secondo elemento
della lista, X, il cui valore viene opportunamente riprodotto sul record su un cam-
po di ampiezza 13 a partire dalla quindicesima posizione;
si incontra infine la parentesi finale e, siccome i valori di M e di Y devono essere
ancora riprodotti, la scansione della specificazione di formato riprende dall'inizio;
viene cos creato un secondo record che ha la stessa struttura del primo, sul quale
sono rappresentati i valori di M ed Y.
I descrittori 'hl" . ho' e nHh
l
. ho
Durante un'operazione di uscita possibile inserire sul record corrente una
stringa hl ... h
n
costituita da caratteri codificabili dal sistema mediante uno dei
descri ttori:
'hl' .. h
n
' ; nHh
l
h
n
Il primo descrittore, non permesso in F66, ha la forma di una costante carattere
ed il secondo, disponibile anche in F66, stato mantenuto per consentire che pro-
grammi scritti in F66 potessero essere eseguiti su elaboratori che realizzano il nuo-
vo standard.
217
Esempio 13.29. Le istruzioni
PRINT 1000, RAGGIO, AREA
1000 FORMAT (lX, 'RAGGIOv='. E13.6, 3X, 'AREAv=', E13.6)
permettono di visualizzare i valori delle variabili RAGGIO e AREA preceduti,
rispettivamente, dalle stringhe RAGGIO v = e AREA v =; se RAGGIO vale 2.
e AREA vale 12.5664, viene creato il record
vRAGGIOv= + 0.200000E + 01 vvv AREAv= + 0.125664E + 02
Si osservi che il carattere blank che precede la stringa RAGGIOv = e i tre blanks
che precedono la stringa AREA v = vengono creati sul record per effetto dei de-
scrittori IX e 3X rispettivamente.
Lo stesso record pu essere ottenuto con una delle seguenti coppie di istru-
zioni:
PRINT 1000, RAGGIO, AREA
1000 FORMAT (lX. 8HRAGGIOv=, E13.6, 3X, 6HAREAV=, E13.6)
PRINT 1000, 'RAGGIOv=', RAGGIO, 'AREAV=', AREA
1000 FORMAT (lX, A8, E13.6. 3X, A6, E13.6)
PRINT 1000, 'vRAGGIOv=', RAGGIO,'vvvAREAV=', AREA
1000 FORMAT (2(A, EI3.6))
e con diverse altre combinazioni di specificazioni di formato e liste di uscita.
Esempio 13.30. Con le istruzioni
PRINT 2000
2000 FORMAT (vvPROBLEMAvTESTV')
si crea un record contenente la stringa di caratteri vvPROBLEMAvTEST v. Si
noti che la specificazione di formato non contiene descrittori ripetibili e che la
lista di uscita vuota.
Se la stringa di caratteri che si vuole inserire in un record di uscita contiene un
apice, questo deve essere scritto come una coppia di apici consecutivi nel de-
scrittore 'hl ... h
n
I o come un solo apice nel descrittore nlfh, ... h
n
Se poi
la specificazione di formato viene associata alla frase di uscita tramite un iden-
tificatore costituito da una costante carattere, allora tutti gli apici devono esse-
re sostituiti da una coppia di apici consecutivi.
Esempio 13.31. Il messaggio 2vNONvE'v3 pu essere stampato con varie com-
binazioni di frasi di uscita e specificazioni di formato, fra le quali:
218
PRlNT 2000. 2. 3
2000 FORMAT(lX, Il, IX, 'NONvE"v', Il)
PRINT '(IX, Il, IX, "NONvE""v", Il)', 2, 3
PRINT 2000, 2,3
2000 FORMAT (IX, Il, IX, 7HNONvE'v, Il)
PRlNT'(AlI )', '2vNONvE"v3'
PRINT '(A)', 'v2vNONvE"v3'
PRlNT'(IX, Il, A, Il)', 2, 'vNONvE"v',3
I descrittori 'hl ... e nHh
l
.. h
n
possono essere usati per ottenere come
primo carattere di un record uno di quelli previsti in fig. 13.5. Cos, ad esempio,
il primo carattere del record creato con la frase
PRINT 555
555 FORMAT (l', I5X, 'INIZI0vDELvFOGLIO')
: l. Se il record viene emesso su stampante, esso viene riprodotto sulla prima riga
del foglio di stampa successivo, privato del primo carattere.
Il descrittore / (sbarra)
Una specificazione di formato pu descrivere la struttura di pi records sia
quando viene riscandita pi volte a causa della lunghezza della lista di I/O, sia
quando contiene il descrittore non ripetibile [, Questo descrittore infatti indica
la fine della trasmissione di informazioni da (su) un record e l'inizio della tra-
smissione dal (sul) record successivo. In ingresso ci significa che gli eventuali
caratteri non ancora letti sul record corrente vengono ignorati e, se la lista di in-
gresso prevede la lettura di altri dati, questi devono essere fomiti sul record suc-
cessivo. In uscita la sbarra fa s che il record corrente venga considerato concluso
e che venga dato inizio alla creazione di un nuovo record. Osserviamo che in una
specificazione di formato si pu omettere la virgola che precede un descrittore
sbarra e quella che lo segue.
Esempio 13.32. L'istruzione
READ '(2FIO.3/214)', X, Y, I, J
indica che devono essere letti due numeri reali e due interi. La specificazione di
formato tale per cui i dati devono essere fomiti su due records: il primo deve
contenere i valori reali da memorizzare in X e Y scritti secondo la specificazione
di formato (2FIO.3); il secondo deve corrispondere alla specificazione (214) e
deve contenere i valon da assegnare a I e J. In altri termini, i dati devono essere
fomiti come se fossero utilizzate le due istruzioni di lettura seguenti
READ '(2FIO.3)', X, Y
READ '(214)', I, J
219
Esempio 13.33. Se VOTI un vettore intero, l'esecuzione della frase
PRINT '(IX, "VETTORE vDEI v VOTI "/5(l X, 16', VOTI
causa la creazione di un record che contiene il messaggio VETTOREvDElvVOTI
e di uno o pi records successivi su ognuno dei quali sono rappresentati i valori
di cinque elementi di VOTI su campi di ampiezza 6 separati da un carattere
blank. Il numero di records successivi al primo dipende dalla lunghezza di VOTI.
Cos ad esempio, se VOTI ha lunghezza 5 l'effetto della frase quello di creare
un solo record successivo al primo contenente i valori dei cinque elementi di
VOTI; se invece VOTI ha lunghezza 12 la frase provoca la creazione di tre records
successivi al primo l'ultimo dei quali contiene due soli dati. Supponendo di voler
creare, dopo il primo, un record per ogni elemento di VOTI, si pu usare la frase
PRINT '(IX, "VETTOREvDElvVOTI"/(lX, 16', VOTI
nella cui specificazrone dI formato la coppia di parentesi interne serve ad impedire
la riproduzione della stringa VETTORE vDEI vVOTI su tutti i record successivi
al primo.
E' possibile distanziare tra loro le righe di stampa prodotte da una istruzione
di uscita inserendo nella relativa specificazione di formato pi sbarre consecu-
tive. Infatti se durante la scansione della specificazione di formato si incontra
una sbarra l'operazione di uscita deve continuare sul record successivo. La scan-
sione del formato procede quindi con l'esame del successivo descrittore; se questo
ancora una sbarra, il record corrente viene lasciato vuoto e l'operazione di uscita
continua sul record successivo. Questo processo si ripete finch non si incontra
un descrittore diverso dalla sbarra oppure la parentesi finale della specificazione
di formato. Ogni record lasciato vuoto viene riprodotto sul mezzo di uscita come
una riga bianca. Cos, eseguendo la frase
PRINT '(IX, 214///2(1 X, EI3.6', N, M, A, B
si creano quattro records di cui il seconao ed 11 terzo VUOtI.
I 3.12.La lista di ingresso/uscita
Una lista di I/O pu contenerenomdivarable, nonudelement di variabile
dimensionata, nomi di variabile dimensionata e nomi di sottostringhe. Inoltre una
lista di uscita pu contenere espressioni, eventualmente costituite da singole co-
stanti. Di una lista di l/O possono far parte elementi pi complessi, detti liste con
DO-implicito, che rappresentano in forma sintetica tutta la lista o parte di essa, e
che sono usate soprattutto in connessione con l'ingresso/uscita di variabili dimen-
sionate.
220
221
PRINT *, (V(I), I = M, N)
oppure con la sequenza di istruzioni
DO 100, 1= M. N
PRINT -. V(I)
100 CONTINUE
Si osservi che gli stessi valori vengono stampati nel primo caso con l'esecuzione
di una sola operazione e nel secondo caso con quella di N - M + 1 operazioni.
Volendo stampare i valori degli stessi elementi di V a gruppi di 3 su linee
successive, si pu usare la frase:
PRINT '(3(1 X, E13.6)', rvrn. l = M. N)
Esempio 13.36. Dato il vettore V specificato dalla frase
REAL V( - 20 : 20)
si vogliono visualizzare sull'unit di uscita standard i valori di V(M), V(M + 1),
..., V(N) dove M ed N sono noti e tali che - 20 M N 20. Tale scopo pu
essere ottenuto con l'istruzione
Lista con DO-implicito
Una lista con DO-implicito ha la forma seguente:
(5f' ,v =e
l
, e
2
, e
3
)
dove:
5f' che diremo lista del DO-implicito. una lista di ingresso o una lista di
uscita coerentemente con il tipo di lista di cui la lista con DO-implicito fa parte;
5f' pu contenere a sua volta una o pi liste con DO-implicito;
v, e
l
, e
2
, e
3
hanno lo stesso significato dei simboli v, e
l
, e
2
, e
3
visti nell'istru-
zione DO (cfr. cap. l O): v detta variabile della lista con DO-implicito.
Al momento dell'esecuzione di una istruzione di I/O nella quale compare
una lista con D0-implicito, viene calcolato il contatore C in base ai valori delle
espressioni e
l
, e
2
, e
3
esattamente come se dovesse essere eseguita un'istruzione
del tipo DO n v =el' e
2
, e
r
La lista con DO-implicito equivalente a quella otte-
nuta riscrivendo C volte consecutive la lista 5f'; ad ogni ripetizione di 5f' il valore
di v viene modificato come nella realizzazione di un ciclo-DO e di conseguenza
vengono modificati i nomi dipendenti da v che compaiono in .!f. Si pu dire
quindi che 5f' costituisce il rango del DO-implicito.
Esempio 13.34. Le liste con DO-implicito seguenti equivalgono alle liste esplicite
scritte accanto
(V(I), I = 1,4)
(A(I, J), J = 1, 3)
(X, Y, K = 1,5)
(N, * N, N =8,2, - 2)
(U(I + 1), V(I - 1), I = 3, 1, - 1)
(K, W(K), K = 1,7,2)
V(l), V(2), V(3), V(4)
A(I, 1), A(I, 2), A(I, 3)
X,Y,X,Y,X,Y,X,Y,X,Y
8, 2 * 8,6, 2 * 6,4, 2 * 4, 2, 2 * 2
U(4), V(2), U(3), V(l), U(2), V(O)
1, W(l), 3, W(3), 5, W(5), 7, W(7)
Se la lista !f di un DO-implicito contiene a sua volta una lista con DO-implicito,
si ha una situazione di annidamento per la quale valgono le regole viste nel cap.
lO; in particolare le variabili di pi viste con DO-implicito annidate devono essere
distinte.
Esempio 13.37. Data una matrice, MAT, l'istruzione
READ *, MAT(I, J), I = l, N), J = l, M)
Esempio 13.35. Data la matrice reale AMAT dichiarata da
REAL AMAT (l4, 14)
la sequenza di istruzioni
DO 100 I = l, 14
PRINT '(5(5X, EI3.6', (AMAT(I, J), J = l, 14)
100 CONTINUE
prevede la scrittura sull'unit di uscita standard di tutti gli elementi di AMAT.
Infatti per ogni valore che I assume durante l'esecuzione del ciclo-DO esplicito,
la lista della frase PRINT costituita dagli elementi AMAT (I, l), AMAT (I, 2),
..., AMAT (I, 14), ossia dagli elementi della l-esima riga di AMAT. Ciascuna riga
di AMAT viene quindi riprodotta su tre records contenenti rispettivamente i valori
degli elementi dal primo al quinto, dal sesto al decimo, e dall'undicesimo al quat-
tordicesimo.
consente di acquisire N * M valori da attribuire agli elementi MAT(I, J) con
l I N e l J M. Gli stessi valori, nello stesso ordine, possono essere letti
con la sequenza di istruzioni
DO 100 J = l,M
DO 100 1 = l, N
READ *, MAT(I, 1)
100 CONTINUE
in cui si effettuano N * M operazioni di lettura anzich una sola. In entrambi i
casi gli elementi MAT (I, J) vengono letti per colonne in quanto, per ogni valore
dell'indice di colonna J, viene fatto variare l'indice di riga l. Volendo stampare per
righe questi valori si pu usare la frase
PRINT *, MAT(I, J), J = l, M), I = l, N)
oppure la sequenza di istruzioni
l
222
DO 200 1= 1, N
DO 200 J = l,M
PRINT-, MAT(I, J)
200 CONTINUE
In quest'ultimo caso si ha la stampa di N * M linee ciascuna contenente un solo
valore.
13.13. Le frasi READ (u, f) e WRITE (u, f)
Le frasi READ e PRINT considerate fino ad ora consentono di effettuare le
operazioni di I/O esclusivamente sulle unit standard. Cos, per esempio, se il
sistema utilizza come unit standard di ingresso e di uscita il terminale video, non
possibile usare queste frasi per leggere dati da un lettore di schede o riprodurre
i risultati sul foglio di carta di una stampante.
Per usare mezzi di I/O diversi da quelli standard, necessario ricorrere ad istru-
zioni di I/O nelle quali sia esplicitamente indicato quale mezzo di I/O deve essere
utilizzato.
A questo proposito si osservi che l'insieme dei records letti o scritti con una
istruzione di I/O del tipo visto fino ad ora costituisce un file esterno sequenziale
la cui trasmissione avviene attraverso le unit di I/O standard. Infatti, come sar
ulteriormente specificato nel cap. 18, un insieme di records costituiti da caratteri
interpretabili in base ad opportune specificazioni di formato un file. Un file
detto sequenziale se per accedere ad un suo record si deve scorrerlo tutto a par-
tire dal primo record, e viene detto esterno se contiene informazioni destinate ad
essere trasmesse mediante una qualunque unit di I/O.
Per individuare un qualunque file esterno si usa un numero intero non negativo
detto numero di unit, che consente anche di individuare il mezzo (unit) di I/O
che permette la trasmissione delle informazioni contenute nel file. In alcuni casi
la corrispondenza tra un file esterno, un numero di unit e un mezzo di I/O pu
essere prestabilita dal sistema e in altri casi possibile stabilirla mediante oppor-
tuni comandi dati al programma Iinker; in ogni caso tale corrispondenza pu
essere stabilita nel programma tramite l'istruzione OPEN (cfr. cap. 18). E' possi-
bile specificare il file, e quindi l'unit di I/O interessati da un'operazione di I/O
usando come frase di ingresso la seguente:
READ (u, f) lista-di-ingresso
e, come frase di uscita, la seguente:
WRITE (u, f) lista-di-uscita
dove:
223
- READ e WRITE sono le parole che identificano le frasi;
u un'espressione intera il cui valore, al momento dell'esecuzione della frase,
rappresenta il numero di unit del file oggetto dell'operazione. Se l'operazione
avviene tramite l'unit standard u pu essere un asterisco _;
f un identificatore di formato.
Esempio 13.38. Diamo alcuni esempi di istruzioni di ingresso sintatticamente cor-
rette:
READ (5, '(1013)') MI, M2, M3
READ (IR, '(1013)') MI, M2, M3
READ(K + l, '(1013)') MI,M2,M3
READ(-, '(1013)') MI,M2,M3
READ (7,100), MI, M2, M3
100 FORMAT (1013)
L'esecuzione delle frasi READ (u, f) e WRITE (u, f) avviene allo stesso modo
di quella delle frasi READ f e PRINT f (cfr. 13.9). Pertanto le istruzioni:
READ (-, f) lista-di-ingresso
WRITE (*, f) lista-di-uscita
sono equivalenti, nell'ordine, a:
READ f, Iista-di-ingresso
PRINT f, Iista-di-uscita
e le frasi:
READ r-, -) lista-di-ingresso
WRITE (-, -) lista-di - uscita
equivalgono alle frasi guidate dalla lista:
READ -, lista-di-ingresso
PRINT -, lista-di-uscita
13.14. Esempi di stampa di variabili dimensionate
Nel calcolo scientifico si presenta spesso la necessit di manipolare variabili
dimensionate di tipo numerico, a una o due dimensioni, e quindi di leggere e
stampare, tutti o in parte, i contenuti dei loro elementi. In generale la lettura
degli elementi di una variabile dimensionata non presenta particolari difficolt,
224
una volta stabilito l'ordine in cui si vogliono far leggere i dati. La stampa invece
pu presentare alcune difficolt, soprattutto se si vuole che l'insieme dei dati
stampati sia facilmente leggibile ed interpretabile. E' evidente che l'istruzione
di uscita guidata dalla lista in questo caso poco opportuna e che conviene invece
usare istruzioni di uscita che facciano riferimento ad una specificazione di forma-
to. Negli esempi che seguono si vuole mettere in luce quali siano le considerazioni
che generalmente possono essere fatte per stabilire una specificazione di formato
opportuna in base alla lista degli elementi che si devono stampare. In tutti gli
esempi supponiamo che la stampante sia identificata dal numero di unit 2 e che
le linee di stampa siano lunghe 80 caratteri.
Esempio 13.39. Vogliamo stampare i valori degli elementi di una matrice di tipo
intero il cui dichiaratore MAT (0:7,20:27). Si vuole che tali valori siano stam-
pati per righe, una riga su ogni linea di stampa, e che siano preceduti dall'intesta-
zione
STAMPA DI MAT PER RIGHE
Scegliendo il descrittore Il O per la stampa di ciascun elemento, e considerando
che ciascuna riga di MAT composta da 8 elementi, possibile descrivere la
struttura di una linea di stampa corrispondente ad una riga di MAT con la specifi-
cazione di formato (81 lO) come mostrato nella figura seguente.
INTEGER MAT(0:7,20:27)
DOlO 1=0,7
00 IO J = 20,27
MAT(I,J)=I.J
lO CONTINUE
WRlTE (2, '(30X, "STAMPAvDlvMATvPERvRlGHE" 130X, 23 (" - ") Il
(8110)') MAT (I, J), J = 20,27), I = 0,7)
END
STAMPA DI MAT PER RIGHE
225
Esempio 13.40. Sia REL una matrice reale con M righe e N colonne, con N > S.
Si vogliono stampare gli elementi di REL per righe.
Se si sceglie il descrittore E13.6 per stampare ogni elemento e si decide di se-
parare ogni valore dal successivo con due caratteri blank, abbiamo un totale di
15 caratteri occupati dalla rappresentazione del valore di ciascun elemento.
Pertanto, essendo ciascuna linea composta da 80 caratteri, potremo al pi stam-
pare 5 valori per linea, e siccome si supposto N > 5 saranno necessarie pi linee
di stampa per riprodurre ciascuna riga di REL. Consideriamo i due casi seguenti:
a) N un multiplo di 5; in tal caso ciascuna riga di REL pu essere riprodotta
esattamente su N/S linee successive;
b) N non un multiplo di 5; in tal caso ciascuna riga di REL pu essere ripro-
dotta su pi linee, di cui l'ultima contenente meno di 5 valori.
Nel caso a) la stampa di REL pu essere effettuata con un'unica operazione;
in fig. 13.7 si tratteggia un programma relativo alla stampa di una matrice REL
di 3 righe e IO colonne e si riportano le linee di stampa ottenute. Nel caso b)
conveniente eseguire tante operazioni di stampa quante sono le righe di REL;
in fig. 13.8 si riporta un esempio relativo ad una matrice REL di 3 righe e 12
colonne.
C STAMPA DI REL (M, N) CON N MULTIPLO DI 5
PARAMETER (M = 3, N == lO)
REAL REL (M, N)
DO lO I=I,M
DO lO J=I,N
IO REL(l,J)=ld+0.005
WRITE (2, ISO) N/5, REL(l, J), J = I, N ),1 = I, M )
ISO FORMAT(l4X,'STAMPAVDIVRELVPERvRIGHE',12,
'LlNEEvPERvCIASCUNAvRIGA' Il 5 (2X, E13.6)
END
STAMPA DI REL PER RIGHE, 2 LINEE PER CIASCUNA RIGA
Figura 13.7. Programma e stampa relativi al caso a) deU'esempio 13.40.
o o o o o o o
20 21 22 23 24 25 26
40 42 44 46 48 50 52
60 63 66 69 72 75 78
80 84 88 92 96 100 104
100 105 110 115 120 125 130
120 126 132 138 144 150 156
140 147 154 161 168 175 182
Figura 13.6. Programma e stampa relativi all'esempio 13.39.
o
27
54
81
108
135
162
189
0.100500E+Ol
0.600500E+01
0.200500E+Ol
0.120050E+02
0.300500E+Ol
0.180050E+02
0.200500E+01
0.700500E+Ol
0.400500E+01
0.140050E+02
0.600500E+01
0.210050E+02
0.300500E+01
0.800500E+01
O.G00500E+01
O.lG0050E+02
O.900S00E+01
O.2400S0E+D2
D.4DDSDDE+D1
0.9DDSDDE+Dl
D.8DDSDDE+Dl
D.18DDSDE+D2
D.12DDSDE+D2
D.270DSOE+D2
D.SDDSDDE+D1
0.lDDDSDE+D2
D.IDDDSDE+D2
D.2DDDSDE+D2
D.lSDDSDE+D2
D.30DDSDE+D2
Il
226
227
Figura 13.8. Programma e stampa relativi al caso b) dell'esempio 13.40.
'('fICAR (Nl : Nl) Il '110)'
RIGA 1
0.100500E+01 0.200500E+01 0.300500E+01 0.400500E+01 0.500500E+01
0.600500E+01 0.700500E+01 0.800500E+01 0.900500E+01 0.100050E+02
0.110050E+02 0.120050E+02
RIGA 2
0.200500E+01 0.400500E+01 0.600500E+01 0.800500E+01 0.100050E+02
0.120050E+02 0.140050E+02 0.160050E+02 0.180050E+02 0.200050E+02
0.220050E+02 0.240050E+02
RIGA 3
0.300500E+01 0.600500E+01 0.900500E+01 0.120050E+02 0.150050E+02
0.180050E+02 0.210050E+02 0.240050E+02 0.270050E+02 0.300050E+02
0.330050E+02 0.360050E+02
D020 I = l,MI
DO 20 J = I,NI
INT (I, J) = I J
20 CONTfNE
WRITE (2, '('tICAR(NI : Nl)11 '110)') INT(I, n. J =l. Nn.1 = I. MI)
END
Fipra 13.9. Propanma relativo ...aempio 13.41.
C ESEMPIO DI UTILIZZO DI SPECIFICAZIONI DI
C FORMATO VARIABILE
INTEGER INT (50,50)
CHARACTER 8 CAR
CAR = '12345678'
C LETTURA DI MI <; 50 E NI.;;; 80 'D
READ., MI, Nl
WRITE (2, 150) MI, NI
150 FORMAT(lOX, 'STAMPAvDELLAvSOTTOMATRICE (',12,','
12, ')VDIVINT, VPERvRIGHE')
STAMPA DELLA SOTTOMATRICE 5, 4) DI INT, PER RIGHE
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
5 lO 15 20
STAMPA DELLA SOTTOMATRICE 5. 6) DI INT, PER RIGHE
2 3 4 5 6
4 6 8 lO 12
6 9 12 15 18
8 12 16 20 24
lO 15 20 25 30
STAMPA DELLA SOTTOMATRICE 5. 8) DI INT. PER RIGHE
1 2 3 4 5 6 7 8
2 4 6 8 lO 12 14 16
3 6 9 12 15 18 21 24
4 8 12 16 20 24 28 32
5 lO 15 20 25 30 35 40
Figura 13.10. Esempi di stampe relative aD'esempio 13.41.
DO IO I=I,M
DO IO J=I,N
REL (I, J) = I J + 0.005
STAMPA DI REL(M, N), CON N MAGGIORE DI 5
E NON MULTIPLO DI 5
PARAMETER (M = 3, N = 12)
REAL REL (M, N)
END
WRITE (2,200) N/5 + I
FORMAT(l4X, 'STAMPAVDIVRELVPERvRIGHE, ',12,
'LINEE vPERvCIASCUNAv RIGA'I/)
DO 20. I = I. M
WRITE (2,150) I, (REL (I, J), J = I, N)
CONTINUE
FORMAT (IX, 'RIGA', I1/5(2X, EI3.6
STAMPA DI REL PER RIGHE, 3 LINEE PER CIASCUNA RIGA
c
c
Esempio 13.41. Data la matrice intera INT di SO righe e SO colonne, si vogliono
stampare per righe gli elementi INT (I, J), con l I M1 e 1 J N1, dove
M1 e N1 sono assegnati. Se si sceglie il descrittore 110 per ogni elemento, si pos-
sono stampare al pi 8 elementi per linea. Il programma tratteggiato in fig. 13.9
dimostra come si possono usare specificazioni di formato variabile (cfr. esempio
13.18) per stampare su ogni linea esattamente N1 valori, se N1 minore o uguale
di 8.
Nel programma ci serviamo dell'identificatore di formato costituito dall'espres-
sione carattere
IO
200
":
!t
I
20
150
I
l
228
229
dove CAR (N l : Nl) la sottostringa costituita dal carattere che in CAR occupa
la posizione Nl. Essendo CAR uguale a '12345678', il valore di CAR (NI : Nl)
proprio il numero intero Nl. Cos, se Nl vale 4, CAR (NI : Nl ) uguale a
'4' e la specificazione di formato equivalente a (4J l O), mentre se Nl vale 8, essa
equivale a (8110).
In fig. 13.10 si riportano le stampe ottenute con il programma di fig. 13.9
per MI = 5 e NI = 4. 6 e 8 rispettivamente.
13.15. Altri descrittori
Il descrittore Iw.m
II descrittore ripetibile IW.m individua un campo destinato alla rappresenta-
li
l
zione d. i un numero intero, in equivale a Iw. !.I dato viene )
. rappresenjatn nel campo di ampiezza w con almeno m cifre, di cui prime Yl:uali li
a zero se il numero composto da meno di m cifre. Cos, ad esempio, se I, J, K I)'
..... .. J
\ valgono rispettivamente 3, 22 e 546, la frase--
Esempio 13.42. La rappresentazione del numero - 2 x 10
15
che si ottiene con f'
il descrittore EI1.3E3 - 0.200E + 015, mentre lo stesso numero viene rap- ,
presentato come - 0.200E + 0015 se si usa il descrittore EI2.3E4.
I descrittori GW.d e GW.dEc
I descrittori ripeti bili GW.d e GW.dEc sono descrittori reali e sono quindi
equivalenti In Ingresso a tutti gli altri descrittori reali. In uscita essi si comportano
in modo diverso a seconda dell'ordine di grandezza del numero x che deve
essere rappresentato nel campo di ampiezza w.
Se Ix I< 0.1 oppure Ix I IO
d,
i descrittori Gw.d e Gw.dEc equivalgono a
Ew.d ed Ew.dEc rispettivamente.
Se l Oi-I Ix I< l o', con O i d, allora si - i
esterna uguale a quella prodotta da un descnttore Fw.d, con d - dIA
e 'ii = w - k, seguita da k caratteri blank, dove k = 4 per il descrittore Gw.d J\
mentre k =c + 2 per il descrittore GW.dEc.
PRINT '(314.2)', I, J, K
produce il record
Esempio 13.43. Nella seguente tavola si riportano le rappresentazioni esterne
di alcuni numeri reali ottenute in corrispondenza di diversi descrittori F, E, G.
vv03 vv 22 v546.
w d + c + 5.
E O... Ob
l
. b
r
con (c - r) cifre zero prima di bl" Se Ib I IO
c
, il descrittore EW.dEc non pu
essere usato e il campo viene riempito di asterischi. In ogni caso la rappresenta-
zione (13.2) implica che deve essere
dove al'" ad ed exp hanno lo stesso significato loro attribuito nella rap-
presentazione (13.1). Se la caratteristica b del dato in uscita esprimibile, in
base dieci, come bi'" b
r
ed r c (ossia Ib I< IO
r
, r c), allora in (13.2)
exp ha la forma seguente
Rappresentazione
F12.5 E12.5 G12.5 G12.5E3
interna
f1 (243762.0) 243762.00000 vO.24376E+ 06 vO.24376E+06 0.24376E + 006
f1 (-243762.0) ************ -0.24376E +06 -0.24376E +06 -.24376E + 006
f1 (-24376.2) -24376.20000 -0.24376E + 05 v-24376.vvvv -24376.vvvvv
f1 (-23.54) vvv-23.54000 -0.23540E + 02 v -23.540vvvv -23.540vvvvv
f1 (0.32693) vvvvvO.32693 v0.32693E + 00 vO.32693vvvv 0.32693vvvvv
f1 (0.021582) vvvvvO.02158 vO.21582E-01 vO.21582E-01 0.21582E -001
f1 (0.00021582) vvvvvo.ooozz vO.21582E-03 vO.21582E- 03 0.21582E - 003
O.a
l
... ad exp ( 13.2)
Il descrittore Ew.dEc
II descrittore ripetibile t:.w.dEc individua su un record di I/O un campo desti-
nato alla rappresentazione di un numero reale.!,!! ingresso, esso equivale a tutti
gli altri descrittori reali, mentre in uscita esso produceun" rappresentazione
deldato, diampiezza w, della forma
Quando, nella scansione di una specificazione di formato, si incontra il de-
scrittore l'operazione di I/O ha termine se stato trasmesso il valore di tutti
gli elementi della lista. Questo descrittore, che pu non essere seguito e preceduto
da virgole, utile essenzialmente per evitare che messaggi non desiderati venga-
no riprodotti sui records di uscita.
230
Il descrittore Lw
Il descrittore ripetibile Lw individua un campo di ampiezza w destinato alla
rappresentazione di un valore logico. In ingresso, il valore vero deve essere in
una delle forme T, . T , .TRVE. ed il valore falso in una delle forme F..F.
.FALSE.; questi caratteri possono essere seguiti da qualunque altro caratt.ere -nei
campo di ampiezza w loro riservato. In uscita i valori vero e falso sono rap-
presentati rispettivamente dai caratteri T e F preceduti da w - l caratteri blank.
Il descrittore (due punti)
231
I
i
;1
I

[
I
,
, I
i:
J descrittori Tn, TRn, TLn
l descrittori Tn, TRn, TLn sono chiamati descrittori di fabulazione in
quanto permettono di specificare, mediante la costante intera positiva senza
segno n che in essi compare, la posizione sul record corrente del successivo dato
da trasmettere. In particolare, il descrittore Tn indica che il campo relativo al
prossimo dato inizia con l'n-esimo carattere del record. Per spiegare invece
l'effetto dei descrittori TRn e TLn indichiamo con p la posizione sul record
corrente del carattere finale dell'ultimo campo utilizzato; il descrittore TRn
(TLn) indica allora che il campo destinato al prossimo dato inizia dalla posi-
zione p + l + n (p + l - n). In altre parole TRn e TLn specificano di quante
posizioni deve essere spostato, a destra e a sinistra rispettivamente, l'inizio del
campo successivo rispetto alla posizione (p + I)-esima. Il descrittore TRn quin-
di equivalente ad nX mentre TLn equivalente a TI se (p + l - n) l.
Esempio 13.44. Se I una variabile intera e CHAR una variabile carattere di lun-
ghezza 7, la frase
READ '(T5, 14, TL4, A7)', I, CHAR
viene cos eseguita. Il descrittore T5 causa un salto al quinto carattere del re-
cord corrente; il descrittore 14 viene poi associato alla variabile I il cui valore
viene letto nel campo che va dal quinto all'ottavo carattere del record. Il descrit-
tore TL4 indica che il campo relativo al dato successivo inizia a partire dalla
Quinta posizione del record corrente in quanto si ha p = 8 e n = 4. Il descrittore
A7 viene poi associato alla variabile CHAR il cui valore viene letto nel campo che
va dal quinto all'undicesimo carattere del record. In questo modo i caratteri pre-
senti sul record nelle posizioni 5, 6, 7, 8 vengono letti due volte e vengono inter-
pretati nei due casi in modi completamente diversi. Se ad esempio il record letto
composto dalla successione di caratteri
12341986/87ABCD
i valori assegnati alle variabili I e CHAR sono rispettivamente il numero intero
1986 e la stringa di caratteri 1986/87.
Esempio 13.45. Sia A un vettore reale i cui primi M elementi A(l), con l I M
ed M assegnato, sono definiti da A(l) = 2 I + 0.5. Si vogliono stampare i sud-
detti elementi, facendo precedere il valore di ciascuno di essi dal suo nome A( I ),
A(2), ecc.; inoltre il valore di un elemento deve essere separato dal nome del
successivo mediante una virgola.
Consideriamo a tale scopo la seguente istruzione dove si suppone che il numero
di unit 2 identifichi la stampante e che sia M 99:
WRITE (2,3) M, (I, A(I), I = I, M)
3 FORMAT (22X, 'STAMPAvDElvPRIMI', 12, 'vELEMENTIVDlvA'//
6 (IX, 'A(', 12, ') =', FS.! : '.')
Per effetto di tale frase vengono create una o pi righe di stampa, ciascuna
contenente i valori di 6 elementi di A secondo il formato richiesto; osserviamo che
la presenza del descrittore fra F5.1 e permette di non stampare la vir-
gola dopo il valore dell'ultimo elemento. Le righe di stampa contenenti i valori de-
gli elementi di A sono precedute da una riga in cui si segnala il numero di elementi
stampati. In fig. 13.11 si riportano le righe di stampa ottenute per M = 6 e M = IO
STAMPA DEI PRIMI 6 ELEMENTI DI A
Al 1)= 2.5. Al 2)= 4.5. Al 3)= 6.5, Al 4)= 8.5. Al 5)= 10.5. Al 6)= 12.5
STAMPA DEI PRIMI lO ELEMENTI DI A
Al 1)= 2.5. Al 2)= 4.5. Al )= 6.5. Al 4)= 8.5, Al 5)= 10.5. Al 6)= 12.5.
Al 7)= 14.5. Al 8)= 16.5. Al 9)= 18.5. AllO}= 20.5
Figura 13.11. Stampe relative all'esempio 13.45.
J descrittori BN e BZ
I descrittori non ripetibili BN e BZ possono essere usati per stabilire una con-
venzione sull'interpretazione dei caratteri blank successivi al primo non blank
nei campi numerici dei records di ingresso (cfr. 13.3). Pi precisamente, se in
una specificazione di formato viene incontrato il descrittore BN o BZ tutti i blanks
presenti nelle posizioni suddette nei campi individuati dai successivi descrittori
232
233
Se il descrittore Dw.d, Ew.d, oppure Ew.dEc, il valore di s deve soddisfare la re-
lazione - d < s";; d + l. Il campo prodotto in uscita se - d < s";; O ha la forma
seguente
Il descrittore sP
Il descrittore sP, dove s una costante intera, specifica un fattore di scala
che influisce sulle modalit di rappresentazione esterna dei numeri reali che
verranno trasmessi successivamente durante l'operazione di I/O. L'effetto di un
descrittore sP resta valido anche nel caso di riscansione della specificazione di
formato. In assenza di descrittori sP si intende che il fattore di scala zero.
In ingresso un fattore di scala s diverso da zero influisce soltanto sull'interpre-
tazione dei numeri reali che sono scritti sul record in una forma senza esponente;
infatti se y il numero scritto nel campo esso viene interpretato come y l O-s.
Per esemplificare quanto detto supponiamo di avere nel record di ingresso la strin-
ga 1525.; con la specificazione di formato (2P, FIO.O) la stringa viene interpretata
come il numero reale 1525.10-
2
, ovvero 15.25, mentre con la specificazione
(- 2P, FIO.O) viene interpretata come 1525.10+ 2, ovvero 152500.
In uscita l'influenza di un fattore di scala diverso da zero varia a seconda del
descrittore ripetibile associato al campo su cui il numero reale deve essere rap-
presentato. Se il descrittore Fw.d, allora il valore da scrivere nel campo ot-
tenuto moltiplicando per 10s il numero che deriva dalla conversione in base dieci
del dato. Cos, ad esempio, il valore - 4.3522 viene riprodotto come
di tipo numerico vengono ignorati o considerati zero rispettivamente. Ricordiamo
che in assenza di tali descrittori, i caratteri blank di cui stiamo trattando vengono
ignorati o considerati zero, a seconda della convenzione in atto per l'unit di in-
gresso usata (cfr. cap. 18). Osserviamo che l'effetto dei descrittori BN e BZ resta
valido anche quando la specificazione di formato viene nuovamente scandita. Ov-
viamente l'effetto di un descrittore BN viene annullato se, nel seguito della scan-
sione, si incontra un descrittore BZ, e viceversa.
Esempio 13.46. Se il record
12 vvvvvv 0.5E2 vl2vvvvvv 0.5E2
viene letto con la frase
READ '(BZ, 14, FIO.5, BN, 14, FIO.5)', I, A, J, B
i valori assegnati alle variabili I, A, J, B sono rispettivamente 1200, 0.5 x 10
2
,
12, 0.5 x 10
2

I descrittori S, SP, SS
l descrittori S, SP, SS possono essere usati in una specificazione di formato
relativa ad una istruzione di uscita per stabilire una convenzione riguardo alla
presenza o meno del segno + nella rappresentazione esterna dei numeri positivi.
In particolare, il descrittore SP indica che, in tutti i campi in cui deve essere rap-
presentato un numero positivo individuati dai successivi descrittori di tipo nume-
rico, deve essere presente il segno +; il descrittore SS indica che tale segno deve es-
sere omesso; infine il descrittore S indica che deve essere restaurata la convenzione
adottata dal sistema di calcolo. Lo standard F77 specifica che l'effetto di un
descrittore S, SP, SS resta valido anche in caso di riscansione della specificazione
di formato.
(13.3)
vvv-4.3522
v-435.2200
vvvv-.0435
se la specificazione di formato
se la specificazione di formato
se la specificazione di formato
(FIOA)
(2P, FIOA)
(- 2P, FIOA).
Esempio 13.47. Se le variabili LI, L2, L3 valgono rispettivamente 30, 31, 32,
la frase
con k = Isi cifre uguali a zero dopo il punto decimale; se invece O< s";; d + l,
allora il campo prodotto ha la forma seguente
PRINT '(IX, SP, 13, SS, 13, S,B)', LI, L2, L3
(13.4)
determina la creazione del seguente record:
v+30v31v32
se il sistema prevede di non riprodurre il segno +; altrimenti si ottiene il record:
v + 30v3I+32.
l
In (13.3) e (13.4) exp ha una delle forme previste per i descrittori Ew.d,
Dw.d ed Ew.dEc. Le cifre ai e il valore dell'esponente b espresso in exp in (13.3)
e (13.4) vanno cos interpretati: il valore espresso in base dieci del dato in memo-
ria , a meno di arrotondamenti sull'ultima cifra decimale, 0.0 ... Dal a
2

a
d
-
k
x lOb e al" . a
s
.a
s+
I ... a
d+
1 x IO
b
rispettivamente.
234
235
Esercizi
13.1. Individuare gli errori presenti nelle seguenti frasi:
READ '(3AIO)', CHAR (:10), CHAR (16:25), CHAR (26:)
READ '(5(A3, 13', (CHAR (I : I + 2). LOC(I), I = 1,13,3).
vvlvv2vv3vv4vv5vv6vv7vv8vv9vvO
21 FORMAT (13, F8.1, 14)
13.2 Data l'istruzione FORMAT:
PRINT 234, N, A(I. J), J = 1. N), I = l, N)
FORMAT (IX, 'NUMEROvDl vEQUAZIONI:'. 14//
IX, 'MATRICEvDELvSISTEMA:v'/5(2X, EI3.6
234
13.5 Scrivere le liste di I/O che comprendono:
a) tutti gli elementi di un vettore V di lunghezza 30;
b) gli elementi di posto pari di un vettore v di lunghezza 30;
c) gli elementi della seconda colonna di una matrice, TAV, di 8 righe e I O
colonne;
d) gli elementi di indici (1,1) di una matrice quadrata TAV con
N - M + l I N, N - M + I J N dove M < N;
e) gli elementi della I-esima riga di una matrice A di N righe ed Ncolonne.
13.4 Specificare Quanti records vengono prodotti con le seguenti istruzioni di
uscita se N vale lO:
13.6 Scrivere una opportuna frase di ingresso/uscita guidata dalla lista per ognu-
na delle seguenti richieste:
a) leggere un valore di N e i primi N elementi del vettore V il cui dichiara-
tore sia V(O : lO)
b) leggere un valore di N e la sottostringa costituita dagli ultimi N caratteri
di una variabile carattere;
c) scrivere gli elementi della J-esima colonna di una matrice MAT ognuno
moltiplicato per il corrispondente indice di riga, supponendo che il dichia-
ratore della matrice sia MAT ( IO, IO);
d) leggere le righe di ordine dispari di ciascun piano della variabile dimen-
sionata TRIO, il cui dichiaratore sia TRIO (9, IO, 4);
e) scrivere le potenze del 2 da 2
3
a 2
15
;
f) leggere le righe di indici l, 4, 7, lO della matrice STR il cui dichiaratore
sia STR (O: ro, O : 5);
g) scrivere in ordine inverso gli elementi di un vettore V il cui dichiaratore
sia V(20).
13.7 Scrivere alcune possibili istruzioni che permettono di stampare il messaggio
21, (N(I), X(I), M(I), I = l, lO)
21, N(I), X(5), M(7)
21, Kl
21, Kl, ALFA
21, (N(I), X(I), M(I), N(I + I), X(I + I), M(I + 1).1 = 2,9)
21, L(I, 1), Y(I, 1), K(I, 1), I = l, ioi, J = l, lO).
READ
READ
READ
READ
READ
READ
READ., X, Y, X + Y
READ ., '(513)', N, M
READ '(214, 2E13.6)', X, Y, K, J
READ., (X, Y)
READ ., A(I), I = l, N
READ (6,77) A(I, 1), I = l, N) J = l, N)
READ (6,77) A(I, 1) I = I, N, J = l, N)
PRINT. X, Y, X + Y
PRINT (5, '(2 D22.15)') DI, D2
WRITE (5, '(2 D22.15)'), D L D2
PRINT '(1 X, G13.5)', (X .. 2, X = 1.5)
PRINT, 250, X, Y
PRINT (., .) X, Y
WRITE (., 15) L +M
specificare quanti records vengono letti con ognunadelle seguenti frasi:
specificare il valore attribuito a ciascun elemento della lista delle seguenti
istruzioni di ingresso nell'ipotesi che i caratteri blank nei campi numerici
siano interpretati come cifre zero:
13.3 Sia LOC un vettore intero di 30 elementi e CHAR una variabile carattere
di lunghezza 30. Supponendo di leggere il seguente record di ingresso:
READ '(1013)', (LOC(I), I = 1,30)
READ '(516)', (LOC(I), I = 1,30)
LAvSOLUZIONEvDELvPROBLEMAvE':v
supponendo che la stampante sia associata al numero di unit 6.
236
13.8 Scrivere una frase FORMAT opportuna per ciascuna delle seguenti istru-
zioni READ, in base alle descrizioni dei records specificate per ognuna di
esse:
a) READ 1200, A, B, C, D
Ciascun record contiene nelle posizioni fra la Il-esima e la 20-esima com-
prese un numero reale in cui presente un punto frazionario;
b) READ 1200, A, B, C, D, E, F, G, D
Ciascun record composto da quattro campi di ampiezza 8; in ogni campo
scritto un numero reale sotto forma di costante intera senza punto deci-
male, ed ogni numero scritto nelle posizioni pi a destra del campo.
13.9. Scrivere una frase FORMAT opportuna per ciascuna delle seguenti istru-
zioni di uscita, in base alle descrizioni dei records specificate:
a) WRlTE (5, 1300) A, B. C, D
I dati devono essere stampati m campi di ampiezza 20 nella forma senza
esponente con due cifre dopo il punto decimale. Ogni dato deve essere
stampato su una riga a distanza di due righe dalla precedente;
b) WRITE (5, 1300) A, B, C, D
I dati devono essere scritti su una sola riga, ciascuno in un campo di ampiez-
za 13, nella forma con esponente con 6 cifre di mantissa. 11 primo dato
deve essere preceduto dalla stringa di caratteri A = , il secondo da B = ,
e cos via:
c) WRlTE (5, 1400) I, U, K, V, W, J, Z, Y, X
I dati devono essere scritti su tre linee. La prima linea deve contenere i
primi due dati, la seconda i tre successivi e la terza gli ultimi quattro. Ogni
numero intero deve essere scritto in un campo di ampiezza 6, mentre ogni
numero reale deve essere scritto in un campo di ampiezza lO con esponente
e 3 cifre di mantissa. Due campi consecutivi devono essere separati da 3
caratteri blank;
d) WRITE (5, 1500) I, J, (X(l), I = l, lO)
I primi due dati devono essere scritti su una riga in campi di ampiezza lO.
Deve poi seguire una riga contenente la stringa *** *** a
partire dalla Il-esima posizione. I successivi dati devono essere stampati 5
per riga, in campi consecutivi di ampiezza 20 separati da l carattere blank,
nella forma con esponente con 13 cifre di mantissa.
237
13.10 Sia CAR una variabile dimensionata carattere, ogni elemento della quale
ha lunghezza 4. Scrivere una frase di uscita che permetta di stampare gli
elementi di CAR indicati dalla lista con DO-implicito
CAR(I, 1), J = l, 8), I = l, 8)
su un quadrato cos strutturato: ciascuna linea contiene 8 valori ognuno
separato dal successivo mediante 6 caratteri blank; fra una riga e l'altra ci
sono 3 linee vuote. L'intero quadrato deve essere preceduto dal titolo
centrato rispetto al quadrato stesso.
13.11 Scrivere una frase di uscita che permetta di stampare la tavola pitagorica
da 5 a 9; gli elementi della tavola devono essere scritti in campi di ampiez-
za 3 e distanziati l'uno dall'altro mediante 2 caratteri blank. La tavola deve
essere preceduta dal titolo cen-
trato rispetto alla tavola stessa.
!i
il
li
Il
II
1
14
Definizione e utilizzazione
dei sottoprogrammi
14.1. Programma principale e sottoprogrammi
Nei capitoli precedenti stata sottolineata la notevole utilit delle funzioni
intrinseche che permettono di eseguire operazioni non elementari di uso molto
comune. D'altra parte possibile evidenziare diverse classi di problemi quali, ad
esempio, la risoluzione dei sistemi lineari algebrici o il calcolo degli autovalori
di una matrice la cui risoluzione richiesta comunemente nelle applicazioni
scientifiche. Gli algoritmi risolutivi di questi problemi possono essere trascritti
in FORTRAN in modo da costituire unit di programma distinte dette sottopro-
che vengono autonomamente compilate e che, essendo identificate me-
diante nomi simbolici, possono essere utilizzate da qualunque programma. Per-
tanto, un programma FORTRAN generalmente costituito da pi unit: una
di esse, detta prozramma prinEipa/e. gestisce l'utilizzazione di tutte le altre e non
viene utilizzata da nessun'altra unit; le altre, i sottoprograrnmi, sono invece uti-
lizzate da una o pi unit di programma e possono a loro volta utilizzare altri
sottoprogrammi. Per esemplificare, in modo semplice, quanto detto si consideri
l'esempio seguente:
Esempio 14.1. N studenti di un corso di laurea hanno sostenuto M esami ciascuno.
Si vuoI calcolare e stampare il voto medio riportato da ogni studente; inoltre, indi-
cata con mi la media dall'i-esimo studente, si vuole calcolare e stampa-
re la media globale p. =(1: m.)/N.
i= l I
Per risolvere questo problema si utilizza, evidentemente, il calcolo della media
aritmetica di un certo numero di valori noti. II procedimento per calcolare la me-
dia infatti utilizzato N + I volte: le prime N per determinare il voto medio mi
di ciascuno studente, l'ultima per determinare la media globale p.. Indicate con vi'
I i M, le votazioni riportate da ogni studente, un algoritmo risolutivo di que-
sto problema pu essere formulato come mostra la fig. 14.1 nella quale l'algo-
ritmo 14.1 fa riferimento (N + 1) volte all'algoritmo 14.2 utilizzandolo, ogni vol-
ta, con dati diversi: quando serve per calcolare la media dei voti riportati da uno
240
Algoritmo 14.1
1. Leggi:M, N
2. Per i =l, ..., N
2.1. Leggi: v
l'
., vM
2.2. Utilizza l'algontmo 14.2 per calcolare m.
3. Utilizza l'algoritmo 14.2 per calcolare Il. l
4. Scrivi: ml' .. " mN' Il.
S. Stop
Algoritmo 14.2
1. Dati: n, al' ..., a
n
2. Poni m =0
3. Peri= l, ..., n
l. Poni m = m +ai
4. Poni m = m/n
S. Risultato: m
6. Stop
Figura 14.1. Algoritmo risolutivo deU'esempio 14.1.
studente, i suoi dati n, al' a
2
, ..., a
n
corrispondono, rispettivamente, al nu-
mero M degli esami ed alle votazioni vI' v
2
' ..., v
M
riportate; quando invece
esso utilizzato per calcolare la media Il, allora deve usare come dati i valori
N, mI' m
2
, ..., mN" Per questo motivo, l'istruzione di lettura dei dati sostituita
nell'algoritmo 14.2 da una frase che mette in evidenza soltanto quali e quanti
valori devono essere acquisiti mentre l'istruzione di scrittura stata sostituita
da una frase che mette in evidenza il risultato fornito al termine dell'algoritmo.
La realizzazione in FORTRAN dei due algoritmi il programma richiesto dal
problema; esso risulta costituito dalle istruzioni che traducono l'algoritmo 14.1 e
che costituiscono il programma principale e dalle istruzioni relative all'algoritmo
14.2 che costituiscono il sottoprogramma.
Come gi stato accennato, ogni sottoprogramma pu utilizzare pi sottopro-
grammi e, a sua volta, pu essere utilizzato da altre unit di programma. L'orga-
nizzazione di un programma FORTRAN pu essere pertanto molto complessa
e, in ogni caso, sempre estremamente utile sapere come le diverse unit di pro-
gramma interagiscono tra di loro. La composizione e l'organizzazione di un pro-
gramma possono essere visualizzate graficamente mediante l'albero delle chiamate
(1) che costituito da pi blocchi uniti da frecce: ciascun blocco rappresenta
(I) Questo nome deriva dalla consuetudine di indicare con chiamata di un sottoprogranuua
la sua utilizzazione.
241
una unit di programma ed il nome dell'unit specificato all'interno del blocco;
se l'unit di programma chiama altre unit, il blocco che la rappresenta unito a
tutti i blocchi che rappresentano le unit utilizzate mediante frecce dirette verso
l'unit chiamata. In fig. 14.2 riportato un albero delle chiamate che mette in
evidenza l'organizzazione di un programma costituito da otto unit di programma:
un programma principale e sette sottoprogrammi. 11 programma principale utilizza
il sottoprogramma NOMEl il quale chiama tre sottoprogrammi: NOME2, NOME3
e NOME4. Il sottoprogramma NOME2 chiama a sua volta NOME3 mentre l'unit
NOME4 utilizza i due sottoprogrammi NOME5 e NOME2. Infine, NOME5 utilizza
NOME 6 e NOME7 mentre NOME2 richiama NOME6.
E' importante ricordare che il FORTRAN non un linguaggio ricorsivo e, per-
1111 un sottoprogramma no.-!!.py richiamare se stesso in " .
f(, attraverso l'utilizzazione di altri sottoprogrammi. Sono pertanto situazioni proibi-
il i
\ (
te quelle esemplificate in fig. 14.3. .
L'albero delle chiamate permette quindi di evidenziare quali e quante unit
di programma devono essere disponibili per produrre il programma in forma
eseguibile. L'esecuzione del programma inizia sempre con quella del programma
principale. Ciascun sottoprogramma viene eseguito in corrispondenza di un'oppor-
tuna istruzione mediante la quale vengono fomite al sottoprogramma le informa-
zioni necessarie alla sua esecuzione. Il momento in cui si effettua lo scambio di
informazioni necessarie alla esecuzione di un sottoprogramma verr detto (l!tiva-
del sottoprogramma e diremo invece uscita dal sottoprogramma il momento
in cui, terminata l'esecuzione del sottoprogramma, i risultati da esso ottenuti
sono disponibili per l'unit chiamante (detta anche unit attivante). L'esecuzione
di ogni unit di programma avviene quindi in modo sequenziale fino a che non si
incontra una frase che provoca l'attivazione di un sottoprogramma. Per effetto di
Figura 14.2. Esempio di albero delle chiamate.
242 243
INOME l H NOME 11
la fine dell'esecuzione del sottoprogramma, il corpo del sottoprogramma eviden-
ziato in fig. 14.4 dal blocco tratteggiato.
Figura 14.3. Esempi di situazioni ricorsive proibite in FORTRAN.
14.2. La prima istruzione di un sottoprogramma
Oltre alle funzioni intrinseche, in F77 sono previsti sottoprogrammi di tipo
SUBROUTINE, FUNCTION e BLOCK DATA che si distinguono mediante la
parola chiave specificata nella loro frase iniziale. In questa frase viene anche indi-
cato il nome che individua il sottoprogramma distinguendolo dalle altre unit che
costituiscono un programma. Un altro compito importante spesso riservato alla
prima frase di un sottoprogramma quello di permettere lo scambio di informa-
zioni con l'unit di programma chiamante. Questo scambio pu infatti essere
realizzato mediante l'associazione di due liste di nomi: quella degli argomenti at-
tuali, specificata nella frase che permette l'attivazione del sottoprogramma, e
quella degli argomenti muti specificata nella prima istruzione del sottoprogram-
ma. In generale diremo che un argomento muto ed un argomento attuale sono
associati quando identificano la stessa informazione. L'associazione tra le due li-
ste di momento dell'attivazione del sottoprogrammaquando
il primoa!gomento associato al primo argomento muto, il secondo ar-
gomento attuale al secondo. argomento muto e cos via fino all'ultimo argo-
mento attuiiie che- alhltlmo argomento muto. Facendo riferimento al-
IYesempo 14.] del paragrafo precedente, un sottoprogramma che calcola la media
m di n valori noti al' a
2
, ..., a
n
basandosi sull'algoritmo ]4.2 deve iniziare con
una frase che ne specifica il nome e che pu contenere, quali argomenti muti, i
nomi che identificano i dati n, al' ..., a
n
ed il risultato m. L'attivazione di questo
sottoprogramma avverr utilizzando in modo opportuno il suo nome e facendo
corrispondere alla lista degli argomenti muti quella degli argomenti attuali nella
quale devono essere specificati i nomi che identificano, nell'unit di programma
chiamante, gli effettivi valori di cui si vuoi calcolare la media. AI momento della
attivazione del sottoprogramma gli argomenti muti vengono associati a quelli at-
tuali ed il sottoprogramma viene pertanto eseguito usando come dati i valori iden-
tificati dagli argomenti attuali.
Quanto detto mette in evidenza che una corretta utilizzazione di un sottopro-
gramrna non pu prescindere dalla conoscenza del significato degli argomenti
muti. In particolare useremo talvolta il termine argomento muto di ingresso per
mettere in evidenza il fatto che un argomento identifica una informazione tra-
smessa dall'unit di programma attivante al sottoprogramma; indicheremo invece
con il termine argomenti muti di uscita gli argomenti che identificano le informa-
zioni definite all'interno del sottoprogramma che vengono trasmesse in uscita al-
l'unit di programma chiamante. Evidentemente i risultati forniti da un sotto-
Unit di programma
chiamata
Blocco di
istruzioni
Blocco di
istruzioni
Unit di programmo
chiamante
Riferimento al sottoprogramma
Figura 14.4. Trasferimento del controUo dell'esecuzione tra unit di
programma chiamante e unit di programma chiamata.
questa frase il controllo dell'esecuzione trasterito dall'unit attivante a quella at-
tivata fino al momento dell'uscita dal sottoprogramma quando l'unit chiamante
riprende il controllo dell'esecuzione. Quanto detto pu essere sinteticamente sche-
matizzato come in fig. 14.4 dove il verso delle frecce indica il flusso di esecuzione
e istruzione di ritorno sta ad indicare una istruzione che determina la fine dell'e-
secuzione del sottoprogramma ed il trasferimento del controllo alla unit chia-
mante. Si osservi che, mentre la frase iniziale di un sottoprogramma unica,
quella che determina il ritorno all'unit chiamante pu non essere unica esatta-
mente come in un programma principale pu non essere unica la frase STOP che
determina la fine della sua esecuzione. Le situazioni che determinano il ritorno
all'unit di programma chiamante sono descritte ne] blocco di istruzioni che
seguono la prima frase e che costituiscono, insieme con le frasi che determinano
244
programma fanno parte degli argomenti di uscita. Si osservi che un argomento
pu essere sia di ingresso che di uscita quando identifica una informazione che,
trasmessa come dato dall'unit di programma attivante, viene poi modificata
durante l'esecuzione del sottoprogramma.
Nel seguito useremo talvolta i termini parametri attuali e parametri muti in
luogo di argomenti attuali e argomenti muti rispettivamente.
14.3. Il corpo di un sottoprogramma e l'istruzione RETURN
Il corpo di un sottoprogramma costituito da tutte le istruzioni che seguono
la prima. Esso deve c:ontenere tutte.le.frasi per una corretta ed auto-
noma compi/azione del sottoprogramma. In particolare, qualorasian()uTilizz-ati
di essere presenti nel corpo del sottopro-
gramma le opportune frasi di specificazione che possono riguardare anche nomi
presenti nella lista degli argomenti muti. Analogamente, possono seguire la prima
frase tutte le istruzioni di specificazione di tipo. lLcorpo di un sottoprogramma
terminare con t'tstrustane. il cui quellB
di la fine delle istruzioni che costituiscono una unit di programma.
--Si osservi che in un
senso che essere in di programma
distinte con significati completamente diversi. __.__ __
Com stato evidenziato anche in fig. 14.4 il corpo del sottoprogramma deve
contenere almeno una istruzione che ne interrompe l'esecuzione e trasferisce il
controllo all'unit chiamante. Tale istruzione, nella sua forma pi semplice,
costituita dalla sola parola chiave
RETURN
Un'altra forma di questa istruzione, utilizzabile per soltanto nei sottoprogrammi
SUBROUTINE. sar vista nel capitolo seguente.
Si osservi che in F77 la sequenza di istruzioni
RETURN
END
equivalente alla sola frase
END
Pertanto in F77 un sottoprogramma pu non contenere la frase RETURN che in-
vece era obbligatoria in F66. Come gi stato osservato il ruolo della frase
RETURN in un sottoprogramma analogo a quello della istruzione STOP nel
programma principale. A tale proposito si osservi che, mentre la frase RETURN
245
non deve far parte di un programma principale, l'istruzione STOP pu essere
utilizzata anche in un sottoprogramma ed il suo effetto quello di interrompere
l'esecuzione del sottoprogramma senza provocare il rientro nell'unit di program-
ma chiamante. In altri termini, l'esecuzione di una frase STOP all'interno di un
sottoprogramma causa la fine dell'esecuzione dell'intero programma.
14.4. I sottoprogrammi SUBROUTlNE e la frase CALL
I sottoprogrammi SUBROUTINE permettono di realizzare qualunque algo-
ritmo il cui risultato pu essere costituito da pi di un valore.
La prima istruzione
La prima frase di un sottoprogramma SUBROUTlNE ha la forma seguente:
SUBROUTINE nome (m" 01
2,
.. " m
n
)
dove:
SUBROUTINE la parola chiave che identifica la frase;
nome un nome simbolico e costituisce il nome di sottoprogramma; esso
non deve comparzre_!!! ----
mI' m
2
, ..., m
n
sono gli argomenti muti del sottoprogramma. Ogni argomento
muto pu essere un nome di variabile, un nome di variabile dimensionata un no-
me di un asterisco. Gli argomenti muti costituiti da
bolici devono essere tutti distinti.
Un sottoprogramma SUBROUTINE pu non avere argomenti muti; in questo
caso la prima istruzione pu assumere una delle forme seguenti:
SUBROUTlNE nome t
SUBROUTlNE nome
Esempio 14.2. Sono sintatticamente corrette le istruzioni:
SUBROUTINE SIST(A, N, X, Y)
SUBROUTINE COPIA(A, B)
SUBROUTINE UN (XPl, XM2, SIGMA,*, -. *)
SUBROUTINE STAMPA
Sono invece sbagliate le seguenti:
SUBROUTINE TRASP(A(l), N, X)
SUBROUTINE LISTA(X, Y, 5)
SUBROUTINE TEST(A, B, A+ B)
SUBROUTINE ESPER(X(4:), PAR)
Queste frasi infatti contengono, rispettivamente, un nome di elemento di varia-
bile dimensionata, una costante, una espressione, un nome di sottostringa.
!
,I
!
, I
246
Esempio 14.3. Il sottoprogramrna MAXMIN di fig. 14.5 permette di calcolare
il massimo ed il minimo fra tre numeri reali a, b, c. Gli argomenti muti del sotto-
programma sono A, B, C, MAX, MIN: i primi tre sono i nomi usati nel sottopro-
gramma per indicare le tre quantit a, b e c rispettivamente, mentre MAX e MIN
sono i nomi usati per indicare il massimo ed il minimo.
Confrontando il sottoprogramma di fig. 14.5 con il programma principale del-
l'esempio 9.12 si pu notare che la frase STOP stata sostituita dalla RETURN
e che le frasi di ingresso/uscita sono state eliminate in quanto le informazioni
relative ai dati e ai risultati vengono trasmesse tramite la lista degli argornenn
muti.
SUBROUTINE MAXMIN (A, B, C, MAX, MIN)
REAL A, B, C, MAX,MIN
IF (A.GT.B) THEN
MAX=A
ELSE
MAX=B
ENDIF
IF (C.GT.MAX) THEN
MAX=C
ENDIF
IF (A.GT.B) THEN
MIN=B
ELSE
MIN=A
ENDIF
IF (C.LT.MIN) THEN
MIN=C
ENDIF
RETURN
END
Figura 14.5. Sottoprogramma per il calcolo del massimo e del minimo fra tre valori reali.
Esempio 14.4. Si vuole scrivere un sottoprogramrna che permetta di calcolare la
radice quadrata di un numero positivo x usando l'algoritmo di fig. 10.6.
L'esempio 10.14 fornisce un programma principale che risolve questo stesso
problema e che prevede operazioni di scrittura diverse per evidenziare il risultato.
Il sottoprogramma che viene ora richiesto pu essere realizzato in modo da tra-
247
smettere in uscita tutte le informazioni relative al risultato ottenuto affinch l'uni-
t di programma chiamante possa utilizzare tali informazioni per eseguire qualun-
que tipo di operazione sul risultato, comprese quelle di scrittura previste nell'e-
sempio 10.14. Per informare l'unit chiamante sul tipo di risultato ottenuto si
pu prevedere, tra le informazioni in uscita, il valore di una variabile IND che nel
corpo del sottoprogramma viene posta uguale a zero se verificata la condizione
1m2 - x I.,;;; G, uguale ad l in caso contrario. Il sottoprogramma richiesto stato
chiamato RADQ, di tipo SUBROUTINE ed utilizza nove argomenti muti il
cui significato specificato mediante opportune frasi di commento.
I
SUBROUTINE RADQ(X, SIGMA,NIT, SX, DX,IND, RAD, ERR, IT)
C SOTTOPROGRAMMA PER ILCALCOLODELLARADICEQUADRATA DI X> O
C ARGOMENTI MUTI DI INGRESSO:
C X : NUMERO POSITIVODI CUI SI VUOLCALCOLARE LA RADICE
C SIGMA: TOLLERANZAPER IL CRITERIO DI ARRESTO
C NIT: NUMEROMASSIMO DI ITERAZIONI
C ARGOMENTI MUTI DlINGRESSO/USCITA:
C SX IN INGRESSO: NUMERO REALE MINOREDI X
C DX IN INGRESSO: NUMERO REALEMAGGIORE DI X
C ADOGNI ITERAZIONEIL VALOREDI SXO DI DXVIENE MODIFICATO
C ARGOMENTI MUTI DI USCITA:
C IND: VARIABILEDI CONTROLLO CONI SEGUENTIVALORI
C = OSE IL CRITERIO DI ARRESTOE' SODDlSFATTO
C = I ALTRIMENTI
C RAD: PER IND= OE' L'APPROSSIMAZIONE DELLARADICEDI X
C ERR : PER IND= OE' L'ERRORE ABS(RAD .. 2 - X)
C IT : PER IND = OE' IL NUMERO DI ITERAZIONI ESEGUITE
C PER IND = l I VALORI DI RAD, ERR, IT SONOQUELLI RELATIVI
C ALL'ULTIMA ITERAZIONEESEGUITA.
DO 150 IT = l, NIT
RAD= SX + 0.5 (DX - SX)
ERR = ABS(RAD .. 2 - X)
IF (ERR.LE.SIGMA) THEN
IND=O
RETURN
ELSE IF (RAD .. 2.GT.x) THEN
DX=RAD
ELSE
SX = RAD
END IF
150 CONTINUE
IND= l
END
Esempio 14.5. L'algoritmo di fig. 14.6 risolve l'equazione ax
2
+ bx + c =O, con
a *" O. Nell'algoritmo si considera nullo qualunque valore del discriminante
Riferimento ad un sottoprogramma SUBROUTlNE
Un sottoprogramma SUBROUTINE viene chiamato mediante una frase esegui-
bile la cui forma la seguente:
dove:
CALL la parola chiave che identifica la frase;
nome il nome del sottoprogramma che si vuole attivare;
al' a
2
, ..., a
n
sono gli argomenti attuali ciascuno dei quali pu essere costitui-
to da un nome di variabile, un nome di variabile dimensionata, un'espressione, un
nome di un altro sottoprogramma, uno specificatore di ritorno alternativo (cfr.
cap. 15). Il numero !kg!i argomenti attuali deve coincidere con quello degli argo-
menti muti del chiamato. _- -- - - __o - ..-- - ---- ------ .-.-.
Se-if-sottoprogramma chiamato non ha argomenti muti la frase CALL pu
avere una delle forme seguenti:
CALL nome ( )
CALL nome
L'effetto dell'esecuzione di una frase CALL quello di attivare il sottopro-
gramma il cui nome specificato nella frase e di riprendere il controllo dell'ese-
cuzione al momento dell'uscita dal sottoprogramma.
248
1. Dati: a"* O, b, c, e > O
2. Poni 6 = b
2
- 4 ac
3. SeI61";f,allora: poni ind e 1;
poni XI =- b/2a;
poni X2 = XI;
esegui 4.
altrimenti: se 6> e, allora: poni ind = 2;
se b <O, allora: poni s = - 1
altrimenti: poni s =+ 1
poni XI =- (b + s -Ji.)/2a;
poni X2 = c/(a xj );
esegui 4.
altrimenti: poni ind = O;
poni XI =- b/(2a);
poni X2 =....et;/(2a),
esegui 4.
4. Risultati: ind, XI, X2
5. Stop.
Figura 14.6. Algoritmo per la risoluzione di 0
2
+ bx + c = Ocon a"* O.
t:. = b
2
- 4 ac tale che It:. IE;;; f, con f> Oassegnato dipendente dalla precisione
di macchina; inoltre, t:. considerato positivo se t:. > e e negativo se t:. <- f. Al
termine dell'algoritmo i risultati sono i seguenti:
ind = O se l'equazione non ha radici reali ovvero se t:. <O;
ind = l se l'equazione ha radici reali coincidenti ovvero se t:. =O;
ind = 2 se l'equazione ha radici reali distinte ovvero se Is >O;
Xl e x
2
sono le radici dell'equazione se ind = l oppure ind = 2, mentre se
ind =O esse sono rispettivamente la parte reale e quella immaginaria delle due
radici complesse coniugate Xl i x
2

Si osservi che le eventuali radici reali e distinte dell'equazione vengono calcolate


secondo le formule
Xl =- (b + sign (b) Vi.)/2:+
x
2
=c/(a Xl)
per limitare la propagazione degli errori di arrotondamento [lO].
Basandosi sull'algoritmo di fig. 14.6 si pu scrivere il seguente sottoprogramma,
SOLV2, i cui argomenti muti A, B, C, EPS, Xl, X2, IND rappresentano rispet-
tivamente a, b, c, e, xl' x
2
' ind.
l
c
C
SUBROUTINE SOLV2 (A, B, C, EPS! Xl, X2, IND)
RISOLUZIONE DI UN'EQUAZIONE DI SECONDO GRADO
A X u 2 + B X + C = O, CON A DIVERSO DA ZERO
DELTA=Bu2-4. A.C
IF (ABS(DELTA).LE.EPS) THEN
IND = 1
XI =-0.5. B/A
X2 =Xl
ELSE IF (DELTA.GT.EPS) THEN
IND = 2 \
IF (B.LT.O.) THEN
S=-1.
ELSE
S=+1.
ENDIF
XI = - 0.5. (B + S. SQRT(DELTA/A
X2 = C/(A. XI)
ELSE
IND = O
XI =-0.5. B/A
X2 = + 0.5. SQRT (- DELTA)/A
END IF
RETURN
END
249
250 251
SUBROUTINE PROVA (X, N, Y)
SUBROUTINE RADQ (X, SIGMA, NIT, SX, DX, IND, RAD, ERR, IT)
Esempio 6. Dato il sottoprogramma definito dalla frase
Il programma richiesto pu essere il seguente:
PROGRAM VALOR]
C CALCOLO DE] VALORI l/SQRT(N), N = 2, ...,50
C SI UT]L1ZZA ]L SOTTOPROGRAMMA RADQ
C NEL PROGRAMMA PRINCIPALE GLI ARGOMENTI ATTUALI
C HANNO GLI STESS] NOMI DE] CORR]SPONDENT] ARGOMENTI
C MUT] AD ECCEZ]ONE DI X AL QUALE CORRISPONDE RN
READ ., S]GMA, NIT
PRINT 1000, S]GMA, NlT
DO 100 N =2, SO
RN=N
SX= l.
DX = N/2. + l. I
CALL RADQ (RN, S]GM.\, NlT, SX, DX, IND, RAD, ERR,lT)
IF (IND.EQ.l) THEN
PRINT 1500, N
ELSE
VAL= l./RAD
PRINT ]600, N, VAL, ERR, lT
END ]F
100 CONTINUE
STOP
1000 FORMAT (lX, 'TOLLERANZA:', EI3.6/
l IX, 'NUMERO MASSIMO DI lTERAZIONI:', BI)
1500 FORMAT (lX,'PER N =',12/
l IX, 'NON E" SODDISFATTO IL CRITER]O DI ARRESTO')
1600 FORMAT (lX,'PER N =', ]2/
1 ]X, 'VALORE CALCOLATO:', E13.6/
2 IX, 'ERRORE COMMESSO:', E13.6/
3 IX, 'NUMERO DI ITERAZ]ONI ESEGUITE:', 13).
END
Si osservi che il sottoprogramma RADQ utilizza un argomento di tipo reale, X,
per indicare la quantit di cui si vuoi determinare la radice quadrata. Ad X deve
quindi corrispondere un argomento attuale di tipo reale; da qui la necessit di
assegnare, prima di ogni attivazione del sottoprogramma, alla variabile reale RN
il valore di N. Gli altri argomenti muti utilizzati dal sottoprogramrna corrispondo-
no, nel programma chiamante, ad argomenti attuali che hanno il loro stesso nome
e, mentre i valori di SIGMA e di NIT vengono definiti una sola volta nel program-
ma chiamante mediante una frase di lettura, quelli di SX e di DX devono essere
definiti prima di ogni chiamata del sottoprogramma in quanto essi vengono mo-
dificati durante l'esecuzione di RADQ. Dopo l'esecuzione del sottoprogramma
i risultati sono disponibili come valori degli argomenti attuali IND, RAD, ERR e
IT; in particolare il valore di IND viene usato dopo l'esecuzione della frase CALL
per effettuare operazioni di stampa diverse ciascuna delle quali metta in evidenza
le caratteristiche dei risultati ottenuti.
perch la lista degli argomenti attuali composta da
due soli elementi;
perch, se Y di tipo reale, il secondo argomento at-
tuale non dello stesso tipo del corrispondente argo-
mento muto.
CALL PROVA (X, N)
CALL PROVA (X, Y, Z)
CALL PROVA (A, M, Y)
CALL PROVA (X + Y, L, Z)
CALL PROVA (X, 15, Y)
CALL PROVA (X, N + l, Y)
CALL PROVA (A(3), N, 8(7
CALL PROVA (R(J), L, S(N + 2
Esempio 14.7. Si vuoI scrivere un programma per calcolare e stampare i valori
per n = 2, 3, ..., 50.
Il problema pu essere risolto usando il sottoprogramma descritto nell'esem-
pio 14.4 definito dalla frase iniziale:
dove X ed Y sono nomi di variabili reali ed N quello di una variabile intera, sono
formalmente corrette le seguenti chiamate:
Con riferimento allo stesso sottoprogramma sono invece sbagliate le seguenti
frasi CALL:
L'attivazione del sottoprogramma avviene associando, nell'ordine, gli argo-
menti attuali al' a
2
, ..., a
n
a quelli muti mI' m
2
, ... , m
n
Per una asso-
ciazione tra gli argomenti attuali e quelli muti occorre che ogni a. sia dello stesso
I _. __ -
tipo delcorrispondente mi; inoltre, se mi il nome di un sottoprogramma anche
ai deve esserlo mentre s-e mi un asterisco, allora ai deve essere uno specificatore
di ritorno alternativo. In altri termini, le due liste di argomenti devono accordarsi
in ordine. numero e tipo.
r Al momento dell'esecuzione di una frase CALL gli argomenti attuali corrispon-
l)
denti agli argomenti muti di ingresso devono contenere le informazioni necessarie : I
I. all'esecuzione del sottoprogramma. Dopo l'esecuzione del sottoprograrnrna, l! \1
Il risultati ottenuti sono disponibili per l'unit chiamante come valori degli argo- ili
, j
menti attuali corrispondenti agli argomenti muti di uscita. Ii
I
,I
I
252
253
tipo FUNCTION nome ( )
Esempio 14.9. Sono formalmente corrette le seguenti frasi iniziali:
REAL FUNCTION MEDIA (V, N)
INTEGER FUNCTION FUNZ(X, Y)
FUNCTION FATT(N)
FUNCTION EPSM ( )
CHARACTER * 8 FUNCTION LISTA(CAR)
FUNCTION tipo
dove:
tipo uno specificatore di tipo che pu essere omesso; se presente, esso deve
coincidere con uno degli specificatori INTEGER, REAL, DOUBLE PRECISION,
COMPLEX, LOGICAL oppure CHARACTER *Q;
FUNCTION la parola chiave che identifica la frase;
nome un nome simbolico che costituisce il nome del sottoprogramma;
m}' m
2
, .. "' m
n
sono gli argomenti muti che devono essere tutti distinti; ogni
argomento muto pu essere un nome di variabile, di variabile dimensionata o di
sottoprogramma.
Se il sottoprogramma FUNCTION non prevede argomenti muti, la sua prima
frase deve avere la forma:
PROGRAM MAIN
REAL MAX,MIN
READ'(3FlO.2)', X, Y, Z
CALL MAXMIN (X, Y, Z, MAX,MIN)
IF (MAX.NE.O.) THEN
READ '(F 10.2)', EPS
CALL SOLV2(MAX, MIN, 1., EPS, Xl, X2,IND)
PRiNT 1000, MAX, MIN, 1., IND
ELSE
PRiNT 2000
END IF
STOP
1000 FORMAT (IX, 'COEFFICIENTI DELLAEQUAZIONE:',3(2X, E13.6)/
1 IX, 'NUMERODI RADICI REALI:', 12)
2000 FORMAT (IX, 'L"EQUAZIONE E" DI PRIMOGRAOO')
END
Esempio 14.8. Si vuoi scrivere un programma che permetta di stabilire il numero
di radici reali distinte dell'equazione di secondo grado ax
2
+ bx + l = O dove a
e b sono rispettivamente il massimo ed il minimo di tre valori dati x, y e z.
Il programma richiesto pu utilizzare i sottoprograrnrru MAXMIN e SOLV2
gi descritti rispettivamente negli esempi 14.3 e 14.5 e pu essere realizzato nel
modo seguente:
Nel programma MAIN l'esecuzione della frase
CALL MAXMIN (X, Y, Z, MAX, MIN)
permette di calcolare il massimo, MAX, ed il minimo, MIN, dei tre valori dati.
L'esecuzione del programma prosegue poi con il controllo sul valore di MAX: se
MAX uguale a zero si esegue l'operazione di scrittura che provoca la riprodu-
zione del messaggio: L'EQUAZIONE E' DI PRIMO GRADO e il programma
termina; altrimenti si legge il valore della variabile EPS e si attiva il sottoprogram-
ma SOLV2 per risolvere l'equazione di secondo grado ax
2
+ bx + c =Ocon a =
=MAX, b = MIN, c = 1.
14.5. I sottoprogrammi FUNCTION
I sottoprogrammi di tipo FUNCfION hanno lo scopo di
chefomiscono come risultato un valore. Per questo motivo tali sottopro-
grammi sono detti anche funzioni esterne e il loro risultato detto valore della
funzione.
La prima istruzione
La prima frase di un sottoprogramma di tipo FUNCfION una istruzione non
eseguibile che ha la forma
Il valore di un sottoprogramma FUNCTION ed il suo tipo
Diversamente da quanto detto per il nome di un sottoprogramma SUBROUTlNE
il nome di una funzioneestema deve comparire come nome di variabile nel
corpo della stessa almeno in una frase eseguibile che ne definisca il valo-
re, Il nome di unl! esterna li! !iella quale viene
memorizzato il risultato del sottoprogramma, ovvero il valore della funzione:
II--tipo-dellavarlabile il nome della funzione ovvero il
tipo del suo valore, detto tipo della funzione, e pu essere dichiarato esplicita-
mente nella prima frase mediante lo specificatore di tipo in essa contenuto.
La specificazione del tipo di una funzione esterna pu avvenire arlC11-fcorpo
del sottoprogramma mediante un'opportuna frase dichiarativa. Cos, ad esempio,
l'istruzione
REAL FUNCTION MEDIA (V, N)
specifica che il sottoprogramma FUNCTION fornisce un risultato reale in quanto
il nome MEDIA di tipo reale; lo stesso effetto sarebbe stato ottenuto con la
sequenza di istruzioni
FUNCTION MEDIA (V, N)
REAL MEDIA
l
254
255
L'unico risultato del sottoprogramma EPSM e la lista degli argomenti vuota
perch non ci sono dati in ingresso.
Esempio 14.12. Scrivere un sottoprogramma che, data la coppia di valori (x. v),
calcoli il valore z = ftx, y) con
altrimenti
per Oe y O
Il seguente sottoprogramrna, di nome ZETA, risolve il problema dato; i due
argomenti muti rappresentano la coppia di dati x ed y e ZETA contiene, al ter-
mine dell'esecuzione del sottoprogramrna, il valore ft x, y).
REAL FUNCTION ZETA (X, Y)
REAL X,Y
IF (X.LT.O..OR.Y.LT.O.) THEN
ZETA = SQRT (EXP(X +SQRT (EXP(Y
ELSE
ZETA = SQRT(X) +SQRT(Y)
END IF
RETURN
END
REAL FUNCTION EPSM( )
C CALCOLO DELLA PRECISIONE DI MACCHINA
EPSM = 1.
lO EPSM=0.5 EPSM
A = 1. + EPSM
IF (A.GT.1.) GO TO lO
EPSM=2. EPSM
RETURN
END
f(x, y) =
Esempio 14.13. La seguente funzione esterna calcola una stima della precisione
di macchina m disponibile su un elaboratore quando si lavora in precisione sem-
plice. L'algoritmo si basa sulla considerazione che la precisione di macchina pu
essere stimata come il pi piccolo numero positivo che, sommato ad l, viene
sentito dall'elaboratore (cfr. [9], [IO]).
Si osservi che il nome FATI del sottoprogramma compare pi volte nel corpo
della funzione; la prima volta il suo valore posto uguale ad l; successivamente,
se n > l, il contenuto di FATI viene modificato all'interno del ciclo-DO in modo
che, alla fine del ciclo, FATI contiene il valore n!
Esempio 14.11. Si vuoI scrivere un sottoprogramma che calcola il fattoriale n!
di un numero intero n O. Ricordiamo che n! definito da:
I sen=O
n'=/
. "il i se n >O
i= l
Esempio 14.10. La sequenza di istruzioni
(
l' jREAL FUNCTION VAL (A, B) iiI l
l DOUBLE PRECISION (R - Z) v V\.
definisce una funzione di nome VAL e di tipo reale; tutti i nomi simbolici presenti
nel corpo del sottoprogramma le cui lettere iniziali siano comprese, nell'ordina-
mento alfabetico, tra R e Z sono di tipo doppia precisione ad eccezione del nome
VAL. Lo stesso effetto ottenuto con la sequenza:
FUNCTION VAL (A, B)
IMPLICIT DOUBLE PRECISION (R - Z)
REAL VAL
In F66 il tipo di una funzione esterna non poteva essere specificato nel corpo
del sottoprogramrna, ma solo nella prima frase.
Si osservi che il valore da calcolare cresce rapidamente al crescere di n; pertanto
opportuno valutare n! usando l'aritmetica reale in modo da limitare la possi-
bilit di overflow. Il sottoprogramma richiesto pu essere quindi una funzione
esterna identificata da un nome di tipo reale quale, ad esempio, la seguente:
REAL FUNCTION FATT (N)
C CALCOLA N! CON N NON NEGATIVO
FATI = 1.
IF (N.GT.l) THEN
DO lO 1= 2, N
lO FATI =FATI. I
ELSE
END IF
RETURN
END
Si osservi che la sequenza di istruzioni
REAL FUNCTION MEDIA (V, N)
REAL MEDIA
ryv sbagliata in quanto, in una stessa unit di programma, il tipo di una variabile /0 '
non pu essere specificato in pi istruzioni. )
Il tipo di un sottoprogramma FUNCfION pu essere definito anche in modo
implicito dalla lettera iniziale del suo nome. Va notato comunque che una dichia-
razione esplicita di tipo presente nella prima frase del sottoprogramma annulla
l'effetto di eventuali istruzioni IMPLICIT.
J,\
,
';1
II

l
256 257
Riferimento ad un sottoprogramma FUNCTlON
Un sottoprogramma FUNCTION pu essere chiamato da un'altra unit di
programma utilizzando, in una qualunque espressione, un riferimento della forma
L'esecuzione di un riferimento ad una funzione esterna consiste nella attiva-
zione, esecuzione e uscita dal sottoprogramma il cui nome specificato nel ri-
ferimento. L'esecuzione del programma chiamante prosegue quindi con l'utiliz-
zazione del risultato fornito dal sottoprogramma.
s n ~ k ~
n!
REAL A(IO, lO), COEFF
I :
altrimenti - I
r(n, k) = k! (n - k)!
Esempio 14.15. Dati due numeri interi n e k scrivere un sottoprogramma che per-
metta di calcolare il valore r (n, k) definito da:
Il sottoprogramma richiesto pu essere il seguente:
FUNCTION COEFF (N, K)
REAL COEFF, FATT
INTEGER N, K
IF (N.GE.K.AND.K.GE.O) THEN
COEFF = FATT(N)/(FATT(K). FATT(N - K
ELSE
COEFF = - l.
ENDIF
RETURN
END
Si osservi che questo sottoprogramma richiama il sottoprogramma FATT (cfr.
esempio 14.11) per calcolare n!, k! e (n - k)!. Il sottoprogramma FATI utiliz-
zato tre volte nella stessa espressione mediante il suo nome seguito dall'indica-
zione dell'argomento attuale. Ogni riferimento alla funzione esterna FATI pro-
voca l'attivazione del sottoprogramma, la sua esecuzione e quindi la disponibilit
del suo risultato.
Se gli elementi aj,j di una matrice A quadrata di ordine n = lO sono definiti da
ai,j = r (i, j) i = l, ... , n, j = l, ... , n
essi possono essere calcolati usando le seguenti istruzioni:
REAL FUNCTION FUNZ (X, N)
nome ( )
Esempio 14.14. Sono formalmente corretti i riferimenti al sottoprogramma de-
finito dalla frase
contenuti nelle istruzioni seguenti:
B =FUNl (X, N)
R = ABS(FUNl (l, 5) +FUNl (X + Y, L
PRINT '(IX, "VALORE DELLA FUNlIONE", E13.6)', FUNZ (V, N)
IF (FUNl (A, L).GT.FUNl (A +0.5 H, lO THEN
IF (X.GT.V) V = FUNl (X - Y, I)
dove:
nome il nome del sottoprogramma FUNCTION;
al' a
2
, ., a
n
sono gli argomenti attuali ciascuno dei quali pu essere un
nome di variabile, un nome di variabile dimensionata, un'espressione, o il nome
di un altro sottoprogramma. La lista degli argomenti attuali deve accordarsi in
numero, ordine e tipo di elementi con quella degli argomenti muti della funzione
esterna chiamata.
Si noti che un riferimento ad una funzione esterna pu comparire anche nella
lista di una frase PRINT o WRITE, purch l'esecuzione del sottoprogramma non
richieda a sua volta operazioni di uscita.
Un riferimento ad una funzione esterna che non prevede argomenti muti ha
la forma:
I Il tipo del nome di una funzione esterna deve risultare, in ogni unit chiamante, ~
, uguale al tipo della funzione; cos, ad esempio, il sottoprogramma definito dalla 111'v
frase
DOUBLE PRECISION FUNCTION VAL (X, Y)
deve essere usato in unit di programma che contengano la frase
DO 20 J = l, io
DO 20 1= 1, lO
A(I, J) =' COEFF (I, J)
20 CONTINUE
DOUBLE PRECISION VAL
oppure in unit di programma in cui sono implicitamente definite di tipo doppia
precisione tutte le variabili il cui nome inizia con la lettera V.
In questa sequenza di istruzioni A(l, 1) interpretato come un nome di ele-
mento di matrice mentre COEFF(l, 1) interpretato come riferimento ad una
li
I
258
funzione esterna. Queste diverse interpretazioni derivano dalla presenza della
frase
REAL A( l O, ioi, COEFF
che definisce soltanto A come nome di matrice.
Sottoprogrammi FUNCTION di tipo carattere
Una funzione esterna di tipo carattere se il suo nome dichiarato, nella prima
frase o nel corpo del sottoprogramma, di tipo carattere. La lunghezza Qspecifica-
ta per il nome di una funzione esterna detta lunghezza della funzione e indica
la lunghezza del suo valore. La lunghezza di una funzione di tipo carattere pu
essere espressa in uno dei modi previsti nel cap. 12 per le variabili di questo tipo
eccetto che tramite un'espressione costante intera in cui compaiono nomi simbo-
lici di costante. Se la specuicazione della lunghezza non presente, allora la fun-
zione ha lunghezza l.
Esempio 14.16. Le frasi seguenti
CHARACTER lO FUNCTJON STR (X)
CHARACTER FUNCTION VOCE (Y)
sono corrette e definiscono due funzioni di tipo carattere che hanno, rispettiva-
mente, lunghezza 10 e l. La seguente definizione della funzione carattere
CHARACTER. (LUN) FUNCTJON ERRATO (X)
PARAMETER (LUN = lO)
invece sbagliata perch la lunghezza della funzione specificata tramite un nome
simbolico di costante. Per lo stesso motivo sbagliata la definizione seguente:
FUNCTJON ERRATO (X)
PARAMETER (LUN = JO)
CHARACTER (LUN) ERRATO
In ogni unit di programma in cui si usa una funzione esterna di tipo carattere,
il nome della funzione deve essere di tipo carattere e la sua lunghezza deve essere
uguale a quella della funzione e deve essere espressa in uno dei modi previsti nel
cap. 12 eccetto che tramite uno specificatore di lunghezza indefinita. Cos, con
riferimento alle funzioni definite nell'esempio 14.16, le unit di programma chia-
manti devono contenere le dichiarazioni
CHARACTER lO STR
CHARACTER VOCE
259
Osserviamo che la lunghezza di una funzione carattere pu essere espressa median-
te uno specificatore di lunghezza indefinita (*); in questo caso la lunghezza effet-
tiva del risultato viene stabilita al momento della chiamata e viene posta uguale al-
la lunghezza che il nome della funzione ha nell'unit di programma chiamante.
Esempio 14.17. Supponiamo che la funzione
CHARACTER (.) FUNCTJON NOME (C)
sia utilizzata da due unit di programma Pl e P2 contenenti, rispettivamente,
le dichiarazioni:
CHARACTER.25 NOME
CHARACTER lO NOME
Allora la funzione NOME fornisce un risultato di lunghezza 25 ogni volta che
viene utilizzata da P I mentre fornisce un risultato di lunghezza lO quando viene
utilizzata da P2.
14.6. Le funzioni definite da una frase
In ogni unit di programma si possono definire ed usare delle funzioni defini-
te da una frase ovvero funzioni che, come dice il loro nome, sono definite da una
unica istruzione non eseguibile della forma:
dove:
nome il nome simbolico della funzione; il tipo di nome il tipo della fun-
zione;
m)' m
2
, ..., m
n
sono gli argomenti muti che devono essere nomi distinti di
variabile;
e un'espressione FORTRAN che pu contenere, oltre agli argomenti muti
anche costanti, nomi simbolici di costante, nomi di variabile o di elementi di varia-
bile dimensionata che compaiono nella stessa unit di programma. Questa espres-
sione pu anche contenere riferimenti a funzioni intrinseche o a funzioni esterne
e riferimenti ad altre funzioni definite da un'istruzione.
La frase che definisce una funzione deve precedere tutte le frasi eseguibili e se-
guire tutte le frasi dichiarative presenti nell'unit di programma in cui essa com-
pare. Inoltre una funzione definita da una frase deve essere preceduta da tutte le
altre funzioni definite da una frase da essa eventualmente utilizzate.
L'espressione che compare nella frase di definizione di una funzione di tipo
numerico (intero, reale, doppia precisione o complesso) pu avere tipo diverso
260
dalla funzione, ma non pu essere un'espressione logica o carattere; inoltre essa
non pu essere di tipo complesso se la funzione di tipo doppia precisione e
viceversa.
Esempio J4. J8. Sono sintatticamente corrette le seguenti frasi di definizione di
funzioni:
TRASL(X) = (- 2./(A - B. X + (A + B)/(A - B)
F(X, Y) = SQRT(X 2 +y 2)
La frase:
STATUS(A, B, C) =ABS(A - B).LT.EPS.OR.C.GT.O.
corretta solo se preceduta dalla specificazione
LOGICAL STATUS
Una funzione definita da un 'istruzione pu essere
dip!}g[!!!!U!1fl in cui essa .detnit.a..L'utilizzazione di una funzione definita da
una frase avviene mediante un riferimento della forma:
/ nome (al' a
2
, ...., a
n
)
,
dove:
nome il nome della funzione;
al' a
2
, ., a
n
sono gli argomenti attuali ciascuno dei quali pu essere una
espressione; la lista degli argomenti attuali deve accordarsi in numero, ordine e
tipo con quella degli argomenti muti.
L'esecuzione del riferimento avviene nel modo seguente: gli argomenti attuali
vengono associati a quelli muti e viene quindi calcolato il valore dell'espressione
che compare nella frase di definizione della funzione usando, in corrispondenza
degli argomenti muti, i valori degli argomenti attuali. Il valore dell'espressione,
eventualmente convertito al tipo della funzione secondo le regole dell'assegnazio-
ne, costituisce il risultato della funzione.
Esempio J4. J9. Consideriamo il seguente programma:
PROGRAM TAB
F(X) = X .. 3 - SIN(X 2)
READ -. XO, H, N
DO lO l =0, N
X = XO + l. H
PRINT '(IX, /IX =/1, EI3.6, IX, /lF(X) =/1, EI3.6)', X, F(X)
lO CONTINUE
STOP
END
261
Lo scopo del programma quello di scrivere i valori della funzione
f(x) = x
3
- sen(x
2
)
nei punti Xi =X
o
+ ih, con i =O, ... , n supponendo noti x
o'
h, n.
Nell'istruzione che definisce la funzione di nome F, l'unico argomento muto
X. Si osservi che non c' nessun conflitto n ambiguit sul ruolo del nome X
nel programma TAB anche se esso viene usato in altre istruzioni. Infatti al mo-
mento della definizione di F, X rappresenta l'argomento muto, mentre dentro al
ciclo-DO esso il nome della variabile che contiene il valore di Xi' Al momento
dell'attivazione di F, ovvero nella frase di scrittura, X l'argomento attuale.
Osserviamo che lo stesso risultato del programma TAB pu essere ottenuto
con il programma seguente, costituito dal programma principale TAB2 e dalla
funzione esterna F
PROGRAM TAB2
READ -. XO, H, N
DO lO I =0, N
XT =XO + I. H
PRINT '(IX, "X =".E13.6, IX, "F(X) =",EI3.6)', XT, F(XT)
io CONTINUE
STOP
END
FUNCTION F(X)
F = X 3 - SIN(X 2)
RETURN
END
14.7. Le funzioni intrinseche
Come stato sottolineato anche all'inizio di questo capitolo, le funzioni in-
trinseche non sono altro che particolari sottoprogrammi che ogni sistema mette
a disposizione dell'utente. Nel cap. 6 si sono descritte alcune funzioni di uso
estremamente comune nelle applicazioni, ma in F77 sono previste molte altre
funzioni il cui significato descritto in questo paragrafo. Ricordiamo che per
utilizzare correttamente qualunque funzione intrinseca si devono seguire le re-
gole seguenti:
il numero di argomenti attuali deve coincidere con il numero di argomenti
specificato per la funzione;
il tipo degli argomenti attuali deve essere uno dei tipi previsti per gli argomenti
della funzione;
se gli argomenti attuali sono pi di uno, essi devono essere tutti dello stesso
tipo.
Ricordiamo anche che quando una funzione intrinseca pu essere usata con ar-
!
\ ,
! .
262
Le funzioni di conversione numenca
Le funzioni che consentono di passare da una rappresentazione interna di un
dato numerico ad un'altra sono dette funzioni di conversione numer!ca._l.r- loro
caratteristiche sono riassunte in fig. 14.7 insieme a quelle di alcune funzioni
intrinseche da esse derivate e di altre destinate al trattamento dei numeri com-
pIessi: per ognuna di queste funzioni si riportano in figura il numero di argomenti,
il nome generico e/o i nomi specifici, il tipo di argomenti e il tipo del risultato.
I simboli I, R, Dp, C indicano rispettivamente il tipo intero, reale, doppia preci-
sione e complesso.
gomenti di tipo diverso, il tipo del risultato determinato da quello degli argomenti
attuali, Cos, ad esempio, la funzione intrinseca ABS pu operare su un argomen-
to di tipo intero, reale, doppia precisione oppure complesso. Nei primi tre casi
la funzione ABS fornisce il valore assoluto della quantit specificata quale argo-
mento attuale ed il suo risultato dello stesso tipo dell'argomento attuale; nel-
l'ultimo caso, ovvero se l'argomento attuale di tipo complesso, la funzione ABS
d come risultato un valore reale che il modulo dell'argomento. Con un unico
nome, ABS, pertanto possibile indicare operazioni diverse in base al tipo del-
l'argomento usato. La caratteristica di indicare con lo di funzione
(nome generico) operazioni diverse comune a molte funzioni
L'utilizzazione del nome generico permette quindi di selezionare, mediante il
tipo degli argomenti, le operazioni che devono essere eseguite per ottenere un
I risultato coerente con i dati forniti alla funzione. Questa flessibilit delle
fhI:! intrinseche rispetto al tipo dei loro argomenti, deriva dal fatto che ciascun nome!
I generico indica una famiglia di funzioni ciascuna delle quali opera su un
minato tipo di argomenti per fornire uno specifico risultato. Il tipo degli arg
menti attuali che, in un riferimento alla funzione, accompagnano il nome generico
determina quale sottoprogramma della famiglia deve essere effettivamente utiliz-
zato e determina quindi il risultato della funzione. Nella maggior parte dei casi,
ogni sottoprogramma della famiglia identificata da ----nnome -generico di funzione
-utilizzatoanche--mediatrt; un spectfico,In gli-
argomenti attuali devono essere -tipo per quIp;rticolare sottopro-
gramma. Riprendendo l'esempio della funzione ABS essa indica una famiglia di
quattro sottoprogrammi le cui caratteristiche possono essere cos riassunte:
263
Figura 14.7. Funzioni di conversione numerica.
Descrizione della funzione numero nome nome tipo tipo
argomenti generico specifico argomenti risultato
Conversione al tipo intero l lNT - I I
con troncamento INT,IFIX R I
(cfr.Oss.14.1) IDINT Dp I
- C I
Conversione al tipo reale l REAL REAL, FLOAT I R
(cfr. Oss. 14.2) - R R
SNGL Dp R
- C R
Conversione al tipo doppia l DBLE - I Dp
precisione (cfr. Osso 14.3) - R Dp
- Dp Dp
- C Dp
Conversione al tipo 102 CMPLX - I C
complesso - R C
(cfr. Oss. 14.4) - Dp C
- C C
Parte immaginaria di un l - AIMAG C R
numero complesso Dp
Complesso coniugato l - CONJG C C
Dp
Conversione al tipo intero l NINT NINT R I
con arrotondamento IDNINT Dp I
(cfr. Oss. 14.5)
Troncamento di un numero l AINT AINT R R
reale (cfr. Osso 14.6) DlNT Dp R
Arrotondamento di un l ANINT ANINT R R
numero reale (cfr.Oss. 14.7) DNINT Dp Dp
1
I
I
I
I
Tipo del risultato
Intero
Reale
Doppia precisione
Reale
Tipo dell'argomento
Intero
Reale
Doppia precisione
Complesso
Nome specifico
IABS
ABS
DABS
CABS
264 265
Osservazione 14.6. La funzione AINT definita da:
te immaginaria uguale a Il valore di CMPLX (X, Y) quindi il nu-
mero complesso con parte reale X e parte immaginaria Y, mentre il valore di
CMPLX (X + 3., 2.) il numero complesso che ha parte reale uguale al valore
dell'espressione X + 3. e parte immaginaria uguale a 2.
Osservazione 14.5. La funzione NINT converte un dato reale o doppia preci-
sione al tipo intero. Questa funzjone differisce da INT in J:onvefSiGRe-.-
avviene per arrotondamento e Eon per troncamento: pi precisamente si ha
NINT(a) = INT (a + 0.5) se a;;;:' O
NINT(a) = INT (a - 0.5) se a < O.
Osservazioni sulle funzioni di conversione numerica
Osservazione 14.1. La funzione INT effettua la conversione al tipo intero di un
dato numerico, mediante troncamento.
Per a di tipo intero, INT(a) uguale ad a.
Per a di tipo reale o doppia precisione, si distinguono due casi: se Ia I< l, al-
lora lNT (a) = O; altrimenti il valore di INT (a) un intero il cui segno coincide
con quello di a e il cui valore assoluto il pi grande intero che non supera Ia I.
Cos. ad esempio, INT (3.7) e INT (- 3.7) valgono rispettivamente 3 e - 3.
Per a di tipo complesso, il valore INT(a) ottenuto applicando la regola prece-
dente alla parte reale di a.
Si osservi che non sono previsti nomi specifici per questa funzione quando gli
argomenti sono di tipo intero o complesso e che i nomi specifici IFIX e IDINT
sono stati mantenuti in F77 per compatibilit con il precedente standard.
AINT(a) = REAL (lNT(a se
AINT(a) = DBLE (lNT(a se
a di tipo reale
a di tipo doppia precisione
Le funzioni matematiche
In fig. 14.8 sono riassunte le caratteristiche delle funzioni intrinseche previste
in F77 per la realizzazione di funzioni matematiche quali la radice quadrata, l'e-
sponenziale, il logaritmo, ecc. Le notazioni usate in fig. 14.8 sono le stesse gi
usate in fig. 14.7.
Per molte funzioni intrinseche di questa classe sono previste alcune restrizioni
sui valori degli argomenti in quanto il dominio delle corrispondenti funzioni ma-
tematiche un sottoinsieme dell'insieme dei numeri reali o dei numeri com-
plessi. Tali restrizioni sono in generale diverse per argomenti reali e doppia preci-
sione o per argomenti complessi; in ogni caso esse restano valide sia quando ci si
riferisce ad una funzione intrinseca con un nome specifico sia quando si usa il
nome generico.
Osservazione 14.2. La funzione REAL effettua la conversione al tipo reale di un
dato numerico.
Per a di tipo reale, REAL(a) uguale ad a.
Per a di tipo intero o doppia precisione, REAL(a) fornisce la rappresentazione
interna del valore di a in floating-point in precisione semplice.
Per a di tipo complesso, REAL(a) la parte reale di a.
Si osservi che non sono previsti nomi specifici per questa funzione quando gli ar-
gomenti sono di tipo reale e complesso, e che i nomi specifici FLOAT e SNGL
sono stati mantenuti in F77 per compatibilit con il precedente standard.
Osservazione 14.3. La funzione DBLE effettua la conversione al tipo doppia
precisione di un dato numerico.
Per a di tipo doppia precisione, DBLE(a) =a.
Per a di tipo intero o reale, DBLE(a) fornisce la rappresentazione interna del
valore di a in doppia precisione.
Per a di tipo complesso, DBLE(a) la rappresentazione in doppia precisione del-
la parte reale di a.
Osservazione 14.7. La funzione ANINT definita da:
ANINT(a) = REAL (NINT(a se
ANINT(a) = DBLE (NINT(a se
a di tipo reale
a di tipo doppia precisione
Osservazione 14.4. La funzione CMPLX pu avere uno o due argomenti. Se l'ar-
gomento uno solo, questo pu essere di tipo intero, reale, doppia precisione o
complesso, mentre se gli argomenti sono due essi non possono essere di tipo
complesso.
CMPLX(a) uguale ad a se a complesso; altrimenti CMPLX(a) il numero
complesso con parte reale uguale a REAL(a) e parte immaginaria uguale a zero.
CMPLX (al' a
2
) il numero complesso con parte reale uguale a REAL(a
l)
e par-
Osservazioni alla figura 14.8
Osservazione 14.8. Il valore dell'argomento di SQRT e DSQRT deve essere mag-
giore o uguale di zero, mentre quello dell'argomento di CSQRT pu essere un qua-
lunque numero complesso. Indicando con Q' + i (3 il valore dell'argomento e con
'Y + i<5 il risultato di CSQRT, si ha: 'Y = 6 = O se Q' = (3 = O; altrimenti 'Y + i<5
quella radice di Q' + i(3 per cui 'Y;;;:' Oe, se 'Y = O, 6 ;;;:. O.
266
Descrizione della funzione Numero di Nome Nomi I Tipo di Tipo del
argomenti generico specifici argomenti risultato
Valore assoluto o modulo I ABS IABS I I
ABS R R
DABS Dp Dp
CABS C C
Radicc quadrata I SQRT SQRT R R
(cfr. 055. 14.8) DSQRT Dp Dp
eSQRT C C
Esponenziale I EXP EXP R R
DEXP Dp Dp
CEXP C C
Logaritmo naturale I LOG ALOG R R
(cfr. Osso 14.9) DLOG Dp Dp
CLOG C C
Logaritmo in base dieci I LOGIO ALOGIO R R
(cfr. 055. 14.9) DLOGIO Dp Dp
Seno (cfr. 055. 14.10) I SIN SIN R R
DSIN Dp Dp
CSIN C C
Coseno (cfr. 055. 14.10) I eos eos R R
DCOS Dp Dp
ecos C C
Tangente (cfr. Osso 14.10) I TAN TAN R R
DTAN Dp Dp
Arcoseno (cfr. 055. 14.11) I ASIN ASIN R R
DASIN Dp Dp
Arcocoseno I AeOS ACOS R R
(cfr. Oss.14.11) DACOS Dp Dp
Arcotangente con un I ATAN ATAN R R
argomento (cfr. 055.14.12) DATAN Dp Dp
Arcotangente con due 2 ATAN2 ATAN2 R R
argomenti (cfr. Osso 14.13) DATAN2 Dp Dp
Seno iperbolico I SINH SINH R R
DSINH Dp Dp
Coseno iperbolico 1 COSH eosli R R
DeOSII Dp Dp
Tangente iperbolica 1 TANH TANH R R
DTANH Dp Dp
Figura 14.8. Funzioni intrinseche matematiche.
267
Osservazione 14.9. Il valore dell'argomento di ALOG, DLOG, ALOGIO e DLOGIO
deve essere maggiore di zero, mentre quello dell'argomento di CLOG deve es-
sere diverso da zero. Indicando con a + il3 il valore dell'argomento e con "y + icS
il risultato di CLOG, si ha che "y + icS il valore principale di a + i/3,
per il quale - 1r < cS 1re cS =1rsoltanto se a < Oe 13 =o.
Osservazione 14.10. Le funzioni SIN, COS, TAN e DSIN, DCOS, DTAN calcola-
no seno, coseno e tangente di un angolo espresso in radianti.
Osservazione 14.11. Il valore assoluto dell'argomento di ACOS, DACOS, ASIN
e DASIN deve essere minore o uguale di l.
Osservazione 14.12. Il valore di ATAN(a), per a di tipo reale o doppia precisione,
l'arcotangente di a se Ia I a, dove a una quantit positiva dipendente dalla
particolare realizzazione della funzione ATAN. Se a < - a, allora il valore di
ATAN(a) - 1r/2, mentre se a> a il valore di ATAN(a) 1r/2.
Osservazione 14.13. Legata al calcolo dell'arcotangente anche la funzione
ATAN2 che prevede due argomenti, di tipo reale o doppia precisione, almeno uno
dei quali diverso da zero. Infatti il risultato r di ATAN2 (al' a
2
) cos definito:
_ se al> O e a
2
=1= O, allora r tale che tg(r) = a
l/a2
e 0< r < 1r
- se al =O e a
2>
O, allora r =O
- se al = O e a
2
< O, allora r = 1r
_ se al < O e a
2
=1= O, allora r tale che tg(r) = a
l/a 2
e - 1r< r < O
_ se a
2
= O allora r pu valere 1r/2 o - 1r/2 a seconda della particolare realiz-
zazione della funzione.
Le funzioni intrinseche per la manipolazione dei caratteri
Per la manipolazione dei caratteri sono previste in F77 le funzioni intrinseche
LGE, LGT, LLE, LLT, INDEX, ICHAR e CHAR il cui significato stato spiegato
nel cap. 12 e la funzione intrinseca LEN che permette di calcolare la lunghezza di
un dato di tipo carattere il cui utilizzo verr esemplificato nel cap. 15. Per como-
dit riportiamo nella fig. 14.9 le caratteristiche di queste funzioni; per ognuna di
esse la figura comprende una breve descrizione del significato, il numero di argo-
menti, il nome specifico (non esistono nomi generici per queste funzioni) e il
tipo degli argomenti e del risultato (Cr sta per carattere, L sta per logico e l
sta per intero).
Il
r1
I
'1' l,l,
Il
!'
Figun 14.10. Altre funzioni intrinseche.
269
SIGN (l., a) = l. se a> O
SIGN (l., a) = - 1. se a < O
l'
J
I
\
I
,I
) "
. I
l
se al * Oe a
2
;;. O
se al *Oe a
2
< O
se al = O
SIGN (al; a
2
) = Iali
SIGN (al' a
2
) =-I ali
SIGN (al' a
2
) =O
Si osservi che le funzioni SIGN, ISIGN e DSIGN in F66 erano definite nel modo
sopra indicato per a
2
*O, ma non erano definite per a
2
= O.
Dalla definizione segue che
Numero Nome Nomi Tipo di Tipo del
Descrizione della funzione di argo- generico specifici argomenti risultato
menti
Resto della divisione intera 2 MOD MOD l l
(cfr. Oss. 14.14) AMOD R R
DMOD Dp Dp
Trasferimento di segno 2 SIGN ISIGN I 1
(cfr. Osso 14.15) SIGN R R
DSIGN Dp Dp
Differenza positiva 2 D1M 101M l I
(cfr. Osso 14.16) D1M R R
DDlM Dp Dp
Prodotto in doppia precisione 2
DPROD R Dp
(cfr. Osso 14.17)
Massimo fra pi argomenti con risultato ;;;.2 MAX MAXO I I
dello stesso tipo degli argomenti AMAXI R R
(cfr. Osso 14.18) DMAXI Dp Dp
Massimo fra pi argomenti con risultato ;;;.2 AMAXO I R
di tipo diverso (cfr. Oss. 14.18) MAXI R I
Minimo fra pi argomenti con risultato ;;;.2 MIN MINO l 1
dello stesso tipo degli argomenti AMINI R R
(cfr. Osso14.(8) DMINI Dp Dp
Minimo fra pi argomenti con risultato ;;;.2 AMINO I R
di tipo diverso (cfr. Osso 14.18) MINI R I
Altre funzioni intrinseche
In fig. 14.10 si descrivono le caratteristiche delle rimanenti funzioni intrinse-
che previste in F77, che in generale prevedono argomenti di tipo intero, reale e
doppia precisione e danno un risultato dello stesso tipo degli argomenti.
Figun 14.9. Funzioni intrinseche per la manipolazione dei caratteri,
Osservazioni sulla fig. 14.10
Osservazione 14.14. La funzione MOD prevede due argomenti, il secondo dei
quali deve essere diverso da zero, e calcola il resto della divisione effettuata in
aritmetica intera fra il primo ed il secondo argomento. In altri termini essa
definita da
Descrizione della funzione Numero di Nome Tipo degli Tipo del
argomenti specifico argomenti risultato
Relazione di nel codice ASCII 2 LGE Cr L
Relazione di > nel codice ASCII 2 LGT Cr L
Relazione di '" nel codice ASCII 2 LLE Cr L
Relazione di < nel codice ASCII 2 LLT Cr L
Posizione della prima occorrenza di una 2 INDEX Cr I
stringa a2 in una stringa al
Posizione dell'argomento nel sistema di l ICHAR Cr I
codifica usato dall'elaboratore
Carattere che occupa, nel sistema di
codifica usato dall'elaboratore, la poszio- l CHAR I Cr
ne espressa dall'argomento.
Lunghezza dell'argomento l LEN Cr I
268
Osservazione 14.15. La funzione SIGN prevede due argomenti e il risultato
defini to da:
ovvero segue che per a * O SIGN (1., a) d come risultato il valore assunto in
x = a dalla funzione sgn(x) definita da:
SIGN (0.5, a) - SIGN (0.5, - a)
D'altra parte sgn(a) pu essere calcolato, per qualunque valore di a, utiliz-
zando la funzione SIGN nel modo seguente
270
l
sgn(x) = O
-l
x>O
x=O
x<O
271
Esercizi
14.1 Individuare gli errori presenti nelle seguenti istruzioni:
SUBROUTINE NEW (A, B, 0.5))
SUBROUTINE STAMPA (I, J, A(I, 1)
SUBROUTINE COPIA (X, Y, F(X
REAL FUNCTION MEDIA (M, M +1, V)
FUNCTION INDICE (CAR (I : I))
COMPLEX FUNCTION MODULO
Osservazione 14.16. La funzione DIM prevede due argomenti, ed definita da
DIM (al' a
2
) = al - a
2
DIM (al' a
2
) = O
Osservazione 14.17. La funzione DPROD calcola il prodotto in doppia precisione
fra due argomenti reali. Cos, se A e B sono variabili reali e D e DD sono variabili
in doppia precisione, l'istruzione
D = DPROD (A, B)
equivalente alla coppia di istruzioni
DD=A
D = DD * B.
Osservazione 14.18. Le funzioni MAX e MIN determinano, rispettivamente, il
massimo e il minimo fra due o pi argomenti; il risultato dello stesso tipo degli
argomenti. Esistono inoltre le funzioni AMAXO e MAXI (AMINO e MINI) che
calcolano il massimo (minimo) fra pi argomenti e convertono poi il risultato a un
tipo diverso da quello degli argomenti. Queste funzioni sono state mantenute in
F77 per compatibilit con lo standard precedente F66, ma saranno probabil-
mente eliminate nella prossima versione del FORTRAN. Del resto possibile si-
mulare queste funzioni intrinseche tramite la MAX e la MIN e le funzioni di con-
versione numerica; cos, ad esempio se al' a
2
, ..., a
n
sono di tipo intero, si ha
AMAXO (al' a
2
, ., a
n
) =REAL (MAX (al' a
2
, , a
n
))
AMINO (al' a
2
, .. "' a
n
) =REAL (MIN (a" a
2
, , a
n
))
mentre se a" a
2
, ... , a
n
sono di tipo reale si ha
MAXI (a" a
2
, ..., a
n
) = INT (MAX (al' a
2
, ... , a
n
))
MINI (a" a
2
, ", a
n
) = INT (MIN (al' a
2
, , a
n
))
Come si gi accennato nel cap. 6, in F66 non esistevano nomi generici per
le funzioni intrinseche, ma soltanto nomi specifici e inoltre molte funzioni pre-
viste in F77 non erano previste in F66 (cfr. appendice A2).
14.2 E' dato il sottoprogramma seguente
SUBROUTINE ESERC (M, MI, ALFA, BETA)
INTEGER M, MI
REAL ALFA, BETA
END
Supponendo che A e B siano variabili reali e M e N variabili intere, indicare
quali tra le istruzioni CALL seguenti sono formalmente corrette e quali
non lo sono.
CALL ESERC (M, N, A, B) .: I
CALL ESERC (M, B, A)
,1(
CALL ESERC (4, N, A, B) s {
CALL ESERC (N, M, 0.5, 0.5) :. I
CALL ESERC (A, B, M, N) II (l
CALL ESERC (M, N, S, B)
" (
.;
14.3 E' dato un sottoprogramma FUNCTION di tipo reale e di nome EFFE
che prevede, quali argomenti muti, due variabili reali. Individuare gli even-
tuali errori formali nelle seguenti istruzioni che utilizzano EFFE, suppo-
nendo che A e B siano variabili reali e K sia una variabile intera:
IF (EFFE (A, B).GT.EFFE (O., O.)) A = EFFE (A, B)
X = EFFE (A, B) - EFFE (B, A)
B = EFFE (O; 0.5) ti )
READ *, A, B, EFFE (A, B)
A = ABS (EFFE()9, B rI ()
EFFE (A, B) = EFFE (A, B) - 1.
PRINT *, EFFE (A) 10
14.4 Trasformare in un sottoprogramma il programma dell'Esempio 10.9, giu-
stificando la scelta fra un sottoprogramma FUNCTION o un sottopro-
gramma SUBROUTINE.
(soluzioni: l e - 3)
x
2-0.2001104x+0.l001l0?=0
x
2
_ 2 10- 3 x + 10- 6 = O
x
2
- 6 x + 34 =O
x
2
- 10
5
x + l = O
I J
272
14.5 Scrivere un sottoprogramma che, dato un vettore reale di 100 elementi,
fornisca come risultato la media aritmetica dei valori dei suoi elementi.
Giustificare la scelta fra un sottoprogramma FUNCfl0N e un sottopro-
gramma SUBROUTINE.
14.6 Scrivere un sottoprogramma che utilizza il sottoprogramma SOLV2 dello
esempio 14.5 per calcolare le soluzioni reali o complesse delle seguenti
equazioni:
x:l + 2x - 3 = O
(soluzioni: 1000e 1001)
(soluzioni: 10- 3 e 10- 3)
(soluzioni: 3 + Si, 3 - Si)
(soluzioni calcolate con Il cifre:
0.99999999990 10
5
e
0.1000000000 l 10- 4)
Eseguire i calcoli suddetti utilizzando i seguenti valori di e: M' lO M'
100 M' dove M la precisione di macchina che pu essere calcolata con
il sottoprogramma EPSM dell'esempio 14.13.
14.7 Spiegare il significato assunto dal sottoprogramma EPSM dell'esempio
14.13 se si sostituisce la frase iniziale con le frasi
DOUBLE PRECISION FUNCfION EPSM( )
DOUBLE PRECISION A
14.8 Scrivere un sottoprogramma di tipo SUBROUTINE che, assegnato un
vettore X reale di 100 elementi e un intero N, con O<N < 100, permetta
di localizzare, se esiste, il primo elemento di X diverso da zero a partire da
X(N) e fornisca come risultato la posizione, LOC, di tale elemento e il suo
valore, V. Il sottoprogramma deve inoltre segnalare con un opportuno valo-
re di LOC il caso in cui tutti gli elementi di X a partire da X(N) siano uguali
a zero.
14.9 Scrivere un sottoprogramma che risolva il problema del precedente eser-
cizio, ma fornisca in uscita soltanto il valore di LOC.
14.10 Scrivere un sottoprogramma FUNCfION che permetta di calcolare, asse-
gnato il numero complesso z, il valore complesso w(z), dove
w(z) =Iz I+ (l + 3i) z
273
Scrivere inoltre un programma che utilizza il precedente sottoprogramma
per calcolare e stampare i valori di w(z) per i seguenti valori di z: 2 - 3i,
S. 8 + 10
2
i, - 5i.
14.11 Scrivere un sottoprogramma che, assegnata una stringa X di 60 caratteri,
fornisca in uscita una stringa W costituita dai caratteri di X diversi dal ca-
rattere blank, e il numero di questi caratteri. Scrivere inoltre un programma
che utilizzi il sottoprogramma suddetto avendo come dato la stringa:
'MATTEOvHAvFATTOvUNAvCORSAvEDvORAvHAvlLv RESPIROvAFFANNOSOvvvv'
14.12 Individuare quali fra le seguenti frasi che definiscono una funzione sono
sintatticamente corrette:
F(A, B, C) =(A + B + C)/3.
F(A, B, C, 3) =(A + B + C)/3
F =(A + B + C)/3
14.13 Individuare gli errori contenuti nei seguenti riferimenti a funzioni intrin-
seche, supponendo che R, l, C siano variabili di tipo reale, intero e com-
plesso rispettivamente.
SQRT(I)
ABS (CMPLX(R, I
CMPLX (AIMAG(R
NINT (C)
MOD(R, NINT(R
EXP (lNT(R.
14.14 Scrivere un sottoprogramma che consenta di calcolare il prodotto scalare
fra due vettori reali di N elementi, con N SO, e che utilizzi la funzione
intrinseca DPROD per eseguire i prodotti in doppia precisione (cfr. esem-
pio Il.22).
J
15
Argomenti muti
ed argomenti attuali
15.1. Associazione tra argomenti muti ed argomenti attuali
L'attivazione di un sottoprogramma e la sua esecuzione presuppongono uno
scambio di informazioni tra unit di programma chiamante e sottoprogramma.
Questo scambio pu avvenire attraverso la lista degli argomenti muti in quanto
ad essa associata quella degli argomenti attuali in modo tale che, durante l'ese-
cuzione del sottoprogramma, ogni riferimento ad un argomento muto. di fatto,
un riferimento al corrispondente argomento attuale. Al momento della chiamata
di un sottoprogramma viene infatti trasmesso per ciascun argomento muto l'indi-
rizzo del corrispondente argomento attuale e diventano pertanto direttamente
utilizzabili dal sottoprogramma gli indirizzi delle locazioni in cui si trovano me-
1
morizzati i valori degli argomenti attuali. Gli argomenti muti di Wl sottopro- .
gramma sono quindi completamente definiti soltanto al momento della attiva-
zione del sottoprogramma quando ognuno di essi identifica la stessa locazione di
memoria del corrispondente argomento attuale. La corretta esecuzione di un sot- .
toprogramma pertanto subordinata ad una corretta corrispondenza tra gli argo-
menti muti e quelli attuali; eventuali errori non sono generalmente segnalati dal
sistema e si manifestano in fase di esecuzione con risultati del tutto inattendibili
che provocano talvolta l'interruzione del programma. Si osservi che gli errori
commessi nella associazione degli argomenti non possono essere segnalati durante
la compilazione in quanto ogni unit di programma compilata in modo autono-
mo e separatamente da tutte le altre.
15.2. Le variabili non dimensionate come argomenti muti
Quando un argomento muto il nome di una variabile non dimensionata ad
esso pu corrispondere, nella lista degli argomenti attuali, una variabile, un ele-
mento di variabile dimensionata, una costante oppure. pi in generale, un'espres-
sione. In ogni caso l'argomento attuale deve essere dello stesso tipo di quello
muto.
277
276
Esempio 15.1. Sia ESEMP un sottoprogramma definito da:
SUBROUTINE ESEMP (ARG, N)
con ARG ed N nomi di variabile rispettivamente di tipo reale ed intero. Suppo-
nendo che nell'unit di programma chiamante X identifichi una variabile reale,
Y un vettore reale, L una variabile intera ed M una matrice intera, il sottopro-
gramma ESEMP correttamente utilizzato dalle frasi:
CALL ESEMP(X, L)
CALL ESEMP(X, M(I, 2))
CALL ESEMP(Y(3), L + lO)
CALL ESEMP(L Y(2)/X, 12)
mentre sono sbagliate le seguenti istruzioni:
ANG = TETA(Y) + TETA (0.5 * H)
richiede due esecuzioni del sottoprogramma TETA: la prima avviene associando
all'argomento muto X quello attuale Y, la seconda associando ad X la locazione
che contiene il valore dell'espressione 0.5 H. Anche la frase
ANG =TETA (TETA(Y) + H)

due esecuzioni del sottoprogramma TETA: la prima avviene usando l'in-


! di Y e seconda usando della locazione nella quale memoriz-
zato 11 valore di TETA (Y) + H. SI osservi che questo modo di utilizzare un sotto-
programma di tipo FUNCfION non ricorsivo.
Esempio 15.3. Sia SOMMA un sottoprogramma definito da:
SUBROUTINE SOMMA (A, B, C)
l
I
, i
I '
f
CALL ESEMP(L, X)
CALL ESEMP(X, 1.05)
CALL ESEMP(Y(3), X + lO)
CALL ESEMP(M(l, 2). L, 12)
con A, B e C nomi di variabili reali. Supponendo che A e B siano argomenti
di ingresso e che C sia di uscita, l'esecuzione della frase
CALL SOMMA (X, X, Y)
permette di associare A e B alla stessa locazione X e C alla locazione Y; sarebbe
invece sbagliato scrivere
15.3. Le variabili dimensionate come argomenti muti
Quando un argomento muto il nome di una variabile dimensionata, ad esso
deve corrispondere come argomento attuale un nome di variabile dimensionata
oppure un nome di elemento di variabile dimensionata. Ricordiamo che all'in-
terno del sottoprogramma il nome dell'argomento muto deve comparire in una
opportuna frase di specificazione che ha come unico effetto quello di indicare al
compilatore che l'argomento una variabile dimensionata; 'inoltre i nomi degli
elementi dell'argomento muto devono essere utilizzati nel sottoprogramma coe-
rentemente con la specificazione fatta. Anche in questo caso, l'esecuzione del
sottoprogramma avviene utilizzando per l'argomento muto le locazioni di memo-
ria riservate all'argomento attuale dall'unit di programma chiamante, in quanto
l'associazione tra l'argomento muto e quello attuale avviene mediante l'indirizzo
dell'argomento attuale. Pi precisamente, l'indirizzo del primo elemento dell'ar-
;I . CALL SOMMA (X, Y, Xl Il/i
1
111
quanto alla stessa locazione farebbero riferimento sia un argomento di ingresso
che quello di uscita.
Esempio 15.2. Sia TETA un sottoprogramma definito dalla frase:
dove X indica un nome di variabile reale. L'esecuzione dell'istruzione
REAL FUNCfION TETA (X)
Va sottolineato che ad ogni argomento muto di uscita deve corrispondere
come argomento attuale una variabile oppure un elemento di variabile dimensio-
I
nata. In altri termini una costante o una espressione non devono essere usate i A
come argomento attuale in corrispondenza di un argomento muto il cui valore v
sia definito oppure modificato nel corpo del sottoprogramma. Infatti, se l'argo-
mento attuale una costante, qualunque modificazione del corrispondente argo-
mento muto provoca un cambiamento del valore della costante che invece deve
rimanere inalterato durante tutta l'esecuzione del programma. Il divieto di utiliz-
zare un'espressione in corrispondenza di un argomento muto di uscita deriva, in-
vece, dal fatto che l'associazione tra l'espressione ed il corrispondente argomento
muto avviene mediante l'indirizzo della locazione nella quale, al momento della
chiamata del sottoprogramma, memorizzato il valore dell'espressione. Questo
indirizzo viene trasmesso al sottoprogramma ma non noto all'unit di program-
ma attivante che, pertanto, non lo pu utilizzare. Si osservi infine che, se due 'j',
argomenti attuali coincidono. nessuno dei corrispondenti argomenti muti pu ['
essere un argomento di uscita.
278
gomento muto coincide con quello del primo elemento dell'argomento attualese
questo il nome di una variabile dimensionata; se invece il parametro attuale un
elemento di variabile dimensionata, il suo indirizzo viene utilizzato dal sottopro-
grarnma come indirizzo del primo elemento del parametro muto. In ogni caso, gli
indirizzi dei successivi elementi dell'argomento muto vengono determinati a
partire dall'indirizzo del primo elemento in base al numero di dimensioni e alle
limitazioni di ciascuna dimensione dell'argomento muto secondo le modalit
viste nel cap. II.
Esempio 15.4. Il seguente sottoprogramma, SOM, permette di sommare i quattro
elementi di un vettore V con gli elementi di posto dispari di un vettore W di am-
piezza IO. Il risultato viene memorizzato nella variabile reale A.
SU8ROUTINE SOM (V, W, A)
REAL V(4), W(IO)
A=Q.
DOlO, 1=1,4
A = A + V(I)
IO CONTINUE
DO 20 1=1,10,2
A =A +W(I)
20 CONTINUE
RETURN
END
Questo sottoprogramma pu essere correttamente utilizzato nel modo seguente:
REAL X(IO), Y(20)
CALL SOM (X, Y, Al)
CALL SOM (X(6), Y(II), A2)
CALL SOM (Y, X, A3)
Dopo l'esecuzione di queste frasi
A I contiene:
1
l
279
muti V e W sono rispettivamente associati a X ed Y mediante l'indirizzo di X( I)
ed Yt l ): con l'esecuzione della seconda chiamata il primo elemento di V asso-
ciato all'elemento X(6) ed il primo elemento di W a Yf l l ): infine, l'ultima attiva-
zione del sottoprogramma avviene associando V ad Y mediante l'indirizzo di Y( I)
e W ad X mediante l'indirizzo di X( I).
Si osservi che quando un argomento muto ed il corrispondente argomento
"' attuale sono nomi di variabili dimensionate, l'argomento attuale deve avere am-
i piezza maggiore o uguale a quella dell'argomento muto, ovvero il numero totale
degli elementi dell'argomento muto non deve superare quello del corrispondente
!argomento attuale. Quando l'argomento attuale un elemento di variabile dimen-
l' i sionata, l'ampiezza dell'argomento muto non deve superare il numero di elementi
J\ di tale variabile compresi fra l'elemento specificato come argomento attuale e
l'ultimo.
.4
Esempio 15.5. Si vogliono sommare gli elementi di una matrice di 2 righe e 2
colonne con quelli di posto dispari della terza colonna di una matrice B di IO
righe e 3 colonne.
Questo problema pu essere risolto utilizzando il sottoprogramrna SOM
dell'esempio 15.4 nel modo seguente:
REAL A(2, 2), 8(10,3)
CALL SOM (A, B(1,3),S)
AI momento dell'attivazione del sottoprogramma il primo elemento dell'ar-
gomento muto V associato al primo elemento della matrice A mentre il primo
elemento di W associato al primo elemento della terza colonna di B; infine
l'argomento muto di uscita A associato ad S. Durante l'esecuzione del sotto-
programma gli elementi degli argomenti muti V e W sono associati agli elementi
dei corrispondenti argomenti attuali nel modo seguente:
X(l) + X(2) + X(3) + X(4) + Y(l) + Y(3) + Y(5) + Y(7) + Y(9)
A2 contiene:
X(6) + X(7) + X(8) + X(9) + Y(lI) + Y(l3) + Y(l5) + Y(l7) + Y(l9)
V(I)
A(I,I)
V(4)
A(2,2)
A3 contiene:
Y(l) + Y(2) + Y(3) + Y(4) + X(1) + X(3) + X(5) + X(7) + X(9)
Infatti, al momento della prima chiamata del sottoprogramma gli argomenti
W(l) W(2) W(3) W(4) W(5) W(6) W(7) W(8) W(9) W(lO)
8(l,3) 8(2,3) 8(3,3) B(4,3) 8(5,3) B(6,3) 8(7,3) 8(8,3) 8(9,3) B(IO,3)
280
Esempio 15.6. Supponiamo di utilizzare ancora il sottoprogramma SOM del-
l'esempio 15.4 nel modo seguente:
REAL A(3, 3),8(3, lO)
CALL SOM(A,8(1,3),S)
In questo caso, gli elementi del parametro muto V corrispondono a quelli del
parametro attuale A nel modo seguente:
V(l) V(2) V(3) V(4)
A(l,l) A(2,1) A(3,1) A(1,2)
mentre gli elementi di We quelli di B si corrispondono nel modo seguente:
W(1) W(2) I W(3) W(4) W(5) W(6) W(7) W(8) W(9) W(10)
8(1,3) 8(2,3) 8(3,3) 8(1,4) 8(2,4) 8(3,4) 8(1,5) 8(2,5) B(3,5) 8(1,6)
15.4. Dimensionamento variabile e dimensionamento indefinito
In un sottoprogramma possibile specificare le dimensioni di un argomento
muto mediante una particolare forma di dichiaratore di dimensione detta dichia-
ratore di dimensione variabile. Un dichiaratore di dimensione detto dichiaratore
di dimensione variabile se contiene un'espressione intera in cui compare almeno.
un nome di variabile; questo nome di variabile deve far parte della lista degli argo-
menti muti o di un blocco COMMON (cfr. cap. 16). Nel
rativa nella quale compare un dichiaratore di dimensione variabile fra-
se di dimensionamento variabile; essa deve precedere tutte le frasi eseguibili del
corpo del sottoprogramma ma deve essere preceduta da tutte le eventuali frasi di
specificazione che interessano le variabili intere usate nei dichiaratori. Sono per-
tanto esempi di corretta utilizzazione del dimensionamento variabile i seguenti:
SU8ROUTINE ESI (V, A, N)
REAL V(N), A(N, N)
SUBROUTlNE ES2 (V, R, S)
INTEGER R, S
REAL V(R: S)
REAL FUNCTION ES3 (V, M, N)
REAL V(M +N 5)
j
281
REAL FUNCTION ES4 (V, W, A, N)
DIMENSION A(N, 7), W(19, N + I), V(O: N - 3)
L'ampiezza delle dimensioni specificate con i dichiaratori di dimensione varia-
bile determinata al momento dell'attivazione del sottoprogramma. In questa
fase infatti viene definito il valore delle variabili intere usate nei dichiaratori e so-
no valutate le espressioni che compaiono nei dichiaratori stessi. Il valore dei di-
j
Chiarat Ori di dimensione variabile resta inalterato durante tutta l'esecuzione del I
l sottoprogramma anche se il contenuto delle variabili intere usate nei dichiaratori Lt
viene modificato.
Esempio 15.7. Supponiamo che
SUBROUTlNE SU81 (V, W, A, NV, NW)
REAL V(NV), W(NV+ NW+ 2)
siano le frasi iniziali del sottoprogramma SUB1. In esse V e W indicano due vet-
tori reali le cui dimensioni sono specificate mediante gli argomenti muti NV ed
NW. Se, al momento della attivazione di SUB l, gli argomenti attuali corrispon-
denti ad NV ed NW valgono entrambi 15, allora durante l'esecuzione di SUBI il
vettore V viene considerato di ampiezza 15 e W di ampiezza 32; se invece, al mo-
mento della chiamata di SUBl, NV contiene il valore lO ed NW il valore - 5,
il sottoprogramma viene eseguito come se fosse stata usata la specificazione.
REAL V( lO), W(7).
Esempio 15.8. Per calcolare l'elemento massimo di un vettore X di N elementi
si pu usare il seguente sottoprogramma:
REAL FUNCTION MMV(X, N)
INTEGER N
REAL X(N)
MMV= X(l)
DO 200 1 = 2, N
IF (X(I).GT.MMV) MMV= X(l)
200 CONTINUE
RETURN
END
E' possibile utilizzare questo sottoprogramma per calcolare i massimi elementi
delle colonne di una o pi matrici reali. Supponendo che A sia una matrice di l O
righe e 5 colonne e che B sia una matrice di 20 righe e 40 colonne, il seguente
programma permette di definire i valori dei 45 elementi di un vettore V memoriz-
,
i
I
11
282
zando nei primi S, gli elementi massimi di ciascuna colonna di A e, nei restanti 40,
gli elementi massimi di ogni colonna di B.
PROGRAM USOMMV
REAL A(lO, 5), B(20, 40), V(45), MMV
NRA = lO
NCA=5
NRB = 20
NCB=40
READ -. A, B
DO 20 I = I, NCA
V(I) = MMV(A(l, I), NRA)
20 CONTINUE
DO 30 I = I, NCB
V(NCA+ I) = MMV(B( l, I), NRB)
30 CONTINUE
PRINT -. V
STOP
END
All'interno del primo ciclo-DO il sottoprogramma MMV viene attivato NCA
volte ed ogni attivazione avviene associando il primo elemento di una colonna di
A al primo elemento dell'argomento muto X la cui ampiezza determinata dal
valore, lO, di NRA. All'interno del secondo ciclo-DO il sottoprogramma invece
attivato NCB volte: ogni volta il primo elemento di una colonna di B associato
al primo elemento dell'argomento muto X la cui ampiezza, determinata dal valore
di NRB, uguale a 20. Si osservi che, per una corretta utilizzazione del sottopro-
grarnma, indispensabile specificare nell'unit di programma chiamante che
MMV di tipo reale.
Esempio 15.9. Siano xl' x
2
' .. " x
n
le componenti di un vettore x; indicata con
Il la quantit
Il = max I x1 '
l" i" n I
la norma euclidea di x, x Ib, pu essere calcolata nel modo seguente:
se Il = O
se Il =1= O
Un sottoprogramma che permette di calcolare, dati x ed n, la norma Il x 112
1
I
283
allora il seguente:
REAL FUNCTION NORMA2 (X, N)
C NORMA2 INDICA LA NORMA EUCLIDEA DEL VETTORE X
C N INDICA IL NUMERO DI ELEMENTI DI X
REAL MI, X(N)
C CALCOLO DEL MASSIMO FRA I VALORI ASSOLUTI
C DEGLI ELEMENTI DI X
MI = ABS(X(I
DO IO 1= 2, N
IF (MI.LT.ABS(X(I) MI = ABS(X(I
IO CONTINUE
NORMA2 = o.
IF(MI.EQ.O.) RETURN
DO 20 I = l, N
NORMA2 = NORMA2 +(X(I)/MI) ** 2
20 CONTINUE
NORMA2 = MI * SQRT (NORMA2)
RETURN
END
Il sottoprogramma NORMA2 pu essere utilizzato per calcolare la quantit
dove c(i) indica la i-esima colonna di una matrice A di m righe ed n colonne. Sup-
ponendo m = lO ed n = S, SC pu essere calcolato dal programma seguente:
PROGRAM VALSC
REAL A(lO, 5), NORMA2
READ *, A
M=IO
N=5
SC =0.
DO IO I = I, N
SC = se +NORMA2 (A(I, I), M)
IO CONTINUE
PRINT -. 'QUANTITA"VCALCOLATAv', SC
STOP
END
Questo programma deve essere notevolmente modificato se, invece della quan-
tit sc' si vuoI calcolare
sr = t 1/ r(i) 112
i= 1
284
dove r(i) indica la i-esima riga della matrice A. Si considerino infatti le seguenti
istruZIOI1I, analoghe a quelle usate nel programma VALSC:
SR =0.
DO lO I = l, M
SR = SR + NORMA2 (A(I, l), N)
lO CONTINUE
L'esecuzione di queste istruzioni prevede che, per ogni valore di I, il primo ele-
mento dell'argomento muto X abbia lo stesso indirizzo di A(l, l) e che l'ampiezza
di X sia uguale a S. Durante l'esecuzione del sottoprogramma, gli elementi di X
sono quindi associati ad A(l, l) e alle quattro locazioni di memoria ad esso con-
secutive nel modo seguente:
X(l)
A(I, l)
Pertanto, per ogni valore di i, il sottoprogramma NORMA2 fornisce la quantit
i+ 4 5
(I: ~ l )1/
2
e non quella utile per il calcolo di sr che data da (. I: a; /1
2
. Af-
~ i J. J= l
finch il problema possa essere correttamente risolto occorre che gli elementi di
ciascuna riga di A vengano memorizzati, prima della chiamata del sottoprogram-
ma, in locazioni consecutive di memoria. Per questo si utilizza un vettore, RIGA,
nel quale vengono memorizzati tutti gli elementi della i-esima riga di A. Questo
vettore costituisce l'argomento attuale che aeve essere associato a quello muto
X per poter calcolare la norma euclidea della i-esima riga di A. Il programma pu
essere allora il seguente:
PROGRAM VALSR
REAL A(lO, 5), NORMA2, RIGA(5)
READ-. A
M=1O
N = 5
SR=O.
DO 20 l = l, M
DO lO J = l, N
lO RIGA(1) = A(I, J)
SR = SR + NORMA2 (RIGA, N)
20 CONTINUE
PRINT -. 'VALOREvCALCOLATOvSR =', SR
STOP
END
285
Dimensionamento variabile per argomenti muti con due o pi dimensioni
Per chiarire come deve essere usato il dimensionamento variabile per argomenti
muti con due o pi dimensioni, consideriamo il seguente esempio.
Esempio 15.10. Sia MATRIX un sottoprogramma definito dalla frase iniziale:
SUBROUTINE MATRIX (A, N, M. B)
dove A, N ed M sono gli argomenti di ingresso e B quello di uscita e, inoltre, A
una matrice specificata da
REAL A(N, M)
Sia PROGI un programma che utilizza MATRIX nel modo seguente:
PROGRAM PROGI
REAL X(3, 4), Y(2, 3)
READ*, X, Y
NR=3
NC=4
CALL MATRIX (X, NR, NC, BI)
CALL MATRIX (Y, NR - l, NC- l, B2)
Al momento della prima attivazione del sottoprogramma, l'argomento muto
A associato a quello attuale X mediante l'indirizzo di X( l, l) e inoltre N asso-
ciato ad NR, M a NC e B a Bl. Per effetto della prima frase CALL si crea quin-
di tra gli elementi di A e quelli di X una associazione per la quale ogni elemen-
to A(I, 1) nel sottoprogramma corrisponde all'elemento X(l, 1) del program-
ma principale per ogni valore di I, l ~ 1 ~ 3, ed ogni valore di J, l ~ J ~ 4. Al
momento della seconda chiamata, l'argomento muto A associato ad Y mediante
l'indirizzo di Y( l, l), la variabile N associata alla locazione che contiene il
valore dell'espressione NR - l, la variabile M associata alla locazione che con-
tiene il valore di NC - 1 e B associata a B2. L'esecuzione della seconda frase
CALL stabilisce pertanto che ogni elemento A(I, J) corrisponde a Y(l, J) per ogni
I compreso fra l e 2 e J compreso fra 1 e 3.
Esaminiamo ora come avviene la associazione tra argomenti muti ed argomenti
attuali supponendo di usare il sottoprogramma MATRIX con la seguente unit
di programma chiamante:
'Ii
,
, Il
I l
I
l
I
286
PROGRAM PROG2
REAL X(3,4)
READ -, X
NR=3
NC =4
CALL MATRIX(X, NR, NC, BI)
CALL MATRIX(X, NC, NR, B2)
CALL MATRIX(X, NR - l, NC + 2, B3)
CALL MATRIX(X, NR, NR, B4)
La corrispondenza che si crea tra gli elementi dell'argomento muto A e quelli
dell'argomento attuale X con l'esecuzione delle quattro frasi CALL presenti in
PROG2 la seguente:
T
I
287
gli elementi dell'argomento muto coincidono con quelli che individuano gli ele-
menti dell'argomento attuale soltanto se il numero di righe dell'argomento muto
coincide con il numero di righe specificato per l'argomento attuale nell'unit di
programma chiamante.
Esempio 15.11. II seguente sottoprogramma DEFMAT permette di risolvere il
seguente problema: dato n, determinare gli elementi h(n) di una matrice quadrata
1.1
H
n
di ordine n definiti da
n se i =j
~ n = n/(j + 1) se i > j i, j = 1,2, ... , n
r.j
(i - 1)/0 - 1) se i <j
Prima CALL:
Seconda CALL:
xn.n X(2,l) X(3,1) X(l,2) X(2,2) X(3,2) X(l,3) X(2,3) X(3,3) X(l,4) X(2,4) X(3,4)
A(l,l) A(2,l) A(3,l) A(I,2) -\(2,2) A(3,2) A(l,3) A(2,3) A(3,3) A(l,4) A(2,4) A(3,4)
xci, l) X(2,l) X(3,l) X(I,2) X(2,2) X(3,2) X(l,3) X(2,3) X(3,3) X(1,4) X(2,4) lX(3,4)
A(1,I) A(2,1) A(3,l) A(4,1) A(l,2) A(2,2) A(3,2) A(4,2) A(l,3) A(2,3) A(3,3) IA(4,3)
SUBROUTINE DEFMAT(H, NR, N)
REAL H(NR, N)
DO 20 1= 1, N
DO 20 J = I, N
1F(I.EQ.J) THEN
H(I, J) = N
ELSE IF(I.GT.J) THEN
H(I, J) = N/(1 + 1.)
ELSE
H(I, J) =(1- 1.)/(1 - 1.)
ENDIF
20 CONTINUE
RETURN
END
II significato degli argomenti muti di DEFMAT il seguente: H una matrice
reale che contiene, al termine dell'esecuzione del sottoprogramma, la matrice H
n
;
NR ed N sono argomenti di ingresso, il primo dei quali serve per specificare il
numero di righe di H nel descrittore di dimensione variabile e il secondo rappre-
senta l'ordine n della matrice H
n
di cui si devono definire gli elementi.
Consideriamo ora il seguente programma principale, ATTIVA, nel quale il sot-
toprogramma DEFMAT viene utilizzato 5 volte durante l'esecuzione del ciclo-DO
per calcolare successivamente le matrici H
n,
con n = 2, 4,6, 8, IOe memorizzarle
nelle stesse locazioni di memoria riservate alla matrice di ordine maggiore. Si noti
che, durante ogni esecuzione di DEFMAT, gli indici che individuano gli elementi
dell'argomento muto H e gli elementi dell'argomento attuale ad esso associato
concidono. Questa coincidenza di indici dovuta al fatto che ad ogni attivazione
il valore dell'argomento attuale NR uguale al numero di righe specificato per
l'argomento attuale H nel programma ATTIVA.
X(3,4)
A(2,6)
X(1.1)
X(1,1) X(2,1) X(3,l) X(l,2) X(2,2) X(3,2) X(l,3)
A(l,l) A(2.l) A(l,2) -\(2,2) A(l,3) A(2,3) A(1,4)
A(1,1)
L'esempio precedente mette in evidenza che, quando il numero di righe di una
matrice usata come argomento muto non coincide con quello specificato per il
corrispondente argomento attuale, alcuni elementi delI'argomento muto risul-
tano associati ad elementi dell'argomento attuale individuati da indici diversi.
In altri termini, quando si utilizza un sottoprogramma che prevede tra gli argo-
menti muti una matrice, si deve tener presente che gli indici che individuano
Terza CALL:
Quarta CALL:
288
PROGRAM ATTIVA
REAL H(lO, lO)
NR= lO
DO lO N = 2, 10,2
PRINT., 'ORDINE DELLA MATRICE N =', N
CALL DEFMAT (H, NR, N)
DO lO I = l, N
WRITE (.,1000) (H(l, J), J = l, N)
lO CONTINUE
STOP
1000 FORMAT (lO (IX, E12.S
END
Le osservazioni fatte per le matrici valgono anche quando un argomento muto
ha pi di due dimensioni. Infatti, se m il numero di dimensioni, gli indici che in-
dividuano gli elementi dell'argomento muto coincidono con quelli degli elementi
dell'argomento attuale associato, soltanto se al momento dell'attivazione i valori
dei dichiaratori delle prime (m - 1) dimensioni dell'argomento muto coincidono
con quelli fissati per l'argomento attuale nell'unit di programma chiamante.
In questo caso l'ampiezza dell'ultima dimensione dell'argomento muto non deve
superare quella dell'ultima dimensione dell'argomento attuale.
Il dimensionamento vanabile era previsto anche in F66 ma erano ammessi
come dichiaratori di dimensione variabile soltanto nomi di variabili intere facenti
parte della lista degli argomenti muti o di un blocco COMMON.
Dimensionamento indefinito
In F77 prevista una ulteriore forma particolare di dichiaratore di dimensione
per un argomento muto, detta dichiaratore di dimensione indefinita. Si dice che
un argomento muto ha dimensionamento indefinito se l'ultimo dichiaratore di
dimensione un asterisco. Sono esempi di uso del dimensionamento indefinito
le frasi
REAL X(*), B(10, *), A(M, *)
DIMENSION Y(- 5 : N, *), Z(N + M, L, *)
Se un argomento muto ha dimensionamento indefinito, la sua ampiezza non
viene calcolata al momento dell'attivazione del sottoprogramma la cui esecuzione
avviene quindi ignorando l'ampiezza dell'argomento muto; per q ~ ~ s !1l()!!VQ, un
parametro muto che ha dimensionamento indefinito non pu essere usato nel cor-
po del sottoprogramma in frasi la cui esecuzione richiede la conoscenza esplicita
della sua ampiezza. Cos, per esempio, la frase:
PRINT *, A
289
non pu essere usata in un sottoprogramma se A una matrice che compare nella
lista degli argomenti muti ed ha dimensionamento indefinito.
Il dimensionamento indefinito non previsto in F66.
15.5. Argomenti muti di tipo carattere
Se un argomento muto di un sottoprogramma di tipo carattere, il suo tipo e
la sua lunghezza devono essere opportunamente specificati all'interno del sotto-
programma.
Se l'argomento muto una variabile carattere, il corrispondente argomento at-
tuale pu essere una costante, una variabile, una sottostringa, un elemento di
variabile dimensionata, oppure un'espressione carattere. In ogni caso la lunghezza
dell'argomento muto non deve superare quella dell'argomento attuale. Se la lun-
ghezza ~ dell'argomento muto uguale a quella dell'argomento attuale, al momen-
to dell'attivazione del sottoprogramma l'argomento muto associato alla stringa
identificata dall'argomento attuale mediante !'indirizzo dell'unit di memoria
in cui memorizzato il primo carattere dell'argomento attuale. Se invece la lun-
ghezza ~ dell'argomento muto inferiore a quella dell'argomento attuale, l'argo-
mento muto associato alla sottostringa costituita dai primi ~ caratteri dell'argo-
mento attuale.
Esempio 15.12. Indicate con LI ed L2 due lettere dell'alfabeto, il sottoprogram-
ma seguente permette di stabilire se la stringa di lunghezza 8 rappresentata dal-
l'argomento muto DATO inizia con LI e termina con L2. Il sottoprogramma
infatti determina il valore di una variabile logica, IND, il cui valore vero sol-
tanto se DATO inizia con LI e termina con L2. Nel caso in cui IND sia falso,
il sottoprogramma memorizza il carattere iniziale e quello finale di DATO in LI
ed L2 rispettivamente.
SUBROUTlNE INFIN (DATO, IND, LI, L2)
LOGICAL IND
CHARACTER DATO. 8, LI l, L2 l
N=8
IF (DATO (I: l ).EQ.Ll.AND.DATO (N: N).EQ.L2) THEN
IND= .TRUE.
ELSE
IND = .FALSE.
LI = DATO (l:l)
L2 = DATO (N:N)
ENDIF
RETURN
END
I
I >
II
I
II
"
292
Sarebbe invece sbagliata l'istruzione
CALL INFIN (X//A, IND, IN, FIN)
in quanto in essa figura come argomento attuale un'espressione carattere nella
quale un operando, X, un argomento muto di lunghezza indefinita.
Se un argomento muto una variabile dimensionata di tipo carattere, l'argo-
mento attuale ad esso corrispondente deve essere di tipo carattere e pu essere
il nome di una variabile dimensionata, di un elemento di variabile dimensionata,
di una sottostringa di un elemento di variabile dimensionata. In ogni caso, l'asso-
ciazione tra l'argomento muto e quello attuale viene fatta mediante l'indirizzo
dell'unit di memoria in cui memorizzato il primo carattere dell'argomento
attuale. Si osservi che quando un argomento una variabile dimensionata carat-
tere esso individua unit di memoria consecutive in quanto l'ultimo carattere di
ogni elemento immediatamente seguito dal primo carattere dell'elemento suc-
cessivo. Il numero di unit di memoria carattere individuate da un argomento
costituisce la sua lunghezza complessiva. In particolare, se un argomento attuale
il nome di un elemento o di una sottostringa di un elemento di una variabile
dimensionata, la sua lunghezza complessiva costituita dal numero di caratteri
compresi tra il primo carattere dell'elemento o della sottostringa specificati e
l'ultimo carattere dell'ultimo elemento.
La lunghezza dei singoli elementi di un argomento muto di tipo carattere pu
differire da quella degli elementi dell'argomento attuale ma la sua lunghezza com-
plessiva, determinata in base alla specificazione presente nel sottoprogramma, non
deve superare quella dell'argomento attuale.
15.6. I nomi di sottoprogrammi come argomenti muti. Le frasi EXTERNAL e
INTRINSIC
Un argomento muto di un sottoprogramma pu essere il nome di unaltr() sot-
toprogramma e, in questo caso, il corrispondente argomento attuale deve essere,
a sua volta, il nome di un sottoprogramma. Cos, per esempio, se il nome, NOME,
di un sottoprogramma fa parte della lista degli argomenti muti di un altro sotto-
programma, CHIAMA, ogni riferimento a NOME all'interno di CHIAMA equivale
ad un riferimento al sottoprogramma il cui nome specificato come argomento
attuale in corrispondenza di NOME. Per poter realizzare l'associazione tra il
nome del sottoprogramma presente nella lista degli argomenti muti e quello spe-
cificato come argomento attuale, quest'ultimo deve apparire in una opportuna
frase dichiarativa nell'unit di programma chiamante.
Per semplicit di esposizione nel seguito useremo il termine sottoprogramma
293
esterno per indicare un sottoprogramma SUBROUTINE oppure FUNCTION.
La frase EXTERNAL
L'istruzione dichiarativa EXTERNAL permette di individuare, in una lista di
argomenti, i nomi di sottoprogrammi esterni; essa ha la forma seguente:
EXTERNAL lista
dove:
EXTERNAL la parola chiave che identifica la frase;
lista una lista di uno o pi nomi di sottoprogrammi di tipo SUBROUTINE,
FUNCTION, BLOCK DATA. Se la lista costituita da pi nomi, essi sono separa-
ti da virgole.
Ogni nome di sottoprogramma che compare nella lista di una frase EXTERNAL
pu essere usato come argomento attuale nella stessa unit di programma in
cui compare la frase EXTERNAL. D'altra parte, se un nome di sottoprogramma
esterno fa parte di una lista di argomenti attuali esso deve comparire. nella stessa
unit di programma, in una frase EXTERNAL. Per esempio la frase:
EXTERNAL FUNZ, F
indica che i nomi FUNZ ed F sono nomi di sottoprogrammi esterni e che essi
possono essere usati come argomenti attuali nell'unit di programma che contiene
questa frase.
Si osservi un nome simbolico compare in un'istruzione EXTERNAL
esso interpretato come il nome di un sottoprogramma esterno; in particola-
re, se la lista di una frase EXTERNAL comprende il nome di una funzione in-
trinseca, quel nome individua un sottoprogramma esterno diverso dalla funzio-
ne intrinseca. Cos la specificazione
EXTERNAL SQRT
serve per indicare che nell'unit di programma in cui essa compare SQRT il no-
me di un sottoprogramma esterno diverso dalla omonima funzione intrinseca. E'
evidente che in questa unit di programma non possibile utilizzare la funzione
intrinseca SQRT perch ogni riferimento ad SQRT viene interpretato come un ri-
ferimento al sottoprogramma esterno e non alla funzione intrinseca.
Si noti che in F66 il nome di una funzione intrinseca non poteva essere usato
come nome di un sottoprogramma esterno e la sua presenza nella lista di una frase
EXTERNAL serviva soltanto a specificare che esso poteva essere usato come
argomento attuale nella stessa unit di programma.
Esempio 15.15. Sia f(x) una funzione reale definita per x x
o'
con f(x
o)
* 0,
e sia > O una quantit assegnata. Supponendo noti i valori x
o'
h, n si considera-
, :\
I I
I 1
,
. I
290
Questo sottoprogramma pu essere usato per determinare il primo e l'ultimo
carattere di stringhe di lunghezza 8, come nel seguente esempio:
CHARACTER IN, FIN, VI .8,
LOGICAL IND
IN='G'
FIN = 'E'
VI = 'GIUSEPPE'
CALL INFIN (VI, IND, IN, FIN)
L'argomento muto DATO corrisponde all'argomento attuale VI, ed entrambi
sono di tipo carattere e lunghezza 8; pertanto, durante l'esecuzione del sotto-
programma il valore di DATO 'GIUSEPPE'. Gli argomenti attuali IND, IN, FIN
corrispondono rispettivamente agli argomenti muti IND, LI ed L2. Siccome i
valori in ingresso di LI ed L2 sono 'G' ed 'E', dopo l'esecuzione del sottoprograrn-
ma IND contiene il valore .TRUE. e i contenuti di IN e FIN sono immutati.
Sia ora V2 una variabile carattere di lunghezza 14 contenente la stringa di carat-
teri 'MARIA v GELTRUDE' . Se IN e FIN valgono 'G' ed 'E' rispettivamente,
dopo l'esecuzione della frase
CALL INFIN (V2(7:), IND, IN, FIN)
i valori di IND, IN e FIN sono, nell'ordine, .TRUE., 'G' ed 'E', mentre essi di-
ventano .FALSE., 'M'ed 'E' se viene eseguita la frase
CALL INFIN (V2, IND, IN, FIN)
Infatti nel primo caso l'argomento muto DATO viene associato alla sottostringa
V2(7:) che vale 'GELTRUDE', mentre nel secondo caso esso viene associato
alla sottostringa costituita dai primi 8 caratteri di V2, ovvero a 'MARIA vGE'.
Si osservi che non sarebbe corretto utilizzare il sottoprogramma INFIN asso-
ciando a DATO una stringa di lunghezza inferiore a 8. Per esempio sbagliata la
frase:
CALL INFIN ('FRANCO', IND, IN, FIN)
in quanto l'argomento attuale corrispondente a DATO la stringa 'FRANCO' di
lunghezza 6.
L'esempio precedente mette in evidenza che l'obbligo di specificare nel corpo
del sottoprogramma la lunghezza degli argomenti di tipo carattere pu limitare le
possibilit di utilizzazione del sottoprogramma stesso. Per questo prevista la
possibilit di definire la lunghezza di un argomento muto di tipo carattere me-
diante lo specificatore di lunghezza indefinita (.); in questo modo la lunghezza
291
di un argomento muto viene definita soltanto al momento della chiamata del
sottoprogramma quando viene posta uguale a quella dell'argomento attuale
corrispondente.
Esempio 15.13. Supponiamo di modificare il sottoprogramma INFIN dell'esem-
pio 15.12 nel modo seguente:
SUBROUTINE INFIN (DATO, IND, LI, L2)
LOGICAL IND
CHARACTER DATO. (.), LI l, L2. l
N = LEN (DATO)
IF (DATO(l: l ).EQ.Ll.AND.DATO (N:N).EQ.L2) THEN
IND= .TRUE.
ELSE
IND = .FALSE.
LI =DATO(l:l)
L2 = DATO (N:N)
ENDIF
RETURN
END
In questo caso il sottoprogramma pu essere usato per determinare il primo e
l'ultimo carattere di qualsiasi stringa; infatti all'argomento muto DATO viene as-
segnata, al momento della attivazione del sottoprogramma, la stessa lunghezza
dell'argomento attuale corrispondente. Si osservi che in questa seconda versione
del sottoprogramma INFIN necessario usare la funzione intrinseca LEN per
calcolare la lunghezza di DATO.
Si osservi che un argomento muto di tipo carattere la CUI lunghezza sia stata
specificata con (.) pu comparire come operando in una operazione di conca-
tenazione soltanto in una frase di assegnazione.
Esempio 15.14. E' corretta la seguente sequenza di istruzioni, dove INFIN
il sottoprogramma dell'esempio precedente:
SUBROUTINE CONCAT(X, Y, A, IN, FIN)
CHARACTER. (.) X, Y, A. 3, IN l, FIN. l
LOGICAL IND
Y=X/lA
CALL INFIN (Y, IND, IN, FIN)
I
I
294
no i punti xi = X
o
+ ih con O i n. Si vuole scrivere un sottoprogramrna, di
nome SGN, che permetta di individuare, se esiste, il pi piccolo valore di j, con
0< j n, tale che f(x
j)
f(x
j_
1) < Oe, in caso affermativo. fornisca in uscita i va-
lori di j, X
j
_ l' X
r
Inoltre il sottoprogramma deve interrompersi se, per un valore
di i > O. si ha If(x) I e in questo caso deve dare come risultati il valore j = - i
e il valore di Xi' Infine, se nessuna delle precedenti condizioni verificata, il sot-
toprogramma deve fornire in uscita il valore j =n + I e i valori di X
o
e x
n
'
Stabiliamo di utilizzare le variabili XO, H, N ed EPS come argomenti muti di
ingresso contenenti rispettivamente x
o'
h, n ed e, e la variabile JCS come argo-
mento di uscita che contiene il valore di j. Inoltre stabiliamo che l'argomento
muto XO contenga in uscita il valore di Xi se il sottoprogramma termina perch
If(x) I e, mentre usiamo gli argomenti XO e XN per memorizzare i valori di
x
j_
1 e X
j
oppure X
o
e x
n
negli altri due casi. Il sottoprogramma SGN, di tipo
SUBROUTINE, deve richiamare un altro sottoprogramma di nome FUNZ, con il
quale si calcola f(x) per un valore di x assegnato. Il sottoprogramma FUNZ pu
essere di tipo FUNCTION e prevedere come unico argomento muto una variabile
reale che in ingresso contiene il valore di x; in uscita FUNZ fornisce il valore f(x).
II sottoprogramma SGN pu essere quindi cos formalizzato:
SUBROUTINE SGN (XO, XN, H, N, EPS, JCS)
F = FUNZ(XO)
SEGNO = SIGN (I., F)
DOlO J=I,N
XN = XO+ J. H
F = FUNZ (XN)
IF (ABS(F).LE.EPS) THEN
XO=XN
JCS =-J
RETURN
ELSE IF (SIGN(l., F).NE.SEGNO) THEN
XO=XN - H
JCS = J
RETURN
ELSE
ENDFI
IO CONTINUE
JCS = J
END
La prima istruzione del sottoprogramma FUNZ richiamato da SGN deve essere
REAL FUNCfION FUNZ (X)
1
295
e il suo corpo pu descrivere qualunque funzione reale f(x) definita per x ;;;;. x
o
'
D'altra parte, il sottoprogramma SGN non pu essere usato se il sottoprogramma
che calcola f(x) ha un nome diverso da FUNZ. In particolare esso non pu essere
utilizzato nella stessa unit di programma per esaminare il comportamento di
due o pi funzioni distinte che sono ovviamente realizzate da sottoprogrammi
FUNCfION con nomi distinti. Perch ci sia possibile, occorre modificare la pri-
ma istruzione di SGN inserendo il nome FUNZ nella lista degli argomenti muti;
in altri termini si deve usare un sottoprogramma, SGN I, il cui corpo identico a
quello di SGN e la cui prima frase
SUBROUTINE SGNI (XO. XN, H, N, EPS, JCS, FUNZ)
Durante l'esecuzione di SGN l ogni riferimento a FUNZ provoca l'attivazione del
sottoprogramma il cui nome specificato nella lista degli argomenti attuali.
Cos, se FCf, F e VALF sono i nomi di tre sottoprogrammi FUNCfION di tipo
reale e con un solo argomento di ingresso di tipo reale, corretto il seguente uso
diSGNI:
EXTERNAL FCT,F,VALF
CALL SGNI (XO, XN, H, N, EPS, JCS, FCT)
CALL SGNI (XO, XN, H, N, EPS, JCS, F)
CALL SGNI (XO, XN, H, N, EPS, JCS, VALF)
L'istruzione EXTERNAL indispensabile per poter usare FCf, F e VALF
come argomenti attuali corrispondenti a FUNZ.
Esempio 15.16. Sia F una funzione che associa ad ogni elemento x di IRn un vet-
tore y = F(x) di IR
n
. Assegnati due vettori u e v appartenenti ad IR
n
ed un intero
Q> O, sia x
k
' con O k Q, il vettore definito da:
Si vuoI scrivere un sottoprogramma che, supponendo noti u, v, n ed F permet-
ta di determinare tra i vettori x
k
' O k Q, quel vettore x
j
tale che
Il F(xj)llz = min I] F(x
k
) 112' O k Q}
Il sottoprogramma richiesto, che chiameremo MF2, pu essere scritto tenendo
presente il seguente algoritmo:
296
l. Dati: u, v, ~ n
2. Poni x
j
= v
3. Calcola y = F(x
j
)
4. Calcola m =l y lil
5. Ripeti per k = 1,2, ... ~
5. 1. poni (\ =k/ ~
5.2. poni x
k
= Q:kU + (I - Q:k) v
5.3. calcola y = F(x
k
)
5.4. calcola m
k
=Il y Ib
5.5. se m
k
~ m allora: esegui 5.6
altrimenti: poni m =m
k
poni x
j
=x
k
esegui 5.6
5.6. continua il procedimento ripetitivo.
6. Risultati: m, x
j
7. Stop
Si osservi che le istruzioni 4. e 5.4 di Questo algoritmo possono essere realiz-
zate tramite il sottoprogramma NORMA2 dell'esempio 15.9 la cui frase iniziale
la seguente:
REAL FUNCfION NORMA2(X, N)
Inoltre, l'esecuzione delle istruzioni 3. e 5.3 prevede l'utilizzazione di un altro
sottoprogramma che identitichiamo con il nome FX e che, dato il vettore x, per-
metta di calcolare il vettore y = F(x). Il sottoprogramma FX deve essere di tipo
SUBROUTINE e deve prevedere due argomenti di tipo reale: quello di ingresso,
X, contenente il vettore x e quello di uscita, Y, contenente il vettore y = F(x).
Pertanto la frase iniziale di FX
SUBROUTINE FX(X, Y)
mentre il corpo di FX costituito da tutte le istruzioni che permettono di definire
i singoli elementi di Y.
Per definire la frase iniziale del sottoprogramma MF2 si noti che esso deve esse-
re una SUBROUTINE e che, per essere utilizzabile qualunque sia il valore di n.de-
ve prevedere il dimensionamento variabile dei vettori utilizzati. La lista degli ar-
gomenti muti di MF2 deve quindi comprendere i seguenti nomi di variabile. U,
V, L, N, XJ, M, XK, Y che rappresentano, rispettivamente, u, v, ~ n, Xj' m,
x
k
' y. I primi quattro nomi indicano gli argomenti di ingresso; XJ ed M sono gli
argomenti di uscita; XK ed Y sono nomi di vettori che devono comparire nella
lista degli argomenti muti in quanto utilizzati con dimensionamento variabile.
La lista degli argomenti muti pu inoltre comprendere il nome FX del sottopro-
297
gramma utilizzato per calcolare Ftx); questo permette l'utilizzazione di MF2
anche nel caso in cui la funzione Ft x) sia definita da un sottoprogramma la
cui frase iniziale ha la stessa forma indicata per FX ma il cui nome diverso da
FX. Tenendo presente le osservazioni fatte, il sottoprogramma MF2 pu essere
costituito dalle seguenti istruzioni:
SUBROUTINE MF2 (U, V, L, N, XJ, M, XK, Y, FX)
REAL U(N), V(N), XJ(N), XK(N), Y(N)
REAL M, NORMA2, MK
OOlOl=I,N
lO XJ(I) = V(I)
CALL FX(XJ, Y)
M = NORMA2 (Y, N)
RL=L
DO 40 K = l, L
ALFAK = K/RL
DO 20 I = l, N
20 XK(I) = ALFAK U(I) +(I. - ALFAK) V(I)
CALL FX (XK, Y)
MK = NORMA2 (Y, N)
IF (MK.GE.M) GOTO 40
M=MK
DO 30 I = l,N
30 XJ(I) = XK(I)
40 CONTINUE
RETURN
END
Supponendo che F(x) sia la funzione
essa pu essere descritta mediante il seguente sottoprogramma:
SUBROUTINE FUNZ (X, Y)
REAL X(3), Y(3)
Y(I) = (X(2) 2 + 2. EXP(- X(3)/12.
Y(2) = (I. - X(I) +SIN (X(3)/6.
Y(3) = (X(1) 2 + X(2) 2 + X(3) 2)/6.
RETURN
END
Assegnati i vettori u = (I, l, I)T e v = (- l, - l, - 1)1 e fssato P.e 15,ilsotto-
programma MF2 pu essere utilizzato nel modo seguente:
~
f.
i
~
i
l
298
REAL Y(3), Y(3), XK(3), D(3), XJ(3)
EXTERNAL FUNZ
READ * D, Y
N=3
L= 15
CALL MF2 (D, Y, L, N, XJ, EMME, XK, Y, FDNZ)
WRITE (, 1(0)(XJ(I), I = I, N)
100 FORMAT (IX, 'vETTORE DI MINIMA NORMA'/3 (IX, E13.6
WRITE (*,200) EMME
200 FORMAT (I X, 'vALORE DELLA NORMA', 2X, E13.6)
STOP
END
AI momento dell'attivazione di MF2 viene effettuata l'associazione tra gli
argomenti muti e quel1i attuali e, in particolare viene associato ad FX il nome del
sottoprogramma FUNZ. Il programma pertanto costituito dal programma prin-
cipale e dai sottoprogrammi MF2, NORMA2 e FUNZ.
La frase INTRINSIC
Un nome simbolico in una lista di argomenti attuali viene interpretato come
nome specifico di una funzione intrinseca se nel1a stessa unit di programma esso
compare nella lista di una istruzione INTRINSIC. Questa frase dichiarativa, che
non esisteva in F66, ha la forma:
INTRINSIC lista
dove:
INTRINSIC la parola chiave che identifica la frase;
lista una lista di nomi specifici di funzioni intrinseche separati da virgole.
Si osservi che soltanto i nomi specifici delle funzioni intrinseche, e non i nomi
generici, possono essere usati come argomenti attuali e che, se in un'unit di pro-
gramma viene usato come argomento attuale il nome specifico di una funzione
intrinseca, questo nome deve comparire nella stessa unit di programma in una
frase INTRINSIC. Inoltre, non devono essere usati come argomenti attuali i nomi
di funzioni intrinseche che permettono conversioni di tipo (lNT, IFIX, IDINT,
FLOAT, SNGL, REAL, DBLE, CMPLX, ICHAR, CHAR), che stabiliscono l'or-
dinamento dei caratteri (LGE, LGT, LLE, LLT), che determinano il massimo o
il minimo di un insieme di valori numerici (MAX, MAXO, AMAX I, DMAX I,
AMAXO, MAX I, MIN, MINO, AMIN I, DMIN I, AMINO, MIN I).
Esempio 15.17. Fissati i valori di x
o'
n, h ed si vuole studiare il comporta-
mento della funzione sin(x) nei punti Xi = X
o
+ ih, O : i : n, nel senso indi-
cato nell'esempio 15. I 5. Si pu allora utilizzare il sottoprogramma SGNI facendo
corrispondere al1'argomento muto FUNZ il nome specifico SIN della funzione
T
299
intrinseca che calcola sin(x) e che prevede un argomento di tipo reale. In questo
caso il nome SIN deve comparire in una istruzione INTRINSIC nel1a unit di pro-
gramma chiamante; in altri termini, questa deve contenere le due frasi seguenti:
INTRINSIC SIN
CALL SGNI (XO, XN, H, N. EPS, JCS, SIN)
In questo modo, durante l'esecuzione di SGN I, ogni riferimento a FUNZ , di
fatto, un riferimento al1a funzione intrinseca SIN.
15.7. Asterischi come argomenti muti
L'asterisco pu far parte del1a lista degli argomenti muti di un sottoprogramma
SUBROUTINE; ad esso deve corrispondere, come argomento attuale, uno specifi-
catare di ritorno alternativo che ha la forma:
* s
dove
s l'etichetta di una frase eseguibile appartenente al1a stessa unit di pro-
gramma in cui compare lo specificatore.
La denominazione specificatore di ritorno alternativo con la quale si indica
un argomento attuale del tipo * s legata all'effetto di una particolare forma
della frase RETURN che pu essere utilizzata al1'interno di un sottoprogramma
SUBROUTINE. Questa forma la seguente:
RETURN
dove:
RETURN la parola chiave che identifica la frase;
t un espressione intera il cui valore utilizzato per individuare !'istruzione
del programma chiamante che deve essere eseguita al1a fine del1'esecuzione del sot-
toprogramma. Pi dettagliatamente, supponiamo che il sottoprogramma abbia n
argomenti muti del1a forma asterisco e che contenga l'istruzione
RETURN
AI momento dell'esecuzione di questa frase viene valutato il valore k dell'espres-
sione intera t. Se k < I oppure k > n la frase RETURN t ha lo stesso effetto
della frase RETURN. Se invece I : k : n, il valore k identifica il k-esimo asteri-
sco tra gli n presenti nella lista degli argomenti muti e il control1o dell'esecuzione
rimandato all'istruzione della unit di programma chiamante la cui etichetta
associata, mediante uno specificatore di ritorno alternativo, al k-esimo asterisco.
300
Esempio J5. J8. Indicate con LI ed L2 due lettere dell'alfabeto, si vuole scrivere
un sottoprogramma che permetta di stabilire se la stringa rappresentata dall'ar-
gomento muto VOCE inizia con LI e termina con L2, inizia con LI ma non ter-
mina con L2, termina con L2 ma non inizia con LI, non inizia con LI e non
termina con L2. In ogni caso, il sottoprogramma deve fornire il carattere iniziale e
finale di VOCE memorizzandoli in LI ed L2 rispettivamente. Tenendo conto che
il sottoprogramma deve selezionare uno fra quattro possibili casi, esso pu preve-
dere fra gli argomenti muti tre asterischi ed essere realizzato nel modo seguente:
301
Se, durante l'esecuzione di RlTALT, viene eseguita l'istruzione RETURN,
allora l'esecuzione del programma principale prosegue con l'istruzione seguente
la CALL; essa prosegue invece con l'istruzione di etichetta IO, 20 o 30 rispetti-
vamente se in RlTALT viene eseguita l'istruzione RETURN l, RETURN 2 o
RETURN 3.
La possibilit di usare i ritorni alternativi non esisteva in F66.
Esercizi
15.1 Scrivere un sottoprogramma mediante il quale, dati un vettore A di compo-
nenti al' ..., a
n
e un vettore B di componenti bI' ..., b
n
_ l' si costruisce
il termine d
n
di una successione {di' i = O, ... , n }definita da
do = l
dI =al
di = ai d
i_
l - br_ l d
i_
2' per i = 2,3, ..., n
e si verifica se d
n
maggiore di 1/3. Scrivere inoltre un programma che
utilizza questo sottoprogramma con i seguenti dati:
SUBROUTINE RIT ALT (VOCE, LI, L2, *, -. *)
CHARACTER VOCE * (*), LI, L2
N =LEN(VOCE)
IF (VOCE(l: 1).EQ.L1.AND.VOCE(N:N).EQ.L2) RETURN
IF (VOCE(l:l).EQ.L1) THEN
L2 = VOCE (N:N)
RETURN l
ELSE IF (VOCE(N:N).EQ.L2) THEN
LI = VOCE(l:l)
RETURN 2
ELSE
LI = VOCE (l : l)
L2 =VOCE (N:N)
ENDIF
RETURN 3
END
Un programma principale che utilizza RITALT il seguente:
n=6 A =(1,2, lO, - 5, 6, 8) B =(6, 7, 8, 9, lO).
Scrivere un nrogramrna che utilizza il sottoprogramma precedente con i
seguenti dati:
m
Ci,j= L ai,k bk,j peri= l, ...,nej= l, ... ~
k=l
Scrivere un sottoprogramma che calcoli il prodotto C = AB, dove A una
matrice reale di n righe ed m colonne e B una matrice di m righe ed ~ co-
lonne. Si ricorda che la matrice prodotto C ha n righe ed ~ colonne ed i
suoi elementi sono definiti da:
lO
20
30
CHARACTER * 7 NOME, IN * l, FIN * l
READ -. IN, FIN
PRINT *, 'CARATTERE INIZIALE DATO', IN
PRINT -. 'CARATTERE FINALE DATO', FIN
READ *, NOME
CALL RIT ALT (NOME, IN, FIN, * lO, *20, *30)
PRINT -. 'NOME INIZIA CON:', IN,'E TERMINA CON:', FIN
STOP
PRINT -. 'L"ULTIMO CARATTERE DI NOME E":', FIN
STOP
PRINT -. 'IL PRIMO CARATTERE DI NOME E":', IN
STOP
PRiNT -. 'IL PRIMO CARATTERE DI NOME E":', IN
PRINT *, 'L"ULTIMO CARATTERE E":', FIN
STOP
END
15.2
(
- I
A= O
0.5
O
O
- l
3
-5
2.1
8.3 ) (O - 1.5)
- ~ 4 B = - ~ 5 100
15.3 Scrivere un sottoprogramma mediante il quale, data una matrice reale A
di n righe ed m colonne, si determina il numero di variazioni di segno della
302
303
Scrivere infine un programma principale che, usando i due sottoprogrammi
precedenti, calcoli le variazioni di segno delle successioni {vi} associate alla
matrice MIO e alla matrice M
6
, La seconda matrice deve occupare le stesse
celle di memoria della prima.
Scrivere un sottoprogramrna che, dato in ingresso un vettore intero di n
elementi, fornisca in uscita la posizione del massimo e del minimo elemen-
to. Scrivere inoltre un programma principale che utilizzi il sottoprogramma
per localizzare il massimo e il minimo elemento dei seguenti vettori:
tuno il caso in cui tutti gli elementi v
k
' ' .., v
n
siano minori o uguali di m.
l Jtilizzare il sottoprogramrna con i dati seguenti:
v=(0,14,17,18,20) k=2 m=15;
v = (- S, 2, 8, 1S, 30) k = 3 m = 31.
15.7 Siano a = (al' .. " a
n)
e b = (bI' ..., bm) due vettori i cui elementi sono
numeri interi distinti ordinati in senso crescente. Usando il sottoprogramma
scritto nell'esercizio precedente scrivere un altro sottoprogramrna che per-
metta di costruire un terzo vettore c = (Cl' . , ., c
n
+ m) tale che ogni suo
elemento sia un elemento di a o di b e, nel complesso, i suoi elementi siano
ordinati in senso crescente (per esempio, per a = (- 1,2) e b = (O, 5,7) si
ha c =(- 1, O, 2, S, 7)).
Scrivere un programma che utilizzi il sottoprogramma con i dati seguenti:
a = (15,20,100), b = (S, 6,35, SO, 5 I),
15.8 Dati due interi m ed n, sia ftx) la funzione definita nel modo seguente:
per i = 1, ..., n e j i
per i = 1, .. "n e j >i
m(n) =
I,)
successione {vi' i = 1, ..., n}, dove vi il massimo elemento della riga
i-esima di A. Scrivere inoltre un secondo sottoprogramma che, dato un
intero n > l, determini gli elementi m(n) di una matrice quadrata M di
I,) n
ordine n definita da:
1
jn + 1-1
15.4
(- l, O, 5,80) (5,8, - 4, l O) (40,50,60,70) (-3,-5,-8,-1)
se x 1
II programma deve usare un unico vettore di 16 componenti per memoriz-
zare i quattro vettori dati e due vettori di quattro elementi per memoriz-
zare le posizioni degli elementi massimi e degli elementi minimi rispettiva-
mente.
f(x) = m tg (- 7rx/4)
m . n 3
- jf x) - - (x - 1)
n m +

se x>O
15.5 Scrivere un sottoprogramma mediante il quale, assegnato il valore x, si cal-
cola il valore della funzione f(x) definita da:
dove j(x) e (x - sono date da:
se x 1
se x < l.
Scrivere poi un programma principale che calcola e stampa la media arit-
metica dei valori f(l/3), f(5/2), t(O), f(4/3),
15.6 Sia v un vettore intero assegnato di componenti vI' ..., v
n
e siano k,
1 k n, ed m due interi dati. Supponendo che le componenti di v siano
ordinate in senso crescente, scrivere un sottoprogramma che fornisca la
posizione e il valore del primo fra gli elementi v
k
' ..., Vn il cui valore
maggiore di m. Inoltre il sottoprogramma deve segnalare in modo oppor-
La funzione f(x) deve essere calcolata mediante un sottoprogramma di tipo
FUNCfION supponendo che per il calcolo della funzione j(x) sia disponibi-
le una funzione esterna JX con le seguenti caratteristiche:
Scrivere un programma che provveda a leggere i valori di m ed n ed a me-
morizzare in un vettore e quindi stampare i valori assunti da f(x) nei punti
seguenti:
1 2 4
- 3" O, 3" 3"' 1, 3
4 2
- 3"' - 1, -'3'
Prima frase: REAL FUNCfION JX (X, N, A)
Scopo: calcolo del valore assunto nel punto x dal polinomio esponenziale
n
j(x) = a c
k x
k=O k
per O x < 1/2
per 1/2 x < 1
per 1 x 3/2
altrimenti
sin (2x - l)
f(x) = sin (2x - l) +cos (2x - 1)
sin (2x - l) + cos (2x - l) - tgx
O
I
"
'
I
I,
l'
(
305
304
15.9 Data l'equazione x = f(x) e posto Ntx) = f(f(x)) - 2 f(x) + x, sia
Fissato un valore X
o
reale, sia {x
k}
la successione di valori reali definiti
da
Argomenti muti:
X: variabile reale contenente in ingresso il valore di x;
N: variabile intera contenente in ingresso il valore di n;
A: vettore intero di N + l elementi contenente in ingresso i coefficienti
<lo' al' ..., a
n

n=4, k=2, 1=(2,3), J=(1,3)
A = ~ : ~ ~ ~ : ~ : )
25 26 27 28
31 32 33 34
In questo caso verranno modificati gli elementi delle prime 2 righe e 2 co-
lonne di A, che quindi avr in uscita la forma seguente:
15.12 Assegnata una parola chiave costituita da Qlettere dell'alfabeto inglese,
si vuole codificare una frase data secondo il seguente sistema di codifica.
Alla parola chiave viene associato un vettore v = (VI' ..., v ~ tale che v.
la posizione dell'i-esima lettera della parola chiave nell'alfabeto inglese.
Cos, per esempio, se la parola chiave CHIAVE si ha v = (3, 8, 9, l,22,S).
Se il numero di caratteri della frase che si vuole codificare non un multi-
plo di Q, si aggiungono in coda alla frase un certo numero di caratteri blank
in modo da ottenere una stringa, MESS, la cui lunghezza r sia multiplo di Q.
Cos, continuando il nostro esempio, se la frase da codificare
'UN '17 BEL 'I7PANORAMA' si ha MESS = 'UN '17 BEL 'I7PANORAMA'I7'17v'.
15.11 Scrivere un programma principale atto a:
l) leggere i valori degli elementi di una matrice reale A di ordine lO e
deivettori 1=(iI,i
2,i))e
J=(jI,j2,j3);
2) se gli elementi di I e J soddisfano le ipotesi del precedente esercizio
e hanno valori minori o uguale di 5 applicare il sottoprogramma COMP
alla sottomatrice di A costituita dagli elementi a.. con l J. = l 5 e I,J ' , .. -, ,
stampare i risultati ottenuti; altrimenti interrompere l'esecuzione;
3) applicare il sottoprogramma a tutta la matrice A precedentemente
trasformata usando i nuovi vettori I = (il + 5, i
2
+ 5, i
3
+ 5) e J =
= U
I
+ 5, j2 + 5, j3 + 5) e stampare i risultati ottenuti.
Verificare la correttezza del programma usando come dati iniziali la matri-
ce A di elementi a . = _1_ per i = l, ..., lO e j = l, ..., lO e i vettori
l,l i + j
1= (1, 3,5), J = (2, 4,5).
se N(x) =O
se N(x) "1= O
(f(x) - x)2
N(x)
x
x
F(x) =
X
k
+ 1= F(x
k
)
che, sotto opportune ipotesi, converge alla soluzione x = s dell'equazione
data.
Scrivere un algoritmo che, basandosi sul procedimento iterativo ora descrit-
to, permetta di realizzare quanto segue. Dati in ingresso i valori kmax > O,
El > O, E
2
~ O e E) ~ O con E
2
ed E) non ambedue uguali a zero, determi-
nare se esiste un termine x
j
della successione {x
k},
con j E;; k
max
' tale che:
Ixj-F(xj_I)IE;;E
I
e \Xj-xj_IIE;;EIIXj_II+E2
Se tale x
j
esiste, esso una stima della soluzione dell'equazione data; in
questo caso l'algoritmo deve fornire come risultati i valori di j, x. e
J
Ix
j
- F(x
j_
I) I Se tale x
j
non esiste, l'algoritmo fornisce il risultato j =
= k
max
+ l. Realizzare l'algoritmo ora descritto mediante un sottopro-
gramma che preveda fra gli argomenti muti anche il nome della funzione
esterna che descrive f(x).
Utilizzare il sottoprogramma per calcolare una soluzione dell'equazione
x = e- x con X
o
= 0.5, scegliendo valori opportuni per k
max
, El' E
2,
E).
15.10 E' assegnata una matrice reale A quadrata di ordine n, i cui elementi sono
indicati con ai,j' con i, j = l, ..., n. Sono inoltre dati due vettori interi
I = (il' ..., i
k)
e J = UI' ..., jk) con l :so;; k E;; n, per ognuno dei quali gli
elementi sono valori distinti compresi fra l ed n ordinati in senso crescente.
Si scriva un sottoprogramma di nome COMP che permetta di compattare
nella prime k righe e k colonne della matrice A gli elementi aip,jq con p,
q = l, ... , k. Utilizzare il sottoprogramma con i dati seguenti:
306
Ogni carattere di ogni sottostringa successiva di MESS di lunghezza Q,
indicata per semplicit come' Cl ... c ~ viene sostituito nel modo seguente:
se Ci un carattere blank, allora viene sostituito dalla vi-esima lettera del-
l'alfabeto; se invece Ci la j-esima lettera dell'alfabeto, allora viene sostitui-
to dalla lettera (j + vi)-esima se j + Vi ~ 26 o dalla lettera (j + Vi - 26)-
esima se j + Vi > 26 (ricordiamo che l'alfabeto inglese composto da 26
lettere). Il risultato della codifica di MESS una stringa, MESS l, composta
da k + l gruppi di Qlettere separati l'uno dall'altro da un carattere blank:
il primo gruppo la parola chiave; i successivi sono ottenuti codificando nel
modo descritto le sottostringhe di MESS. Cos, nel nostro caso, la prima
sottostringa di MESS di lunghezza 6 'UNvBEL' e viene codificata come
'XVICAQ'; infatti:
U sostituito da X perch VI = 3
e j = 21;
N sostituito da V perch v
2
= 8 e j = 14;
v sostituito da I perch v
3
= 9;
B sostituito da C perch v
4
= 1 e j = 2;
E sostituito da A perch V
s
= 22 e j = 5;
L sostituito da Q perch v
6
= 5 e j = 12.
La seconda e terza sottostringa di MESS, ossia ' v PANOR' e 'AMA v vv'
vengono sostituite rispettivamente da 'CMJOMW' e 'DUJAVE' .Cos il risul-
tato
MESS1 = 'CHIAVE vXVICAQ vCMJOMW vDUJAVE'
Scrivere un sottoprogramma che, avendo come dati in ingresso una parola
chiave, KEY, e una stringa MESS, di lunghezza qualunque, controlli che la
lunghezza di MESS sia multipla di quella di KEY e, in caso affermativo,
esegua la codifica di MESS e fornisca come risultato la stringa MESS l.
Verificare la correttezza del sottoprogramma usando i dati utilizzati nel
corso di questo esercizio.
15.13 Scrivere un sottoprogramma ALF AB che permetta di ordinare alfabetica-
mente gli N elementi di un vettore V di tpo carattere. La lunghezza degli
elementi di V pu essere qualunque.
Scrivere un programma che utilizzi il sottoprogramma ALFAB per ordinare
gli elementi dei seguenti vettori:
VI = ('GIANNA', 'MARISA', 'ALVARO', 'MATTEO', 'FRANCO')
V2 = ('MATEMATICA', 'STORIAvvvv', 'GEOGRAFIAv', 'ITALIANOvv)
V3 =('CANE', 'ALCE', 'LUPO', 'GUFO', 'OCA v', 'BUEv', 'BACO').
T
I
16
Uso flessibile della memoria
16.1. L'istruzione COMMON
La possibilit di strutturare un programma in varie unit, programma princi-
pale e sottoprogrammi, una delle caratteristiche fondamentali del FORTRAN
ed basata sul concetto di localit delle variabili che figurano in ogni unit
di programma. D'altra parte le unit di programma devono scambiare informa-
zioni fra loro e una prima alternativa per soddisfare questa necessit offerta dal
meccanismo di associazione fra argomenti muti e argomenti attuali. Tale mec-
canismo ha per un certo costo in termini di tempo d'esecuzione e occupazione
di memoria: infatti, al momento dell'attivazione di un sottoprogramma l'associa-
zione fra ogni argomento muto e il corrispondente argomento attuale viene realiz-
zata eseguendo delle operazioni che consentono la trasmissione degli indirizzi dei
parametri attuali dalla unit chiamante al sottoprogramma. In alcune situazioni
pu essere vantaggioso evitare questi costi, per esempio quando si debbano tra-
smettere gli indirizzi di molti parametri molte volte durante l'esecuzione del
programma. A tale scopo si pu usare il meccanismo di spartizione predichiarata
di una zona di memoria da parte di pi unit di programma. espresso dall'istruzio-
ne dichiarativa COMMON. Usando tale istruzion-e s p ~ infatti realizzare una se-
conda modalit di trasmissione di informazioni fra pi unit di programma
che pu essere usata insieme o in alternativa alla associazione fra argomenti muti
e argomenti attuali.
I blocchi COMMON
Un blocco COMMON un insieme di unit di memoria numeriche consecutive
o un insieme di unit di memoria carattere consecutive, alle quali possono acce-
dere direttamente pi unit di programma. Un blocco COMMON pu essere indi-
viduato tramite un nome simbolico, detto nome o etichetta del blocco. nel qual
caso il blocco viene detto blocco COMMON etichettato. Il nome di un blocco
COMMON lo distingue dagli altri blocchi dichiarati nel programma e deve essere
diverso dai nomi delle unit che compongono il programma. Un blocco COMMON
308
pu anche essere caratterizzato dall'assenza di un nome, nel qual caso il blocco
viene detto blocco COMMON non etichettato.
I blocchi COMMON vengono definiti mediante l'istruzione dichiarativa
COMMON, la cui struttura la seguente:
COMMON I nome} I lista}, Inome2/lista2' ... , Inomen/listan
dove:
COMMON la parola chiave che identifica la frase:
nome
i,
con l E;;; i E;;; n, il nome simbolico di un blocco COMMON oppure
omesso. Ciascun nome
i
pu essere usato, senza alcuna am biguit, come nome
di variabile nella stessa unit di programma;
listai' per l E;;; i E;;; n, una lista di nomi di variabile, nomi di variabile dimen-
sionata o dichiaratori di variabile dimensionata. In listai non possono coesistere
entit di tipo carattere con entit di tipo numerico oLo...&li;o; inoltre le variabili
dimensionate che figu;ano in lista.
------- - 1------ _
fine non possono far parte di listai argomenti muti della unit di programma
in cui compare la frase COMMON. .-
Per effetto dell'istruzione COMMON alle entit i cui nomi compaiono in listai
vengono riservate unit di memoria consecutive; tali unit di memoria vengono
considerate parte del blocco COMMON individuato dal nome simbolico nome
i,
oppure di un blocco COMMON non etichettato se nome
i
omesso.
Esempio 16.1. La frase
COMMON Il X(50), I NOMEI I Y, Z
dichiara due blocchi COMMON; il primo, non etichettato, comprende i 50 ele-
menti del vettore reale X, ovvero 50 unit di memoria numeriche consecutive;
il secondo, etichettato con il nome simbolico NOMEl, contiene le variabili Y e Z
alle quali il compilatore riserva due unit di memoria consecutive. Si osservi che
la frase data equivalente alla coppia, di istruzioni
DIMENSION X(50)
COMMON Il X, INOMEI I Y, Z
Se in un'istruzione COMMON il primo nome simbohco, nome
l
, omesso,
allora possono essere omesse anche le prime due sbarre; cos la frase COMMON
dell'esempio precedente equivale alla frase
COMMON X(50), INOMEl I Y, Z
Ancora, la virgola che segue ogni lista di nomi pu essere omessa; cos la frase pre-
cedente equivale a
309
COMMON X(50) INOME l I Y, Z
11 nome di un blocco pu comparire pi volte in una stessa frase COMMON () in
pi frasi COMMON nella stessa unit di programma. In questo caso Il' liste asso-
ciate al nome del blocco vengono considerate, nell'ordine di apparizione. seg-
menti consecutivi di un'unica lista che determina la struttura del blocco. Le stesse
considerazioni valgono per il blocco COMMON non etichettato.
Esempio 16.2. Le sequenze di istruzioni
COMMON A, BI NOME2/ Y, WIl e, D.
COMMON E, F I NOME2 I Z
e
COMMON A, B, e, DI NOME2 I Y, W
COMMON E, F INOME2 I Z
sono fra loro equivalenti, ed ambedue hanno lo stesso effetto dell'unica frase
COMMON A, B, C, D, E, F I NOME2 / Y. W. Z
La lunghezza di un blocco COMMON data dal numero di unit di memoria
che lo compongono; in generale la lunghezza di un blocco uguale al numero di
unit di memoria consecutive riservate agli elementi della lista associata al suo
nome (cfr. 16.4).
Esempio 16.3. Con le frasi di specificazione seguenti
CHARAeTER.8 CAR(lO)
REAL REX, REY
DOUBLE PRECISION DP(15)
COMMON IBLOC1/REX,DP. IBLOC2/REY, IBLOC31CAR
vengono definiti tre blocchi COMMON. Ricordando che a un dato in doppia pre-
cisione vengono riservate due unit di memoria numeriche consecutive, si deduce
che il primo blocco, BLOCI. costituito da 31 unit di memoria numeriche; il
secondo, BLOC2, costituito da l unit di memoria numerica e il terzo, BLOC3,
da 80 unit di memoria carattere. Pertanto i tre blocchi hanno lunghezza rispet-
tivamente 31, l ed 80.
16.2. Utilizzazione dei blocchi COMMON
Blocchi COMMON etichettati
In pi unit di programma si possono definire blocchi COMMON etichettati

I
I

:11
blocco COMMON di nome UNO
X(\) Y(\)
X(2) Y(2)
X(3) Y(3)
X(4) Y(4)
X(S) ZO,I )
X(6) Z(2,I)
X(7) Z(1,2)
X(8) Z(2,2)
I
ii
(
"
310
con lo stesso nome. In questo caso i blocchi devono essere costituiti con lo stesso
tipo di unit di memoria (carattere o numerico) e devono avere la stessa lunghez-
za. Durante l'esecuzione del programma tali blocchi occupano la medesima zona
di memoria. Cos, se in pi unit di programma si definiscono blocchi COMMON
_con lo nome, SI definisce di fatto un gruppo di celle di memoria consecu-
tive i_contenuti delle quali sono direttamente utilizzabili da queste unit. Le
liste associate al nome del blocco nelle diverse unit di programma specificano
i nomi locali che ogni unit utilizza per identificare le celle del blocco.
Esempio 16.4. Un programma comprende il programma principale di nome
MAIN e i due sottoprogramrni SUBI e SUB2 seguenti:
PROGRAM MAIN
COMMON /UNO/X(8), /DUE/N, M
END
SUBROUTINE SUBI
COMMON /UNO/Y(4), Z(2, 2)
END
MAIN SUBI MAIN SUB

blocco COMMON di nome DUE


311
SUBROUTINE SUB2
COMMON /DUE/I, J
END
Nel programma vengono definiti due blocchi COMMON, di nomi UNO e DUE,
di lunghezza Be 2 rispettivamente. II primo blocco definito nel programma pnn-
cipale e nel sottoprogramma SUB l e le celle del blocco sono identificate con i
nomi Xt l ), X(2), ... , X(B) e Y( I), ... , Y(4), Z(l, I), .. " Z(2, 2) rispettivamente
nelle due unit dr programma. Al secondo blocco invece hanno accesso il program-
ma principale e il sottoprogramma SUB2 che ne identificano le celle con i nomi
N, M e I, J rispettivamente. Cos, i valori attribuiti nel programma principale
agli elementi del vettore X sono direttamente utilizzabili dal sottoprogramma
SUB I come valori degli elementi di Y e Z, e viceversa. Analogamente i valori asse-
gnati ad N e M nel programma principale vengono direttamente trasmessi al sotto-
programma SUB2 che vi fa riferimento con i nomi I e J, e viceversa. In fig. 16.1
sono schematicamente rappresentati i due blocchi COMMON: ogni rettangolo
rappresenta una cella di memoria e i nomi all'interno del rettangolo sono i nomi
che identificano la cella nelle diverse unit di programma.
Figura 16.1. Rappresentazione dei blocchi COMMON definiti nell'esempio 16.4.
Il blocco COMMON non etichettato
1 blocchi COMMON /IO/I etichettati definiti iII pi unit di programma pOSSOIlO
avere lunghezze diverse; iII ogni caso la loro prima unit di memoria la stessa e
quindi essi definiscono zone di memoria che si sovrappongono del tutto o in
parte. In altri termini in un programma si pu definire una zona della memoria. il
blocco COMMON non etichettato. costituita da un numero di unit di memoria
pari alla massima lunghezza dei COMMON non etichettati dichiarati nelle singole
(
. unit di programma; ognuna di queste unit pu direttamente utilizzare i conte-
nuti delle prime Q unit di memoria del blocco se Q la lunghezza del blocco
COMMON non etichettato in essa dichiarato.
Esempio 16.5. In fig. 16.2 sono rappresentate quattro unit di uno stesso pro-
gramma. ognuna delle quali contiene la specificazione di un blocco COMMON
non etichettato. Nei sottoprograrnmi NO\fE I e il blocco ha
6, mentre in NOME2 e NOME4 ha lunghezza 2 e 4 rispettivamente. Pertanto ri-
sulta definito nel programma un blocco COMMON non etichettato di lunghezza
6; le unit NOMEI e NOME3 hanno accesso a tutte le celle del blocco. mentre
NOME2 pu accedere soltanto alle prime due e NOME4 soltanto alle prime
312
313
NOMEI NOME2 NOME3 NOME4
SUBROUTINE NOME l
REAL A, B, C
COMMON A, B, C(4)
(
COMMON sono uno strumento molto meno flessibile delle liste di argomenti; !
cos, per esempio, in essi non devono figurare variabili dimensionate con di-
mensionamento variabile e ci pu limitare le possibilit di utilizzo di un sot-
toprogramma.
Esempio 16.6. Consideriamo il programma di fig. 16.3, costituito dal sottopro-
gramma ORD che permette di ordinare in senso crescente i contenuti degli N ele-
menti di un vettore X e dal programma principale MAIN che lo utilizza. Le due
unit di programma comunicano attraverso la lista degli argomenti. Possiamo
modificare le unit ORD e MAIN in modo da ottenere un programma principale
MAINI e un sottoprogramma ORDI che sono analoghi ai precedenti ma utiliz-
zano come canale di comunicazione un blocco COMMON non etichettato (cfr.
fig. 16.4). Si pu notare che la frase
REAL X(N)
del sottoprogramma ORD viene sostituita dalla frase
REAL X(SO)
nel sottoprograrnma ORD 1, in quanto il vettore X fa parte di un blocco COMMON
A A M(l) C(l)
B B M(2) C(2)
C(l) M(3) C(3)
C(2) M(4) C(4)
C(3) M(S)
C(4) M(6)
END
SUBROUTINE NOME4
REAL C
COMMON C(4)
END
SUBROUTINE NOME3
INTEGER M
COMMON M(6)
END
SUBROUTINE NOME2
REAL A, B
COMMON A, B
END
Figun 16.2. Sottoprogrammi e blocco COMMON deU'esempio 16.5.
quattro. Si noti che nel sottoprogramrna NOME3 le celle sono individuate con
nomi di tipo intero, mentre nelle altre unit si utilizzano nomi di tipo reale.
/
1 Osservazione. Si not.i che l'associazione che viene stabilita fra le variabi!i
... in un blocco che figura in pi unit di programma dal
I tipo di queste variabili: quindi estremamente importante che il programmatore
ponga moltaattenzione ai possibili effetti non desiderati derivanti dal disaccordo
in tipo fra variabili che spartiscono le medesime unit di memoria.
l blocchi COMMON possono essere utilizzati con un duplice scopo. Attraverso
la definizione di zone di memoria utilizzabili da pi unit di programma si pu
ridurre talvolta la quantit di memoria necessaria alla esecuzione di un program-
ma. D'altra parte i blocchi COMMON costituiscono veri e propri canali di comu-
nicazione fra unit di programma e possono essere usati per scambio di informa-
zioni. Rispetto all'associazione fra parametri muti e parametri attuali, l'uso dei
blocchi COMMON presenta il vantaggio di una maggior velocit di esecuzione;
infatti in questo caso non si eseguono operazioni per realizzare la trasmissione
delle informazioni in quanto i blocchi vengono definiti dal compilatore e dal
linker nelle fasi che precedono l'esecuzione. Osserviamo per che i blocchi
j
PROGRAM MAIN
REAL X(SO)
READ -. N, (X(I), I = l, N)
WRITE(*, 3)(X(I), I = l, N)
3 FORMAT(lX, 'vETTORE DA RIORDINARE' / S(lX, EI3.6)
CALL ORO(X, N)
WRlTE(*,5) (X(I), I = l, N)
FORMAT(l X, 'VETTORE RIORDINATO' / S(lX, EI3.6
STOP
END
SUBROUTINE ORD(X, N)
REAL X(N)
C RIORDINAMENTO IN SENSO CRESCENTE
C DEGLI ELEMENTI DEL VETTORE X
0010 1=I,N-I
XMIN = X(I)
DO20 J = I + l, N
IF (X MIN.GT.x(J)) XMIN = X(J)
20 CONTINUE
X(I) = XMIN
IO CONTINUE
RETURN
END
Figura 16.3. Scambio di informazioni fra unit di programma attraverso la lista degli argomenti
(esempio 16.6)
314
PROGRAM MAINI
REAL X(50)
COMMON N, X
CALL ORDI
END
SUBROUTINE ORDI
REAL X(50)
COMMON N,X
END
Figura 16.4. Scambio di informazioni fra unit di programma
attraverso un blocco COMMON(esempio 16.6).
e non pu quindi avere dimensionamento variabile. Si osservi che questa forma
di dimensionamento potrebbe essere mantenuta lasciando X fra gli argomenti
muti di ORD e mettendo N in un blocco COMMON.
Osserviamo che in alcune situazioni l'uso dei blocchi COMMON pu rivelarsi
molto vantaggioso se non si vogliono modificare sottoprogrammi gi scritti.
Esempio 16.7. Consideriamo la seguente funzione della variabile x
(I + a)
f(x) = x
2
- 2ax + --- - 2a
log x
315
PROGRAM MALFA
COMMON /MAINFX/ALFA
PARAMETER (A = IO., B = 100.)
EXTERNAL FXALFA
REA D e , N, EPS
H = (B - A)/N
ALFA = O.
DO 20 1 = l, IO
ALFA = ALFA + 0.1
XO= A
CALL SGNI (XO, XN, H, N, EPS, JCS, FXALFA)
WRITE (., 3), ALFA, JCS
3 FORMAT(/ IX, 'ALFA =', F3.I, 5X. 'JCS =',15)
20 CONTINUE
STOP
END
FUNCTION FXALFA(X)
COMMON /MAINFX/ALFA
FXALFA = X X - 2. ALFA. X + (1. + ALFA)/LOG(X) - 2. ALFA
RETURN
END
Osserviamo che il programma composto dal programma principale MALFA
e dai sottoprogrammi SGN l ed FXALFA. L'uso del blocco COMMON ci con-
sente di scavalcare SGN l e passare l'informazione relativa ad ALFA diret-
tamente da MALFA a FXALFA. In fig. 16.5 rappresentiamo schematicamente
il modo in cui la memoria viene utilizzata e il modo in cui avviene la trasmissione
di informazioni fra le varie parti della memoria.
Figura 16.5. Utilizzazione della memoria e scambio di infonnazioni fra unit di programma
(cfr. es. 16.7).
dove a un parametro reale che pu assumere i valori 0.1, 0.2, ... ,0.9, l. Fissato
l'intervallo di estremi a = l O, e b = 100., e assegnati i valori n > O e > O, si
vuole utilizzare il sottoprogramma SGN l dell'esempio 15.15 per studiare il com-
portamento di f(x), per ogni valore di a, sui punti xi = a + ih, con i = O, ..., n e
h =(b - alIno
La SUBROUTINE SGN l richiede la definizione di un sottoprogramma di tipo
FUNCTION, con un unico argomento muto che rappresenta la variabile indi-
pendente x, Nel nostro caso quindi, non potendo utilizzare la lista degli argo-
menti per trasmettere alla funzione il valore di a, dovremmo definire per ogni
valore di a un sottoprogramma FUNCTION distinto. Si pu evitare tale dispen-
dioso modo di procedere ricorrendo alla definizione di un blocco COMMON
opportuno. Quanto detto esemplificato nel seguente programma principale e
nel sottoprogramma FXALFA.
Memoria locale Unit di programma
MAIN
Blocchi COMMON
accesso di una unit
- di programma alla
sua memoria locale
scambio di informazioni
~ tramite la lista di
argomenti muti e attuali
accesso al blocco
COMMON
317
Figura 16.6. Effetto dell'istruzione EQUIVALENCE dell'esempio 16.8.
precedenti figure, ogni rettangolo rappresenta una unit di memoria, e i nomi al
suo interno sono i nomi usati per identificare questa unit; nel caso della variabile
complessa OMEGA, il nome identifica due unit di memoria numeriche.
Si osservi che l'eventuale spartizione di una o pi unit di memoria da parte di
entit di tipo diverso non implica alcuna operazione di conversione. Osserviamo
inoltre che, evidentemente, un'istruzione EQUIVALENCE non deve implicare
sovrapposizioni di unit di memoria che devono essere distinte o la separazione
di unit di memoria che devono essere consecutive. Pertanto sono sbagliate dichia-
razioni del tipo
REL(I)
REL(3)
REL(2)
REL(4)
I----OMEGA-
ALFA (1 : 1) CAR (1)
ALFA (2: 2) CAR (2)
ALFA (3 : 3) CAR (3)
ALFA (4: 4) CAR (4)
ALFA (5: 5) CAR (5)
ALFA (6: 6)
mente 6 e 5 unit di memoria carattere, hanno in comune le prime 5 di queste;
pertanto il nome CAR (1). con 1 :E;;; I :E;;; S, identifica la stessa unit di memo-
ria identificata dal nome ALFA (I : I). Ancora, la variabile di tipo complesso
OMEGA occupa due unit di memoria numeriche consecutive, mentre REL(3)
il terzo elemento del vettore reale REL che ha ampiezza 4; pertanto le unit
di memoria occupate da OMEGA coincidono con quelle occupate da REL(3)
e REL(4). Infine, i tre nomi I, J e K identificano la stessa cella di memoria. In
fig. 16.6 si rappresenta in modo schematico l'effetto ora descritto. Come nelle
316
dove:
EQUIVALENCE la parola chiave che identifica la frase;
per ogni i, l <; i .;; n, listai una lista composta da almeno due nomi, separati
da virgole; listai pu contenere nomi di variabile, nomi di variabile dimensionata,
nomi di elementi di variabile dimensionata con indici costituiti da espressioni
costanti intere, e nomi di sottostringhe. L'occorrenza in listai di un nore di va-
riabile dimensionata equivalente all'occorrenza del suo primo elemento. Non
possono coesistere in listai entit di tipo carattere con entit di tipo numerico
o logico; inoltre non possono figurarvi argomenti muti della unit di programma
in cui la frase EQUIVALENCE compare.
Per effetto della dichiarazione EQUIVALENCE tutte le entit che compaiono
in ciascuna listai' con l .-; i <;; n, hanno in comune la prima unit di memoria.
Da ci pu seguire che due o pi entit in una stessa lista spartiscano, oltre alla
prima, altre unit di memoria.
16.3. L'istruzione EQUIVALENCE
L'idea della spartizione di una cella di memoria da parte di pi variabili espressa
dalla frase COMMON si trova anche nella frase. dichiarativa EQUIVALENCE.
La differenza fondamentale rispetto alla frase COMMON risiede nel fatto che
con la frase EQUIV viene dichiarata la spartizione di una zona della
memoria da parte di pi variabtl; nella medesima unit di tuozmmma. Esi-
stono varie circostanze nelle quali pu risultare utile sfruttare le possibilit of-
ferte dalla dichiarazione EQUIVALENCE; essa infatti consente di riferirsi alla
medesima quantit con nomi diversi ed quindi utilizzabile, ad esempio, quando
si vuole risparmiare memoria in presenza di grandi quantit di dati. In quest'ul-
timo caso, quando ad esempio una variabile dimensionata sia gi stata elaborata
e la sua presenza in memoria non sia ulteriormente necessaria, un'altra variabile
dimensionata, il cui nome ci interessi mantenere distinto da quello della prima,
pu occupare in tutto o in parte lo spazio di memoria occupato dalla prima.
La forma della frase EQUIVALENCE la seguente:
EQUIVALENCE (listai)' ... (lista
n
)
Esempio 16.8. Consideriamo le seguenti istruzioni:
CHARACTER ALFA. 6, CAR(5). I
REAL REL(4)
COMPLEX OMEGA
EQUIVALENCE (ALFA, CAR), (OMEGA, REL(3, (I, J, K)
L'effetto di queste frasi il seguente: ALFA e CAR, che occupano rispettiva-
DIMENSION A(2)
EQUIVALENCE (A(l), B), (A(2), B)
oppure
REAL A(2)
COMPLEX C(2)
EQUIVALENCE(A(I), C(I , (A(2), C(2
':i. [
I
:1
I
,I
318
Anche alla luce delle precedenti osservazioni, occorre molta attenzione nell'u-
tilizzare la frase EQUIVALENCE soprattutto in relazione a variabili dimensionate.
Esempio 16.9. Si considerino le seguenti frasi di specificazione
REAL A(6), B(2, 3), C(6)
EQUIVALENCE (A, B), (B(I, 2), C(3
Il significato di questa frase EQUIVALENCE pu essere il seguente: il primo ele-
mento del vettore A ed il primo elemento della matrice B occupano la medesima
cella di memoria ed il primo elemento della seconda colonna della matrice B
occupa la stessa cella del terzo elemento del vettore C. Esaminiamo per gli effetti
implicitamente derivanti dalla frase EQUlVALENCE, dovuti al fatto che A, B e
C sono variabili dimensionate ed occupano ciascuna 6 unit di memoria conse-
cutive. L'effetto complessivo nel nostro caso quello descritto in fig. 16.7, dove
si nota in particolare che dalla sovrapposizione fra B( l, 2) e C(3) segue la sovrap-
posizione totale fra la matrice B e il vettore C. Pertanto le frasi considerate sono
equivalenti alle frasi
REAL A(6), B(2, 3), C(6)
EQUIVALENCE (A, B, C)
Esempio 16.10. Le dichiarazioni seguenti
REAL A(2, 2), B(2, 2)
EQUIVALENCE (A(I, 2), BO, I
producono l'effetto schematizzato in fig. 16.8, ovvero la sovrapposizione fra la
seconda colonna della matrice A e la prima colonna della matrice B.
1
319
16.4. Interazione fra istruzioni COMMON ed EQUIVALENCE
E' possibile che una variabile, dimensionata o non dimensionata, figuri in una
frase COMMON e in una frase EQUIVALENCE nella stessa unit di programma,
purch l'effetto congiunto delle due frasi non dia luogo alle seguenti situazioni
non consentite. Innanzitutto un'istruzione EQUIVALENCE non deve creare so-
vrapposizioni fra blocchi COMMON distinti; per esempio sbagliata la compre-
senza nella stessa unit di programma delle seguenti frasi
COMMON!COMI! A(lOO), B(lOO)
COMMON!COM2! X, Y
EQUIVALENCE (B(lOO), X)
In questo caso, infatti, l'ultima cella di memoria del blocco di nome COMI
si sovrapporrebbe alla prima cella del blocco di nome COM2. Si osservi inoltre
che dall'interazione tra una frase COMMON e una frase EQUlVALENCE pu
seguire un allungamento di un blocco COMMON. Per spiegare in cosa consiste
questo fenomeno conviene ricorrere ad un semplice esempio.
Esempio 16.11. Consideriamo le seguenti istruzioni
REAL D(3)
COMMONIX! A, B, C
EQUIVALENCE (C, D(I
Per effetto della frase EQUIVALENCE la terza unit di memoria del blocco
COMMON coincide con l'unit di memoria riservata al primo elemento del vet-
tore reale D. In questo caso anche i restanti due elementi di D vengono consi-
derati parte del blocco COMMON (cfr. fig. 16.9.a); pertanto le istruzioni date
sono equivalenti alle seguenti
A(I) B(l,I) C(I)
A(2) B(2,1) C(2)
A(3) B(I,2) C(3)
A(4) B(2,2) C(4)
A(5) B(I,3) C(5)
A(6) B(2,3) C(6)
Figura 16.7. Effetto della frase
EQUlVALENCE nell'esempio 16.9.
A(l,I)
A(2,1)
A(l,2) B(I,I)
A(2,2) B(2,1)
B(I,2)
B(2,2)
Figura 16.8. Effetto della frase
EQUIVALENCE nell'esempio 16.10.
REAL D(3)
COMMON IX! A, B, O
EQUIVALENCE (C, 0(1
e il blocco COMMON ha lunghezza 5 anzich lunghezza 3 come risulterebbe
dalla sola frase
COMMON IXI A, B, C
Ancora. la sequenza di istruzioni
REAL 0(3)
COMMON IX! A, B, C
EQUIVALENCE (B, O (I
equivale alla sequenza
e in questo caso il blocco COMMON ha lunghezza 4 (cfr. hg. 16.9.b).
REAL 0(3)
COMMON/X/ A, D
EQUIVALENCE (8, D(1, (C, 0(2
i
l
III
A D(3)
B
C
0(1)
D(2)
Figura 16.10. Allungamento non consentito di un blocco COMMON.
321
La frase DATA consente di predefinire, ossia definire prima dell'esecuzione,
in fase di compilazione, il valore di una variabile, di una variabile dimensionata,
di un elemento di una variabile dimensionata, di una sottostringa. I valori asse-
gnati con una frase DATA restano inalterati per la durata dell'esecuzione dell'inte-
ro programma, a meno che non vengano esplicitamente modificati nell'unit di
programma in cui la frase DATA compare.
La frase DATA una frase non eseguibile che pu apparire in qualsiasi punto
di una unit di programma dopo le frasi di specificazione e prima della END.
Tale frase ha la forma seguente:
16.5. La frase DATA
b)
A
8 D(1)
C 0(2)
0(3)
a)
Figura 16.9. Allungamenti del blocco COMMONnell'esempio 16.11.
A
8
C 0(1)
D(2)
0(3)
320
L'allungamento di un blocco COMMON etichettato per effetto di frasi
EQUIVALENCE in una unit di programma consentito purch sia rispettata la
regola secondo la quale i blocchi COMMON con lo stesso nome definiti in unit
di programma diverse devono avere la stessa lunghezza. In ogni caso, anche per il
blocco COMMON non etichettato, vale la seguente restrizione: un blocco COMMON
pu essere allungato soltanto a destra, ovvero con l'aggiunta di unit di memo-
ria successive all'ultima. Pertanto sbagliata la sequenza di istruzioni
REAL D(3)
COMMON/X/ A, B, C
EQUIVALENCE (A, D(3
secondo la quale l'elemento D(3) si sovrappone alla prima unit di memoria del
blocco COMMON; ci provocherebbe un allungamento non consentito a sini-
stra, come illustrato in fig. 16.10.
dove:
DATA la parola chiave che identifica la frase;
le virgole che separano ogni coppia nlistaJvlistaJ dalla successiva, possono
essere omesse;
ciascuna nlista
i
, per I i n, una lista di nomi di variabile; nomi di variabile
dimensionata, nomi di elementi di variabile dimensionata, nomi di sottostringa
e liste con DO-implicito. Le espressioni indice nei nomi di elementi di variabile
dimensionata e le espressioni di sottostringa nei nomi di sottostringa devono
essere espressioni costanti intere;
ciascuna vlista
i
, per I i n, una lista di costanti, nomi simbolici di costante,
o simboli della forma r * c, dove r (un nome simbolico di) una costante intera
non nulla senza segno e c una costante o un nome simbolico di costante. La
presenza di un simbolo r * c equivalente alla presenza di r costanti successive
uguali a c separate da virgole. Tenendo presente che ogni nome di variabile dimen-
sionata in nlista
i
equivalente alla lista dei nomi dei suoi elementi nell'ordine in
,:1
1
322
cui compaiono in memoria, il numero di valori costanti espressi in nlista
i
deve
essere uguale al numero di componenti di nlista.. Infatti viene stabilita una corri-
spondenza uno-a-uno fra gli elementi di nlista
i
e quelli' di vlista
j
e ogni elemento
di nlista. viene predefinito con il corrispondente valore in vlista
j
. Di questa prede-
I . .
finizione si tiene conto attraverso la tavola dei sim boli (cfr. cap. 2) che in COrrI-
spondenza di ogni entit presente in una frase DATA riporta. oltre all'indirizzo
della sua prima unit di memoria, anche il suo valore iniziale. Da quanto detto
segue che ad ogni elemento di tipo logico o carattere in nlista
i
deve corrispondere
un valore dello stesso tipo in vlista.. Si osservi inoltre che la predefinizione di un
elemento di tipo carattere avviene secondo le regole dell'assegnazione carattere
e quella di un elemento di tipo numerico pu implicare un'operazione di conver-
sione secondo le specifiche della frase di assegnazione aritmetica.
Si osservi che la frase DATA non pu essere usata per predefinire entit che
facciano parte di un blocco COMMON non etichettato o della lista di argomenti
muti nella stessa unit di programma. Le entit che fanno parte di un blocco
COMMON etichettato possono invece essere predefinite soltanto nel corpo di un
sottoprogramma BLOCK DATA, come vedremo nel paragrafo successivo.
Esempio J6. J2. Sono corrette le seguenti istruzioni:
DATA UNO, DUE, TRE 11.,2.,3./, I, J, K I 3 * O
DATA TRE. CINQUE I 3,5
DIMENSION V(lO, IO), U(l5)
DATA V I 100 * 0./, U I IO* O., 1.,2.,3.,4.,5./
CHARACTER * 2 MAT(3, 3), VAR
DATA MAT(I, l), MAT(2, 2), MAT(3, 3), VAR 14 * 'UN'
Sono invece sbagliate le seguenti:
DATA A,B 13*0.51
DOUBLE PRECISION D(5,5)
DATA D I 20*0.5D-21
CHARACTER * 4 NOME
DATA NOME, X I 3.2, 'ANNA'I
Infatti nei primi due casi nlista
i
e vlista
i
non contengono lo stesso numero di
elementi, mentre nel terzo la variabile NOME, di tipo carattere, viene predefinita
con un valore reale e la variabile reale X con un valore di tipo carattere.
I
\
I
323
Esempio J6.13. Consideriamo le seguenti istruzioni:
REAL B(l5,I5)
CHARACTER * 6 NOME(41
DATA B1225 * 0./, NOMEI 'GUIDO', 'BRUNO', 'GIULIO', 'LAPO'/
A tutti gli elementi della matrice B viene assegnato in fase di compilazione il
valore zero, mentre gli elementi del vettore carattere NOME conteranno all'inizio
dell'esecuzione le stringhe 'GUIDOv', 'BRUNOv', 'GIULIO, ' LAPOvV. Infatti
i contenuti di B e NOME risultano definiti come se venissero eseguite le frasi di
assegnazione seguenti:
DOlO 1==1,15
DO IO J == l, l 5
IO B(I, J) == O.
NOME(I) == 'GUIDO'
NOME(2) == 'BRUNO'
NOME(3) == 'GIULIO'
NOME(4) == 'LAPO'
Osserviamo che i valori preassegnati agli elementi di B e di NOME possono es-
sere modificati durante l'esecuzione del programma.
Come l'esempio precedente suggerisce, le frasi DATA possono essere vantag-
giosamente utilizzate per predefinire variabili dimensionate di grosse dimensioni;
in questi casi infatti la predefinizione in fase di compilazione permette un notevo-
le risparmio di tempo rispetto, per esempio, all'esecuzione di un gran numero di
frasi di assegnazione. Talvolta la frase DATA pu essere usata con uno scopo ana-
logo a quello dell'istruzione PARAMETER, ovvero per poter usare nel corpo di
una unit di programma un nome simbolico per riferirsi ad una quantit che non
cambia durante l'esecuzione del programma. Cos. per esempio, le due frasi
DATA I EPS I LE -0.5
PARAMETER (EPS == LE - 0.5)
consentono am bedue di utilizzare il nome sim bolico EPS in luogo della costante
I.E - 0.5. D'altra parte le due frasi non sono equivalenti; infatti nel primo caso
EPS un nome di variabile e il suo valore pu essere modificato successivamente
durante l'esecuzione. mentre nel secondo caso EPS un nome di costante.
Liste con DO-implicito nella frase DATA
In una frase DATA possono figurare liste con DO-implicito con lo stesso signi-
ficato ad esse attribuito nelle liste di I/O. Lo standard F77 impone per alcune re-
------.-...._------.-.._-- -----
324
strizioni alle liste con DO-implicito presenti nelle frasi DATA; esse infatti devono
avere la forma seguente:
dove:
Y la lista del DO-implicito in cui possono figurare soltanto nomi di elementi
di variabile dimensionata, e, eventualmente, altre liste con DO-implicito;
i la variabile del DO-implicito e deve essere una variabile di tipo intero;
mI' m
2
, m
3
hanno lo stesso significato attribuito ai simboli vI' v
2
, v
3
nelle liste
con DO-implicito nelle frasi di I/O; mI' m
2
ed m
3
devono essere espressioni costan-
ti intere se la lista con DO-implicito non contenuta in un'altra lista con DO-im-
plicito; altrimenti mI' m
2
ed m
3
possono essere espressioni intere che contengono
costanti, nomi simbolici di costanti e le variabili (ovviamente diverse da i) delle
liste con DO-implicito pi esterne. In ogni caso i valori di mI' m
2
, m
3
devono
essere tali da implicare almeno una ripetizione della lista.
Esempio 16.14. Le frasi
PARAMETER(N = 5)
DATA (V(I), l = l, N) /5.0./
sono corrette. In particolare corretto l'uso del nome simbolico N nella lista con
DO-implicito in quanto N un nome di costante. E' invece sbagliata la sequenza
DATA N / 5/
DATA (V(I), l = l, N) /5.0./
perch in questo caso N un nome di variabile e non la variabile di una lista
con DO-implicito esterna a (V(I), I = l, N).
Esempio 16.15. La frase
DATA X(K, J), J = K, 5), K = 1,5) /15 * 0./
corretta e definisce come zero i quindici elementi della matrice X che compon-
gono la lista con DO-implicito. Lo stesso effetto, in fase di esecuzione, si otterreb
be con le frasi:
00 15 K = 1,5
00 15 J = K,5
15 X(K.J)=O.
Si osservi che la definizione della variabile di una lista con DO-implicito nella
frase DATA non implica alcuna predefinizione per una eventuale variabile con
325
il medesimo nome che figuri nella medesima unit di programma.
Osserviamo infine che la frase DATA era prevista anche in F66, ma con alcune
differenze rispetto alla forma e alle modalit di utilizzo qui descritte (cfr. appen-
dice A2).
16.6. Sottoprogrammi BLOCK DATA
Se si vuole predefinire con una frase DATA un'entit che fa parte di un blocco
COMMON etichettato, si deve utilizzare un opportuno sottoprogramma di tipo
BLOCK DATA. Ricordiamo che non consentita la predefinizione di entit che
figurano in un blocco COMMON non etichettato.
L'unico scopo dei sottoprogrammi BLOCK DATA quello di predefinire entit
che fanno parte di blocchi COMMON etichettati; essi sono quindi sottoprogrammi
non eseguibili che non possono essere utilizzati da altre unit di programma in
fase di esecuzione ma vengono trattati direttamente in fase di compilazione.
La prima frase di un sottoprogramma BLOCK DATA ha la forma seguente:
BLOCK DATA nome
dove:
BLOCK DATA la parola chiave che identifica la frase;
nome un nome simbolico che pu essere omesso. Se presente, nome il
nome simbolico che identifica il sottoprogramma e lo distingue da tutte le altre
unit di programma; esso non pu essere usato a nessuno scopo nel corpo del
sottoprogramma. In un programma possono esistere pi sottoprogrammi di tipo
BLOCK DATA con nomi diversi ed uno solo senza nome.
Il corpo di un sottoprogramma BLOCK DATA deve terminare con la frase
END e pu contenere oltre a questa soltanto frasi di specificazione di tipo,
frasi IMPLICIT, PARAMETER, DIMENSION, COMMON, EQUIVALENCE,
SAVE (cfr. cap. 17) e, naturalmente, frasi DATA.
Esempio 16.16. Il sottoprogramma seguente
BLOCK DATA
CHARACTER 6 CAR, MOTS(150)
REAL A(IO, io), B(IO)
COMMON / BLOCI / A, B,/ BLOC2/ MOTS, CAR
OATA A, B /110.0.5/, MOTS/150. 'INIZIO'/
END
permette di predefinire con i valori presenti nella frase DATA i contenuti delle
locazioni di memoria che costituiscono il blocco COMMON di nome BLOCl,
I
,!
326
identificate in questa unit di programma come elementi delle variabili dimensio-
nate A e B. Ancora, la frase DATA predefinisce gli elementi del vettore carattere
MOTS che fa parte del blocco COMMON di nome BLOC2, ma non la variabile
CAR che occupa le ultime sei unit di memoria del blocco. E' evidente che
i valori preassegnati in questo sottoprogramma alle variabili A, B sono direttamen-
te utilizzabili all'inizio della esecuzione da tutte le unit di programma al cui
interno sia definito un blocco COMMON di nome BLOCl; queste unit potranno
fare riferimento a tali valori con i nomi locali usati per identificare le celle del
blocco. Analogamente i valori memorizzati negli elementi del vettore MOTS
sono disponibili all'inizio dell'esecuzione per tutte le unit di programma che
fanno riferimento al blocco COMMON di nome BLOC2.
Esempio 16.17. Consideriamo il sottoprogramma:
BLOCK DATA BLOCD
CHARACTER * lO SETTIM (7), MESE (12)
INTEGER GMESE(l2)
COMMUNI NOMI I SETTIM, MESE, I GIORNI I GMESE
DATA SETTlM I 'LUNEDI"', 'MARTEDI"', 'MERCOLEDI''', 'GIOVEDI'",
*'VENERDI"', 'SABATO', 'DOMENICA' l, MESE I 'GENNAIO', 'FEBBRAIO'.
*'MARZO', 'APRILE', 'MAGGIO', 'GIUGNO', 'LUGLIO', 'AGOSTO',
*'SETTEMBRE', 'OTTOBRE', 'NOVEMBRE', 'DICEMBRE' I,
*(GMESE(I), I = 1,12) I 31, 28, 31,30, 31 ,30, 2 * 31,30,31,30,31 I
END
Tale sottoprogramma BLOCD predefinisce tutti gli elementi dei vettori carat-
tere SETTIM e MESE e quelli del vettore intero GMESE; in altri termini ven-
gono predefinite tutte le unit di memoria dei blocchi COMMON di nomi NOMI
e GIORNI.
Si osservi che due o pi sottoprogrammi BLOCK DATA in uno stesso pro-
gramma non possono fare riferimento a blocchi COMMON etichettati con lo
stesso nome.
327
Esercizi
16.1 Segnalare gli errori presenti nelle seguenti frasi COMMON:
a) COMMON A, B, C I BLl I N, A
b) COMMON Il N, M, I.
c) COMMON IVAR I D(l 00), B(I)
d) DIMENSION A(200)
COMMON A(50)
e) DIMENSION V<N)
COMMON I VAR I V
f) FUNCfION BETA (X, Y)
COMMON MAT( l O, IO), X
g) CHARACTER * 80 FRASE
COMMON FRASE (l : 20)
h) CHARACfER * 30 PAESE
INTEGER N
COMMON PAESE, N
16.2 Rappresentare graficamente i blocchi COMMON definiti nel seguente pro-
gramma e i nomi usati nelle diverse unit per riferirsi alle locazioni dei
blocchi
PROGRAM MAIN
COMMON A, X(5), YIBLl IC, Z(5, 5)/BL2/N, I, K
END
FUNCfION FUNZ (L, M)
COMMON A/BLl/C, Z(5, 5)
COMMON/BL3/ALFA
END
SUBROUTINE SUB
COMMON A, B, C, D, E, F, G/BL2/N(3)
COMMON/BL31ALFA
END
16,3 Se in una unita dI programma il blocco COMMON di nome PROVA de-
finito dalla frase
COMMON I PROVA I C(5. 4), A
con C ed A reali, indicare quali fra le seguenti definizioni possono essere
presenti in un'altra unit dello stesso programma:
328
329
a) COMMON / PROVA / C(5, 5), A
b) COMMON / PROVA / A(5), B(5), C(5, 2), D
c) COMMON / PROVA / C(5, 4)
d) COMMON / PROVA / X(2l)
e) COMMON / PROVA / X(5), Y(5), Z(5), W(5)
f) COMMON / PROVA / A, C(5, 4)
g) COMMON / PROVA / M(2l)
16.5 Scrivere un programma che, fissato Q = 15 e due vettori u e v di IRn. usi
il sottoprogramma MF2 dell'esempio 15.16 per determinare fra i punti
w
k
= ~ u + ( l - ~ v, O ~ k ~ Q,quello a cui corrisponde il pi piccolo
valore della norma euclidea della funzione data Fn (x). Questa funzione
associa ad un vettore x di componenti xl' ... , x
n
il vettore Y le cui compo-
nenti Yl' ... , Y
n
sono definite da:
16.6 Modificare il sottoprogramma MAXMIN dell'esempio 14.3 e il programma
principale dell'esempio 14.8 in modo che lo scambio di informazioni fra le
due unit di programma avvenga tramite blocchi COMMON.
Si vuole che il programma risolva il problema per n = 2, 3,4,5; in ogni caso
il vettore u deve avere elementi tutti uguali a 0.5 e il vettore v deve avere
elementi tutti uguali a 1. Inoltre si deve definire un solo sottoprogramma
che realizzi le funzioni F
2(x),
F
3(x).
F
4(x)
e Fs(x). (Suggerimento: fare
uso della frase COMMON, cfr. esempio 16.7).
I :
, I
\ !
per i = 2, ... , n
per i = 1
n
Y
j
=- 1 + nX
j
j= I
n
Yj = xi + L X
j
- (n + 1)
j= I
16.7 Modificare la funzione esterna MMV e il programma principale USOMMV
dell'esempio 15.8 in modo che:
a) soltanto il vettore X resti fra gli argomenti muti di MMV e il valore di
N venga trasmesso tramite un blocco COMMON;
b) tutte le informazioni fra le due unit di programma vengano trasmesse
attraverso blocchi COMMON.
16.8 Scrivere opportune frasi dichiarative per soddisfare le seguenti richieste:
a) due matrici rettangolari specificate dalla frase
REAL A(20, 20), B(20, lO)
si sovrappongono in modo tale che gli ultimi 200 elementi di A,coincidono
con gli elementi di B;
b) gli elementi di una matrice MAT di lO righe e lO colonne sono indivi-
duabili come elementi di un vettore MATVET;
c) i tre piani della variabile VAR3 dichiarata come
REAL VAR3 (lO, 10,3)
possano essere trattati come 3 matrici di lO righe e lO colonne.
PRIMA TERZA SESTA NONA
l(l ) M(l,l) I K(l)
1(2) M(2,1) J K(2)
1(3) M(3,1) K K(3)
1(4) M(1,2) M(l) L(l)
1(5) M(2,2) M(2) L(2)
1(6) M(3,2) M(3) L(3)
1(7) M(1,3) L(4)
1(8) M(2,3) L(5)
1(9) M(3,3) L(6)
1(10) M(I,4)
I( Il) M(2,4)
1(12) M(3,4)
Figura 16.11. Rappresentazione di un bloccoCOMMON non etichettato relativo all'esercizio 16.4.
16.4 Scrivere delle opportune frasi dichiarative che possano essere inserite
nelle unit di programma PRIMA, TERZA, SESTA, NONA in modo tale
da realizzare la spartizione del blocco COMMON non etichettato rappre-
sentata in fig. 16.11.
---------- ~ s t l
END
330
FUNCfION FUNZ (Y)
DIMENSION Z(3)
COMMON 1BL2 1X(5)
EQUIVALENCE (X(2), Y)
l.. 'jJ
"
l
16.9 Indicare se sono corrette le sequenze di istruzioni qui indicate:
a) COMMON A, B, X( io: d) PROGRAM MAIN
EQUIVALENCE (B, X( I)) COMMON I BL2 1X(5)
b) COMMON A, B, X(lO)
DIMENSION Y(lO)
EQUIVALENCE (A, C), (X(5), Y(3))
c) PROGRAM MAIN
COMMON 1BLI 1X(5)
END
,
17
USO flessibile dei sottoprogrammi
SUBROUTINE SUB
COMMON 1BLI 1X(5)
EQUI VALENCE (X(3), Y(3))
END
END
e) SUBROUTINE SUBI
COMMON 1BU 1X(5)
END
FUNCTION FUNZ I (Y)
DIMENSION Z(3)
COMMON 1BU 1X(5)
EQUIVALENCE (X (4), Z( I))
END
17.1. Punti di ingresso secondari: l'istruzione ENTRY
L'istruzione ENTRY, non prevista in F66, una frase non eseguibile che pu
essere usata nel corpo di un sottoprogramma per evidenziarne dei punti particolari,
detti punti di ingresso secondari. ciascuno dei quali identificato da un nome sim-
bolico e da una lista di argomenti muti. L'importanza di tali punti legata al fatto
che un sottoprogramma pu essere attivato facendo riferimento al nome di un
punto di ingresso secondario individuato da una frase ENTRY che compare
nel suo corpo. In questo caso lo scambio di informazioni fra l'unit di programma
chiamante e il sottoprogramma avviene tramite la lista di argomenti specificata
per il punto di ingresso secondario e l'esecuzione del sottoprogramrna inizia dalla
frase che segue immediatamente la frase ENTRY (cfr. fig. 17.1).
Figura 17.J. Trasferimento del controUo dell'esecuzione fra unit di programma chiamante e
sottoprogramma tramite un punto di ingresso secondario.
16.10 Scrivere la frase DATA che definisce come 1.5 il valore iniziale degli ele-
menti di un vettore V di lunghezza 15.
16.11 Scrivere la frase DATA che definisce come Ogli elementi della sottomatrice
triangolare superiore di una matrice MAT di 4 righe e 4 colonne.
16.12 Scrivere la frase DATA per predefinire due variabili di tipo carattere di
nome TITOLO ed ESEMP con le stringhe 'INIZIALIZZAZIONEvDATI'
e 'TERZOvESEMPIO'.
16.13 Trovare gli eventuali errori nelle seguenti frasi:
a) DAI A I, K, LI 2 * 31
b) DATA (V(I), I =K, IO) 1IO. Il
c) LOGICAL LI
CHARACfER 4 CARTA
DATA LI, CARTA /. TRUE., 'FIORI'!
d) REAL REL (2 : 8, - 5 : 5)
DATA (REL(I, 1), J = - 5,5), 1= 2, 8) 177. lO
Unit di programma chiamante Sottoprogramma
332
L'istruzione ENTRY ha la forma seguente:
ENTRY nome (m), ... , m
n
)
dove:
ENTRY la parola chiave che identifica la frase;
nome un nome simbolico e costituisce il nome del punto di ingresso se-
condario. Tale nome deve essere diverso dal nome del sottoprogramma in cui la
frase ENTRY compare e dai nomi degli altri eventuali punti di ingresso secondari.
Inoltre esso deve essere diverso dai nomi delle altre unit di programma e dei
loro eventuali punti di ingresso secondari;
m), ... , m
n
sono gli argomenti muti del punto di ingressosecondario e possono
avere le forme consentite per gli argomenti muti del sottoprogramma in cui la
frase ENTRY compare.
La lista di argomenti muti in una frase ENTRY pu essere diversa da quella
presente nella prima frase del sottoprogramma. Un argomento muto specificato
in una frase ENTRY non pu essere usato nelle frasi eseguibili che la precedono,
a meno che esso non sia utilizzato come argomento muto anche in una precedente
frase ENTRY o nella prima frase del sottoprogramma. In ogni caso le frasi dichia-
rative relative ai parametri muti di una frase ENTRY devono precedere la prima
frase eseguibile del corpo del sottoprogramma (cfr. appendice A3). Osserviamo a
tale proposito che se la lista di argomenti di una frase ENTRY comprende il nome
di una variabile dimensionata con dimensionamento variabile, essa deve anche
comprendere i nomi delle variabili intere che compaiono nel dichiaratore della va-
riabile, a meno che esse non figurino in una frase COMMON. Cos, corretto il
sottoprogramma segue nte:
SUBROUTINE SUB(A, M, V)
REAL A(M, e), V(M)
ENTRY PUNTO(V, M)
END
mentre sbagliato scrivere
SUBROUTINE S(lij(A. M, V)
REAL A(M, e), V(M)
ENTRY PUNTO(V)
END
Una frase ENTRY pu non prevedere argomenti muti; in questo caso essa pu
333
avere una delle forme seguenti:
ENTRY nome ( )
ENTRY nome
Una frase ENTRY pu comparire in qualunque punto nel corpo di un sotto-
programma, ma non tra una frase IF(c) THEN e la corrispondente frase END IF
oppure tra una frase DO e la corrispondente frase terminale. L'istruzione ENTRY
ha il solo scopo di definire la posizione, il nome e gli argomenti muti di un punto
di ingresso secondario; essa quindi ignorata se viene incontrata durante l'esecu-
zione del sottoprogramma.
Il nome di un punto di ingresso secondario di un sottoprogramma pu essere
usato in una unit di programma distinta da questo come argomento attuale in un
riferimento ad un altro sottoprogramma; in questo caso il nome deve comparire
in una frase EXTERNAL nell'unit di programma chiamante. Cos corretta
la situazione seguente nella quale il nome, PUNTO, di un punto di ingresso secon-
dario della funzione FUNC viene usato nel riferimento al sottoprogramma SUB
come argomento attuale corrispondente all'argomento muto EFFE:
PROGRAM MAIN
EXTERNAL PUNTO
CALL SUB(X, PUNTO)
END
SUBROUTINE SUB(X, EFFE)
Y =EFFE(X)
END
REAL FUNCTION FUNC(X\
~ T Y PUNTO(X)
END
r
:\
334
17.2. Punti di ingresso secondari di un sottoprogramma SUBROUTlNE
Il nome di un punto di ingresso secondario di un sottoprogramma di tipo
SUBROUTlNE non pu comparire in nessuna frase del sottoprogramma diversa
dalla frase ENTRY che lo definisce.
Esempio 17.1. Date (n + 1) coppie di numeri reali (xi' Y
i
) con i = O, l, ..., n
e xi diverso da x
j
per i diverso da j, esiste un unico polinomio Pn(x) di grado mi-
nore o uguale di n, tale che Pn(xi) = Yi per i = O, l, ..., n. Pn(x) detto poli-
nomio interpolante le coppie di valori dati e pu essere scritto nella forma:
A
o
+ AI(x - xo) + A
2(x
- xo)(x - xl) + + An(x - xo) (x - Xl) ... (X - x
n- l)
dove A
o
uguale a Yo e i coefficienti Al' , An sono differenze divise calcola-
bili mediante i valori Xi' Yi' i =O, ..., n [9]. Assegnato un valore reale x, il valore
p =P
n
(x) pu essere calcolato utilizzando l'algoritmo seguente:
l. Dati: x; (Xi' Yi) con i =O, l, ..., n;
2. Poni = Y
o
e A
o
= go
3. Per i = l, ..., n
3.1. Poni gi = Y
i
3.2. Per k =i - l, ..., O
3.2.1. Calcola gk = (gk+ l - gk)!(x
i
- x
k)
3.3. Poni Ai =
4. Poni P = An
5. Per i = n - l, ..., O
5.1. Calcola P = P' (x - Xi) + Ai
6. Risultato: P
7. Stop
Si pu osservare che la determinazione dei coefficienti A
o'
..., An indipen-
dente dal valore di x (cfr. istruzioni 2 e 3). Pertanto, quando si voglia calcolare
Pn(X) per pi valori di X pu essere conveniente eseguire una sola volta le istru-
zioni 2 e 3 ed eseguire invece per ogni valore di x le istruzioni 4, 5 e 6. Sulla base
di queste considerazioni si perviene alla scrittura del sottoprogramma POLINT
di seguito riportato. Gli argomenti muti nella prima fase di POLINT hanno il
seguente significato:
- X e Y sono vettori reali che contengono in ingresso i valori x
o'
... , x
n
e Yo' ... ,
Yn rispettivamente;
- N una variabile intera che contiene in ingresso il valore di n;
- XS una variabile reale che contiene in ingresso il valore di x;
- A un vettore reale che contiene in uscita i coefficienti A
o'
... , An;
- PN una variabile reale che contiene in uscita il valore Pn(x);
- G un vettore reale di servizio.
335
SUBROUTINE POLINT(X, Y, N, XS, A, PN, G)
REAL X(O: N), Y(O : N), A(O : N), XS, PN, G(O : N)
INTEGER N
C CALCOLODEI COEFFICIENTI A(O), ..., A(N)
G(O)= Y(O)
A(O) = CIO)
DO IO I = l, N
G(I) = Y(I)
DO 5 K = I - l, O, - I
G(K) = (G(K + 1) - G(K / (X(I) - X(K)
5 CONTINUE
A(I) =G(O)
lO CONTINUE
C CALCOLODEL VALORE, PN, DELPOLINOMIO INTERPOLANTEIN XS
ENTRY VALPOL(X,N,XS,A.PN)
PN = A(N)
DO 15 I = N- l, O,- I
PN =PN (XS - X(I) + A(I)
15 CONTINUE
RETURN
END
Nel corpo del sottoprogramma figura la frase
ENTRY VALPOL(X,N,XS,A, PN)
che individua un punto di ingresso secondario di nome VALPOL e argomenti
muti X, N, XS, A, PN. Il significato dei parametri X, N, XS, PN uguale a quello
degli omonimi argomenti presenti nella prima frase del sottoprogramma, mentre
il vettore A in questo caso deve contenere in ingresso i coefficienti A
o'
... , An'
Se il sottoprogramma viene utilizzato in una unit di programma chiamante
nel modo usuale, ovvero facendo riferimento al nome POLINT, la frase ENTRY
viene ignorata durante l'esecuzione e vengono calcolati i coefficienti A
o'
...,
An e il valore Pn(x). Se invece nell'unit chiamante si fa riferimento al nome del
punto di ingresso secondario, VALPOL, allora l'esecuzione del sottoprograrnma
inizia dalla frase che segue la ENTRY; cos in questo caso viene calcolato il valore
del polinomio interpolante mentre i coefficienti A
o'
..., An sono assunti come
dati in ingresso.
Riferimento ai punti di ingresso secondari di un sottoprogramma SUBROUTlNE
Un riferimento ad un punto di ingresso secondario di un sottoprogramma di
tipo SUBROUTINE consentito in una unit di programma distinta da questo
ed avviene tramite la frase
CALL nome (al' ... , a
n
)
336
dove:
nome il nome del punto di ingresso secondario;
al"'" a
n
sono gli argomenti attuali che devono accordarsi in numero, ordine
e tipo con gli argomenti muti del punto di ingresso secondario. Se il punto di in-
gresso a cui si fa riferimento non prevede argomenti, la frase CALL pu avere una
delle forme seguenti:
CALL nome ( )
CALL nome
Al momento dell'attivazione del sottoprogramma i parametri attuali vengono
associati ai parametri muti del punto di ingresso secondario secondo le modalit
viste nel cap. 15 e l'esecuzione del sottoprogramma inizia dalla frase che segue
la ENTRY.
Esempio l 7.2. Sia P4 (x) il polinomio di grado minore o uguale di 4 che interpola
cinque coppie di valori reali (Xi' Y
i
) , con i =O, ...,4, assegnate. Si vuole scrivere
un programma che permetta di calcolare e stampare i valori P4 (Xi)' con i = I,
.., IO, dove i valori xl , ...,x
lO
sono dati.
Il programma CALPOL che segue, risolve il problema utilizzando il sottopro-
gramma POLINT dell'esempio precedente. In CALPOL i valori xl' ...,x
lO
sono
memorizzati nel vettore XS, mentre x
o
' , x
4
e Yo' ..., Y
4
sono memorizzati
rispettivamente in X e Y e i coefficienti A
o
' , A
4
in A.
PROGRAM CAlPOL
DIMENSION X(5), Y(5), A(5), XS(IO), G(5)
DATA N, NXS/4, 101
READ-,X, Y
READ -. XS
CALL POLINT (X, Y, N, XS(I), A, PN, G)
PRINT ISO, XS(1), PN
DO 20 I =2, NXS
CALL VALPOL (X, N, XS(I), A, PN)
PRINT ISO, XS(I), PN
20 CONTINUE
STOP
ISO FORMAT (IX, 'PN(, EI3.6, ') =', EI3.6)
END
Con la frase
CALL POLINT (x. Y, N, XS(l), A, PN, G)
il sottoprogramma POLINT viene attivato facendo riferimento alla sua frase ini-
ziale. L'esecuzione di POLINT avviene quindi in modo sequenziale ignorando la
frase ENTRY che fa parte del suo corpo. Al rientro nel programma chiamante
337
sono disponibili in A i valori dei coefficienti A
o
' ..., A
4
e in PN il valore del po-
linomio interpolante in xl'
Successivamente, per ogni valore di I compreso fra 2 e lO si esegue la frase
CALL VALPOL (X, N, XS(I), A, PN)
In questo caso si fa riferimento al punto di ingresso secondario del sottopro-
gramma, e pertanto i parametri attuali X, N, XS(1), A e PN vengono associati
agli argomenti muti X, Y, XS, A e PN specificati nella frase ENTRY nel sotto-
programma.. L'esecuzione di POLINT ha inizio in questo caso dalla prima frase
successiva alla ENTRY e i valori dei coefficienti A
o
' ..., A
4
contenuti in A sono
utilizzati come dati in ingresso. Al termine della esecuzione di POLINT il valo-
re del polinomio interpolante in Xi disponibile in PN.
17.3. Punti di ingresso secondari di un sottoprogramma FUNCTION
Il nome di un punto di ingresso secondario di un sottoprogramma FUNCTION
pu comparire come nome di variabile in frasi eseguibili successive alla ENTRY
che definisce il punto. Il tipo della variabile il cui nome coincide con il nome di
un punto di ingresso secondario detto tipo del punto di ingresso secondario e
pu essere specificato mediante la sua lettera iniziale oppure mediante una frase
dichiarativa di tipo che deve precedere la prima frase eseguibile del sottopro-
gramma (cfr. appendice A3).
Punti di ingresso secondari di tipo carattere
Un punto di ingresso secondario in una funzione esterna di tipo carattere deve
essere di tipo carattere e pertanto il suo nome deve comparire in una frase
CHARACTER che precede la prima frase eseguibile del sottoprogramma. La lun-
ghezza specificata per il nome del punto di ingresso secondario deve essere uguale
alla lunghezza della funzione; in particolare essa deve essere espressa mediante
uno specificatore di lunghezza indefinita se la funzione ha lunghezza indefinita.
Punti di ingresso secondari di tipo diverso da carattere
In una funzione esterna che non sia di tipo carattere possono essere presenti
punti di ingresso secondari di qualunque tipo, ma non di tipo carattere. Di solito
tutti i punti di ingressosecondari hanno lo stesso tipo della funzione.
Supponiamo che tutti i punti di ingresso secondari di un sottopogramma
FUNCTION siano dello stesso tipo della funzione; allora durante l'esecuzione
del sottoprogramma il valore della funzione pu essere memorizzato in una varia-
bile il cui nome coincide con il nome di un qualunque punto di ingresso secon-
i
I
n
I
Il
'I
I
1
;I
I
339
338
dari o O con il nome della funzione, qualunque sia il nome usato per l'attivazione.
Da ci segue che nel corpo del sottoprogramma almeno uno fra i nomi dei punti
di ingresso secondari o della funzione deve essere utilizzato come nome di varia-
bile in frasi eseguibili che ne definiscano il valore. Va comunque tenuto presente
che il nome di un punto di ingresso secondario non pu comparire in frasi che
precedono l'istruzione ENTRY che lo definisce, ad eccezione che in una frase
dichiarativa di tipo.
REAL FUNCTION NORMA (U, N)
REAL NORMAP, U(N), MAX
C CALCOLO DELLA NORMA INFINITO DI U
MAX= ABS(U(I)
DO 5 1= 2, N
IF (MAX.LT.ABS(U(I))) MAX= ABS(U(I))
5 CONTINUE
NORMA=MAX
RETURN
C
REAL FUNCfION NORMA (U, N)
ENTRY NORMAP (U, N, IP)
Esempio 17.3. Se u un vettore di componenti ul' ..., un' la norma Il u 11_ de-
finita dalla relazione
Si osservi che durante l'esecuzione di un sottoprogramma FUNCnON tutti i
nomi di variabile dello stesso tipo che vengono usati nel corpo del sottoprograrn-
ma e che coincidono con il nome della funzione o con il nome di un punto di
ingresso secondario identificano la stessa locazione di memoria.
Supponiamo ora che in una funzione esterna siano definiti dei punti di ingres-
so secondari il cui tipo non coincide con il tipo della funzione. In questo caso
il risultato di ogni esecuzione del sottoprogramma deve essere un valore dello
stesso tipo del nome .tramite il quale avvenuta l'attil'azione. Il risultato deve
quindi essere memorizzato in una variabile del tipo suddetto il cui nome coincide
con il nome di un punto di ingresso secondario oppure con il nome della funzione.
Inoltre, durante l'esecuzione non deve essere assegnato alcun valore a variabili
di tipo diverso dal nome tramite il quale avvenuta l'attivazione e il cui nome
coincida con il nome di un punto di ingresso secondario oppure con il nome
della funzione.
ENTRY NORMAP(U, N, IP)
C CALCOLO DELLA NORMA-P DI U
MAX= ABS(U(1)
DO lO 1= 2, N
IF (MAX.LT.ABS(U(I)) MAX= ABS(U(I))
lO CONTINUE
NORMAP=O.
IF (MAX.EQ.O.) RETURN
00151=I,N
NORMAP= NORMAP+(U(I)/MAX) IP
15 CONTINUE
NORMAP= MAX. NORMAP.. (1./IP)
END
In questo sottoprogramma il nome della funzione, NORMA, e il nome del
punto di ingresso secondario, NORMAP, sono entrambi di tipo reale. Pertanto
il significato del sottoprogramma resta inalterato se nelle frasi che seguono l'i-
struzione ENTRY si sostituisce il nome NORMAP con il nome NORMA. Sarebbe
invece sbagliato sostituire NORMA con NORMAP nelle frasi eseguibili che prece-
dono la ENTRY.
altrimenti.
max lUi I
i c iO:; n
Ilull_=
Data Il u 11_ ' possibile calcolare la norma u Il p con p intero positivo, nel modo
seguente:
Il seguente sottoprogramma NORMA pu essere utilizzato ner calcolare Il u 11-
oppure Il u 1\ con p > O assegnato. Nel primo caso il sottoprogramrna deve
essere attivafo mediante il nome, NORMA. che compare nella prima frase, mentre
nel secondo caso deve essere attivato mediante il nome, NORMAP, del suo punto
di ingresso secondario. Gli argomenti muti U ed N nelle due frasi
rappresentano rispettivamente il vettore u di cui si deve calcolare la norma e la sua
dimensione n; l'argomento muto IP nella frase ENTRY contiene in ingresso il
valore di p.
l !
340
Riferimento a punti di ingresso secondari di una funzione esterna
Un riferimento ad un punto di ingresso secondario di una funzione esterna
consentito in unit di programma distinte dalla funzione ed ha la forma se-
guente:
dove:
nome il nome del punto di ingresso secondario;
al"'" a
n
sono gli argomenti attuali che devono accordarsi in numero, ordine e
tipo con gli argomenti muti del punto di ingresso secondario. Se il punto d'in-
gresso secondario non prevede argomenti, il riferimento deve avere la forma
nome ( )
L'attivazione e l'esecuzione del sottoprogramma avvengono nel modo gi descritto
nel paragrafo precedente per i sottoprogrammi SUBROUTINE.
Esempio 17.4. II seguente programma utilizza la funzione NORMA dell'esempio
precedente per calcolare IleO)1.. ~ c O Il eleO) b, con i = l, ..., n, dove c(i)
indica l'i-esima colonna di una matrice reale C di ordine n = lO.
REAL NORMA, NORMAP
PARAMETER (N = IO)
DlMENSION C(N, N)
READ .,C
DOI5I=I,N
CN = NORMA (C(1. I), N)
CNI = NORMAP(C(l, I), N,I)
CN2 = NORMAP(C(l, I), N, 2)
WRITE (.,35) I, CN, CNI, CN2
15 CONTINUE
STOP
35 FORMAT (IX, 'COLONNA N.', I2/IX, 'NORMA INFINITO:', EI3.6/
IX, 'NORMA-l:', Ell 6/IX, 'NORMA-2:', EI3.6)
END
Per effetto del riferimento NORMA(C( l, I), N) gli argomenti attuali C( l, I)
ed N vengono associati alli argomenti muti della prima frase del sottoprogramrna
REAL FUNCfION NORMA (U, N)
L'esecuzione del sottoprogramma procede quindi in modo sequenziale e ter-
mina quando viene eseguita l'istruzione RETURN che precede la frase
ENTRY NORMAP (U, N, IP)
341
Quando il sottoprogramma viene attivato mediante uno dei riferimenti
NORMAP (C( l, I), N, l) e NORMAP (CO, I), N, 2), gli argomenti attuali vengo-
no associati a quelli muti della frase ENTRY e vengono quindi eseguite tutte le
istruzioni che seguono questa frase. Si osservi che nel programma chiamante
indispensabile la frase di specificazione
REAL NORMA, NORMAP
Dagli esempi svolti in questo e nel precedente paragrafo, possiamo concludere
che l'istruzione ENTR Y uno strumento utile in due tipi di situazioni: quando in
un sottoprogramma si individua un blocco di istruzioni che seguono la prima frase
e che in alcune particolari utilizzazioni del sottoprogramma non devono essere
eseguite (cfr. esempio 17.1), oppure quando il corpo di un sottoprogramma
costituito da due o pi blocchi uno solo dei quali viene eseguito ad ogni attiva-
zione del sottoprogramma (cfr. esempio 17.3). Nel seguito del capitolo vedremo
altre situazioni in cui l'istruzione ENTRY pu essere vantaggiosamente utilizzata.
17.4. Le variabili interne di un sottoprogramma e l'istruzione SAVE
NelIe istruzioni che compongono il corpo di un sottoprogramma si utilizzano
spesso nomi simbolici che identificano variabili interne o locali al sottoprogram-
ma, ovvero variabili il cui contenuto non oggetto di scambio di informazioni
con l'unit di programma chiamante. Pi precisamente, le variabili interne sono
tutte quelle variabili i cui nomi non compaiono come argomenti muti nella prima
frase del sottoprogramma o in qualche frase ENTRY e che non fanno parte di un
blocco COMMON. Durante l'esecuzione del sottoprogramma i nomi delle varia-
bili interne identificano delle locazioni di memoria il cui contenuto pu essere
definito ed utilizzato dal sottoprogramma stesso. II periodo di tempo durante il
quale il nome di una variabile interna identifica una particolare zona di memoria
limitato al tempo che intercorre fra l'attivazione del sottoprogramma e il rientro
nell'unit di programma chiamante. Pertanto se un sottoprogramma viene utiliz-
zato pi volte durante l'esecuzione del programma, non vi alcuna garanzia che
il valore delIe sue variabili locali resti inalterato da una chiamata all'altra. Se si
desidera che ci avvenga per alcune variabili interne, occorre specificare i loro no-
mi in una frase dichiarativa SAVE nel corpo del sottoprogramma. In questo caso
l'istruzione SAVE pu' avere la forma seguente:
SAVE v}' ... , v
n
dove:
SAVE la parola chiave che identifica la frase;
v}' ... , v
n
sono i nomi delle variabili interne, dimensionate e non dirnen-
Il
I
I
11
________________--..+--------..-------------1
342
sionate, di cui si vuole che sia mantenuto il valore al termine dell'esecuzione del
sottoprogramma.
Esempio 17.5. Sia dato un problema ai valori iniziali per un sistema di equazioni
differenziali ordinarie nella forma
\ y'(t) = f(t, y(t))
l y(t
o
) =Yo
dove y(t), per ogni t nell'intervallo [t
o
' te], un vettore di ]R." e f(t, y(t)) una
funzione a valori in JR" tale che il problema ammette un'unica soluzione y(t).
Esistono molti metodi numerici che consentono di approssimare i valori y(t j )
che la soluzione assume su un insieme di punti ti' con i = l, ..., N, dove
t
o
< ti < ... < t
N
= te (cfr. [9] e [lO)). Il sottoprogramma RK:S, la. cui lista
completa si trova in [lO], utilizza un particolare metodo numenco (di Runge-
Kutta-Fehlberg) per calcolare un vettore u
j
che approssima y(t j ) avendo come
dato un vettore u
i_
I che approssima y(t
i_ 1
) Posto U
o
= Yo assegnato, il sotto-
programma deve essere richiamato N volte consecutive per calcolare ul' ..., uN'
SUBROUTINE RKFS (F, NEQN, Y, T, TOUT, RELERR, ABSERR,
IFLAG, yP, H, Fl, F2, F3, F4, F5, SAVRE, SAVAE, NFE, KOP. INIT,
JFLAG, KFLAG)
MFLAG = IABS (IFLAG)
IF (MFLAG.NE.l) GOTO 20
C PRIMA CHIAMATA- SI CALCOLANO EPS E U26
EPS =1.0
EPS = EPS/2.0
EPSPI = EPS + 1.0
IF (EPSl.GT.l.) GOTO 5
026 = 26.0 EPS
GOTO 50
C CHIAMATE SUCCESSIVE
20 CONTINUE
50 CONTINUE
RER =2. EPS + REMIN
HMIN = 026 ABS(T)
END
343
Fra gli argomenti muti di RKFS, il significato dei quali spiegato in [lO],
Y un vettore che contiene in ingresso u
i_
I e in uscita uj' mentre T e TOUT
contengono in ingresso t
i_
I e ti rispettivamente. Inoltre IFLAG un indicatore
che pu assumere in ingresso e in uscita diversi valori; in particolare alla prima
chiamata di RKFS il valore assoluto di IFLAG in ingresso deve essere uguale a
l, mentre deve essere diverso da l alle chiamate successive. Osserviamo che nel
corpo del sottoprogramma vengono utilizzate due variabili locali, EPS e U26,
i cui valori vengono calcolati una volta per tutte alla prima chiamata. Evidente-
mente, RKFS pu fornire risultati corretti alle chiamate successive alla prima sol-
tanto se il sistema di calcolo con cui si lavora mantiene inalterato il valore delle
variabili interne anche dopo il rientro nella unit di programma chiamante. Per
avere la garanzia che questo succeda per qualunque sistema di calcolo occorre
inserire tra le frasi dichiarative del sottoprogramma l'istruzione seguente:
SAVE EPS, U26
Esempio 17.6. Consideriamo il seguente sottoprogramma:
SUBROUTlNE PARAM (ALFA)
SAVE A
A=ALFA
RETURN
ENTRY FALFA (X, Y)
Y = 0.5. (EXP(ALFA. X) - EXP(- ALFA. X))
RETIJRN
END
L'attivazione di questo sottoprogramma mediante la prima frase consente di
memorizzare nella variabile locale A il valore dell'argomento attuale corrisponden-
te all'argomento muto ALFA; essendo presente la frase SAVE A, tale valore viene
conservato anche dopo il rientro nell'unit di programma chiamante. Cos il valo-
re di ALFA disponibile per l'esecuzione del sottoprogramma se questo viene
successivamente attivato tramite il punto di ingresso secondario definito dalla
frase
ENTRY FALFA (X, Y)
Un esempio di utilizzazione del sottoprogramma PARAM tratteggiato qui
di seguito:
344
PROG RAM MAIN
EXTERNAL FALFA
A=O.l
CALL PARAM (A)
CALL SUB (FALFA, ...)
END
SUBROUTINE SUB (F, ...)
CALL F(X, Y)
END
Il programma principale attiva il sottoprogramma PARAM in modo che venga
memorizzato nella variabile locale A il valore 0.1; successivamente il sottopro-
gramma SUB richiama il sottoprogramma PARAM mediante il nome del punto
di ingresso secondario FALFA.
Esempio 17. 7. E' noto che una funzione ricorsiva pu essere tradotta in un sotto-
programma che fa uso di cicli-DO e di particolari strutture di dati dette pile [15].
Una pila un insieme ordinato di elementi sul quale sono consentite le seguenti
operazioni:
a) aggiungere un elemento in testa alla pila;
b) prelevare un elemento dalla testa della pila.
Per dare un'idea, necessariamente semplificata, di come pu essere costruito
un sottoprogramma non ricorsivo come risultato della traduzione di una funzione
ricorsiva, consideriamo la funzione min, definita neli' esempio 1.13, che calcola
l'elemento minimo di un vettore. Ricordando che, indicato con [al' ..., an] il
vettore dato, se ne possono evidenziare il primo e i restanti elementi usando la
notazione [al Iz] con z = [a
2
, ..., an] (cfr. esempio 1.11), la definizione della
funzione min la seguente:
min ([al)) =al
min ([al' a
2
)) = se al < al/ora al altrimenti a
2
min ([ali z)) = min ([al' min (z)))
In questo caso gli elementi della pila sono gli indici degli elementi del vettore
a = [al' ..., an] Il sottoprogramma non ricorsivo prevede due fasi. Nella prima
fase si provvede a definire gli elementi della pila, simulando in questo modo le
chiamate della funzione min presenti nella parte ricorsiva della definizione; in-
345
fatti da questa si ottiene che
min ([ali zl) =min ([al' min ([a
2
, min ([a
3
, ..])
Nella seconda fase si utilizza la parte non ricorsiva della definizione per calcolare
il valore della funzione. Ci avviene nel modo seguente: vengono prelevati dalla
pila l'elemento in testa e quello immediatamente precedente e vengono confron-
tati fra loro gli elementi del vettore ad essi corrispondenti; l'indice del minimo
fra questi due elementi viene quindi aggiunto alla pila e diventa il nuovo elemento
di testa. Si procede cos finch la pila non contiene un solo indice che necessa-
riamente quello dell'elemento minimo cercato.
Per realizzare le operazioni sopra tratteggiate si utilizzano due sottoprogrammi:
la funzione esterna MINl che calcola il minimo e il sottoprogramma AGG, di tipo
SUBROUTINE utilizzato dalla prima per eseguire le operazioni sulla pila. I due
sottoprogrammi possono essere utilizzati per calcolare min ([al' ... , a
n
j) con
l n 100.
SUBROUTINE AGG(K)
INTEGER PILA (100), TESTA
SAVE PILA, TESTA
DATA TESTA /0/
C AGGIUNT A DI UN ELEMENTO IN TEST A ALLA PILA
IF (TESTA.GE.lOO) THEN
PRINT -. 'LA PILA Eli PIENA'
STOP
ELSE
TESTA = TESTA + l
PILA (TEST A) =K
RETURN
ENDIF
C PRELIEVO DELL'ELEMENTO IN TEST A ALLA PILA
ENTRY PREL (K)
IF (TESTA.LT.I) THEN
PRINT -. 'LA PILA Eli VUOTA'
STOP
ELSE
K =PILA (TESTA)
TESTA =TESTA - l
RETURN
ENDIF
END
L'argomento muto K nella prima frase del sottoprogramma contiene in ingres-
so il valore che deve essere aggiunto in testa alla pila, mentre nella frase
ENTRY PREL (K)
esso contiene in uscita il valore che memorizzato nell'elemento in testa alla pila.
I
i
1 I
:1
l
______________-...-__.....--rrtL-------------------.
----------------- -
346
II vettore intero PILA che contiene la pila e la variabile intera TESTA che contie-
ne la posizione in PILA dell'elemento di testa sono variabili locali il cui valore vie-
ne conservato da una chiamata all'altra per effetto delIa presenza della frase
SAVE PILA, TESTA
II valore di TESTA viene aggiornato ad ogni chiamata del sottoprogramma. In
particolare, se questo viene attivato tramite la prima frase, il valore di TESTA vie-
ne incrementato di una unit e viene posto uguale a K il valore di PILA (TESTA);
se invece il sottoprogramma viene attivato tramite il punto di ingresso secon-
dario PREL, il valore di PILA (TESTA) viene assegnato al parametro di uscita
K e successivamente il valore di TESTA viene decrementato di una unit.
La funzione esterna MIN1 utilizza il sottoprogramma AGG per calcolare il
minimo fra i primi N elementi di un vettore A di 100 elementi.
REAL FUNCTION MINI (A, N)
REAL A(lOO)
C PRIMAFASE; SI MEMORIZZANO NELLAPILAGLI INDICI I, ... , N
DO IO I = I, N
CALL AGG(I)
IO CONTINUE
IF (N.EQ.I) GOTO30
C SECONDA FASE: SI RIPERCORRE LAPILA ALL'INDIETRO
DO20 I =N, 2, - I
C GLI ELEMENTI DI A CORRISPONDENTI AI DUE ELEMENTI DI
C TESTA DELLA PILA VENGONO CONFRONTATI. L'INDICE DEL
C PIU' PICCOLO FRA I DUE DIVENTALA NUOVA TESTA DELLA PILA
CALL PREL (KI)
CALL PREL(K2)
IF (A{KI).LT.A(K2 THEN
CALL AGG(KI)
ELSE
CALL AGG(K2)
ENDIF
20 CONTINUE
C LA PILA CONTIENE L'INDICE DELL'ELEMENTO MINIMO DI A
C LA SECONDA FASE HA TERMINE
30 CONTINUE
CALL PREL (K)
MINI = A(K)
RETURN
END
Ricordiamo che una variabile interna ad un sottoprogramma predefinita me-
diante una frase DATA conserva il suo valore per la durata dell'esecuzione del-
l'intero programma, soltanto se questo valore non viene modificato nel sottopro-
gramma. In caso contrario, affinch il valore venga mantenuto fra due successive
347
chiamate del sottoprogramma, necessario che il nome della variabile figuri in
una frase SAVE nel corpo del sottoprogramma.
17.5. I blocchi COMMON etichettati e l'istruzione SAVE
Una situazione analoga a quella descritta nel paragrafo precedente per le varia-
bili interne ad un sottoprogramma, si verifica anche per i blocchi COMMON
etichettati. Pi precisamente, quando termina l'esecuzione di un sottoprogramma
che ha accesso ad un blocco COMMON etichettato i valori memorizzati nel
blocco vengono conservati soltanto se allo stesso blocco ha accesso anche l'unit
chiamante oppure un'altra unit che, attraverso una catena di chiamate, ha provo-
cato l'attivazione del sottoprogramma. In caso contrario non si ha la garanzia
che i valori memorizzati nel blocco vengano conservati, e si dice che il blocco di-
venta indefinito. Evidentemente, un blocco COMMON presente anche nel pro-
gramma principale non diventa mai indefinito nel corso dell'esecuzione del pro-
gramma. Inoltre non diventa mai indefinito il blocco COMMON non etichettato.
Esempio 17.8. In un programma costituito dal programma principale MAIN e dai
quattro sottoprogrammi SUBl, SUB2, SUB3, SUB4, sono definiti tre blocchi
COMMON etichettati di nomi ETMI24, ETI3, ET34. Supponiamo che I'organiz-
zazione del programma possa essere schematizzata nell'albero delle chiamate di
fig. 17.2, dove in ogni rettangolo si sono riportati, oltre al nome dell'unit di
programma, i nomi dei blocchi COMMON a cui essa pu accedere. Dalla figura
possiamo dedurre quanto segue:
Figura 17.2. Albero deUe chiamate e accesso ai blocchi COMMON nell'esempio 17.8.
348
- II blocco COMMON/ETM 124/ non diventa mai indefinito dal momento che
utilizzato nel programma principale;
- II blocco COMMON/ET13/ non diventa indefinito al termine della esecuzione
di SUB3; infatti a questo blocco ha accesso anche il sottoprogramma SUBl che,
avendo richiamato SUB2, ha provocato l'attivazione di SUB3. Pertanto i valori
memorizzati nel blocco vengono conservati quando termina l'esecuzione di SUB3
e il blocco diventa indefinito soltanto al termine dell'esecuzione di SUBl, quando
il controllo ritorna al programma principale;
- II blocco COMMON/ET34/ diventa indefinito sia al termine della esecuzione di
SUB3 che al termine dell'esecuzione di SUB4. Evidentemente in questo caso non
vi pi la garanzia che le informazioni memorizzate nel blocco da uno dei due
sottoprogrammi vengano ritrovate intatte dall'altro; ci pu comportare una to-
tale perdita di significato del blocco se questo viene utilizzato come mezzo per
la trasmissione di informazioni fra i due sottoprogrammi.
Situazioni come quella ora descritta possono essere evitate dichiarando nel pro-
gramma principale tutti i blocchi COMMON etichettati che vengono utilizzati dal-
le varie unit di programma. In F77 si pu usare allo stesso fine l'istruzione SAVE
la cui forma generale infatti la seguente:
SAVE lista
dove ogni elemento della lista pu essere il nome di una variabile interna oppure il
nome di un blocco COMMON racchiuso fra sbarre e due successivi elementi della
lista sono separati mediante una virgola.
Se il nome di un blocco COMMON figura in un'istruzione SAVE in una unit
di programma, le variabili del blocco conservano il loro valore al termine dell'ese-
cuzione di questa unit. Cos, per esempio, l'istruzione
SAVE A, B, /COMC/, Kl
serve a specificare che le variabili interne A, B e Kl e le variabili facenti parte del
blocco COMMON/COMC/ devono mantenere il loro valore anche dopo la fine
dell'esecuzione del sottoprogramma in cui la frase compare. Notiamo che se il
nome di un blocco COMMON fa parte della lista di un'istruzione SAVE in una
unit di programma, esso deve figurare in un'istruzione SAVE anche in tutte le
altre unit di programma che hanno accesso al blocco.
L'istruzione SAVE in un sottoprogramma pu anche ridursi alla sola parola
chiave
SAVE
In questo caso tutte le variabili interne e le variabili di tutti i blocchi COMMON
etichettati a cui il sottoprogramma ha accesso mantengono il loro valore al termi-
ne dell'esecuzione del sottoprogramma.
349
Esercizi
17.1 Individuare gli errori presenti nei seguenti sottoprogrammi:
a) SUBROUTINE MAT (A, NMAX, N)
REAL A (NMAX, N)
ENTRY SUBMAT(A, N)
END
b) SUBROUTINE SUB (A, B, C)
D=l.
ENTRY SUBS (D)
END
c) FUNCTION FUNZ (X, Y)
A = DER (X, Y)
ENTRY DER (X, Y)
END
17.2 Modificare il sottoprogramma POLINT dell'esempio 17.1 in modo tale da
ottenere un nuovo sottoprogramma che non faccia uso dell'istruzione ENTRY
e che, come POLINT, possa essere utilizzato per calcolare i coefficienti
A
o'
..., An del polinomio interpolante e il valore Pn(x) oppure solo per cal-
colare Pn(x). (suggerimento: inserire un indicatore fra gli argomenti muti).
17.3 Modificare, nello stesso spirito del precedente esercizio, il sottoprogramma
NORMA dell'esempio 17.3.
17.4 Scrivere, facendo uso dell'istruzione ENTRY, un sottoprogramma che possa
essere usato per calcolare, assegnato un valore di x, il valore della funzione
fl x) definita da:
f(x) = x - sen (x - l) - l
oppure il valore della derivata ['(x), definita da
f'(x) = l - cos (x - l)
I.
k = O, l, ...,4.
350
17.5 Scrivere, facendo uso dell'istruzione ENTRY, un sottoprogramma mediante
il quale si possa calcolare, dato x, il valore di f(x) oppure i valori di f(x) e
f''(x), dove f(x) la stessa funzione del precedente esercizio.
17.6 Scrivere un programma che, utilizzando il sottoprogramma dell'esercizio
17.4, permetta di calcolare e stampare i valori di f(x
i
) e f'(x
i
) per Xi =
=0.5 + i 0.01, i =O, ..., lO.
17.7 Scrivere un programma che, utilizzando il sottoprogramma dell'esercizio
17.5, permetta di calcolare e stampare i primi cinque termini della succes-
sione {x
k
}, dove X
o
=Oe i restanti termini sono definiti da
f(x
k
)
x =x ---
k+l k f'(x
k
)
II programma deve interrompersi se, per un valore di k, risulta r'(x
k
) = O.
17.8 II sottoprogramma PARAM dell'esempio 17.6 deve necessariamente essere
di tipo SUBROUTINE e non pu essere di tipo FUNCfION. Spiegare il
motivo di tale affermazione.
17.9 Spiegare il significato che assume il sottoprogramma PARAM dell'esempio
17.6 se si elimina dal suo corpo la frase RETURN che precede l'istruzione
ENTRY. Scrivere un programma principale che utilizzi il sottoprogramma
PARAM nella versione cos modificata per calcolare i valori della funzione
y = 0.5 (e
Q X
- e(- QX)
con Cl' = 0.01 per i seguenti valori di x: O, 1, 2, 3, 4.
"
18
Trattamento dei files
18.1. Introduzione
Abbiamo fin qui trattato le operazioni di I/O procedendo dalla loro forma
pi semplice, le frasi di I/O guidate dalla lista (cfr. cap. 8), fino ad una forma
un po' pi complessa, le frasi di I/O con formato (cfr. cap. 13).
Tali argomenti non esauriscono l'esposizione del complesso delle istruzioni
che il F77 offre all'utente per una completa e sofisticata gestione del meccanismo
di I/O.
In generale una operazione di I/O comporta la trasmissione di informazioni
sotto forma di records da o verso unit (o mezzi) di I/O cui sono associati dei
files. Tale trasmissione pu avvenire sotto il controllo di formato (cfr. cap. 13)
oppure senza il controllo di formato. Ancora, la modalit di accesso ad un file
pu essere sequenziale o diretta.
Inoltre, tali files possono essere rappresentati su supporti esterni alla memoria
centrale, ad esempio su una stampante o video, su nastro o disco magnetico, o
all'interno della memoria centrale.
Da quanto detto si vede quanto possano essere diversificate le operazioni di
I/O a seconda delle necessit e, conseguentemente, quante informazioni debbano
essere fornite prima di un'operazione di I/O per stabilire le varie caratteristiche
del file associato all'unit usata nell'operazione stessa.
Una operazione di I/O pu poi svolgersi senza alcun errore oppure no: pu
essere allora utile gestire in qualche modo queste eventualit. Vedremo che la
forma generale delle istruzioni di I/O prevede anche tali possibilit.
18.2. Records e files
Nel cap. 13 abbiamo esaminato le varie possibilit disponibili in F77 per rea-
lizzare le richieste dell'utente che voglia fornire dati e vedere i risultati dell'ese-
cuzione di un certo programma avendo in mente la gestione dei mezzi di I/O che
trasmettono informazioni strutturate sotto forma di files di tipo sequenziale i
352
cui records sono costituiti da sequenze di caratteri con una prestabilita confi-
gurazione: i records con formato.
Una prima definizione di records e files gi stata data nel cap. 13. Conviene
qui riprendere questi concetti per poter descrivere le rimanenti possibilit per
la gestione di operazioni di I/O meno intuitive di quelle gi viste.
I records previsti in F77 sono di tre tipi:
a) records con formato, costituiti da sequenze di caratteri riconosciuti dal siste-
ma di calcolo;
b) records senza formato, costituiti da sequenze di valori, nella forma di rappre-
sentazione interna;
c) record endfile.
Nel cap. 13 abbiamo solo trattato i records di tipo a).
.Lna sequenza di records tutti del medesimo tipo (a) o b costituisce un file.
A loro volta, i files possono essere suddivisi in due categorie:
a) files esterni, rappresentati su supporti esterni alla memoria centrale dell'ela-
boratore;
b) files interni, rappresentati all'interno della memoria centrale; sono usati
esclusivamente quale magazzino temporaneo di dati, la loro vita quella del
tempo di esecuzione del programma in cui sono definiti come vedremo nel se-
guito.
Per quanto riguarda i files esterni, rappresentati su supporti magnetici, nastri
e dischi, occorre mettere in luce una profonda differenza fra i due tipi di suppor-
to magnetico.
Il nas!ro magnetico un supporto come lo sono una stampante,
una telescrivente, un video o un lettore di schede. Ci implica che per accedere
ad un record del file occorre avere prima scorso tutti i records che si trovano pri-
ma di quello voluto; in altri termini, i records devono essere letti nel medesimo
ordine in cui sono stati scritti. Tale caratteristica comporta un certo dispendio
di tempo per lo scorrimento, avanti o indietro, del nastro per poter accedere al
record voluto.
Su di un disco, al contrario, si pu accedere ad ogni sua parte in un tempo
estremamente inferiore a quello necessario sul nastro: come vedremo pi avanti
occorre solo che la testina di lettura/scrittura si sposti di qualche centimetro
avanti o indietro per posizionarsi sulla parte voluta.
Si dice allora che su tale mezzo le informazioni possono essere reperite ad
c!ire!to, per significare la differenza con il concetto di accesso sequenziale
visto sopra. Tale caratteristica del disco non impedisce che su di esso si possano
gestire files anche in modo sequenziale, mentre il viceversa non possibile sui
nastri: questi consentono solo un accesso sequenziale.
353
Conseguentemente, i files possono essere files sequenziali o files ad accesso
diretto.
Volendo allora leggere o scrivere informazioni su di un file esterno dovremo
specificare quale sia il modo di accesso al file, sequenziale o diretto, e se i suoi
records sono con o senza formato.
Tali specifiche, insieme a diverse altre, vengono esplicitamente fomite tramite
la frase cui utilizzazione non richiesta per alcuni mezzi esterni, ad
esempio i mezzi standard, per i quali il sistema assume implicitamente il modo di
accesso sequenziale e records con formato.
Records con formato e senza formato
I records con formato sono costituiti da una sequenza di caratteri tale da essere
facilmente compresa da un essere umano. Tali records sono scritti tramite le ope-
razioni di uscita guidate dalla lista o sotto il controllo esplicito del formato.
Ancora, questi records possono anche essere creati senza l'esecuzione di un pro-
gramma FORTRAN, ad esempio servendosi di programmi di editing general- I
mente disponibili nei moderni sistemi di calcolo.
La lunghezza di un record con formato data dal numero di caratteri che lo
compongono. Si noti che la conoscenza della lunghezza di un record necessaria
quando il file cui il record appartiene sia dichiarato ad accesso diretto.
La trasmissione di un record con formato implica una conversione da rappre-
sentazione esterna ad interna o viceversa dei dati in esso contenuti; ci compor-
ta un tempo non trascurabile. Se, d'altra parte, l'informazione scritta sul record
non deve essere letta da un essere umano, ma successivamente letta nel medesimo
o altro programma, non si presenta la necessit di dover convertire questa infor-
mazione da rappresentazione interna ad esterna o viceversa.
l/In questo caso, con grande risparmio di tempo, basta usare frasi di I/O senza il/
'I controllo di formato per produrre o leggere records senza formato.
I Un record senza formato costituito da una sequenza di valori rappresentati
modalit dipendenti dal sistema. In generale un valore esattamente
111a rappresentazione interna di un dato; cos un record senza formato pu esserii
considerato la copia di una parte della memoria.
Frasi di I/O senza formato possono essere scritte semplicemente non riportando
l'identificatore di formato, ma solamente il riferimento all'unit di I/O come si
vede nelle frasi seguenti:
WRITE (8) A V, BV, CV
READ (9) X, Y
La prima fa s che venga scritto il record costituito dai valori attuali delle varia-
bili AV, BV e CV sul file associato all'unit 8; la seconda ha invece l'effetto di
, I
I
354
leggere, dal file associato all'unit 9, un record che si suppone costituito da due
valori che, senza alcuna conversione, sono assegnati alle variabili X e Y.
La lunghezza di un record senza formato misurata in unit dipendenti dal
sistema; generalmente l'unit di misura il byte o multiplo di byte. Cos se i
valori di AV, BV e CV sono rappresentati su quattro by tes, il record prodotto
dalla frase WRITE sopra riportata risulta lungo 12 bytes.
Notiamo una importante differenza fra le frasi di I/O con formato e quelle
senza.
Le prime, per effetto del controllo congiunto fra lista e specificazione di for- I
',mato, possono trasmettere pi records; le seconde possono trasmettere un solo
((I(' \" record per volta.
III Inoltre, la lunghezza della lista in una istruzione d'ingresso senza formato deve
Il;! iessere minore o uguale alla lunghezza della lista della frase di uscita che ha pro-
,'l' dotto il record che sta per essere letto.
Esempio 18.1. Affinch la frase
READ (9) X, Y
possa essere correttamente eseguita occorre che il record che sta per essere letto
sul file associato all'unit 9 sia costituito da almeno due valori.
Nel caso in cui la lunghezza della lista sia inferiore a quella del record che sta
per essere letto, i valori eccedenti sul record resteranno non letti.
Il record endfile e la frase ENDFILE
Il record endfile pu essere posto solo come ultimo record di un file ed pro-
dotto con l'uso della frase speciale:
355
Il significato di questi specificatori verr dato nel paragrafo successivo.
Notiamo che, comunque, l'unit riferita da u deve essere ad accesso sequen- , ! I
ziale. I
L'effetto principale dell'esecuzione della frase ENDFILE quello di scrivere
sul file associato all'unit u il record speciale endfile. Ci rende impossibile ogni
successivo tentativo di leggere da o scrivere su quel file senza avere prima scorso
all'indietro il file usando una frase BACKSPACE o REWIND (cfr. 18.5).
E' molto comodo porre tale record alla fine di files sequenziali che devono es-
sere successivamente riletti per facilitare tale rilettura completa senza dover con-
trollare la lunghezza del file da leggere. L'uso del record endfile verr evidenziato
nell'esempio 18.12.
18.3. La forma generale delle frasi di I/O
La forma generale delle frasi di I/O la seguente:
rw (dista) lista-di-I/O
dove:
rw la opportuna parola chiave: READ per le operazioni di ingresso,
WRITE per quelle di uscita;
lista-di-I/O la lista degli elementi i cui valori devono essere trasmessi; per la
sua forma cfr. cap. 13;
dista la lista di controllo che fornisce informazioni sia circa l'unit di
I/O che sulla natura e modalit di gestione dell'operazione.
L'effetto principale di un 'operazione di I/O quello gi ampiamente descritto
nel cap. 13: la trasmissione di uno o piu records.
La lista di controllo
Tale lista costituita dall'elenco di tutti o parte dei seguenti specificatori se-
parati da virgole
I
l
" ,l
, \
ENDFILE u
oppure
ENDFILE (auxlista).
Nella prima forma u l'espressione intera il cui valore denota il numero dell'u-
nit sulla quale il record deve essere scritto; nella seconda forma la lista auxlista
pu contenere ciascuno dei seguenti specificatori separati da virgole e senz'altro
lo specificatore relativo all'unit:
u
UNIT =u
ERR =s
10STAT = v
gli specificatori u e UNIT = u sono equivalenti.
u
UNIT = u
f
FMT= f
10STAT = s
ERR =s
END =s
REC = n
Lo specificatore u oppure UNIT
u, relativo all'unit di I/O, deve essere
356
sempre presente. In particolare, se esso l'unico specificatore presente, la frase
in questione rappresenta una operazione di l/O senza formato sul file (sequenzia-
le) associato all'unit specificata.
Se la stringa UNlT = omessa, allora lo specificatore u deve essere il primo ele-
mento della lista di controllo. Lo specificatore u pu avere una delle forme se-
guenti:
a} un'espressione intera il cui valore identifica l'unit di l/O interessata all'o-
perazione e quindi il file ad essa associato;
b) il carattere asterisco ... che denota l'opportuno mezzo standard;
c) uno dei seguenti elementi di tipo carattere: una variabile, un elemento di
variabile dimensionata, una sottostringa, una variabile dimensionata.
La specifica dell'unit secondo le forme a) e b) consente di gestire files esterni.
Quella la forma c) consente la gestione di files interni; le operazioni di
a queste unit verranno descritte nel 18.8.
In una operazione di l/O con formato deve essere presente uno dei seguenti
( specificatori:
FMT = f oppure f
I
La stringa FMT = pu essere omessa solo se stata omessa la stringa UNlT =
nello specificatore d'unit, in questo caso l'identificatore di formato f essere
il secondo elemento nella lista di controllo.
Si noti che se lo specificatore di formato assente l' operazione di l/O avviene
senza il controllo di formato.
Esempio 18.2. Alcune frasi di l/O fra loro equivalenti:
READ (UNII =l, FMT = 50) A, B, C
READ (FMT = 50, UNII = l) A, B, C
READ (1, FMT =50) A, B, C
READ (l,50) A, B, C
READ (I, 50) A, B, C
READ (l, '(3FlO.0)') A, B, C
READ (UNII = l, FMT = '(3FlO.0)') A, B, C
50 FORMAT (3FIO.0)
357
Si noti che fra tutte le forme di frasi di I/O dell'esempio 18.2 solo
READ( l ,50) A, B, C READ (I, 50) A, B, C WRlTE (2, 60) A, B, C e
WRlTE (J, 60) A, B, C sono consentite in F66.
Gli specificatori di
stato 10STAT =v
errore ERR = s
fine file END =s
sono opzionali e, se presenti, le relative parole chiave devono essere pure
riportate.
Nello specificatore di stato 10STAT = v, v un nome di variabile o elemento
di variabile dimensionata di tipo intero. AI termine dell'operazione di l/O v assume
un determinato valore:
zero, se l'operazione ha avuto termine normalmente;
un intero positivo, se occorso un errore, ad esempio di conversione di un
dato, oppure se il file associato all'unit specificata non ha opportune caratte-
ristiche: costituito ad esempio da records senza formato mentre l'operazione
con formato;
un intero negativo, se l'operazione in questione un'operazione di ingresso di
tipo sequenziale, nessun errore avvenuto ma stato incontrato il record endfile
non potendo cos completare l'operazione di ingresso per mancanza di dati.
Il valore effettivo di v dipende dal sistema, e pu essere controllato dopo l'ope-
razione di l/O per poter decidere le opportune azioni successive.
Esempio 18.3. Uso dello specificatore 10STAT. Si consideri il seguente segmento
di programma:
READ (1,50, IOSTAT = KS) A, B, C
IF (KS.LT.O) THEN
C FINE DEL FILE
ELSE
C CONTINUAZIONE DELLA NORMALE ELABORAZIONE
ENDIF
STOP
50 FORMAT (3 EI3.6)
END
nelle quali si suppone l = l.
WRITE (UNII = 2, FMT = 60) A, B, C
WRIIE (J, '(IX, 3E13.6)') A, B, C
WRIIE (FMT =60, UNII =l + I) A, B, C
WRIIE (2, 60) A, B, C
WRIIE (J, 60) A, B, C
WRIIE (UNII = 2, FMT = '(IX, 3E13.6)') A, B, C
60 FORMAT (IX, 3E13.6)
nelle quali si suppone J = 2 e l = l.
C
ELSE IF (KS.GT. O) THEN
CONDIZIONE D'ERRORE DURANTE LA LETTURA
358
359
Esempio 18.4. Simulazione dell'esempio 18.3 tramite gli specificatori ERR e
END.
La lista di controllo presente nella READ specifica che la lettura avviene dal
file associato all'unit l secondo le modalit di conversione date nella frase
FORMAT di etichetta 50; lo stato al termine dell' operazione codificato nella
variabile intera KS e l'esecuzione procede in base al valore di KS che viene con-
trollato nella struttura IF successiva.
Negli specificatori di errore ERR = s e di fine file END = s, s l'etichetta di
una frase eseguibile appartenente alla medesima unit di programma.
Il significato di tali specificatori il seguente: il controllo viene trasferito
all'istruzione etichettata con s se durante l'operazione si sia verificata una condi-
zione di errore per il primo o se, in lettura, sia stato incontrato il record endfile
su un file esterno o sia stato fatto un tentativo di leggere oltre la fine di un file
interno per il secondo.
Si ricordi che, come gi sopra accennato, una condizione di errore pu essere
provocata da vari eventi fra i quali un disaccordo in tipo fra l'elemento della lista
di I/O ed il descrittore ripetibile associato nella specificazione di formato oppure un
errore di conversione dovuto alla presenza nel campo di ingresso di un carattere
non valido, oppure un disaccordo fra le caratteristiche assunte per il file associato
all'unit presente nella lista di controllo e quelle effettivamente dichiarate nella
frase OPEN per quell'unit.
0'! Inoltre, se durante un 'operazione di lettura si verifica una condizione di fine/
I file o di errore, i valori degli elementi della lista di ingresso diventano indefiniti. A
Infine, se nella lista di controllo non presente n lo specificatore 10STAT
n END n ERR e si verifica una condizione di errore o fine file, ci provoca una
condizione d'errore per il programma la cui esecuzione, secondo il FORTRAN
77, deve cessare.
L'ultimo specificatore, REC = n, dove n un'espressione intera, riguarda le
operazioni di I/O su files ad accesso diretto che verranno illustrate nel 18.6.
18.4. Connessione di un file esterno: frasi OPEN e CLOSE
Per poter fare riferimento in una frase di I/O ad un file esterno occorre che
questo sia conosciuto dal programma, ossia connesso o associato ad una data
unit. I files relativi alle unit di I/O standard sono sempre connessi per tutti i
possibili programmi; essi si dicono pertanto files preconnessi e la dichiarazione
di connessione che vedremo per essi implicitamente sempre assunta.
Alcuni sistemi prevedono anche la possibilit di preconnettere un file, ad esem-
pio alla stampante o al lettore di schede etc., tramite opportuni comandi rivolti
allinker.
Frase OPEN
Con una dichiarazione di connessione rendiamo accessibile ad un programma
un file che gi esiste su qualche supporto esterno, dichiarandone le caratteristiche
e potendo cos leggerlo o modificarlo. Si pensi, ad esempio, ad un file esistente
relativo agli stipendi degli impiegati di una ditta. Esso sar memorizzato su un
disco magnetico e conosciuto all'interno del sistema con un nome, poniamo
STIPENDI. Se vogliamo aggiornare tale file dobbiamo renderlo accessibile da par-
te del programma di aggiornamento e ci viene appunto fatto connettendo tale
file, identificato dal suo nome, ad una certa unit di I/O rappresentata dall'oppor-
tuno valore intero.
Se, d'altra parte, il file non esiste esso pu venire creato dandogli un nome e de-
finendolo con opportune operazioni di scrittura; questo file potr poi essere me-
morizzato permanentemente, su qualche supporto esterno a seconda delle speci-
fiche date al riguardo.
In ogni caso. per tutti i files che non siano preconnessi occorre che essi siano
esplicitamente connessi tramite l'uso della frase OPEN che ha la seguente forma:
READ (1,50, ERR = 100, END = 200) A, B, C
CONTINUAZIONE DELLA NORMALE ELABORAZIONE c
i
'I
I
i I
Il
I
i
I
I
r
GOT060
C CONDIZIONE D'ERRORE
100
GO TO 60
C FINE DEL FILE
200
60 STOP
50 FORMAT (3E13.6)
END
OPEN (olista)
dove:
OPEN la parola chiave che identifica la frase;
olista una lista composta da tutti o parte dei seguenti specificatori separati
da virgole:
I 1l'
t
I
STATUS =st
Con lo specificatore di stato
STAMPA SUL MEZZO PRN.
WRlTE (2, 'C'v STAMPAvSULvMEZZOvPRN")'}
associa il file (stampante) PRN all'unit 2, cos la successiva istruzione
OPEN (UNlT = 2, FILE = 'PRN')
file identificato, pu essere diverso per ogni esecuzione del programma in cui le
istruzioni sopra riportate compaiono: le istruzioni di I/O che nel corso di quel
programma si riferiscono all'unit 6 comportano cos operazioni di I/O sul file
individuato dal valore attuale di NOMEFI.
361
produce sulla stampante, la linea
dove:
st una espressione di tipo carattere che deve valere una delle seguenti strin-
ghe: 'OLD', 'NEW', 'SCRATCH' o 'UNKNOWN', stabiliamo certe caratteristiche
sulla vita del file il cui nome presente nella stessa frase OPEN.
Se st vale 'OLD' allora il file deve gi esistere, mentre se vale 'NEW' esso non
deve preesistere. Se un file con specifica 'NEW' viene connesso, allora il suo stato
viene mutato in 'OLD' cos che ogni successivo tentativo di riconnettere quel
file con STATUS uguale a 'NEW' fallisce, ci per evitare eventuali modifiche ac-
cidentali di un file gi esistente. Se st vale 'SCRATCH' si ha la creazione di un
file speciale di esclusivo uso da parte del programma, la sua durata quella del-
l'esecuzione del programma: quando l'esecuzione del programma termina anche
il file cessa di esistere. Evidentemente, se la dichiarazione del file prevede lo spe-
cificatore FILE, il file non pu essere di tipo SCRATCH. Se st vale 'UNKNOWN'
o se lo specificatore di stato omesso, lo stato del file dipende dal sistema: gene-
ralmente, se il file gi esiste, lo stato assunto 'OLD', altrimenti 'NEW'.
Esempio 18. 6. Scrittura sulla stampante. Supponiamo che nel sistema di calcolo
in uso la stampante sia identificata dal nome PRN. La seguente istruzione
CHARACTER 8 NOMEFI
READ '(A)', NOMEFI
OPEN (UNIT =6, FILE =NOMEFI)
FILE = 'PRN', FILE = 'CON', FILE = 'STIPENDI'
FILE = 'A:VAL.DAT'
dove n un'espressione di tipo carattere, ad esempio possiamo avere:
FILE =n
UNIT =u
FILE =n
STATUS =st
ACCESS = ace
FORM = form
RECL =2
BLANK =bi
ERR =s
10STAT = v
Esempio 18.5. Uso di un nome variabile di file
Il primo specificatore, UNIT = u o semplicemente u, deve essere sempre
presente, mentre gli altri sono facoltativi. In questo specificatore, u ha la forma
gi illustrata nel 18.3.
Il file che deve essere associato all'unit u deve avere, se gi esiste, un nome che
sia conosciuto dal sistema, ad esempio il nome che tale file ha se memorizzato
su nastro o disco, oppure il nome che il sistema d ai files che rappresentano i
comuni mezzi di I/O, quali la stampante o la telescrivente, come PRN, LPT o
CON e simili. Tale nome quello che deve comparire nello specificatore
360
Le espressioni, in questo caso costanti, 'PRN', 'CON', 'STIPENDI' e
,A : VAL.DAT' sono possibili nomi di files riconoscibili dall'attuale sistema di
'Icalcolo. Per quanto riguarda i nomi dati dal sistema ai comuni mezzi di I/O e
l/I 1, la forma corretta per i nomi di files sui vari supporti magnetici occorrer l ~
'l' consultare il relativo manuale del sistema. Oltre a nomi costanti di files si possono' I
usare anche nomi variabili, come mostra il seguente esempio.
Con queste istruzioni viene letta, dal mezzo standard di ingresso, una stringa
di caratteri e assegnata alla variabile carattere NOMEFl che, nella successiva frase
OPEN, costituisce il nome del file associato all'unit 6. Tale nome, e quindi il
Esempio 18.7. Connessione del file esistente, 'A: VAL.DAT', all'unit 6, con
una delle successive istruzioni OPEN equivalenti:
OPEN (6, FILE = 'A:VAL.DAT', STATUS ='OLD')
OPEN (6, FILE = 'A:VAL.DAT', STATUS = 'UNKNOWN')
OPEN (6, FILE = 'A:VAL.DAT').
d
I
I

I
I
362
Lo specificatore
ACCESS = ace
dove:
ace un'espressione carattere che deve valere 'SEQUENTIAL' o 'DIRECT'
dichiara il modo di accesso al file. Con 'SEQUENTIAL' il modo di accesso se-
quenziale, con 'maser invece diretto; nel 18.6 verranno illustrate le carat-
teristiche e l'uso dei files ad accesso diretto. Se lo specificatore ACCESS omesso
assunto il modo sequenziale: i files -connessi con le istruzioni OPEN dagli
esempi precedenti sono allora tutti ad accesso sequenziale.
Gi abbiamo illustrato la possibilit di usare records con e senza formato.
Un file pu essere costituito da records tutti con formato o tutti senza formato
in accordo con lo specificatore
FORM = form
dove:
form un'espressione carattere che deve valere 'FORMATTED' o
'UNFORMATTED', rispettivamente per files con e senza formato.

I
omesso iLfle considerato dal sistema con formato '(
ryr; I se l'accesso .sequeneiale, ma senza formato se l'accesso diretto. Alloratl"ill li: ,iV
!i files degli esempi precedenti sono costituiti e ad
1 so sequenziale.
p
- ---Ili
Esempio 18-8- Connessione di un file sequenziale con formato di tipo SCRATCH
all'unit I:
OPEN (I, STATUS = 'SCRATCH', ACCESS = 'SEQUENTIAL',
FORM = 'FORMATTED').
Quando un file sia stato dichiarato ad accesso diretto necessario stabilire a
priori la lunghezza, costante, dei suoi records, misurata in caratteri per i records
con formato o in base all'unit di misura adottata dal sistema per quelli senza for-
mato. Tale dichiarazione viene fatta tramite lospecificatore
RECL =
dove:
un'espressione intera il cui valore d l'opportuna informazione sulla lun-
ghezza.
f\I\J Si noti che tale specificatore non deve essere presente se il file stato dichiarato
" ad accesso sequenziale. [,J \
1
363
Esempio 18.9. Si considerino le seguenti frasi:
OPEN (6, FILE = 'A:DIR.DAT', ACCESS = 'DIRECT', STATUS = 'OLD',
*RECL =8)
OPEN (7, FILE = 'C:VAL.FM', ACCESS = 'DIRECT', STATUS = 'NEW',
*FORM ='FORMATTED', RECL =8) -
La prima associa all'unit 6 il file identificato dal nome A:DIR.DAT, gi esi-
stente e memorizzato su un supporto magnetico. Le sue caratteristiche sono di
essere: ad accesso diretto con records senza formato (il dichiaratore FORM
infatti assente e l'accesso diretto); la lunghezza di ciascun record 8 unit.
La seconda frase OPEN associa all'unit 7 il file che verr creato con il nome
C:VAL.FM. Le sue caratteristiche sono di essere: ad accesso diretto con records
con formato di lunghezza 8 caratteri ciascuno.
Nella definizione delle caratteristiche di un file costituito da records con for-
mato, possiamo stabilire il modo di interpretare i caratteri blank all'interno di
campi numerici: ignorarli o considerarli come cifre zero. A questo scopo esiste
lo specificatore
BLANK = bI
dove:
bI un'espressione carattere che deve valere 'NULL' o 'ZERO' a seconda se
vogliamo ignorare o considerare come zero i caratteri blanks nei campi numerici,
tenendo conta.checomunque un campo composto da tutti blanks considerato
contenere il valore zero.
Se tale specificatore omesso, viene assunta l'opzione 'NULL'. Ricordiamo
inoltre che tale scelta pu essere ulteriormente, di volta in volta, cambiata con
l'uso dell'apposito descrittore non ripeti bile BN o BZ all'interno di una specifi-
cazione di formato (cfr. cap. BLANK infine, non deve essere
presente se il file costituito da records senza formato.
- ---"- - -- ._- ----
Il trattamento delle condizioni di errore che si possono verificare durante la
connessione di un file stabilito con gli ultimi due specificatori ERR e IOSTAT.
Una condizione d'errore si potrebbe presentare nel caso in cui un file dichiarato
come 'OLD' non esista o se il tipo del file esistente non si accorda con quello sta-
bilito da certi specificatori.
Ricordiamo che in queste circostanze. se nessuno dei due specificatori ERR o
IOSTAT presente si ha un arresto dell'esecuzione del programma.
Con lo specificatore
ERR =s
/ ,
364
dove:
s l'etichetta di una frase appartenente alla medesima unit di programma
si stabilisce che in caso di errore l'esecuzione riprenda a partire dalla frase di eti-
chetta s.
Se presente lo specificatore:
IOSTAT =v
dove:
v un nome di variabile o elemento di variabile dimensionata di tipo intero,
allora in relazione al verificarsi o meno di errori v assume i seguenti valori:
zero se nessun errore avvenuto;
un valore positivo dipendente dal sistema in caso contrario.
La variabile v pu essere controllata per avere informazioni sull'esito dell'o-
perazione di connessione.
(vJ Tenendo presente la generale. che una unit non Pli
contemporaneamente a ptu files, possiamo avere una corretta connessione neil{
casi seguenti:
a) se il file nella OPEN diverso da quello gi connesso, allora il file preceden-
te viene sconnesso (vedi frase CLOSE pi avanti) ed il nuovo file viene connesso'
b) se il file nella OPEN il medesimo, ossia gi connesso, oppure se l'unit
indicata una di quelle preconnesse, allora l'unico specificatore consentito il
BLANK per stabilire esplicitamente l'interpretazione dei blanks.
I, Il In ogni caso tentare un file che sia gi /',' \,
, \ \ associato ad un 'altra unit. -- - I
Frase CLOSE
Al termine dell'esecuzione di un programma ogni file che sia stato connesso
viene automaticamente sconnesso o chiuso.
Se vogliamo operare tale sconnessione prima della fine del programma perch
desideriamo ad esempio riconnettere quel file ad altra unit, possiamo usare la
frase
CWSE (cllista)
dove:
cllista una lista composta da uno o pi dei seguenti specificatori separati
da virgole:
365
u
UNIT = u
STATUS = st
ERR = s
IOSTAT =v
Lo specificatore u oppure UNIT = u deve essere sempre presente. Gli speci-
ficatori u, UNIT, ERR e IOSTAT hanno il medesimo significato visto nella frase
OPEN.
Con lo specificatore
STATUS = st
dove:
st un'espressione carattere che deve valere 'KEEP' o 'DELETE', si danno
indicazioni sulla possibilit o meno di riconnettere il file durante l'esecuzione
del programma. Se st vale 'KEEP' il file che era connesso all'unit u pu essere
successivamente connesso alla medesima o altra unit; se invece st vale 'DELETE',
il file connesso all'unit u cessa di esistere: ci significa che il file non pu essere
ulteriormente connesso durante l'esecuzione del programma e non vuoI dire che
il file deve essere cancellato dalla memoria ausiliaria sulla quale memorizzato.
Se lo specificatore STATUS omesso, viene automaticamente assunta la di-
chiarazione KEEP a meno che il file in questione non sia stato connesso con la
specifica STATUS = 'SCRATCH', nel qual caso viene assunta la dichiarazione
DELETE.
Ricordiamo infine che le frasi OPEN e CLOSE non esistevano in F66.
Esempio 18.10. Le seguenti frasi
OPEN (6, FILE = 'C:VAL.DAT', STATUS = 'OLD')
CLOSE (6, STATUS ='KEEP')
OPEN (7, FILE ='C:VAL.DAT')
implicano la connessione del file CVAL.DAT all'unit 6, quindi la sconnessione
da quella unit e la successiva riconnessione di quel file all'unit 7.
18.5. Frasi di posizionamento: BACKSPACE e REWIND
Pu essere utile poter esplicitamente posizionare la testina di lettura/scrittura
di un mezzo magnetico su di un record voluto di un file sequenziale.
I
I
i i
t
I
I
l
I,
,
1
-1 I
n
\,
I
366
367
A tale scopo esistono le frasi
BACKSPACE u oppure BACKSPACE (auxlista)
e
REWIND u oppure REWIND (auxlista)
tutti i records successivi.
Le istruzioni BACKSPACE e REWIND vengono usate di solito solo per leggere
i records di un file. Vedremo comunque che i files ad accesso diretto consentono
un aggiornamento dei loro records nel senso che possibile modificare un certo
record lasciando inalterati tutti i precedenti ed i successivi.
Si osservino le tre frasi
esse realizzano in modo assai semplice il posizionamento sul record endfile del file
ESPER.DAT. La frase READ non contiene alcuna lista, ma la sua esecuzione,
5 READ (8, END = lO)
GOTOS
lO BACKSPACE 8
PROGRAM AGGESP
DICHIARAZIONI
REAL TEMP
INTEGER DATA (3), ORA (3)
LETTURA DATI DAL MEZZO STANDARD D'INGRESSO
READ., TEMP, DATA, ORA
IL FILE ESPER. DAT E' ASSOCIATO ALL'UNITA' 8
OPEN (8, FILE = 'ESPER.DAT', STATUS = FORM =
.'UNFORMATTED', ACCESS ='SEQUENTIAL )
POSIZIONAMENTO SUL RECORD ENDFILE
5 READ (8, END = lO)
GOTOS
lO BACKSPACE 8
I DATI LETTI VENGONO SCRITTI COME ULTIMO RECORD
DEL FILE AL POSTO DI ENDFILE, CHE VIENE ULTERIORMENTE
AGGIUNTO AL FILE
WRITE (8), TEMP, DATA, ORA
ENDFILE 8
STOP
END
C
C
C
C
C
C
c
Esempio J8. J2. Si vuole aggiornare un file di nome ESPER.DAT, i cui .records
contengono i valori: temperatura, data ed ora relativi ad un certo espenmento.
Tali records sono senza formato ed il file ad accesso sequenziale, vogliamo infat-
ti solo aggiungere alla fine del file il record relativo all'ultima rilevazione fatta,
l'ultimo record del file il record end file.
Un semplice programma per realizzare quanto sopra detto, dovr contenere le
specifiche del file in una opportuna frase OPEN, dovr prevedere la lettura dei
dati che devono essere aggiunti al file. Siano questi TEMP per temperatura,
DATA (3) il vettore di 3 componenti per giorno mese ed anno ed il vettore
ORA (3) di 3 componenti per ora, minuti e secondi.
WRITE (2, '(lOE13.6)') V
BACKSPACE 2
Esempio J8. JJ. Le seguenti frasi
fanno si che venga scritto sul file SEQ un record e successivamente provocano il
posizionamento della testina all'inizio del record appena scritto.
REAL V(lO)
OPEN (UNIT = 2, FILE = 'SEQ', ACCESS = 'SEQUENTIAL')
dove:
u l'identificatore di unit come gi precedentemente illustrato;
auxlista la lista di specificatori UNIT, ERR e 10STAT gi illustrati nel
18.2, in cui lo specificatore UNIT deve necessariamente essere presente.
L'esecuzione di BACKSPACE fa si che la testina si posizioni all'inizio del
record appena trasmesso; ci consente, ad esempio, di rileggere un record appena
letto.
Si noti che all'inizio dell'esecuzione di un programma, per ogni file connesso,
il record che sta per essere letto il primo. Ovviamente, eseguendo pi volte una
BACKSPACE possibile il posizionamento su un record precedente.
Se, d'altra parte, desideriamo ritornare all'inizio del file conveniente l'uso
della REWIND, che causa appunto il posizionamento sul primo record del file
associato ad u nella REWIND stessa.
f r L'uso di tali frasi particolarmente utile in connessione con l'uso del record
\ l' !endfile. Quando un tale record sia stato letto o scritto, nessuna ulteriore opera-
\ zione di I/O pu essere effettuata sul file in questione senza prima aver eseguito
una frase BACKSPACE o REWIND.
I
Occorre mettere in evidenza una importante caratteristica dei files ad accesso
r sequenziale. Quando un record viene scritto su di un file sequenziale, esso l'ul-
\ I, timo record del file, COSI' ogni eventuale altro record presente sul file
, vtene distrutto. Non possiamo allora usare le frasi BACKSPACE e REWIND per
\ \ I posizionarsi su un certo record, riscriverci sopra una nuova versione lasciando i
record successivi inalterati: lascrittura del nuovo record possibile solo perdendo'
368
18.6. Files ad accesso diretto
Abbiamo gi messo in luce il fatto che usando come memoria ausiliaria il disco
magnetico, che pu essere disco rigido o fisso o dischetto (floppy disk), riusciamo
ad ottenere da una parte prestazioni, riguardo ai tempi d'accesso, molto miglion
rispetto ai nastri e dall'altra la possibilit di accedere ai records di un file, se il
modo d'accesso DIRECT, in modo non sequenziale ma stabilito in base al nu-
mero d'ordine del record voluto. Tale possibilit di accesso diretto, detto anche
casuale, data dalla struttura fisica del mezzo che riportiamo in fig. 18.1.
j.
\

I
i
369
RECL =2
come gi illustrato nel 18.4.
dove n un'espressione intera.
Ricordiamo che per dichiarare un file ad accesso diretto, dobbiamo includere
nella frase OPEN lo specificatore
ACCESS = 'DIRECT'
e dobbiamo altres dichiarare la lunghezza di ciascun record del file con lo spe-
cificatore
binazione del movimento orizzontale avanti-indietro della testina e di quello
di rotazione del disco, consente il posizionamento della testina in qualsiasi punto
di qualsiasi traccia. Ovviamente il tempo massimo richiesto per accedere ad un
record quello necessario per lo spostamento della testina dalla traccia pi in-
terna a quella pi esterna, o viceversa, pi quello per un giro completo del disco.
Le caratteristiche di velocit d'accesso del disco lo hanno fatto di gran lunga
preferire al nastro per quasi tutte le applicazioni, tanto che oggi il sistema operati-
vo di un elaboratore basato proprio sul disco, si pensi ad esempio alla categoria
dei sistemi DOS (Disk Operating System).
Il fatto che il disco consenta l'accesso diretto ai records di un file non implica
che necessariamente tutti i files su di esso memorizzati siano ad accesso diretto;
come gi stato osservato, possono essere definiti sul disco anche files ad acces-
so sequenziale.
I files ad accesso diretto risultano particolarmente utili in determinate circo-
stanze: quando si voglia leggere un record senza dover necessariamente scorrere
tutti i precedenti o quando si voglia riscrivere su di un record una nuova versione
senza perdere i records successivi.
Per accedere ad un record su di un file ad accesso diretto, occorre conoscere
il numero d'ordine, in quanto tutti i records di un file sono ordinati. Il numero
d'ordine del record interessato all'operazione di I/O deve essere specificato nella
lista di controllo della frase di I/O mediante lo specificatore
REC=n
Testina di
lettura/scrittura
Traccia
provocando comunque la lettura di un record, i cui valori non sono assegnati ad
alcuna variabile, genera uno scorrimento del file che viene ripetuto per effetto
della frase GOTO 5 finch non viene letto il record endfile. A questo punto lo
specificatore END = lO provoca il salto alla frase lO BACKSPACE 8 la quale
posiziona la testina sul record appena letto ovvero sul record endfile. La succes-
siva frase WRITE provoca la sostituzione del record endfile con quello senza for-
mato, costituito dai sette valori di TEMP, DATA e ORA. La successiva frase
ENDFlLE 8 scrive il nuovo record endfile. La fine dell'esecuzione del programma
comporta quindi l'automatica sconnessione del file come se fosse eseguita una
frase CLOSE (8).
Figura 18.1. Struttura dell'unit disco magnetico.
L'unit disco magnetico infatti costituita da un disco, le cui facce sono ri-
coperte da materiale magnetico, che ruota intorno ad un asse verticale; sul disco
si muove orizzontalmente una testina di lettura/scrittura.
L'informazione memorizzata su tracce concentriche, di modo che la com-
Esempio 18.13. Si considerino le seguenti frasi:
OPEN (7. FILE ='ACCDIR', ACCESS ='DI RECT' ,
*FORM ='UNFORMATTED', RECL = 12)
WRITE (7, REC = 2) X, Y, Z
READ (7, REC =2) A, B, C
370
La prima frase dichiara le seguenti caratteristiche del file di nome' ACCDIR'
associato all'unit 7: esso ad accesso diretto e i suoi records senza formato sono
lunghi 12 unit.
La seconda scrive come secondo record del file 'ACCDIR' un record (di lun-
ghezza 12) composto dai 3 valori di X, Y e Z rispettivamente. La terza causa
la lettura del 2
0
record del file 'ACCDIR' e definisce le variabili A, B, C con i va-
lori, senza alcuna conversione, di X, Y, e Z precedentemente scritti.
Esempio 18.14. II seguente programma:
PROGRAM MEDVAL
REAL MEDIA
DIMENSION A(20), MEDIA (50)
C CONNESSIONE DEL FILE 'VALORI' ALL'UNITA' 2
OPEN (UNIT = 2, FILE = 'VALORI', ACCESS = 'DIRECT', RECL = 80,
*STATUS = 'OLD')
C LETTURA DEI VALORI DI M E N, CON M MINORE O UGUALE A 20
C E N MINORE O UGUALE A 50 (NUMERO TOTALE DEI RECORDS
C PRESENTI NEL FILE 'VALORI')
READ *,M,N
C DEFINIZIONE DEL VETTORE A E DEL VETTORE MEDIA,
C TRAMITE LA LETTURA DI UN RECORD PER VOLTA DAL FILE
DOSI=I,N
READ (2, REC = I) (A(J), J = 1, M)
MEDIA (I) = O.
D04K=I,M
MEDIA (I) = MEDIA (I) + A(K)
4 CONTINUE
MEDIA (I) = MEDIA (I)/M
CONTINUE
C STAMPA SULLA STAMPANTE 'PRN' DEL VETTORE MEDIA,
C IL FILE 'PRN' VIENE ASSOCIATO ALL'UNITA' 3
OPEN (3, FILE = 'PRN')
WRITE (3, 6) MEDIA
STOP
6 FORMAT (IOX, 'VETTORE MEDIA RICAVATO DAL FILE VALORI'/
*5 (2X, EI3.6))
END
definisce le prime N componenti del vettore MEDIA. Ciascuna componente la
media degli M valori letti da ciascuno dei primi N records del file 'VALORI'
associato all'unit 2. Questo file ad accesso diretto ed costituito da records
senza formato di lunghezza 80 (= 20 x 4 unit). Esso deve essere stato preceden-
temente definito in modo tale da contenere in ciascuno dei primi N records al-
meno M valori. II vettore MEDIA calcolato viene stampato sul file stampante
'PRN' di tipo sequenziale costituito da records con formato, associato all'unit
3.
371
Abbiamo gi notato che la lunghezza dei records, in un file ad accesso diretto,
deve essere sempre la medesima, quella definita nello specificatore RECL.
D'altra parte in F77 possibile scrivere un record senza formato di lunghezza
inferiore a quella stabilita; in questo caso la parte mancante viene riempita con
valori indefiniti. Ci possibile anche con records con formato di un file ad
accesso diretto: in questo caso il record eventualmente pi corto viene allungato
con dei caratteri blanks per raggiungere la lunghezza stabilita.
Esiste poi un altro tipo di automatismo nelle operazioni di 110 ad accesso di-
retto con formato: se la specificazione di formato e la lista di 110 sono tali da
trasmettere pi di un record, allora ogni record trasmesso viene numerato aggiun-
gendo una unit al numero d'ordine del record precedente. Cos le frasi
OPEN (3, FILE = 'DIRFORM', ACCESS = 'DIRECT',
*FORM = 'FORMATTED', RECL = 100)
WRITE (3, 30, REC = l) (A(I), I = 1,20)
30 FORMAT (lO GIO.2)
provocano la scrittura, sul file 'DIRFORM', di due records ciascuno costituito
da lOdati rappresentati in accordo al descrittore G l 0.2; il primo record ha nu-
mero d'ordine 1 ed il secondo ha numero d'ordine 2. Si noti, infine, che se il file
'DIRFORM' contenesse gi il primo ed il secondo record, questi verrebbero sosti-
tuiti da quelli appena scritti.
18.7. Indagine sulle unit di 110e sui files: frase INQUIRE
Pu essere utile avere la possibilit di sapere le caratteristiche di files esterni
conosciuti dal sistema eia unit usate in un programma. Ci pu essere ottenuto
eseguendo la frase INQUIRE che definisce il valore di variabili el elementi di
variabile dimensionata, in modo tale da sapere se un tile costituito da records con
formato, se ad accesso diretto o sequenziale e cos via.
La frase in questione la seguente
INQUIRE (i1ista)
dove
INQUIRE la parola chiave che identifica la frase;
ilista una lista di specificatori, separati da virgole, scelti fra i seguenti:
u
UNIT =u
FILE = nl
ACCESS = ace
FORM = fm
372
373
(( f ~
'SEQUENTIAL' o 'DIRECf' se il file connesso per un accesso sequenziale o
diretto, ma rester indefinita se non c' alcuna connessione. Analogamente, fm
assume il valore 'FORMATIED' o 'UNFORMATTED' a seconda del tipo di con-
nessione, ma resta indefinita se non c' connessione. Ancora, ~ assume come valore
la lunghezza dei records del file se questo connesso con un accesso diretto, al-
trimenti resta indefinita; bi assume il valore 'ZERO' o 'NULL' a seconda dei casi,
ma resta indefinita se non c' connessione o se il file costituito da records senza
formato.
RECL = ~
BLANK = bi
SEQUENTIAL = seq
DIRECf = dir
FORMATTED = fmt
UNFORMATTED = unf
EXIST = ~ l
OPENED = ~ 2
NAMED = ~ 3
NUMBER=num
NAME = n2
NEXTREC = nr
ERR =s
IOSTAT = v
Viceversa, gli specifica tori
SEQUENTIAL = seq, DIRECf = dir,
UNFORMATTED = unf
FORMATTED = fmt,
. Negli specificatori indicati tutti gli elementi alla destra del segno di uguaglian-
za devono essere nomi di variabile o nomi di elementi di variabile dimensionata
ad eccezione di u e di nl che possono anche essere un'espressione intera e un'e-
spressione carattere rispettivamente. In particolare, ace, fm, bi, seq, dir, fmt,
unf e n2 sono di tipo carattere; ~ l, ~ 2 e ~ 3 sono di tipo logico; ~ num, nr e v sono
di tipo intero e s un'etichetta di una frase eseguibile appartenente alla medesi-
ma unit di programma.
Con questa frase possiamo conoscere le caratteristiche di un file attraverso il
suo nome anche se non connesso ad alcuna unit, oppure quelle di un file con-
nesso ad una data unit.
1
Nel primo caso nella ilista deve essere presente lo specificatore FILE ed as-j
"li sente quello UNIT, nel secondo deve essere presente lo specificatore UNIT e non \'1}
quello FILE.
La presenza degli altri specificatori facoltativa; in generale, l'effetto dell'ese-
cuzione di una frase INQUIRE quello di assegnare dei valori alle entit variabili
negli specificatori. In alcuni casi, per, tale assegnazione pu non avvenire e la
corrispondente entit resta indefinita.
Per molti versi gli specificatori della INQUIRE sono simili a quelli della OPEN,
per con un effetto diverso.
Cos gli specificatori l(
ACCESS = ace, FORM = fm, RECL = ~ BLANK = bi
fanno s che ace, fm, ~ e bi diventino o meno definite: ace assumer il valore
'. . consentono di conoscere le corrispondenti caratteristiche di un file anche se
'\' questo non connesso. 11 '
In ogni caso seq, dir, fmt e unf vengono definite con i valori 'VES' 'NO' o
'UNKNOWN'. '
Cos seq assume il valore 'VES' se il file consente l'accesso sequenziale, 'NO' se
non lo consente e 'UNKNOWN' se da parte del sistema non possibile determi-
nare questa caratteristica. Per gli altri tre specificatori e relativi elementi dir, fmt
e unf valgono le stesse considerazioni fatte per lo specificatore SEQUENTIAL.
Con l'uso degli specifica tori
EXIST = ~ l OPENED = ~ 2 NAMED =B
~ l ~ 2 ~ 3 assumono un valore logico, .TRUE. o .FALSE.. a seconda del verifi-
carsi o meno della corrispondente condizione. Con EXIST viene effettuato il
controllo se il file specificato o l'unit specificata esiste. Con OPENED, ~ 2 risulta
vera se il file specificato connesso a qualche unit, o se l'unit specificata con-
nessa a qualche file, falsa altrimenti. Con lo specificatore NAMED, ~ 3 assume il
valore vero se il file connesso ha un nome, falso altrimenti.
Gli specificatori
NUMBER = num, NAME = n2
definiscono num e n2 rispettivamente con il numero dell'unit attualmente con-
~
\
l
i
. ~ .rs1tm--------- .....
374
nessa al file specificato e con il nome del file attualmente connesso all'unit spe-
cificata. Se non c' alcuna unit connessa al file num resta indefinita; altrettanto
n2 resta indefinita se il file connesso all'unit non ha un nome.
Riguardo ancora allo specificatore NAME c' da notare che se esso appare in
una frase INQUIRE in cui figura lo specificatore FILE, il valore assunto da
n2 pu non essere uguale a quello riportato nello specificatore FILE; ad esem-
pio il valore di n2 pu contenere anche una sigla di identificazione relativa all'u-
tente. Se poi nessun file connesso all'unit specificata n2 rimane indefinita.
375
Esempio 18.15. Si considerino le seguenti frasi
LOGICAL LOG
INQUIRE (FILE ='V A.L.DAT', OPENED =LOG, NUMBER =NUM)
IF (LOG) THEN
C IL FILE VAL.DAT E' GIA' CONNESSO ALL'UNITA' NUM
WRITE (NUM) A, B, C
ElSE
IL FILE VAL.DAT NON E' CONNESSO AD ALCUNA UNITA',
ESSO VIENE ALLORA ASSOCIATO ALL'UNITA' 3
OPEN (3, FILE ='VAL.DAT') r t r ( (C /1 l Cfltlr 1( e
Lo specificatore
NEXTREC = or
causa la definizione di or con il valore m + l dove m il numero d'ordine dell'ul-
timo record trasmesso da o verso il file se questo ad accesso diretto; se nessun
record stato trasmesso allora nr assume il valore 1. Se invece il file non ad
accesso diretto o se avvenuto un errore durante la trasmissione tale da rendere
indefinita la posizione richiesta, or resta indefinita.
C
C
WRITE (3) A, B, C
ENDIF
:::, ( y , \ l" \4 ( (I ( A
I C (, 1(1 f C
Lo specificatore
IOSTAT = v
definisce v con il valore zero se non esiste alcuna condizione d'errore relativa al
file o all'unit specificata nella INQUIRE, oppure con un numero positivo, dipen-
dente dal sistema, se, al contrario, esiste una condizione d'errore.
Lo specificatore
ERR=s
ha il medesimo significato illustrato nel 18.4.
Una variabile o elemento di variabile dimensionata che figura in uno degli spe-
cificatori della frase INQUIRE non pu essere presente in nessun altro specifica-
tore della medesima frase INQUIRE; tale divieto si estende anche a tutte le entit
che in qualche modo sono associate, ad esempio tramite la frase EQUIVALENCE,
a quella variabile o elemento di variabile dimensionata.
Notiamo infine che la frase INQUIRE non esiste in F66.
Con la frase INQUIRE siamo in grado di sapere se il file VAL.DAT connesso
o meno e in caso affermativo a quale unit. Se il file gi connesso LOG assume
il valore vero e NUM il valore intero che identifica l'unit a cui il file connesso.
Con la struttura IF successiva, in base al valore assunto da LOG si possono com-
piere operazioni di 110 sull'unit NUM se LOG vera oppure in caso contrario il
file VAL.DAT viene connesso all'unit 3 tramite la quale si compiono ancora
operazioni di 110 sul file.
18.8. Files interni
Un file interno pu essere considerato come una zona di memoria di transito,
utile per dei trasferimenti, con eventuali conversioni, di dati da una parte all'altra
della memoria entrambe interne.
Un file interno una delle seguenti entit di tipo carattere: una variabile, un
elemento di variabile dimensionata, una sottostringa o una variabile dimensionata.
Se un tale file una variabile o elemento di variabile dimensionata o una sotto-
stringa allora costituito da un solo record, mentre se una variabile dimensio-
nata esso costituito da tanti records Quanti sono gli elementi della variabile.
Qualunque operazione di I/O su di un file interno inizia sempre dal primo record
del file.
II riferimento al file avviene direttamente nella frase di 110usando il suo nome
come identificatore della unit di I/O. Tali operazioni devono essere di tipo
376
sequenziaie sotto il controllo esplicito di formato.
Una entit usata come file interno pu essere definita oltre che con una
operazione di scrittura, anche, ad esempio, tramite una operazione di lettura da
un'altra unit, o con operazioni di assegnazione di tipo carattere.
Se durante un'operazione di scnttura su di un file interno viene prodotto un
record di lunghezza inferiore a quella specificata per il file il record prodotto viene
allungato con l'aggiunta alla sua destra di caratteri blank.
Tale tipo di file non esisteva in F66, n quindi le corrispondenti operazioni
di I/O.
Esempio 18.16. Un file di nome ACCDIR ad accesso diretto contiene 25 records
con formato. Ciascun record costituito da 4 campi contenenti dei numeri scritti
secondo il descrittore EI5.7, seguiti da un ultimo campo costituito da un valore
logico rappresentato secondo il descrittore LI. In totale quindi la lunghezza,
in caratteri, di ciascun record 61.
Siano N, O:s;;; N:S;;; 25, i records contenenti il valore vero nell'ultimo campo. Vo-
gliamo definire le prime N righe di una matrice reale, RMAT, in modo tale che es-
se siano nell'ordine i 4 valori reali dei records che contengono nell'ultimo campo
il valore vero.
Possiamo far uso della variabile carattere TRANS di lunghezza 60 come file
interno in cui leggere i records di ACCDIR ed usarla poi come unit di ingresso
per definire, se il caso, la riga opportuna di RMAT. Il seguente programma rea-
lizza quanto sopra richiesto.
PROGRAM FIUNT
LOGICAL L61
CHARACTER * 60 TRANS
REAL RMAT (25, 4)
C IL FILE 'ACCDlR' E' ASSOCIATO ALL'UNITA' 3
C LE CARATTERISTICHE DI QUESTO FILE SONO DATE NELLA OPEN
OPEN (UNIT = 3, FILE = 'ACCDIR', FORM = 'FORMATTED', RECL =
*61, ACCESS ='DIRECT',STATUS = 'OLD')
IR = l
DO 20 I = 1,25
READ (2, 3, REC =I) TRANS, L61
IF (L6l) THEN
READ (TRANS, FMT =4) (RMAT (IR, J), J = 1,4)
IR = IR + l
ENDIF
20 CONTINUE
IF (IR.EQ.l) THEN
PRINT *, 'NESSUN RECORD DI ACCDlR CONTIENE IL',
*'vALORE VERO, RMAT NON Eli STATA DEFINITA'
zd
377
ELSE
PRINT *, 'SONO STATE DEFINITE LE PRIME', IR - l,
*'RIGHE DI RMAT, NEL MODO SEGUENTE:'
WRITE (*, 5) RMAT (I, J), J = 1,4), I = l, IR - l)
END IF
STOP
3 FORMAT (A60, Ll)
4 FORMAT (4E15.7)
5 FORMAT (4 (IX, EI5.7
END
Esempio 18.17. Vogliamo scrivere, usando un file interno, le opportune frasi
di l/O che permettano di arrotondare il valore di ciascuna componente Vi' l :s;;; i :s;;;
100, di un vettore reale v precedentemente definito, a due cifre decimali, sup-
ponendo che - 1000 :s;;; v; :s;;; 10000 per ogni i.
CHARACTER * 8 ARROT2 (IOO)
DIMENSION VET (100)
c USO DEL VETTORE ARROTI COME FILE INTERNO, SUL
C QUALE VENGONO SCRITTI GLI ELEMENTI DI VET
C CIASCUNO SECONDO IL DESCRITTORE F8.2
WRITE (ARROTI, '(F8.2)') VET
C I VALORI ARROTONDATI GIA' SCRITTI IN ARROT2
C VENGONO RILETTI IN VET
READ (ARROn, '(F8.2)') VET
C USO DI VET
Il file interno ARROT2 (100) viene definito, scrivendoci i valori di VET
tramite F8.2 che opera il voluto arrotondamento. Tali valori arrotondati vengono
poi riletti dal file ARROT2 per ridefinire VET. In entrambe le operazioni di
scrittura e lettura vengono scritti e letti esattamente 100 records sul e dal file
ARROT2.
Esercizi.
18.1 Scrivere le opportune frasi OPEN e WRITE per stampare dei dati su un file
chiamato LPT di tipo sequenziale costituito da records con formato.
18.2 Scrivere le frasi OPEN e READ per definire la matrice A di lO righe e IO
colonne, leggendo i valori dei suoi elementi da un file di nome FIL.DAT
composto di records senza formato, di lunghezza 80 bytes (un valore
rappresentato da 4 bytes), ad accesso diretto.
II
!
f

l
'I
i
378
18.3 Come l'esercizio 2, supponendo per il file ad accesso sequenziale.
18.4 Scrivere le frasi OPEN e READ per leggere i valori degli elementi di un
vettore VET di lunghezza 100 da un file chiamato PERIF, ad accesso di-
retto con records con formato di lunghezza 20 caratteri. Ciascun record
contiene 4 campi scritti secondo il descrittore FS.I. Il numero dei records
di PERIF pu essere inferiore a 100, comunque l'ultimo record il record
endfile che, se letto, provoca un salto ad una frase WRITE che scrive il
numero dei records letti.
18.5 In una classe composta da n 50) studenti vengono fatte mensilmente
delle prove scritte, una per materia, relative a 3 materie indicate con MAT l,
MAT2 e MAT3. Scrivere:
a) un programma che aggiorni ogni mese, riportando i voti per ciascun
alunno, un file chiamato PROSCR, tenendo conto che il numero totale
dei mesi 9. Gli alunni sono venti;
b) un programma che al termine delle prove fornisca le medie per alunno
relative a ciascuna materia.
c) un programma che fornisca l'elenco degli studenti che hanno conseguito
per ciascuna materia un voto medio maggiore o uguale a 6.
Esaminare le varie possibilit esistenti circa la strutturazione del file
PROSCR: sequenziale con e senza formato, ad accesso diretto con e senza
formato.
18.6 Trovare tutte le caratteristiche di un dato elenco di files.
18.7 Scrivere un sottoprogramma FUNCTION che realizzi l'arrotondamento di
un assegnato numero reale r ad un dato numero n di cifre significative. Ci
si deve servire di un file interno nella forma di variabile di tipo carattere di
lunghezza 20. Si ottiene il voluto arrotondamento scrivendo il dato con il
descrittore Ew.n, con w opportuno.
4
APPENDICI
c
Al. Differenze con il subset language
I( subset language presenta, rispetto al fulllanguage F77, le seguenti limitazioni
(cfr. [12]):
I caratteri $ e : non fanno parte dell'alfabeto;
Non sono ammesse pi di 9 linee di continuazione;
Le frasi DATA devono seguire tutte le frasi di specificazione e precedere le
funzioni definite da una frase e le istruzioni eseguibili;
Non sono permesse linee di commento tra le linee che costituiscono una istru-
zione;
Non sono previsti dati di tipo doppia precisione e complesso;
Una variabile dimensionata non pu avere pi di tre dimensioni;
Un dichiaratore di dimensione pu avere soltanto la forma SUPj;
Un dichiaratore di dimensione deve essere o una costante o una variabile
intera;
Un'espressione indice pu contenere soltanto costanti e variabili intere;
Non sono previsti gli operatori logici .EQV. ed .NEQV.;
Non sono previste le istruzioni: PRINT, CLOSE, INQUIRE, ENTRY,
BLOCK DATA, PARAMETER, DOUBLE PRECISION e COMPLEX;
Soltanto nomi di blocchi COMMON possono far parte della lista di una istru-
zione SAVE;
L'istruzione SAVE deve contenere sempre una lista;
Una lista con DO-implicito non pu far parte di una istruzione DATA;
Non sono permesse conversioni di tipo nelle frasi DATA;
La variabile del DO deve essere una variabile intera;
I parametri del DO devono essere costanti intere oppure variabili intere;
Nell'istruzione GOTO-calcolato l'espressione deve essere una variabile intera;
Non sono previste istruzioni di I/O guidate dalla lista;
Un identificatore di un file interno deve essere una variabile carattere o un ele-
mento di variabile dimensionata carattere;
I
"
382
II numero di unit associato ad un file esterno non deve essere un'espressione;
Un identificatore di formato deve essere l'etichetta di una frase FORMAT
oppure una costante carattere;
Nelle istruzioni di 110 gli specificatori di unit edi formato non includono le
parole chiave UNIT = e FMT = :
Non sono previsti files ad accesso diretto con formato;
Nelle istruzioni di 110 non previsto lo specificatore ERR =:
Non sono previste le istruzioni di 110 della forma .READ f, lista-di-ingresso e
PRINT f,lista-di-uscita;
Nelle liste di IlO i parametri del DO-implicito devono essere costanti o variabili
intere. La variabile del DO-implicito deve essere di tipo intero;
Le costanti, le espressioni ed i nomi di sottostringhe non possono comparire
nella lista di uscita;
L'istruzione OPEN usata soltanto per specificare l'unit su cui effettuare
operazioni di 110 ad accesso diretto senza formato;
Non consentito l'uso di files esterni;
Non sono previsti i seguenti descrittori ripetibili: Iw.m, Dw.d, Gw.d, Gw.dEc;
Non sono previsti i seguenti descrittori non ripetibili: Tn, TLn, TRn, S, SP,
SS,: ;
In una specificazione di formato sono ammesse al pi tre coppie di parentesi
una dentro l'altra;
Non sono previsti ritorni alternativi;
Non esistono funzioni intrinseche che prevedono argomenti o risultati di tipo
doppia precisione o complesso;
Non sono previsti nomi generici per le funzioni intrinseche;
Non sono previste FUNCTION di tipo carattere;
La specificazione della lunghezza di una entit di tipo carattere deve essere
fatta con una costante intera. Non previsto lo specificatore (*);
Non sono previste sottostringhe di caratteri;
Non prevista l'operazione di concatenazione;
Non sono previste le funzioni intrinseche LEN, CHAR, INDEX;
L'associazione di entit carattere effettuata per mezzo di istruzioni COMMON
ed EQUI VALENCE o attraverso gli argomenti di un sottoprogramma deve avveni-
re tra entit della stessa lunghezza.
Le istruzioni che compongono ciascuna unit di programma devono seguire
l'ordinamento indicato nella seguente figura nella quale le linee orizzontali divi-
dono gruppi di istruzioni che non possono .essere mescolate tra loro mentre quelle
verticali delimitano istruzioni che possono essere presenti contemporaneamente
in qualsiasi ordine.
383
Istruzione iniziale: PROGRAM, FUNCTION, SUBROtITlNE
Istruzioni IMPLICIT
Altre istruzioni di specificazione
linee di commento Istruzioni FORMAT Istruzioni DATA
Funzioni definite da una frase
Istruzioni eseguibili
Istruzione END
Ordinamento delle i<ltruzionidel Subset Language in una unit di programma.
AZ. Principali differenze
fra il FORTRAN 77 e il FORTRAN 66
Caratteri dell'alfabeto
In F66 non esistono il carattere apice e il carattere due punti.
385
Espressioni aritmetiche
In F66 le uniche espressioni miste consentite sono quelle tra operandi di tipo
reale e doppia precisione e tra operandi di tipo reale e complesso.
Espressioni logiche
In F66 non esistono gli operatori .EQV. e .NEQV.
Espressioni carattere
In F66 non sono previste espressioni di questo tipo.
Assegnazione aritmetica
Nella frase di assegnazione v = e in F66 sono proibite le seguenti combinazioni
fra il tipo v ed il tipo di e:
v,k,vk,s*vk
Variabili dimensionate
Ricordiamo alcune caratteristiche delle variabili dimensionate in F66.
Il massimo numero consentito di dimensioni tre.
Nel dichiaratore di variabile dimensionata prevista, per ogni dimensione, la
dichiarazione della sola limitazione superiore, in quanto la limitazione inferiore
uguale ad l.
Non previsto l'uso del dimensionamento indefinito.
L'unica forma consentita di un dichiaratore di dimensione variabile il nome
di una variabile intera, che deve far parte degli argomenti muti o di un blocco
COMMON nella stessa unit di programma.
Ciascuna espressione indice nel nome di un elemento di variabile dimensionata
deve avere una delle forme seguenti:
Linee di commento
In F66 una linea di commento caratterizzata dalla presenza del carattere
C in colonna l. In F77 possibile usare il carattere * e il carattere C.
Linee di continuazione
In F66 sono consentite linee di continuazione che contengono qualsiasi carat-
tere nelle colonne dalla prima alla quinta, eccettuato il carattere C sulla prima
colonna. In F77 le colonne dalla prima alla quinta di una linea di continuazione
devono contenere dei caratteri blank.
Nome del programma principale
In F66 non prevista la possibilit di dare un nome al programma principale;
non esiste infatti l'istruzione PROGRAM.
Dati di tipo carattere
In F66 non esiste il tipo carattere ma esistono le costanti di tipo Hollerith
ovvero costanti del tipo nH Cl c
2
... c
n
dove ogni Ci rappresenta un carattere.
Dichiarazione implicita di tipo
In F66 non esiste l'istruzione IMPLICIT.
tipo di v
complesso
complesso
complesso
intero
reale
doppia precisione
tipo di e
intera (consentita in F77)
reale (consentita in F77)
doppia precisione (proibita anche in F77)
complessa (consentita in F77)
complessa (consentita in F77)
complessa (proibita anche in F77)

l''
Il
\
Nome simbolico di costante
In F66 non esiste l'istruzione PARAMETER e quindi non esiste la possibilit
di dare nomi simbolici alle costanti.
dove v una variabile intera e k ed s sono costanti intere.
Il valore di un indice nel nome di un elemento di variabile dimensionata pu
superare la corrispondente limitazione superiore, purch la posizione di quel-
l'elemento in memoria non superi l'ampiezza totale della variabile dimensionata
stessa.
386
E' consentito usare in una frase EQUIVALENCE il nome di una variabile di-
mensionata seguito da un solo indice, anche se le sue dimensioni sono pi di una.
Istruzioni di controllo
In F66 non esiste il costrutto IF-THEN-ELSE.
La sola forma consentita per l'istruzione GOTO-calcolato la seguente
GOTO (e
l
, ..., et), v
dove ciascuna e
i
un'etichetta e v una variabile di tipo intero. Inoltre, a diffe-
renza di quanto previsto in F77, se il valore di v non compreso fra l e k non
stabilito quale istruzione debba essere eseguita dopo l'istruzione GOTO-cal-
colato.
L'istruzione DO in F66 ha la forma seguente:
DO n v =mI' m
2
, m
3
dove: n l'etichetta del1a frase terminale; v, la variabile del DO, di tipo
intero; mI' m
2
e m
3
sono il parametro iniziale, finale e d'incremento e possono
essere nella forma di costante o variabile di tipo intero. Il parametro m
3
, come
in F77, pu essere omesso ed il suo valore in questo caso assunto essere 1.
Devono inoltre valere le seguenti condizioni: mi' m
2
, m
3
> O e mi m
2
. Al
termine de11'esecuzione del ciclo-DO la variabile di controll indefinita. Si os-
servi che in F66 permesso l'uso del rango esteso, proibito invece in F77.
Istruzioni di l/O
In F66 non esistono le seguenti possibilit ed istruzioni:
- Le istruzioni guidate dal1a lista;
- Il controllo del1e condizioni di errore e fine file;
- Le istruzioni OPEN, CLOSE e INQUIRE;
- I descrittori Iw.m, Ew.dEc, Gw.dEc, BN, BZ, S, SP, SS, :, Tn, TLn, TRn,
'hl' .. h
n
' ;
- Le operazioni di l/O ad accesso diretto.
L'unica forma consentita in F66 per le frasi di l/O con formato la seguente:
READ (u, f) lista
WRITE (u, f) lista
dove: u una costante o variabile di tipo intero che identifica l'unit di l/O (solo
come file esterno); f l'etichetta di una frase FORMAT o il nome di una variabile
dimensionata definita in modo tale da contenere dei caratteri costituenti una spe-
cificazione di formato; la lista costituita da eventuali liste con DO-implicito e
nomi di variabile, nomi di elementi di variabile dimensionata e nomi di variabile
dimensionata. In ogni caso la lista non deve contenere espressioni. Nel1e liste con
387
DO-implicito la specificazione v = mI' m
2
, m
3
prevede che: v sia una variabile
di tipo intero; mI' m
2
, m
3
siano variabili o costanti di tipo intero con le limita-
zioni gi viste per l'istruzione DO.
In una operazione di ingresso la definizione degli elementi della lista avviene
solo al completamento dell'esecuzione dell'intera operazione di lettura.
Nelle operazioni di l/O con formato possibile trasmettere sequenze di carat-
teri tramite il descrittore Aw. Tali sequenze possono essere associate ad elementi
della lista di l/O di tipo qualsiasi; la lunghezza massima di ogni sequenza legata
al tipo dell'elemento ad essa associato nella lista di l/O.
In F66 possibile usare il descrittore n HC
I
... c
n
in specificazioni di formato
associate ad istruzioni di ingresso.
In F66 il descrittore Dw.d deve essere associato a dati di tipo doppia precisione
ed i descrittori Fw.d, Ew.d, GW.d a dati di tipo reale.
Sottoprogrammi
In F66 non sono previsti ritorni alternativi dai sottoprogrammi.
In F66 non sono previsti nomi generici, ma solo specifici, per le funzioni in-
trinseche. Le seguenti funzioni intrinseche non esistono in F66: tutte le funzioni
che trattano dati di tipo carattere e DINT, ANINT, DNINT, NINT, IDNINT,
DDIM, DPROD, TAN, DTAN, ASIN, DASIN, ACOS, DACOS, SINH, DSINH,
COSH, DCOSH e DTANH. Non esiste, in F66, l'equivalente della funzione INT
applicata ad un argomento di tipo intero o complesso; analogamente non esiste
l'equivalente della REAL applicata ad un argomento di tipo reale; la funzione
CMPLX si applica solo ad una coppia di argomenti reali e la funzione DBLE si ap-
plica solo ad un argomento reale. In F66 le funzioni AMOD, MOD, SIGN, ISIGN
e DSIGN non sono definite quando il valore del secondo argomento zero.
Le seguenti funzioni intrinseche in F66 non possono essere argomento attuale
corrispondente ad un argomento muto di tipo sottoprogramma: ABS, IABS,
DABS, AINT, INT, IDINT, AMOD, MOD, AMAXO, AMAXl, MAXO, MAXl,
DMAXl, AMINO, AMINl, MINO, MINI, DMINl, FLOAT, IFIX, SIGN, ISIGN,
DSIGN, DIM, 101M, SNGL, REAL, AIMAG. DBLE, CMPLX e CONJG.
Le funzioni intrinseche usate come argomento attuale in corrispondenza
ad un argomento muto di tipo sottoprogramma devono figurare in una frase
EXTERNAL; la frase INTRINSIC infatti, non esiste in F66. La frase EXTERNAL,
in F66, ha il solo scopo di dichiarare i nomi dei sottoprogrammi che figurano co-
me argomenti attuali corrispondenti ad argomenti muti di tipo sottoprogramma.
In F66 non esistono le istruzioni SAVE ed ENTRY.
Istruzione DATA
In F66, nel1a forma nlista/vlista/ che figura in una frase DATA, nlista pu
388
essere costituita solo da nomi di variabile e nomi di elementi di variabile dimensio-
nata con indici nella forma di costanti intere.
Sottoprogrammi BLOCK DATA
L'unica forma consentita, in F66, della prima istruzione di un sottoprogramma
BLOCK DATA quella senza nome.
A3. Ordinamento delle istruzioni F77
Le istruzioni F77 possono essere raggruppate in:
l. Istruzioni iniziali: PROGRAM
FUNcnON
SUBROUTINE
BLOCK DATA
2. Istruzioni di specificazione: IMPUCIT
PARAMETER
INTEGER
REAL
OOUBLEPRECISION
COMPLEX
LOGICAL
CHARACTER
DIMENSION
EQUIVALENCE
COMMON
EXTERNAL
INTRINSIC
SAVE
3. Istruzione DATA
4. Funzioni definite da una frase
5. Istruzioni eseguibili: Assegnazione aritmetica, logica, carattere
Controllo: IF(c) THEN
ELSE IF
ELSE
ENDIF
IF-logico
If'-aritmetico
GOTO- incondizionato
GOTO calcolato
GOTO- assegnato (*)
DO
CONTINUE
STOP
PAUSE(*)
END
Istruzione: CALL
Istruzione: ASSIGN (*)
(*) Questa istruzione non stata trattata nel testo in quanto di scarsa utilit.
390 391
Ingresso/uscita: READ
WRITE
PRINT
OPEN
CLOSE
INQUIRE
BACKSPACE
ENDFILE
REWIND
6. Istruzione ENTRY
7. Istruzione FORMAT
8. Linee di commento
La prima frase di ogni unit di programma deve essere una istruzione iniziale.
L'istruzione PROGRAM pu essere soltanto la frase iniziale del programma prin-
cipale.
L'ultima frase di ogni unit di programma deve essere un'istruzione END.
In un programma principale o in un sottoprogramma di tipo FUNCfION o
SUBROUTINE le istruzioni devono rispettare iI seguente ordinamento:
Tutte le istruzioni di specificazione devono precedere tutte le frasi DATA, le
funzioni definite da una frase e le istruzioni eseguibili;
tutte le funzioni definite da una frase devono precedere tutte le istruzioni ese-
guibili;
le frasi DATA possono comparire in qualsiasi punto dopo le istruzioni di spe-
cificazione;
le istruzioni ENTRY possono comparire in qualsiasi punto che non sia dentro
al rango di un DO o tra un'istruzione IF(c) THEN e la corrispondente istruzione
END IF;
le istruzioni FORMAT e le linee di commento possono comparire in qualsiasi
punto.
Per le frasi di specificazione inoltre fissato il seguente ordinamento:
le istruzioni IMPLICIT devono precedere tutte le altre istruzioni di specifica-
zione;
ogni istruzione di specificazione che indica il tipo di un nome simbolico di co-
stante deve precedere la frase PARAMETER che definisce quel particolare nome
simbolico di costante;
la frase PARAMETER deve precedere tutte le altre istruzioni che contengono
i nomi simbolici di costanti da essa definiti.
Queste regole sono riassunte nella figura seguente nella quale le linee orizzontali
dividono gruppi di istruzioni che non possono essere mescolate mentre quelle
verticali delimitano istruzioni che possono essere presenti contemporaneamente
in qualsiasi ordine.
Istruzione iniziale: PROGRAM, FUNCTION, SUBROUTINE,
BLOCK DATA
Istruzioni IMPLICIT
Istruzioni
PARAMETER
Istruzioni Altre istruzioni di specificazione
Linee di FORMAT
commento ed
Istruzioni
Funzioni definite da una frase
ENTRY
DATA
Istruzioni eseguibili
Istruzione END
Ordinamento delle istruzioni F77 in una unit di programma.
393
A4. La codifica dei caratteri
64 blank
123 rI' 161 214 o
~ 7
124 @ 162

215 p
in ASCII e in EBCDIC
75 .
125
163 t
216 Q
76
126
-
164 u
217 R
77 (
127
..
165
21HZ4
y
78 + 128 166 w
225
79
I 129

167 )(
226 S
80 & 130 b 168 v
227 T
81-89 131 c 169 z
228 U
90 ! 132 d 170-191
229 V
91 I 133 e
192 230 W
92
*
134 f 193 A 231 X
93
135 g 194 B 232
y
94
136 h 195 C
233 Z
Codice ASCII
95 137 1 196 O
231r-Z39
96 - 13&-144 197 E
240 O
Il codice ASCII definisce 128 caratteri utilizzando per ciascuno 7 bits. I carat- 97 I 145 j 198 F
241 1
teri riproducibili in stampa sono i seguenti:
9&-106 146 k 199 G
242 2
107 , 147 l 200 H
243 3
108 l 148 Il 201 I
244
"
109 149 n 202-208
245 5
32 blank 56 8 80 P 104 h 110 150
209 J
246 6
> o
247 7
33 ! 57 9 81
Q 105 111 ? 151 p 210 K
248 8
34
..
58 82 R 106 j
112-120 152
211 L
249 9 q
35
"
59 83 S 107 k 121 153 r
212 ..
36 S
60 < 84 T 108 l 122 154--160
213 N
37 X 61 . 85 U 109 Il
38 & 62 > 86 V 110 n
Il
39 63 ? 87 W 111 o
Nelle tabelle riportate i numeri decimali che accompagnano ciascun carattere
40 64 @
88 X
112 p sono i corrispondenti numeri d'ordine.
41 65 A 89
y
113 q
42
*
66 B
90 Z
114 r
43 + 67 C 91 [
115 s
44 , 68 D 92 \
116 t
45 - 69 E 93 J
117 u
46 70 F 94
118 v
47 I 71 G 95
119 w
48 O 72 H
96
120 x
49 1 73 I 97 a
121 y
50 2 74 J
98 b
122 z
51 3 75 K
99 c
123 {
52 4 76 L
100 d
124
I
53 5 77 .. 101 e
125
l
54 6 78 N
102 f
126
55 7 79 O
103
9
Codice EBCOIC
Il codice EBCOIC utilizza 8 bits per la codifica di ciascun carattere; esso com-
prende tutti i caratteri del codice ASCII ordinati per in modo diverso.

Bibliografia
(1] DAHLO.J., HOAREC.A.R., DIJKSTRA E.W. (1972): Structured Programming, Academic
Press, New York.
[2] CHURCH A. (l956):Introduetion to mathematicallogic I, Princeton UnivoPresso
[3] ANDRONICO A. ed altri (1973): Scienza degli elaboratori, Zanichelli, Bologna.
[4] WINSTON D., HORNB.K.P. (198 I): L/SP, Addison Wesley.
[5] NAURP. (1963): Revised report on the Algorithmic LanguageAIgol60, Comm. ACM voI.
6, n. 1.
[6] LECARME O., NEBUT J.L. (1985): Pascal - Guida per programmatori, McGraw-Hill.
(7] Mc CARTHY J. (1963): A basis for a mathematical theory of computation, Proc. IFIP
Congress 1962, North-Holland Pub. Co., Amsterdam.
[8] HERMES H. (1955): Entscheidungsprobleme in Mathematik und Logik, Ausarbeitung
einer Vorlesung, Aschendorft, Mtinster i.w.
[9] FONTANELLA F., PASQUALI A. (1979): Calcolo numerico. Metodi ed algoritmi, Pitagora
Ed., Bologna.
(10] FORSYTHE G.E., MALCOLM M.A., MOLER C.B. (1977): Computer methods for Mathe-
matical Computations, Prentice-Hall, Englewood Cliffs.
[II] FORSYTHE G.E., MOLER C.B. (1967): Computer Solution of Linear Algebraic Systems,
Prentce-Hall, Englewood Cliffs.
(12] ANSI X3.91978 - American National Standards Inst. NewYork.
[13] ANSI X3.9-1966 - American National Standards Inst. New York.
[14] GoLUB G.H., VAN LoAN C.F. (1983): Matrix computations, John Hopkins UnivoPresso
[15] MEYER B., BAUDOIN C. (1978): Mthodes de programmation, Eyrolles.
Indice analitico
I numeri in neretto si riferiscono alle Appendici.
A, 195, 204,209
ACCESS =. 360, 362, 369, 371
Accesso, vedi: file
Accumulatore, 23
Albero delle chiamate, 240,347
Alfabeto, 48, 185
Algoritmo, 3, 239, 245, 252
Allungamento, 181, 185
vedi: blocco COMMON
Ampiezza
argomento, 279, 288
campo, 194,204
dimensione, 153, 288
variabile dimensionata, 153, 160
.AND.,78
Annidamento
ciclo-DO, 145
DO-implicito, 221
struttura decisionale, 105
Apice, 48, 92, 174, 196, 205, 2I 7, 384
Apostrofo, 174
Argomento, 73,187,189,312
vedi: ampiezza, lista, lunghezza, ordine
asterisco, 245, 298
288,293,298,307,333,336,340
carattere, 289
costante, 276
di ingresso, 243, 250
di uscita, 243, 250, 276
espressione, 74, 276
muto, 243,245, 249, 253, 256, 259, 275, 288,307,316,322, 331,341,384
funzione intrinseca, 298, 387
sottoprogramma, 245, 249, 253, 256, 292,387
variabile, 245, 249, 253, 256
variabile dimensionata, 245, 249, 253, 256, 277
Aritmetica
vedi: assegnazione, espressione
if'
l-
I
; I
398
finita, 41
intera, 68, 138, 268
reale, 68, 138
Arrotondamento, 39, 201, 263, 265
vedi: esempi
ASCII, 173,185,268,392
Assegnazione, 3, 83, 90,157,180,184,260,291,323,372
aritmetica, 83, 322, 385, 389
carattere, 180,204,322,389
logica, 83, 86, 389
mista, 85
simbolo, IO, 83
Assemblatore, 26
ASSIGN,389
Associazione, 243, 250, 260,276,292,307,31 I
Asterisco, 48,50,61,197,205,228,382
vedi: DATA, dimensionamento indefinito, identificatore di formato, lunghezza indefinita,
PRINT*, READ*, ritorno alternativo
Attivazione
ciclo-DO, 128, 140
sottoprograrnma, 241, 249, 257, 275, 289, 307, 336, 339, 347
Aw, 195,203.209,387
BACKSPACE, 355,366, 390
Base di numerazione, 33, 37
Bit, 22, 173
Blank,48, 174, 376,384
vedi: A, Aw, BLANK =, BN, BZ, Gw.d, nX, READ *,spaziatura, Tn
BLANK = ,360, 363, 372
Blocco COMMON, 280, 288, 307,309,312,319,341,381,384
vedi: COMMON, lunghezza
allungamento, 319
etichettato, 307, 310, 322, 325, 347
indefinito, 347
nome,307,310,348,381
non etichettato, 308, 311, 322, 347
Blocco ELSE, 103,116
Blocco THEN, 103
BLOCKDATA, 243, 293, 322, 325, 381,387,389
BN, 196,231,363,386
Byte, 22, 35, 354
BZ,196,231,363,386
CALL, 249, 335, 389
Campo, 194,209,228,233,358,363
vedi: ampiezza
Carattere
vedi: A, Aw, argomento, assegnazione, CHARACTER, costante, espressione, funzione
399
esterna, ingresso/uscita, lunghezza, ordine, unit di memoria, variabile
codificabile, 173, 185, 189, 392
iniziale e finale. vedi: esempi
speciale, 48
tipo, 173,308,337,382,384
Caratteristica, 37, 40,201,228
Caricamento. 24
Cella. vedi: locazione
CHAR, 189,268,382
CHARACTER, 57, 174,253,337,389
Chiamata, 240, 275
ricorsiva, 14,277
Ciclo, 125
vedi: annidamento, DO, UNTIL, WHILE
finito, 127, 131
iterativo, 12, 128, 131, vedi: esempi
CLOSE,364,38],386,390
Codice operativo, 23
Colonna, 50, 384
Commento, 50,38],384,390
COMMON 307, 316, 319, 325, 332,382,389
Compilatore, 26, 57,153,162,277,312
Compilazione, 26, 244, 275, 321,325
Complemento a due, 36
Complesso
vedi: assegnazione mista, COMPLEX, costante, descrittore, espressione mista, ingresso/uscita,
operazione
COMPLEX, 57, 253,38],389
Concatenazione, I Il,179,208,291,382
10,359,361,364,373
Contatore
vedi: DO, ripetizione
Continuazione, 5I , 38] , 384
CONTINUE, 119, 129,136,146,389
Controllo
vedi: istruzione, lista, spaziatura, trasferimento del controllo, unit
Conversione, 33, 37, 71, 75, 197,317, 322,358
vedi: funzione intrinseca
Corpo
vedi: ciclo iteratvo, sottoprogramma

vedi: argomento, dimensionamento, espressione, PARAMETER
carattere, 56,92, 174, 205, 216, 289, 382
complessa, 55, 202
doppia precisione, 55, 199
intera, 53, 153,156,174,198,230,233
logica, 56
nome, 54,96, 153, 174, 176, 258,321,384,390
reale, 54, 199
400
D,55,201
DATA, 321, 323, 325,381,387,389
'DELETE', 365
Descrittore non ripetibile, 195,202,210,215,218,231,382
di tabulazione, 230
Descrittore ripetibile, 195,209,212,228,233,358,382
carattere, vedi: A, Aw
complesso, 202
intero, vedi: Iw, IW.m
logico, vedi: Lw
reale, 199,202,209,228, vedi: Dw.d, Ew.d, Ew.dEc, Fw.d, Gw.d, GW.dEc
Diagnostico, 26, 28
Diagramma, 9, 12
Dichiarativa
vedi: istruzione
Dichiaratore
dimensione, 153, 160, 280, 288, 381
dimensione indefinita, 288
dimensione variabile, 280, 288, 385
variabile dimensionata, 153, 160, 308, 332, 385
DlMENSION, 155,389
Dimensionamento
costante, 153, 308
indefinito, 288, 385
variabile, 280, 285, 288, 313,332
Dimensione, 156, 167,278
vedi: ampiezza, dichiaratore
'maser', 362, 368, 373
DlRECT =, 372
~ ~ 22,351,360,368
dnr, 195, vedi: descrittore non ripetibile
DO, 128, 132, 141,333,381,386,389
vedi: annidamento, DO-implicito
ciclo, 133, 138, 145
contatore, 127, 133, 135, 220
frase terminale, 132, 136,145,147,333
parametro, 133,381,382
rango, 133, 135, 137, 141, 145,220,390
variabile, 133, 136, 143,145,381
DO-implicito, 219, 321, 323, 381,382,386
Dollaro, 48
Doppia precisione
vedi: assegnazione mista, costante, descrittore ripetibile, DOUBLE PRECISI0N, espressione
mista, ingresso/uscita, precisione
DOS, 31, 369
DOUBLEPRECISION, 57, 253,381,389
dr, 195, vedi: descrittore ripetibile
Due punti, 48, 231, 381, 384, 386
vedi: dichiaratore di variabile dimensionata, sottostringa
Dw.d, 195, 199,201,209,233,382,386
E,54, 201,228
EBCOIC, 173,392
Elemento di variabile dimensionata, 151,160,178,279,289,355,375,385
nome, 156,277,292,316,321,357,364
posizione, 160
Elevamento a potenza, 67
ELSE, 102, 105, 112, 114, 136, 142,389
vedi: blocco ELSE
ELSEIF,112,114,136,141,389
END,93,136,206,244,321,325,389
ENDFILE, 354, 390
END IF, 102, 105, 112, 114, 136, 142,333,389,390
END=,355,357,386
ENTRY, 331, 336, 338,341,381,387,390
.EQ., 76,185
Equazione di 2 grado, vedi: esempi
EQUIVALENCE, 316, 325, 374,382,386,389
.EQV., 78, 381,384
Errore
arrotondamento, 40, 169,248
assoluto, 40
condizione di, vedi: ERR =
programmazione, 28,58, 131, 275
relativo, 40
ERR =, 354, 357, 360, 363,365,372,374,382,386
Esecuzione, 83, 101,208,210,212,223,245,257,260,275,298,307,331,339
vedi: programma
Esempi
arrotondamento, 377
carattere iniziale e finale, 289
ciclo iterativo, 12, 129
equazione di 2 grado, 107,247,252
fattoriale, 17,254,257
massimo e minimo, 4,7,15,116,119,246,252,281
media aritmetica, 125, 136, 142,145,168,239
norma,282,295,338,340
ordinamento, 110,115,166,313
polinorrUo, 163,334,336
precisione di macchina, 255
prodotto, 6,15,138
prodotto scalare, 167, 169
radice quadrata, 129, 131, 144,246,251
simulazione della ricorsivit, 344
somma, 6, 14, 16,23,25,137,278
Esponente, 54,67,92,199,233
Espressione, 61,83,91, 157,259,276,382,386
aritmetica, 61, 76,83,120,133,153,385
carattere, 179, 184, 189,205,207,289,360
costante, 79,96, 174, 258, 316,321,324, 363, 365,385
di sottostringa, 179, 321
401
402
indice, 156,160,321, 381, 384
intera, 223, 280, 298, 354, 356, 359, 362,369
logica, 77, 103, 112, 116,385
mista, 70,384
relazionale, 76, 185
valutazione, 62, 69, 74, 76, 78
51,101,103, 120, 205, 299,307,358,364
Ew.d, 195, 199,201,209,233,387
Ew.dEc, 195, 209, 228, 233,386
EXIST =, 372
EXTERNAL, 292, 333, 387,389
Fattore di scala, vedi: sP
Fattoriale, vedi: esempi
File, 222, 351, 359
accesso diretto, 352, 362, 367, 371, 373, 382,386
con formato, 362
connesso, 359, 364; 372
esterno, 222, 352, 356, 358, 371, 381, 382
fine, vedi: ENDFILE, END =, record
interno, 352, 356, 358, 375, 381
nome, 360, 372
preconnesso, 359, 364
senza formato, 362
sconnesso, 364
sequenziale, 222,351,356,362,365,373
stato del, 361
FILE =, 360,371,374
Floating point, 37, 70, 264
f1(x), 39
Floppy disk, 22, 368
Flusso, 3,101,242
diagramma di, 12
FMT =, 355, 356, 382
FORM =, 360, 362,371
FORMAT, 205, 382, 386, 390
Formato, 92
vedi: file, identificatore di formato, record, specifcatore, specificazione
della linea, 50
'FORMATTED', 362, 373
FORMATTED =, 372
Frase, vedi: istruzione
Full language, 47,381
FUNCTION, 243, 253, 293, 337,339,389
Funzione definita da una frase, 259, 389, 390
Funzione esterna, 252, 340
vedi: FUNCTION, lunghezza
carattere, 258, 382
nome, 253,256,338
prima istruzione, vedi: FUNCTION
riferimento, 256
tipo, 253, 256, 337
valore, 252, 337
Funzione intrinseca, 71, 261, 293,382
vedi: argomento
262, 298
manipolazione dei caratteri, 187,267,298,387
matematiche, 265
altre, 268
nome, 262,265,298,382
Funzione ricorsiva, 14,344
Fw.d, 199,200,209, 233,387
.GE., 76, 185
GOTO-assegnato, 136,389
GOTO-calcolato, 120, 381, 386, 389
GOTO-incondizionato, 101, 121, 129, 136,389
.GT., 76,185
Gw.d, 195,209,229,382,387
Gw.dEc, vedi: GW.d
H, vedi: n H h I ... h
n
Hardware, 21
Hollerith, 384
'hl' .. h
n
' , vedi: n H hl ... h
n
ICHAR, 189,268
Identificatore di formato, 205, 217, 223, 356,381
IF-aritmetico, 121, 136, 389
IF-Iogico, 117, 119, 129,389
IF-THEN-ELSE, 102, 119, 136,140,333,386,389,390
IMPLICIT, 58, 177,254,325,384,389,390
Incremento, 134
Indentation, 107
INDEX, 188, 268, 382
Indice, 152, 156, 160, 165, 286, 316, 384
vedi: espressione
Indirizzo, 23,275, 278, 289, 292,307
assoluto, 28
relativo, 26
Infj : sUPi, 153
Ingresso/uscita
vedi: istruzione, lista, operazione, simbolo, unit
dati carattere, 183, 203, 209
dati complessi, 202
dati interi, 198, 209
403
404
dati logici, 230
dati reali e doppia precisione, 199,202,209,386
guidata dalla lista, 90, 183, 193, 202, 204, 224, 381,386
variabile dimensionata, 164, 167
INQUlRE, 371,374,381,386,390
INTEGER, 57, 253,389
Intero
vedi: aritmetica, costante, espressione, ingresso/uscita, INTEGER, Iw, lw.m, rappresentazione
Interpretatore, 18, 29
INTRINSIC, 298, 387, 389
10STAT =, 354,357,360,363,372,374
Istruzione, 3, 23,48,51
vedi: ordine
assegnazione, 3, 291, 323
controllo, 386, 389
dichiarativa, 49,57,244,277,280,321,389,390
dichiarativa di tipo, 154, 174,253,325,337
dipendente, 116
eseguibile, 49, 389,390
finale, vedi: istruzione terminale
ingresso/uscita, 89,193,205,222,351,355,381,386,389
iniziale, 103, 105, 141,242,389,390
posizionamento, 366
ritorno, 242
specificazione, vedi: istruzione dichiarativa
terminale, 103, 105, 112, vedi: DO
lw, 195,198,209
lw.m, 195,209,228,382,386
'KEEP', 365
.LE., 76,185
LEN, 190,268, 382
LGE, 187,268,298
LGT, 187,268,298
Linea, 50,90,92
vedi: commento, continuazione
Linguaggio, 21, 23, 25, 31
Linker, 28, 222, 312, 359
Lista
vedi: DO-implicito
argomenti, 250, 256, 275, 280, 288, 292, 298, 312,322, 331
controllo, 355, 358, 369
ingresso/uscita, 90, 157, 164, 183, 197,205,208,212,214,218,222,256,354,358,
371,382,386,387
programma, 50
LLE, 187, 268, 298
LLT, 187,268,298
s
405
Locazione, 22, 83,151,160,163,253,275,310,339
LOGICAL, 57, 253,389
Logico
vedi: costante, espressione, ingresso/uscita, LOGICAL, Lw, operatore
.LT., 76, 185
Lunghezza
vedi: specificatore
argomento, 289
blocco COMMON, 309, 320
complessiva, 292
dato carattere, 173, 178, 268, 382
funzione esterna, 258
indefinita, 176,258,290,337

sottostringa, 179
Lw, 195,209,230
Mantissa, 37,40,201
Massimoo minimo, 268, 298
vedi: esempi
Matrice, 152, 154, 161,286
Media aritmetica, vedi: esempi
Memoria, 22,351,365,375
Modulo oggetto, 28
Monoprogrammazione, 31
Multiprogrammazione,31
NAME=, 372
NAMED=, 372
Nastro, 22, 351, 360
.NE., 76, 185
.NEQV., 78, 381, 384
NEXTREC =, 372, 374
'NEW', 361
nHh\ ... h
n,
196,216,387
Nido, 105
'NO', 373
Nome
vedi: costante, elemento di v. dimensionata, file, funzione esterna, funzione intrinseca,
programma, punto di ingresso secondario, sottoprogramma, sottostringa, variabile,
variabile dimensionata
generico, 262, 265, 298, 382,387
locale, 244,310
simbolico, 25,49,59,151, 174,239,245,253,259,298,307,323,325,331,341
specifico, 262, 265, 298, 387
Norma, vedi: esempi
.NOT.,78
'NULL', 363,373
\ I
406
NUMBER =, 372
nX, 196,215,230
'OlD: 361. 363
OPEN,222,353,358,365,382,386,390
OPENED =, 372
.OR.,78
Operatore
aritmetico, 61
concatenazione, 179
logico, 77
priorit, 62, 71, 78
relazione, 76, 185
Operazione
l'cdi: ordine
complessa, 70
conversione, 71, 73
elemen tare, 41
ingresso/uscita, 89, 209,231,256,351,355,387
primitiva, 3
simbolo, 9
Ordinamento, vedi: esempi
Ordine
argomenti, 250, 256, 336
caratteri, 185
istruzioni, 49, 383, 389, 391
operazioni, 62, 64, 69
Overtlow, 35, 39, 54,68, 138. 254
P, vedi: sP
PARAMETFR, 96,176,258,323,325,38],384,389,390
Parametro. vedi: argomento. DO
Parentesi, 48. 64,73,78. 174, 195, 210,219,245,253,333,336,340,382
Parola chiave, 49
PAUSE,389
Preconnessione, 359.364
Polinomio, vedi: esempi
Precisione
di macchina, 40, 92, 130, 255
doppia, 41, 169,200,202.264
finita, 130
semplice, 41,169,200.264
Predefinizione, 322
PRINT,256,381,390
PRINT r, 205, 223,382
PRINT,91.223,289
Prodotto, 269, vedi: esempi
scalare, vedi: esempi
407
PROGRAM, 93, 384, 389, 390
Programma, 21, 89, 239, 275, 307,311,325,359
vedi: lista, unit
esecuzione, 28, 241, 310, 323, 341, 347.363
eseguibile, 28, 241
nome,93,384 .
oggetto, 26, 28
241,307,347,384,390
sorgente, 26
Punto di ingresso secondario, 331
vedi: ENTRY
nome, 332,336,339
riferimento, 335, 340
tipo, 337
Punto di riscansione, 210
Radice quadrata, vedi: esempi
Rango, vedi: DO
Rappresentazione, 33
esterna, 197, 201, 203, 229, 232, 353
finita, 39, 70
interna, 197,200,202,262,352
READ, 355, 390
READ f, 205, 223, 382
READ (u, f), 222,386
READ. , 90, 205, 223
REAl, 57, 75, 253,389
Reale
vedi: aritmetica, costante, descrittore ripetibile, espressione, ingresso/uscita, rappresentazione
REe =, 355, 359, 369
RECl =,360,362,369,372
Record, 194, 197,201,212,222,351,366
vedi: lunghezza
con formato, 352, 362, 371
corrente, 209,212,214,218,230
end
numero d'ordine, 369
senza formato, 352,362,371, 373
RETURN, 136, 244, 298
REWIND, 355, 365, 390
Ricorsivit, 14, vedi: esempi
Ripetizione, 125, 130, 133,220,324
contatore, 127. 134. 195
simbolo, 9
Ritorno alternativo, 249, 298. 301, 382, 387
S, 196,232,382,386
SAVE, 325,341,348,38],387,389
408
Sbarra, 48
vedi: COMMON, concatenazione, descrittore non ripetibile, operatore, READ., SAVE
Scambio, 87
di informazioni, 243,275,313,331,341
'SCRATCH', 361, 365
'SEQUENTIAL', 362, 373
SEQUENTIAL =, 372
sf, 195, vedi: specificazione di formato
Simbolo, ':J
tavola, 26, 322
Software, 21
Somma, vedi: esempi
Sottoprogramma, 239, 275, 292, 307, 331, 387, 390
vedi: argomento, attivazione, BLOCK DATA, funzione esterna, funzione intrinseca, punto
di ingresso secondario, SUBROUTINE
chiamata, vedi: attivazione
corpo, 243, 253,280,288,325,331,333
esterno, 292
nome, 73, 243, 249, 253,256,292
prima fase, 242, 332
uscita, 241
Sottostringa, 178,180,182,207,289,355,375,382
vedi,' espressione, lunghezza
nome, 179,292,316,321
SP,196,232,382,386
sP, 196,233
Spaziatura
l'cdi: blank
verticale, 214
Specificatore
formato, 356
lunghezza, 174, 177
lunghezza indefinita, 176, 258, 290, 337
ritorno alternativo, 249, 299
stato, vedi: 10STAT =, STATUS =
tipo, vedi: CHARACTER, COMPLEX, DOUBLE PRECISION, INTEGER, LOGICAL,
REAL
unit, vedi: UNIT =
Specificazione
vedi: istruzione
formato, 194,205,208,212,214,224,232,354,358,363,371,382
formato variabile, 208, 226
vuota, 214
SS,196,232,382,386
Stampante, 92,214,351,360
STATUS =, 360, 365
. STOP, 93,136,242,244,389
Stringa, 173, 180,182,185,188,203,217,289
vedi: lunghezza dato carattere
Struttura decisionale, 102, 105, 111, 114, 140
409
vedi: annidamento, IF-THEN-ELSE
Struttura di ripetizione, 125
vedi: DO
SUBROUTlNE, 243, 245, 292, 298, 334, 389
vedi: CALL
Subset language, 47,381
sup], 153,381,384
Supervisore,31
Tavola dei simboli, 26,322
Testina di lettura/scrittura, 352, 365, 368
Time-sharing, 31
Tipo implicito, 58, 177,254,384
vedi: IMPLICIT
TLn,196,230,382,386
Tn,196,230,382,386
Tolleranza, 77, 131
Traduttore, 18, 25
Traduzione, 28
Trasferimento del controllo, 101,104,137,143,147,242,299,331
TRn,196,230,382,386
Troncamento,39, 181,263
Underf1ow, 39, 54
'UNFORMATTED', 362, 373
UNFORMATTED =, 372
UNIT =, 354,360,365, 371,382
Unit
aritmetica, 22
attivante, 241, 243, 250, 258, 275, 288, 292, 299, 307,331,333,341,347
di controllo, 22
di ingresso/uscita, 22, 89,210,212,222,351,354,359,364,371,375
di memoria carattere, 173, 182,289, 292, 307,310
di memoria numerica, 22, 307, 310
di programma, 21, 239, 242, 260, 275,293,298,307,309,311,316,319,358,364,
383,390
numero di, 222, 354, 373, 381
'UNKNOWN', 361, 373
UNTlL,128
Variabile, 56
vedi: DO, DO-implicito
carattere, 174,289,356,375
interna, 341, 348
nome di, 56,83,245, 249,253,256,275,280,308,316,321,342,357,364
tipo, 56,275
Variabile dimensionata, 151, 153, 156
I:
l
I
i
I
I
I I
410
vedi: ampiezza, argomento, dichiaratore, elemento
nome, 153, 155, 164, 178,205,208,245,249,253,256,298,308,316,321,342
Vettore, 152, 154, 160
Video, 92, 351
Virgola, 48, 73,90,120, 133,218,231,308,316,321,348,354
l'cdi: floating point
WHILE,128
WRITE, 256,355,390
WRITE(u, f), 222, 386
X, vedi: nX
'YES',373
'ZERO', 363. 373

You might also like