"
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,
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
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)
=-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
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