3.2 IF...THEN...ELSE IF...ELSE...END IF

Fortran

As estruturas de controle controlam quais declarações serão executadas pelo programa. No Fortran 90 existem três tipos de estrutura de controle, que são as construções IF, CASE e DO. As construções podem receber um nome terminado por dois pontos (:) ao serem declaradas. Aqui será visto em mais detalhe a construção IF.

O grupo de declarações cuja execução é controlada por uma estrutura de controle é chamado de bloco de declarações. Abaixo está mostrada a forma geral da construção IF:

    IF (expressão lógica) THEN
        bloco de declarações
    ELSE IF (expressão lógica) THEN
        bloco de declarações
    ELSE IF (expressão lógica) THEN
        bloco de declarações
    ...
    ELSE
        bloco de declarações
    END IF

O programa exemplo abaixo, além da construção IF, mostra a construção DO, uma interface e uma sub-rotina com argumento opcional.

FUNCTION ano_bissexto(ano) RESULT(bissexto)
    ! No Calendário Gregoriano o ano é bissexto se for divisível por 4,
    ! mas não for divisível por 100, a não ser que seja divisível por 400.
    IMPLICIT NONE
    INTEGER,INTENT(IN) :: ano
    LOGICAL :: bissexto
    bissexto = (MOD(ano, 4) == 0) & ! Divisível por 4
        .AND. (.NOT. (MOD(ano, 100) == 0)) & ! mas não divisível por 100
        .OR. (MOD(ano, 400) == 0) ! a não ser que seja divisível por 400
END FUNCTION ano_bissexto
FUNCTION num_dias_mes(num_mes, num_ano) RESULT(num_dias)
    ! Recebe como parâmetros o número do mês e do ano com 4 dígitos,
    ! este último opcional, e retorna o número de dias do mês.
    ! Se o ano não for informado, é usado o ano corrente.
    INTEGER, INTENT(IN) :: num_mes
    INTEGER, INTENT(IN), OPTIONAL :: num_ano
    INTEGER :: num_dias
    INTEGER :: ano
    LOGICAL ano_bissexto
    INTEGER, DIMENSION(8) :: data
    INTEGER, DIMENSION(7) :: meses_31_dias = (/1, 3, 5, 7, 8, 10, 12/)
    INTEGER, DIMENSION(4) :: meses_30_dias = (/4, 6, 9, 11/)
    IF (PRESENT(num_ano)) THEN
       ano = num_ano
    ELSE
       CALL DATE_AND_TIME(VALUES=data)
       ano = data(1)
    END IF
    IF (ANY(meses_31_dias(1 : SIZE(meses_31_dias)) == num_mes)) THEN
       num_dias = 31
    ELSE IF (ANY(meses_30_dias(1 : SIZE(meses_30_dias)) == num_mes)) THEN
        num_dias = 30
    ELSE IF (ano_bissexto(ano)) THEN
       num_dias = 29
    ELSE
       num_dias = 28
    END IF
END FUNCTION num_dias_mes
PROGRAM mostra_num_dias_mes
    ! Programa para ler o mês e o ano da console e mostrar o
    ! número de dias do mês. Se ano for igual a zero, ou deixado
    ! em branco, será considerado o ano corrente. Se o mês for
    ! igual a zero, termina a execução do programa.
    IMPLICIT NONE
    INTERFACE
        FUNCTION num_dias_mes(num_mes, num_ano) RESULT(num_dias)
            INTEGER, INTENT(IN) :: num_mes
            INTEGER, INTENT(IN), OPTIONAL :: num_ano
            INTEGER :: num_dias
        END FUNCTION num_dias_mes
    END INTERFACE
    INTEGER :: mes, ano
    PRINT *, 'Forneça o mês e o ano no formato 2I5'
    PRINT *, 'Mês = 0 termina o programa'
    PRINT *, 'Ano = 0 igual ao ano corrente.'
    leitura: DO
        READ '(2I5)', mes, ano
        IF (mes == 0) THEN
           EXIT leitura
        ELSE IF (ano == 0) THEN
           PRINT '(A12,I5, A16, I5)', 'Mês = ', mes, &
                 ' dias = ', num_dias_mes(mes)
        ELSE
           PRINT '(A12, I5, A3, I5, A8, I5)', 'Mês / ano = ', mes, &
                 ' / ', ano, &
                 ' dias = ', num_dias_mes(mes, ano)
        END IF
    END DO leitura
END PROGRAM mostra_num_dias_mes

Makefile:

num_dias_mes: num_dias_mes.f90
	gfortran num_dias_mes.f90 -o num_dias_mes
clean:
	rm num_dias_mes

Execução:

 Forneça o mês e o ano no formato 2I5
 Mês = 0 termina o programa
 Ano = 0 igual ao ano corrente.
2
     Mês =     2         dias =    28
2    1600
Mês / ano =    2 /  1600 dias =    29
2    1700
Mês / ano =    2 /  1700 dias =    28
2    2000
Mês / ano =    2 /  2000 dias =    29
11
     Mês =    11         dias =    30
11   2000
Mês / ano =   11 /  2000 dias =    30
12
     Mês =    12         dias =    31
12   1999
Mês / ano =   12 /  1999 dias =    31

Referências: