Fortran has one more selective execution statement, SELECT CASE, and could be very handy if it is used properly. The SELECT CASE statement is also usually referred to as the CASE statement. The following is its syntactic form:
SELECT CASE (selector)
CASE (label-list-1)
statements-1
CASE (label-list-2)
statements-2
CASE (label-list-3)
statements-3
.............
CASE (label-list-n)
statements-n
CASE DEFAULT
statements-DEFAULT
END SELECT
where statements-1, statements-2, statements-3, ...,
statements-n and statements-DEFAULT are sequences of
executable statements, including the SELECT CASE statement
itself, and selector is an expression whose result is of type
INTEGER, CHARACTER or LOGICAL (i.e.,
no REAL type can be used for the selector).
The label lists label-list-1, label-list-2,
label-list-3, ..., and label-list-n are called
case labels.
A label-list is a list of labels, separated by commas. Each label must be one of the following forms. In fact, three of these four are identical to an extent specifier for substrings:
where value, value-1 and value-2 are constants or alias defined by PARAMETER. The type of these constants must be identical to that of the selector.value value-1 : value-2 value-1 : : value-2
INTEGER :: Class
SELECT CASE (Class)
CASE (1)
WRITE(*,*) 'Freshman'
CASE (2)
WRITE(*,*) 'Sophomore'
CASE (3)
WRITE(*,*) 'Junior'
CASE (4)
WRITE(*,*) 'Senior'
CASE DEFAULT
WRITE(*,*) "Hmmmm, I don't know"
END SELECT
WRITE(*,*) 'Done'
CHARACTER(LEN=4) :: Title
INTEGER :: DrMD = 0, PhD = 0, MS = 0, BS = 0, Others = 0
SELECT CASE (Title)
CASE ("DrMD")
DrMD = DrMD + 1
CASE ("PhD")
PhD = PhD + 1
CASE ("MS")
MS = MS + 1
CASE ("BS")
BS = BS + 1
CASE DEFAULT
Others = Others + 1
END SELECT
INTEGER :: Number, Sign
SELECT CASE (Number)
CASE ( : -1)
Sign = -1
CASE (0)
Sign = 0
CASE (1 : )
Sign = 1
END SELECT
WRITE(*,*) "Sign = ", Sign
CHARACTER(LEN=1) :: c
SELECT CASE (c)
CASE ('a' : 'j')
WRITE(*,*) 'One of the first ten letters'
CASE ('l' : 'p', 'u' : 'y')
WRITE(*,*) 'One of l, m, n, o, p, u, v, w, x, y'
CASE ('z', 'q' : 't')
WRITE(*,*) 'One of z, q, r, s, t'
CASE DEFAULT
WRITE(*,*) 'Other characters, which may not be letters'
END SELECT
INTEGER :: Number, Range
SELECT CASE (Number)
CASE ( : -10, 10 : )
Range = 1
CASE (-5:-3, 6:9)
Range = 2
CASE (-2:2)
Range = 3
CASE (3, 5)
Range = 4
CASE (4)
Range = 5
CASE DEFAULT
Range = 6
END SELECT
Here is the result:
| Number | Range | Why? |
| <= -10 | 1 | CASE ( : -10, 10 : ) |
| -9, -8, -7, -6 | 6 | CASE DEFAULT |
| -5, -4, -3 | 2 | CASE (-5:-3, 6:9) |
| -2, -1, 0, 1, 2 | 3 | CASE (-2:2) |
| 3 | 4 | CASE (3, 5) |
| 4 | 5 | CASE (4) |
| 5 | 4 | CASE (3, 5) |
| 6, 7, 8, 9 | 2 | CASE (-5:-3, 6:9) | >= 10 | 1 | CASE ( : -10, 10 : ) |