Cicli
I cicli permettono di esprimere delle azioni ripetitive.
Per poter eseguire una sequenza di istruzioni un certo numero di volte si
adopera il DO.
DO etichetta
contatore=inizio,fine,incremento
............
e CONTINUE
dove e è
etichetta (vedi etichetta). Contatore
è una variabile di tipo INTEGER, detta anche
variabile di controllo. Inizio, fine e incremento devono
essere delle costanti o delle variabili di tipo
INTEGER, a cui è stato precedentemente assegnato un valore. I puntini
(............) rappresentano il blocco di istruzioni all'interno del ciclo,
mentre l'istruzione CONTINUE indica la chiusura del ciclo.
Inizio è il
valore iniziale della variabile di controllo. Ogni volta che il ciclo viene
eseguito il valore del contatore viene incrementato del valore indicato
da incremento, fino a raggiungere il valore fine. Incremento
può essere un numero intero positivo o negativo (mai nullo); se questo viene
omesso è si intende incremento = 1. Da quanto detto, se incremento
è positivo, inizio deve essere minore di fine, se si vuole che il
ciclo sia eseguito almeno una volta; viceversa se incremento è negativo,
inizio deve essere maggiore di fine. Se quanto richiesto non si
verifica, il blocco di istruzioni non viene mai eseguito.
Quindi inizio,
fine, incremento determinano una successione di numeri crescenti
(decrescenti); l'azione dell'istruzione DO è quella di assegnare alla variabile
contatore, uno alla volta, ciascuno di questi valori, e di eseguire il
blocco di istruzioni (............) all'interno del ciclo (tra DO e... ed
e CONTINUE).
Esempio:
DO 10 I=1,10,3
PRINT*,I
10 CONTINUE
l'output è 1,4,7,10
Il valore della variabile di controllo viene modificato implicitamente ad ogni ripetizione del ciclo, all'interno del ciclo, o in sottoprogrammi richiamati all'interno del ciclo, non può apparire alcuna istruzione volta a modificarne il valore. Terminato il ciclo, il valore della variabile di controllo non è definito, non si deve quindi fare alcuna assunzione sul suo valore.
Il blocco di istruzioni all'interno di un DO possono essere di
qualsiasi tipo ammesso dal Fortran, quindi può esservi contenuto un altro ciclo.
In questo caso si parla di cicli annidati.
DO e1 contatore1=inizio1,fine1,incremento1
blocco1
DO e2 contatore2=inizio2,fine2,incremento2
blocco2
e2 CONTINUE
blocco3
e1 CONTINUE
blocco1, blocco2 e blocco3 sono dei blocchi di
istruzioni.
I cicli interni devono essere chiusi prima della chiusura del
ciclo esterno. La seguente costruzione è quindi errata:
DO e1 contatore1=inizio1,fine1,incremento1
blocco1
DO e2 contatore2=inizio2,fine2,incremento2
blocco2
e1 CONTINUE
e2 CONTINUE
Esempi:
DO 10 I=1,3
DO 20 J=3,1,-2
PRINT*,'I = ',I,' J = ',J
20 CONTINUE
10 CONTINUE
si ottiene in output:
I = 1 J = 3
I = 1 J = 1
I = 2 J = 3
I = 2 J = 1
I = 3 J = 3
I = 3 J = 1
Il
precedente poteva anche essere scritto:
DO 10
I=1,3
DO 10 J=3,1,-2
PRINT*,'I = ',I,' J = ',J
10 CONTINUE
ottenendo lo stesso output.
Vediamo un altro esempio:
DO 10 I=1,3
PRINT*,I
DO 20 J=3,1,-2
PRINT*,J
20 CONTINUE
10 CONTINUE
si ottiene in output:
1
3
1
2
3
1
3
3
1
Il
precedente poteva invece essere scritto:
DO 10 I=1,3
PRINT*,I
DO 10 J=3,1,-2
PRINT*,J
10 CONTINUE
la precedente scrittura è errata, e l'errore viene
segnalato dal compilatore.
Ecco un altro esempio:
DO 10 I=1,2
PRINT*,I
DO 20 J=2,5,2
PRINT*,I+J
20 CONTINUE
DO 30 J=2,6,2
PRINT*,I*J
30 CONTINUE
10 CONTINUE
si ottiene in output:
1
3
5
2
4
6
2
4
6
4
8
12
In alcuni casi il DO può essere omesso, si parla quindi di DO implicito. Si parlerà di questo argomento nel capitolo dedicato agli array.