Controllo del flusso: istruzioni IF...THEN, ELSE ENDIF, e CASE

  • Il costrutto IF...THEN...ELSE...ENDIF, come pure l'IF su una sola riga non presentano niente di nuovo in F90.
  • Un'alternativa più limitata, ma più elegante nel caso di numerose possibilità di scelta (e forse più ottimizzabile?) è il costrutto CASE:
    • è introdotto dall'istruzione SELECT CASE (<expr>) dove <expr> è un'espressione intera o carattere
    • è formato da una o più clausole CASE (<const-expr>) o CASE (<const-expr1:const-expr2>) dove const-expr e compagnia sono espressioni dello stesso tipo di cui sopra ma costanti, quindi calcolabili al momento della compilazione, che definiscono le istruzioni da eseguire nel caso in cui <expr> sia uguale a <const-expr> oppure sia compreso nell'intervallo <const-expr1:const-expr2>
    • può includere una clausola CASE DEFAULT che definisce le istruzioni da eseguire nel caso nessuna delle altre clausole CASE() sia stata soddisfatta
    • le condizioni in ciascuna clausola CASE non possono intersecarsi, in altre parole zero o al più una clausola CASE può essere eseguita per ciascun valore in SELECT
    • ovviamente termina con END SELECT.
    L'utilità del costrutto SELECT è limitata, e riproducibile con IF...THEN...ELSE...ENDIF, esso tuttavia è consigliato come alternativa agli obsolescenti GOTO calcolato e IF aritmetico del F77.
SUBROUTINE stampastaz(tipo, t1, t2, nl)
INTEGER :: tipo, nl
REAL :: t1(nl), t2(nl)

INTEGER, PARAMETER :: synop=1, ship=2, buoy=3, temp=4, pilot=5

SELECT CASE(tipo)
  CASE(synop)
    PRINT(A,F5.1)','Temperatura a 2m: ',t1(1)
  CASE(ship:buoy)
    PRINT(A,F5.1)','Temperatura a 2m: ',t1(1)
    PRINT(A,F5.1)','Temperatura del mare: ',t2(1)
  CASE(temp, pilot)
    DO i = 1, nl
      PRINT(A,F5.1)','Temperatura: ',t1(i)
      PRINT(A,F5.1)','Temperatura di rugiada: ',t2(i)
    ENDDO
  CASE DEFAULT
    PRINT'(A,I3,A)','Tipo di stazione', tipo, 'sconosciuto'
END SELECT

END SUBROUTINE stampastaz

L'indenting dei costrutti IF e CASE non è obbligatorio, ma può migliorare la leggibilità del codice e, al solito, emacs lo fa gratis e in quantità programmabile (file .emacs); consiglio di limitare comunque l'indenting a 2 caratteri.