<< I/O dei dati

Indice

Istruzione condizionale (IF ... THEN ... ELSE) >>

 

Cicli

 

  • DO
  • Cicli annidati
  •  

    I cicli permettono di esprimere delle azioni ripetitive.

     

    DO

    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.

     

    Cicli annidati

    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.

     

    << I/O dei dati

    Indice

    Istruzione condizionale (IF ... THEN ... ELSE) >>