25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

160 Array<br />

In questo caso la lista degli argomenti contiene un solo elemento, a(i), e la lista stessa viene<br />

ripetuta una volta per ogni valore assunto dalla variabile i che rappresenta un indice variabile<br />

da 1 a 5.<br />

Come tutti i normali cicli DO, anche i cicli impliciti possono essere annidati, la qual cosa<br />

torna particolarmente utile quando si opera con array di rango maggiore di uno. Nel caso di due<br />

cicli DO impliciti annidati, è necessario ricordare che il ciclo interno sarà eseguito completamente<br />

ad ogni iterazione del ciclo esterno: quest’ordine viene osservato indipendentemente dal numero<br />

di cicli nidificati. A titolo di esempio, si consideri il seguente frammento di programma:<br />

INTEGER, DIMENSION(4,4) :: mat=(/(i=1,16)/)<br />

mat=RESHAPE((/(i, i=1,SIZE(mat,DIM=1))/),SHAPE(mat))<br />

...<br />

WRITE(*,100) ((mat(i,j), j=1,3 ), i=1,2)<br />

100 FORMAT(1X,I5,1X,I5)<br />

in cui l’istruzione WRITE contiene due cicli impliciti nidificati. La variabile indice del ciclo<br />

interno è j, mentre quella del ciclo esterno è i. Quando l’istruzione WRITE viene eseguita, la<br />

variabile j assume i valori 1, 2 e 3 mentre i vale 1. Quindi, la variabile i assume valore 2 e il<br />

ciclo interno viene ripetuto, con j che assume nuovamente i valori 1, 2 e 3. Pertanto l’output<br />

di questo blocco di istruzioni sarà:<br />

1 5 9<br />

2 6 10<br />

Le funzioni intrinseche SIZE e SHAPE usate nel precedente esempio forniscono, rispettivamente,<br />

l’estensione (nella dimensione specificata), e la forma dell’array argomento. Per i dettagli<br />

relativi al loro utilizzo si rimanda alla sezione del capitolo 6 dedicata alle funzioni intrinseche<br />

di array.<br />

3.10.2 Input e output con interi array o con sezioni di array<br />

Oltre agli elementi di un array, anche un intero array o una sua sezione possono essere utilizzati<br />

con le istruzioni READ, WRITE e PRINT. Se il nome di un array viene specificato senza indici in<br />

un’istruzione di I/O, il compilatore suppone che tutti gli elementi dell’array debbano essere letti<br />

o visualizzati. Analogamente, se ad essere specificata in una istruzione di I/O è una sezione di<br />

array, allora il compilatore suppone che l’intera sezione debba essere letta o visualizzata.<br />

<strong>Il</strong> seguente frammento di programma mostra un semplice esempio di utilizzo delle istruzioni<br />

di scrittura per array in forma globale per sezioni:<br />

REAL, DIMENSION(5) :: a=(/1.,2.,3.,20.,10./)<br />

INTEGER, DIMENSION(4) :: vett=(/4,3,4,5/)<br />

WRITE(*,100) a ! array globale<br />

WRITE(*,100) a(2::2) ! sezione di array con tripletta di indici<br />

WRITE(*,100) a(vett) ! sezione di array con indice vettoriale<br />

100 FORMAT(1X,5F8.3)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!