3.3 SELECT CASE...DEFAULT...END SELECT

Fortran

A estrutura de controle CASE é semelhante ao IF, uma vez que permite selecionar um bloco de declarações a ser executado entre várias possibilidades, mas é um caso especial onde uma dada expressão é comparada com várias opções possíveis. Abaixo está mostrada a forma genérica de sua construção:

    SELECT CASE (expressão)
    CASE (seletor do caso)
        bloco de declarações
    CASE (seletor do caso)
        bloco de declarações
    ...
    CASE DEFAULT
        bloco de declarações padrão
    END SELECT

O programa exemplo abaixo chama o procedimento RANDOM_NUMBER para obter 400 números pseudo-aleatórios de distribuição uniforme no intervalo 0 ≤ x < 1 e armazená-los na variável colheita. Em seguida é calculado o número de ocorrências destes números nos 10 intervalos 0 ≤ x < 0.1; 0.1 ≤ x < 0.2; … 0.9 ≤ x < 1. A saída do programa mostra a ocorrência dos valores obtidos nestes 10 intervalos. A cada execução do programa sua saída muda.

PROGRAM randomico
    ! Distribuição da ocorrência dos números randômicos.
    ! Chama o procedimento RANDOM_NUMBER para preencher
    ! o array colheita com 400 números pseudo-randômicos
    ! no intervalo [0,1) e mostra a ocorrência desses
    ! números em 10 intervalos de 0,1 cada.
    IMPLICIT NONE
    REAL, DIMENSION(400) :: colheita
    INTEGER, DIMENSION(0:9) :: intervalo = (/ 0,0,0,0,0,0,0,0,0,0 /)
    CHARACTER, DIMENSION(100) :: barra
    INTEGER :: i, j
    CALL RANDOM_NUMBER(colheita)
    DO i = 1, SIZE(colheita)
       SELECT CASE(INT(colheita(i)*10.))
           CASE (0)
               intervalo(0) = intervalo(0) + 1
           CASE (1)
               intervalo(1) = intervalo(1) + 1
           CASE (2)
               intervalo(2) = intervalo(2) + 1
           CASE (3)
               intervalo(3) = intervalo(3) + 1
           CASE (4)
               intervalo(4) = intervalo(4) + 1
           CASE (5)
               intervalo(5) = intervalo(5) + 1
           CASE (6)
               intervalo(6) = intervalo(6) + 1
           CASE (7)
               intervalo(7) = intervalo(7) + 1
           CASE (8)
               intervalo(8) = intervalo(8) + 1
           CASE DEFAULT
               intervalo(9) = intervalo(9) + 1
       END SELECT
    END DO
    PRINT '(A9, A14)', 'Intervalo', '  Ocorrências'
    DO i = 0, 9
       barra = ' '
       DO j = 1, intervalo(i)
          barra(j) = '*'
       END DO
       PRINT '(I9, I4, 101A1)', i, intervalo(i), ' ', barra
    END DO
END PROGRAM randomico

Resultados:

Intervalo  Ocorrências
        0  38 **************************************                                                              
        1  38 **************************************                                                              
        2  39 ***************************************                                                             
        3  45 *********************************************                                                       
        4  52 ****************************************************                                                
        5  40 ****************************************                                                            
        6  37 *************************************                                                               
        7  30 ******************************                                                                      
        8  28 ****************************                                                                        
        9  53 *****************************************************   
Intervalo  Ocorrências
        0  30 ******************************                                                                      
        1  37 *************************************                                                               
        2  31 *******************************                                                                     
        3  39 ***************************************                                                             
        4  42 ******************************************                                                          
        5  38 **************************************                                                              
        6  43 *******************************************                                                         
        7  48 ************************************************                                                    
        8  48 ************************************************                                                    
        9  44 ******************************************** 

Este programa pode ser reescrito sem uso da construção SELECT CASE, conforme mostrado abaixo:

PROGRAM randomico
    ! Distribuição da ocorrência dos números randômicos.
    ! Chama o procedimento RANDOM_NUMBER para preencher
    ! o array colheita com 400 números pseudo-randômicos
    ! no intervalo [0,1) e mostra a ocorrência desses
    ! números em 10 intervalos de 0,1 cada.
    IMPLICIT NONE
    REAL, DIMENSION(400) :: colheita
    INTEGER, DIMENSION(0:9) :: intervalo = (/ 0,0,0,0,0,0,0,0,0,0 /)
    CHARACTER, DIMENSION(100) :: barra
    INTEGER :: i, j
    CALL RANDOM_NUMBER(colheita)
    DO i = 1, SIZE(colheita)
       j = INT(colheita(i)*10.)
       intervalo(j) = intervalo(j) + 1
    END DO
    PRINT '(A9, A14)', 'Intervalo', '  Ocorrências'
    DO i = 0, 9
       barra = ' '
       DO j = 1, intervalo(i)
          barra(j) = '*'
       END DO
       PRINT '(I9, I4, 101A1)', i, intervalo(i), ' ', barra
    END DO
END PROGRAM randomico

Resultado:

Intervalo  Ocorrências
        0  55 *******************************************************                                             
        1  33 *********************************                                                                   
        2  39 ***************************************                                                             
        3  42 ******************************************                                                          
        4  39 ***************************************                                                             
        5  36 ************************************                                                                
        6  37 *************************************                                                               
        7  42 ******************************************                                                          
        8  39 ***************************************                                                             
        9  38 **************************************

Referências: